On Tue, Mar 27, 2012 at 9:57 AM, Uros Bizjak <ubiz...@gmail.com> wrote:
> On Tue, Mar 27, 2012 at 6:57 PM, H.J. Lu <hjl.to...@gmail.com> wrote:
>
>>>> Well, generally speaking, reload makes a lot of assumptions on how
>>>> addresses can look like; it needs to, since if a target rejects an
>>>> address as invalid as-is, reload must fix it up -- and it can do
>>>> so only by making assumptions ...
>>>>
>>>> Allowing a random UNSPEC as part of valid (non-strict) addresses
>>>> makes it really impossible for reload to understand what's going
>>>> on.  Given that, I'd tend to agree that *if* you do that, you
>>>> then also have to help reload how to deal with such addresses
>>>> by providing a legitimize_reload_address hook as you did.
>>>>
>>>> Now, in this particular case, there might be another option to
>>>> avoid this hassle completely:  I understand that this UNSPEC is
>>>> simply a magic marker to make the address use the fs: or gs:
>>>> segment override, right?   Now that GCC supports address spaces,
>>>> it might be possible to model fs:/gs: relative addresses instead
>>>> by using a non-standard address space ...
>>>
>>> This is an interesting idea, I will look into it.
>>
>> As I explained in:
>>
>> http://gcc.gnu.org/ml/gcc-patches/2012-03/msg01590.html
>>
>> we can remove *load_tp_x32_zext and use
>>
>> (define_insn "*load_tp_x32_<mode>"
>>  [(set (match_operand:SWI48x 0 "register_operand" "=r")
>>        (unspec:SWI48x [(const_int 0)] UNSPEC_TP))]
>>  "TARGET_X32"
>>  "mov{l}\t{%%fs:0, %k0|%k0, DWORD PTR fs:0}"
>>  [(set_attr "type" "imov")
>>   (set_attr "modrm" "0")
>>   (set_attr "length" "7")
>>   (set_attr "memory" "load")
>>   (set_attr "imm_disp" "false")])
>>
>> to load %fs directly into %r32 or %r64.
>
> No, we can't.
>

GCC needs to move the value in the %fs segment
register into %r32 or %r64.  This instruction

"mov{l}\t{%%fs:0, %k0|%k0, DWORD PTR fs:0}"

does exactly what GCC wants.

-- 
H.J.

Reply via email to