On Tue, Nov 19, 2013 at 9:43 PM, Ilya Enkovich <enkovich....@gmail.com> wrote:

>> > Here is a patch to add size relocation and instruction to obtain object's 
>> > size in i386 target.
>>
>> +(define_insn "move_size_reloc_<mode>"
>> +  [(set (match_operand:SWI48 0 "register_operand" "=r")
>> +        (match_operand:<MODE> 1 "size_relocation" "Z"))]
>> +  ""
>> +{
>> +  return "mov{<imodesuffix>}\t{%1, %0|%0, %1}";
>>
>> Please don't change x86_64_immediate_operand just to use "Z"
>> constraint The predicate is used in a couple of other places that for
>> sure don't accept your change.
>>
>> Better write this insn in an explicit way (see for example
>> tls_initial_exec_64_sun). Something like:
>>
>> (define_insn "move_size_reloc_<mode>"
>>   [(set (match_operand:SWI48 0 "register_operand" "=r")
>>     (unspec:SWI48
>>      [(match_operand 1 "symbolic_operand" "..." )]
>>      UNSPEC_SIZEOF))]
>>   ""
>>   "mov{<imodesuffix>}\t{%a1@SIZE, %0|%0, %a1@SIZE}")
>>
>> You will probably need to define new operand 1 predicate and constraint.
>>
>> Uros.
>
> Hi, Uros!  Thanks for comments!  Here is what I got trying to follow your 
> suggestion.  Does it look better?

You actually don't need any operand modifiers in the insn template. Simply use:

"mov{<imodesuffix>}\t{%1@SIZE, %0|%0, %1@SIZE}"

and you will automatically get

"movl $zzz, %eax" or "mov %eax, OFFSET FLAT: zzz".

Since your pattern allows only symbolic_operand, there is no reload,
so you can avoid the constraint alltogether.

BTW: Did you consider various -mcmodel=... options? For DImode moves,
you should check x86_64_zext_immediate_operand predicate and output
either "movl $zzz, %eax" or "movabs $zzz, %rax". There is no movq with
64bit immediate. Please see movdi pattern.

Uros.

Reply via email to