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.