Hello!

Attached patch removes special MPX jump insn patterns and extends
generic jump insn patterns to handle bnd prefix using existing MPX
infrastructure.

2015-06-29  Uros Bizjak  <ubiz...@gmail.com>

    * config/i386/i386.md (*jcc_1): Use %! in asm template.
    Set attribute "length_nobnd" instead of "length".
    (*jcc_2): Ditto.
    (jump): Ditto.
    (*jcc_1_bnd, *jcc_2_bnd, jump_bnd): Remove insn patterns.

Patch was tested on x86_64-linux-gnu {,-m32} and committed to mainline SVN.

Uros.
Index: config/i386/i386.md
===================================================================
--- config/i386/i386.md (revision 225123)
+++ config/i386/i386.md (working copy)
@@ -10948,24 +10948,6 @@
 ;; Basic conditional jump instructions.
 ;; We ignore the overflow flag for signed branch instructions.
 
-(define_insn "*jcc_1_bnd"
-  [(set (pc)
-       (if_then_else (match_operator 1 "ix86_comparison_operator"
-                                     [(reg FLAGS_REG) (const_int 0)])
-                     (label_ref (match_operand 0))
-                     (pc)))]
-  "TARGET_MPX && ix86_bnd_prefixed_insn_p (insn)"
-  "bnd %+j%C1\t%l0"
-  [(set_attr "type" "ibr")
-   (set_attr "modrm" "0")
-   (set (attr "length")
-          (if_then_else (and (ge (minus (match_dup 0) (pc))
-                                 (const_int -126))
-                             (lt (minus (match_dup 0) (pc))
-                                 (const_int 128)))
-            (const_int 3)
-            (const_int 7)))])
-
 (define_insn "*jcc_1"
   [(set (pc)
        (if_then_else (match_operator 1 "ix86_comparison_operator"
@@ -10973,35 +10955,18 @@
                      (label_ref (match_operand 0))
                      (pc)))]
   ""
-  "%+j%C1\t%l0"
+  "%!%+j%C1\t%l0"
   [(set_attr "type" "ibr")
    (set_attr "modrm" "0")
-   (set (attr "length")
-          (if_then_else (and (ge (minus (match_dup 0) (pc))
-                                 (const_int -126))
-                             (lt (minus (match_dup 0) (pc))
-                                 (const_int 128)))
-            (const_int 2)
-            (const_int 6)))])
+   (set (attr "length_nobnd")
+       (if_then_else
+         (and (ge (minus (match_dup 0) (pc))
+                  (const_int -126))
+              (lt (minus (match_dup 0) (pc))
+                  (const_int 128)))
+         (const_int 2)
+         (const_int 6)))])
 
-(define_insn "*jcc_2_bnd"
-  [(set (pc)
-       (if_then_else (match_operator 1 "ix86_comparison_operator"
-                                     [(reg FLAGS_REG) (const_int 0)])
-                     (pc)
-                     (label_ref (match_operand 0))))]
-  "TARGET_MPX && ix86_bnd_prefixed_insn_p (insn)"
-  "bnd %+j%c1\t%l0"
-  [(set_attr "type" "ibr")
-   (set_attr "modrm" "0")
-   (set (attr "length")
-          (if_then_else (and (ge (minus (match_dup 0) (pc))
-                                 (const_int -126))
-                             (lt (minus (match_dup 0) (pc))
-                                 (const_int 128)))
-            (const_int 3)
-            (const_int 7)))])
-
 (define_insn "*jcc_2"
   [(set (pc)
        (if_then_else (match_operator 1 "ix86_comparison_operator"
@@ -11009,16 +10974,17 @@
                      (pc)
                      (label_ref (match_operand 0))))]
   ""
-  "%+j%c1\t%l0"
+  "%!%+j%c1\t%l0"
   [(set_attr "type" "ibr")
    (set_attr "modrm" "0")
-   (set (attr "length")
-          (if_then_else (and (ge (minus (match_dup 0) (pc))
-                                 (const_int -126))
-                             (lt (minus (match_dup 0) (pc))
-                                 (const_int 128)))
-            (const_int 2)
-            (const_int 6)))])
+   (set (attr "length_nobnd")
+       (if_then_else
+         (and (ge (minus (match_dup 0) (pc))
+                  (const_int -126))
+              (lt (minus (match_dup 0) (pc))
+                  (const_int 128)))
+         (const_int 2)
+         (const_int 6)))])
 
 ;; In general it is not safe to assume too much about CCmode registers,
 ;; so simplify-rtx stops when it sees a second one.  Under certain
@@ -11452,35 +11418,21 @@
 
 ;; Unconditional and other jump instructions
 
-(define_insn "jump_bnd"
-  [(set (pc)
-       (label_ref (match_operand 0)))]
-  "TARGET_MPX && ix86_bnd_prefixed_insn_p (insn)"
-  "bnd jmp\t%l0"
-  [(set_attr "type" "ibr")
-   (set (attr "length")
-          (if_then_else (and (ge (minus (match_dup 0) (pc))
-                                 (const_int -126))
-                             (lt (minus (match_dup 0) (pc))
-                                 (const_int 128)))
-            (const_int 3)
-            (const_int 6)))
-   (set_attr "modrm" "0")])
-
 (define_insn "jump"
   [(set (pc)
        (label_ref (match_operand 0)))]
   ""
-  "jmp\t%l0"
+  "%!jmp\t%l0"
   [(set_attr "type" "ibr")
-   (set (attr "length")
-          (if_then_else (and (ge (minus (match_dup 0) (pc))
-                                 (const_int -126))
-                             (lt (minus (match_dup 0) (pc))
-                                 (const_int 128)))
-            (const_int 2)
-            (const_int 5)))
-   (set_attr "modrm" "0")])
+   (set_attr "modrm" "0")
+   (set (attr "length_nobnd")
+       (if_then_else
+         (and (ge (minus (match_dup 0) (pc))
+                  (const_int -126))
+              (lt (minus (match_dup 0) (pc))
+                  (const_int 128)))
+         (const_int 2)
+         (const_int 5)))])
 
 (define_expand "indirect_jump"
   [(set (pc) (match_operand 0 "indirect_branch_operand"))]

Reply via email to