2013/11/20 Uros Bizjak <ubiz...@gmail.com>: > 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.
For medium models x86_64_zext_immediate_operand returns true for object is known to go to lower 2Gb space. It should allow us to use movl. Why do you always emit movabs for medium model? Ilya > > Please try attached patch. > > Uros.