Patch: Print SImode register names to force addr32 prefix
H.J. Lu
hjl.tools@gmail.com
Fri Nov 9 09:17:00 GMT 2012
Hi,
Since x32 runs in 64-bit mode, for address -0x40000300(%rax), hardware
sign-extends displacement from 32-bits to 64-bits and adds it to %rax.
But x32 wants 32-bit -0x40000300, not 64-bit -0x40000300. This patch
uses 32-bit registers instead of 64-bit registers when displacement
< -16*1024*1024. -16*1024*1024 is used instead of 0 so that we will
still generate -16(%rsp) instead of -16(%esp).
Tested it on Linux/x32. OK to install?
Thanks.
H.J.
---
2012-11-09 H.J. Lu <hongjiu.lu@intel.com>
* config/i386/i386.c (ix86_print_operand_address): For x32,
print SImode register names to force addr32 prefix if displacement
< -16*1024*1024.
diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c
index 78e840b..6d4fbb5 100644
--- a/gcc/config/i386/i386.c
+++ b/gcc/config/i386/i386.c
@@ -14502,6 +14514,17 @@ ix86_print_operand_address (FILE *file, rtx addr)
gcc_assert (!code);
code = 'l';
}
+ else if (code == 0
+ && TARGET_X32
+ && disp
+ && CONST_INT_P (disp)
+ && INTVAL (disp) < -16*1024*1024)
+ {
+ /* For x32, print SImode register names to force addr32 prefix
+ if displacement < -16*1024*1024 so that 32-bit displacement
+ isn't sign-extended to 64-bit. */
+ code = 'k';
+ }
if (ASSEMBLER_DIALECT == ASM_ATT)
{
More information about the Gcc-patches
mailing list