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