On Wed, Nov 20, 2013 at 1:32 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. > > Yep, for large objects it may work wrongly. Does anyone use static objects > >4Gb? :) > > Large address does not mean large object but seems we have to be conservative > here. I added x86_64_zext_immediate_operand check with additional CM_KERNEL > check because in this model object size should always fit 32 bits. IMO, we should list code models that support object sizes > 31bits for 64bit target. The object size in small models will never be > 31bits (and never negative), so we can use movl unconditionally. Please try attached patch. Uros.
Index: i386.md =================================================================== --- i386.md (revision 205051) +++ i386.md (working copy) @@ -79,6 +79,7 @@ UNSPEC_PLTOFF UNSPEC_MACHOPIC_OFFSET UNSPEC_PCREL + UNSPEC_SIZEOF ;; Prologue support UNSPEC_STACK_ALLOC @@ -18458,6 +18459,30 @@ "bndstx\t{%2, %3|%3, %2}" [(set_attr "type" "mpxst")]) +(define_insn "move_size_reloc_si" + [(set (match_operand:SI 0 "register_operand" "=r") + (unspec:SI + [(match_operand:SI 1 "symbol_operand")] + UNSPEC_SIZEOF))] + "TARGET_MPX" + "mov{l}\t{%1@SIZE, %0|%0, %1@SIZE}" + [(set_attr "type" "imov")]) + +(define_insn "move_size_reloc_di" + [(set (match_operand:DI 0 "register_operand" "=r") + (unspec:DI + [(match_operand:DI 1 "symbol_operand")] + UNSPEC_SIZEOF))] + "TARGET_64BIT && TARGET_MPX" +{ + if (ix86_cmodel == CM_MEDIUM || ix86_cmodel == CM_LARGE + || ix86_cmodel == CM_MEDIUM_PIC || ix86_cmodel == CM_LARGE_PIC) + return "movabs{q}\t{%1@SIZE, %0|%0, %1@SIZE}"; + else + return "mov{l}\t{%1@SIZE, %k0|%k0, %1@SIZE}"; +} + [(set_attr "type" "imov")]) + (include "mmx.md") (include "sse.md") (include "sync.md") Index: predicates.md =================================================================== --- predicates.md (revision 205051) +++ predicates.md (working copy) @@ -119,6 +119,10 @@ (match_test "TARGET_64BIT") (match_test "REGNO (op) > BX_REG"))) +;; Return true if VALUE is a symbol reference +(define_predicate "symbol_operand" + (match_code "symbol_ref")) + ;; Return true if VALUE can be stored in a sign extended immediate field. (define_predicate "x86_64_immediate_operand" (match_code "const_int,symbol_ref,label_ref,const")