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.