Evitar sobrecarga de prólogo da função gcc?
Ultimamente encontrei muitas funções em que o gcc gera um código muito ruim no x86. Todos eles se encaixam em um padrão de:
if (some_condition) {
/* do something really simple and return */
} else {
/* something complex that needs lots of registers */
}
Pense no caso simples como algo tão pequeno que metade ou mais do trabalho é gasto pressionando e aparando registros que não serão modificados. Se eu estivesse escrevendo o asm manualmente, salvaria e restauraria os registros salvos através de chamadas dentro do caso complexo e evitaria tocar no ponteiro da pilha, no caso simple
Existe alguma maneira de fazer com que o gcc seja um pouco mais inteligente e faça isso sozinho? De preferência com opções de linha de comando, em vez de hacks feios na fonte ...
Editar Para torná-lo concreto, aqui está algo muito próximo de algumas das funções com as quais estou lidando:
if (buf->pos < buf->end) {
return *buf->pos++;
} else {
/* fill buffer */
}
e um outro
if (!initialized) {
/* complex initialization procedure */
}
return &initialized_object;
e outro
if (mutex->type == SIMPLE) {
return atomic_swap(&mutex->lock, 1);
} else {
/* deal with ownership, etc. */
}
Edit 2: Eu deveria ter mencionado antes: essas funções não podem ser incorporadas. Eles têm ligação externa e são código de biblioteca. Permitir que eles sejam incorporados no aplicativo resultaria em todos os tipos de problema