diff mbox

[i386,Pointer,Bounds,Checker,30/x] Size relocation

Message ID 20141002135156.GE28697@msticlxl57.ims.intel.com
State New
Headers show

Commit Message

Ilya Enkovich Oct. 2, 2014, 1:51 p.m. UTC
On 02 Oct 11:49, Uros Bizjak wrote:
> On Thu, Oct 2, 2014 at 10:23 AM, Ilya Enkovich <enkovich.gnu@gmail.com> wrote:
> 
> > 2014-10-01  Ilya Enkovich  <ilya.enkovich@intel.com>
> >
> >         * config/i386/i386.md (UNSPEC_SIZEOF): New.
> >         (move_size_reloc_<mode>): New.
> >         * config/i386/predicates.md (symbol_operand): New.
> >         (x86_64_immediate_size_operand): New.
> 
> OK with a trivial adjustment.
> 
> Thanks,
> Uros.
> 
> > diff --git a/gcc/config/i386/i386.md b/gcc/config/i386/i386.md
> > index 65990b1..1901023 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
> > @@ -18789,6 +18790,21 @@
> >    "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"
> > +{
> > +  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}";
> > +}
> > +  [(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 fea7754..1875339 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")
> > @@ -336,6 +340,14 @@
> >    return false;
> >  })
> >
> > +;; Return true if size of VALUE can be stored in a sign
> > +;; extended immediate field.
> > +(define_predicate "x86_64_immediate_size_operand"
> > +  (and (match_code "symbol_ref")
> > +       (ior (not (match_test "TARGET_64BIT"))
> > +           (ior (match_test ("ix86_cmodel == CM_SMALL"))
> > +                (match_test ("ix86_cmodel == CM_KERNEL"))))))
> 
> Uh yes, I did a trivial thinko. Please note that above (ior) can be
> rewritten with a multiple arguments:
> 
> (define_predicate "x86_64_immediate_size_operand"
>   (and (match_code "symbol_ref")
>        (ior (not (match_test "TARGET_64BIT"))
>            (match_test "ix86_cmodel == CM_SMALL")
>            (match_test "ix86_cmodel == CM_KERNEL"))))
> 
> Also, there were unneded parenthesis for match_test removed.
> 
> >  ;; Return true if OP is general operand representable on x86_64.
> >  (define_predicate "x86_64_general_operand"
> >    (if_then_else (match_test "TARGET_64BIT")

Thanks for comments!  Here is adjusted version.

Ilya
--
2014-10-02  Ilya Enkovich  <ilya.enkovich@intel.com>

	* config/i386/i386.md (UNSPEC_SIZEOF): New.
	(move_size_reloc_<mode>): New.
	* config/i386/predicates.md (symbol_operand): New.
	(x86_64_immediate_size_operand): New.
diff mbox

Patch

diff --git a/gcc/config/i386/i386.md b/gcc/config/i386/i386.md
index 65990b1..1901023 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
@@ -18789,6 +18790,21 @@ 
   "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"
+{
+  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}";
+}
+  [(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 fea7754..3aebe2b 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")
@@ -336,6 +340,14 @@ 
   return false;
 })
 
+;; Return true if size of VALUE can be stored in a sign
+;; extended immediate field.
+(define_predicate "x86_64_immediate_size_operand"
+  (and (match_code "symbol_ref")
+       (ior (not (match_test "TARGET_64BIT"))
+	    (match_test "ix86_cmodel == CM_SMALL")
+	    (match_test "ix86_cmodel == CM_KERNEL"))))
+
 ;; Return true if OP is general operand representable on x86_64.
 (define_predicate "x86_64_general_operand"
   (if_then_else (match_test "TARGET_64BIT")