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.

Reply via email to