Ist eine Vorzeichen- oder Nullerweiterung erforderlich, wenn einem Zeiger für das x86-64-ABI ein 32-Bit-Offset hinzugefügt wird?

Zusammenfassung: Ich habe mir den Assembly-Code angesehen, um meine Optimierungen zu steuern und beim Hinzufügen von int32 zu einem Zeiger viele Vorzeichen- oder Nullerweiterungen zu sehen.

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

Zuerst dachte ich, mein Compiler wäre gefordert, 32-Bit-Ganzzahlen zu 64-Bit-Ganzzahlen hinzuzufügen, aber ich habe dieses Verhalten mit Intel ICC 11, ICC 14 und GCC 5.3 bestätigt.

DiesFade bestätigt meine Ergebnisse, aber es ist nicht klar, ob das Vorzeichen oder die Null-Erweiterung erforderlich ist. Diese Vorzeichen- / Null-Erweiterung wäre nur erforderlich, wenn die oberen 32 Bit nicht bereits eingestellt sind. Aber wäre der x86-64-ABI nicht schlau genug, um das zu verlangen?

Ich zögere es, alle Zeiger-Offsets in ssize_t zu ändern, da Register-Spills den Cache-Speicherbedarf des Codes erhöhen.

Antworten auf die Frage(4)

Ihre Antwort auf die Frage