Message ID | 20140917183534.GD3628@msticlxl57.ims.intel.com |
---|---|
State | New |
Headers | show |
On Wed, Sep 17, 2014 at 8:35 PM, Ilya Enkovich <enkovich.gnu@gmail.com> wrote: > On 16 Sep 12:22, Uros Bizjak wrote: >> On Tue, Sep 16, 2014 at 11:37 AM, Ilya Enkovich <enkovich.gnu@gmail.com> wrote: >> > 2014-09-16 13:08 GMT+04:00 Uros Bizjak <ubizjak@gmail.com>: >> >> >> >> Can x86_64_immediate_operand predicate be used here? >> > >> > I think it cannot be used because of TLS symbols not counting as immediate. >> >> OK, please introduce a new predicate, similar to >> x86_64_immediate_operand, perhaps x86_64_immediate_size_operand, so we >> can add some comments there. This will also help to macroize the insn, >> x86_64_immediate_operand has !TARGET_64BIT shortcut for this case. >> >> Uros. > > I don't see how new predicate would help to macroize insn. Single template may look as following patch. You put early return for !TARGET_64BITS. Please see x86_64_immediate_operand predicate. So, /* Here comes comment. */ (define_predicate "x86_64_immediate_size_operand" (match_code "symbol_ref") { if (!TARGET_64BIT) return true; /* Comment here explaining these conditions. */ return (ix86_cmodel == CM_SMALL || ix86_cmodel == CM_KERNEL); } And then in the pattern itself: if (x86_64_immediate_size_operand (operands[1], VOIDmode) return "mov{l}\t{%1@SIZE, %k0|%k0, %1@SIZE}"; else return "movabs{q}\t{%1@SIZE, %0|%0, %1@SIZE}"; Uros.
diff --git a/gcc/config/i386/i386.md b/gcc/config/i386/i386.md index 2c367b2..628a58b 100644 --- a/gcc/config/i386/i386.md +++ b/gcc/config/i386/i386.md @@ -79,6 +79,7 @@ UNSPEC_PLTOFF UNSPEC_MACHOPIC_OFFSET UNSPEC_PCREL + UNSPEC_SIZEOF ;; Prologue support UNSPEC_STACK_ALLOC @@ -18554,6 +18555,24 @@ "bndstx\t{%2, %3|%3, %2}" [(set_attr "type" "mpxst")]) +(define_insn "move_size_reloc_<mode>" + [(set (match_operand:SWI48 0 "register_operand" "=r") + (unspec:SWI48 + [(match_operand:SWI48 1 "symbol_operand")] + UNSPEC_SIZEOF))] + "TARGET_MPX" +{ + /* We have to use movabs in case object's size may exceed + 31 bits. */ + 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") + (set_attr "mode" "<MODE>")]) + (include "mmx.md") (include "sse.md") (include "sync.md") diff --git a/gcc/config/i386/predicates.md b/gcc/config/i386/predicates.md index cd542b7..3e2d471 100644 --- a/gcc/config/i386/predicates.md +++ b/gcc/config/i386/predicates.md @@ -124,6 +124,10 @@ (match_test "TARGET_64BIT") (match_test "REGNO (op) > BX_REG"))) +;; Return true if VALUE is 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")