On Mon, Mar 5, 2012 at 12:24 AM, Uros Bizjak <ubiz...@gmail.com> wrote:
> On Mon, Mar 5, 2012 at 9:01 AM, Uros Bizjak <ubiz...@gmail.com> wrote:
>
>>>> @@ -11388,6 +11400,11 @@ ix86_decompose_address (rtx addr, struct
>>>> ix86_address *out)
>>>>   else
>>>>     disp = addr;                       /* displacement */
>>>>
>>>> +  /* Since address override works only on the (reg) part in fs:(reg),
>>>> +     we can't use it as memory operand.  */
>>>> +  if (Pmode != word_mode && seg == SEG_FS && (base || index))
>>>> +    return 0;
>>>>
>>>> Can you explain the above some more? IMO, if the override works on
>>>> (reg) part, this is just what we want.
>>>
>>> When Pmode == SImode, we have
>>>
>>> fs segment register == 0x1001
>>>
>>> and
>>>
>>> base register (SImode) == -1 (0xffffffff).
>>>
>>> We are expecting address to be 0x1001 - 1 == 0x1000.  But, what we get
>>> is 0x1000 + 0xffffffff, not 0x1000 since 0x67 address prefix only applies to
>>> base register to zero-extend 0xffffffff to 64bit.
>>
>> I would call this a bug in the specification - I guess that
>> 0x1001(%eax) works correctly.
>>
>> We will treat this issue as a bug.
>
> Nice, we have TARGET_TLS_DIRECT_SEG_REFS option. We can just clear it
> somewhere appropriate when Pmode != word_mode.
>

This only applies to fs:(reg) address.  fs:offset is OK.

-- 
H.J.

Reply via email to