On Fri, Mar 9, 2012 at 10:15 AM, Uros Bizjak <ubiz...@gmail.com> wrote: > On Fri, Mar 9, 2012 at 4:26 PM, H.J. Lu <hjl.to...@gmail.com> wrote: >> On Thu, Mar 8, 2012 at 7:20 AM, Uros Bizjak <ubiz...@gmail.com> wrote: >>> On Sun, Mar 4, 2012 at 9:13 PM, Uros Bizjak <ubiz...@gmail.com> wrote: >>> >>>>> We only need to handle zero-extended addresses in DImode. >>>>> OK for trunk? >>>> >>>>> 2012-03-02 H.J. Lu <hongjiu...@intel.com> >>>>> >>>>> * config/i386/i386.c (ix86_print_operand_address): Only handle >>>>> zero-extended DImode addresses. >>>> >>>> OK. >>> >>> The patch was reverted due to PR target/52530. >>> >> >> Revert breaks Pmode == SImode for x32. Here is a different patch. >> It checks Pmode == DImode instead of TARGET_64BIT. Tested on >> Linux/x32. OK for trunk? > > This will still emit i.e. "leal 1(%rSImode), %rSImode" on Pmode == > SImode targets, so you win nothing really. > > Attached patch finally decouples LEA operand handling from generic > address handling, and by introducing %E operand modifier, we are able > to always emit DImode registers for LEAs (which is good anyway to > avoid unnecessary addr32 prefixes). Luckily, the "leal 1(%rSImode), > %rSImode" triggered some unknown problem with Sun assembler, so we > were able to detect the problem. > > I would like to point out that the patched compiler now also emits > address registers in their natural mode (modulo zero-extended RTXes) > and fixes following failure on Pmode == SImode targets: > > --cut here-- > struct foo > { > int *f; > int i; > }; > > void > __attribute__ ((noinline)) > bar (struct foo x) > { > *(x.f) = 1; > } > --cut here-- > > For Pmode == SImode, the compiler emitted (%rdi) address, which was > wrong, since "i" was passed in the high part of (%rdi) register. > > 2012-03-09 Uros Bizjak <ubiz...@gmail.com> > > PR target/52530 > * config/i386/i386.c (ix86_print_operand): Handle 'E' operand modifier. > (ix86_print_operand_address): Handle UNSPEC_LEA_ADDR. Do not fallback > to set code to 'q'. > * config/i386/i386.md (UNSPEC_LEA_ADDR): New unspec. > (*movdi_internal_rex64): Use %E operand modifier for lea. > (*movsi_internal): Ditto. > (*lea_1): Ditto. > (*lea<mode>_2): Ditto. > (*lea_{3,4,5,6}_zext): Ditto. > (*tls_global_dynamic_32_gnu): Ditto. > (*tls_global_dynamic_64): Ditto. > (*tls_dynamic_gnu2_lea_32): Ditto. > (*tls_dynamic_gnu2_lea_64): Ditto. > (pro_epilogue_adjust_stack_<mode>_add): Ditto. > > Patch was tested on x86_64-pc-linux-gnu {,-m32}. I have also eyeballed > x32 code (Pmode == SImode) and found no problems. > > Committed to mainline SVN. > > H.J., can you please construct a runtime test from the above example code? > > Uros.
It passed all my x32 tests. Thanks. -- H.J.