¿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.

Respuestas a la pregunta(2)

Su respuesta a la pregunta