Требуется ли расширение знака или нуля при добавлении 32-битного смещения к указателю для ABI x86-64?

Описание: я искал ассемблерный код для руководства по оптимизации и видел множество расширений со знаком или нулем при добавлении int32 к указателю.

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

Сначала я думал, что мой компилятор испытывает трудности при добавлении 32-битных к 64-битным целым числам, но я подтвердил это с Intel ICC 11, ICC 14 и GCC 5.3.

этонить подтверждает мои выводы, но неясно, нужен ли знак или расширение нуля. Это расширение знак / ноль будет необходимо, только если верхние 32 бита еще не установлены. Но разве x86-64 ABI не будет достаточно умен, чтобы требовать этого?

Я неохотно изменяю все мои смещения указателя на ssize_t, потому что разлив регистров увеличит объем кеша кода.

Ответы на вопрос(2)

Ваш ответ на вопрос