Требуется ли расширение знака или нуля при добавлении 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, потому что разлив регистров увеличит объем кеша кода.