É necessário um sinal ou extensão zero ao adicionar um deslocamento de 32 bits a um ponteiro para a ABI x86-64?

Resumo: Eu estava olhando o código de montagem para orientar minhas otimizações e ver muitas extensões de sinal ou zero ao adicionar int32 a um ponteiro.

void Test(int *out, int offset)
{
    out[offset] = 1;
}
-------------------------------------
movslq  %esi, %rsi
movl    $1, (%rdi,%rsi,4)
ret

No começo, pensei que meu compilador tivesse o desafio de adicionar números inteiros de 32 bits a 64 bits, mas confirmei esse comportamento com o Intel ICC 11, ICC 14 e GCC 5.3.

estefio confirma minhas descobertas, mas não está claro se o sinal ou extensão zero é necessário. Essa extensão de sinal / zero seria necessária apenas se os 32 bits superiores ainda não estiverem definidos. Mas a ABI x86-64 não seria inteligente o suficiente para exigir isso?

Eu sou um pouco relutante em alterar todos os meus deslocamentos de ponteiro para ssize_t porque os derramamentos de registro aumentarão a pegada de cache do código.

questionAnswers(2)

yourAnswerToTheQuestion