Estoy haciendo algo de experimentación con el ensamblaje x86-64. Después de haber recopilado esta función dummy:gcc argument register derrame en x86-64
long myfunc(long a, long b, long c, long d,
long e, long f, long g, long h)
{
long xx = a * b * c * d * e * f * g * h;
long yy = a + b + c + d + e + f + g + h;
long zz = utilfunc(xx, yy, xx % yy);
return zz + 20;
}
Con gcc -O0 -g
Me sorprendió encontrar lo siguiente en el inicio del montaje de la función:
0000000000400520 <myfunc>:
400520: 55 push rbp
400521: 48 89 e5 mov rbp,rsp
400524: 48 83 ec 50 sub rsp,0x50
400528: 48 89 7d d8 mov QWORD PTR [rbp-0x28],rdi
40052c: 48 89 75 d0 mov QWORD PTR [rbp-0x30],rsi
400530: 48 89 55 c8 mov QWORD PTR [rbp-0x38],rdx
400534: 48 89 4d c0 mov QWORD PTR [rbp-0x40],rcx
400538: 4c 89 45 b8 mov QWORD PTR [rbp-0x48],r8
40053c: 4c 89 4d b0 mov QWORD PTR [rbp-0x50],r9
400540: 48 8b 45 d8 mov rax,QWORD PTR [rbp-0x28]
400544: 48 0f af 45 d0 imul rax,QWORD PTR [rbp-0x30]
400549: 48 0f af 45 c8 imul rax,QWORD PTR [rbp-0x38]
40054e: 48 0f af 45 c0 imul rax,QWORD PTR [rbp-0x40]
400553: 48 0f af 45 b8 imul rax,QWORD PTR [rbp-0x48]
400558: 48 0f af 45 b0 imul rax,QWORD PTR [rbp-0x50]
40055d: 48 0f af 45 10 imul rax,QWORD PTR [rbp+0x10]
400562: 48 0f af 45 18 imul rax,QWORD PTR [rbp+0x18]
gcc
derrames de forma muy extraña de todo argumento registra en la pila y luego toma ellos de la memoria para otras operaciones.
Esto solo ocurre en -O0
(con -O1
no hay problemas), pero aún así, ¿por qué? Esto parece una anti-optimización para mí, ¿por qué gcc
haría eso?
Creo que podría tenerlo al revés. Estoy bastante seguro de que lo anterior es cómo GCC siempre (inicialmente) genera el código, es solo que normalmente no lo verás, ya que está optimizado de forma trivial (pero, por supuesto, solo si las optimizaciones están habilitadas). – user786653
Esto no es anti optimización, simplemente no es optimización. – hirschhornsalz
Acabo de ver este ejemplo en alguna parte: http://eli.thegreenplace.net/2011/09/06/stack-frame-layout-on-x86-64/ :-) –