Estoy mirando un ensamblado que se generó al desmontar algunos programas C y estoy confundido por una única optimización que veo repetidamente.¿Por qué GCC emite "lea" en lugar de "sub" para restar?
cuando no tengo optimizaciones en el compilador GCC utiliza la instrucción subl
para la sustracción, pero cuando tengo que optimizaciones encendido (-O3
para ser precisos) el compilador utiliza una instrucción en lugar de la sustracción leal
, ejemplo siguiente:
sin optimizaciones:
83 e8 01 subl $0x1, %eax
con optimizaciones
8d 6f ff leal -0x1(%edi), %ebp
Ambas instrucciones tienen 3 bytes de longitud, por lo que no veo una optimización aquí. ¿Podría alguien ayudarme y tratar de explicar la elección del compilador?
Cualquier ayuda sería apreciada.
No lo había considerado desde esta perspectiva porque la versión no optimizada solo usa valores inmediatos en las restas. Gracias, esto fue muy útil. –