¿Se requiere un signo o una extensión cero al agregar un desplazamiento de 32 bits a un puntero para el x86-64 ABI?
Resumen: Estaba buscando código de ensamblaje para guiar mis optimizaciones y vi muchas extensiones de signo o cero al agregar int32 a un puntero.
void Test(int *out, int offset)
{
out[offset] = 1;
}
-------------------------------------
movslq %esi, %rsi
movl $1, (%rdi,%rsi,4)
ret
Al principio, pensé que mi compilador tenía el desafío de agregar números enteros de 32 bits a 64 bits, pero he confirmado este comportamiento con Intel ICC 11, ICC 14 y GCC 5.3.
Estahilo confirma mis hallazgos, pero no está claro si el signo o la extensión cero son necesarios. Esta extensión de signo / cero solo sería necesaria si los 32 bits superiores aún no están configurados. ¿Pero no sería el x86-64 ABI lo suficientemente inteligente como para requerir eso?
Soy un poco reacio a cambiar todos mis desplazamientos de puntero a ssize_t porque los derrames de registro aumentarán la huella de caché del código.