public inbox for gcc-patches@gcc.gnu.org
 help / color / mirror / Atom feed
From: Richard Sandiford <richard.sandiford@arm.com>
To: gcc-patches@gcc.gnu.org
Cc: nickc@redhat.com, richard.earnshaw@arm.com,
	ramana.radhakrishnan@arm.com, kyrylo.tkachov@arm.com
Subject: [PR68432 01/22][ARM] Remove operand dependency from "type" attribute
Date: Wed, 25 Nov 2015 12:23:00 -0000	[thread overview]
Message-ID: <87ziy2i80z.fsf@e105548-lin.cambridge.arm.com> (raw)
In-Reply-To: <874mgajmo9.fsf@e105548-lin.cambridge.arm.com> (Richard	Sandiford's message of "Wed, 25 Nov 2015 12:20:06 +0000")

The "enabled" attribute is supposed to be an invariant property of an
alternative and shouldn't depend on having access to a particular insn.
Although I think ARM honours that, it's not really enforceable at
compile time because "enabled" depends on "type", which in turn depends
on match_operand.  This patch removes the type->match_operand dependency
by splitting alternatives where necessary.  This is needed for the fix to
PR 68432.

Tested as described in the covering note.

gcc/
	* config/arm/arm.md (*arm_addsi3): Split register+immediate
	alternatives and make "type" a constant property of the
	alternative number.
	(*addsi3_carryin_shift_<optab>): Likewise.
	(*subsi3_carryin_shift): Likewise.
	(*rsbsi3_carryin_shift): Likewise.
	(andsi_not_shiftsi_si): Likewise.
	(andsi_not_shiftsi_si_scc_no_reuse): Likewise.
	(andsi_not_shiftsi_si_scc): Likewise.
	(*movhi_insn_arch4): Likewise.
	(*arm_cmpsi_negshiftsi_si): Likewise.
	(*movsicc_insn): Likewise.
	(*cond_move): Likewise.
	(*if_plus_move): Likewise.
	(*if_move_plus): Likewise.
	(*if_arith_move): Likewise.
	(*if_move_arith): Likewise.
	(*if_shift_move): Likewise.
	(*if_move_shift): Likewise.
	(*if_shift_shift): Likewise.
	* config/arm/thumb2.md (*thumb2_movsicc_insn): Likewise.
	(*thumb2_addsi_short): Likewise.
	(thumb2_addsi3_compare0): Likewise.
	(*thumb2_addsi3_compare0_scratch): Likewise.
	(*thumb2_shiftsi3_short): Make "type" a constant property of the
	alternative number.
	* config/arm/neon.md (neon_vc<cmp_op><mode>_insn): Likewise.

diff --git a/gcc/config/arm/arm.md b/gcc/config/arm/arm.md
index 5782b35..40666b4 100644
--- a/gcc/config/arm/arm.md
+++ b/gcc/config/arm/arm.md
@@ -574,9 +574,9 @@
 ;;  (plus (reg rN) (reg sp)) into (reg rN).  In this case reload will
 ;; put the duplicated register first, and not try the commutative version.
 (define_insn_and_split "*arm_addsi3"
-  [(set (match_operand:SI          0 "s_register_operand" "=rk,l,l ,l ,r ,k ,r,r ,k ,r ,k,k,r ,k ,r")
-        (plus:SI (match_operand:SI 1 "s_register_operand" "%0 ,l,0 ,l ,rk,k ,r,rk,k ,rk,k,r,rk,k ,rk")
-                 (match_operand:SI 2 "reg_or_int_operand" "rk ,l,Py,Pd,rI,rI,k,Pj,Pj,L ,L,L,PJ,PJ,?n")))]
+  [(set (match_operand:SI          0 "s_register_operand" "=rk,l,l ,l ,r ,r ,k,k,r,r ,k ,r ,k,k,r ,k ,r")
+        (plus:SI (match_operand:SI 1 "s_register_operand" "%0 ,l,0 ,l ,rk,rk,k,k,r,rk,k ,rk,k,r,rk,k ,rk")
+                 (match_operand:SI 2 "reg_or_int_operand" "rk ,l,Py,Pd,r, I, r,I,k,Pj,Pj,L ,L,L,PJ,PJ,?n")))]
   "TARGET_32BIT"
   "@
    add%?\\t%0, %0, %2
@@ -585,6 +585,8 @@
    add%?\\t%0, %1, %2
    add%?\\t%0, %1, %2
    add%?\\t%0, %1, %2
+   add%?\\t%0, %1, %2
+   add%?\\t%0, %1, %2
    add%?\\t%0, %2, %1
    addw%?\\t%0, %1, %2
    addw%?\\t%0, %1, %2
@@ -605,13 +607,11 @@
 		      operands[1], 0);
   DONE;
   "
-  [(set_attr "length" "2,4,4,4,4,4,4,4,4,4,4,4,4,4,16")
+  [(set_attr "length" "2,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,16")
    (set_attr "predicable" "yes")
-   (set_attr "predicable_short_it" "yes,yes,yes,yes,no,no,no,no,no,no,no,no,no,no,no")
-   (set_attr "arch" "t2,t2,t2,t2,*,*,*,t2,t2,*,*,a,t2,t2,*")
-   (set (attr "type") (if_then_else (match_operand 2 "const_int_operand" "")
-		      (const_string "alu_imm")
-		      (const_string "alu_sreg")))
+   (set_attr "predicable_short_it" "yes,yes,yes,yes,no,no,no,no,no,no,no,no,no,no,no,no,no")
+   (set_attr "arch" "t2,t2,t2,t2,*,*,*,*,*,t2,t2,*,*,a,t2,t2,*")
+   (set_attr "type" "alu_sreg,alu_sreg,alu_imm,alu_imm,alu_sreg,alu_imm,alu_sreg,alu_imm,alu_sreg,alu_imm,alu_imm,alu_imm,alu_imm,alu_imm,alu_imm,alu_imm,alu_imm")
  ]
 )
 
@@ -835,21 +835,19 @@
 )
 
 (define_insn "*addsi3_carryin_shift_<optab>"
-  [(set (match_operand:SI 0 "s_register_operand" "=r")
+  [(set (match_operand:SI 0 "s_register_operand" "=r,r")
 	(plus:SI (plus:SI
 		  (match_operator:SI 2 "shift_operator"
-		    [(match_operand:SI 3 "s_register_operand" "r")
-		     (match_operand:SI 4 "reg_or_int_operand" "rM")])
-		  (match_operand:SI 1 "s_register_operand" "r"))
+		    [(match_operand:SI 3 "s_register_operand" "r,r")
+		     (match_operand:SI 4 "reg_or_int_operand" "r,M")])
+		  (match_operand:SI 1 "s_register_operand" "r,r"))
 		 (LTUGEU:SI (reg:<cnb> CC_REGNUM) (const_int 0))))]
   "TARGET_32BIT"
   "adc%?\\t%0, %1, %3%S2"
   [(set_attr "conds" "use")
    (set_attr "predicable" "yes")
    (set_attr "predicable_short_it" "no")
-   (set (attr "type") (if_then_else (match_operand 4 "const_int_operand" "")
-		      (const_string "alu_shift_imm")
-		      (const_string "alu_shift_reg")))]
+   (set_attr "type" "alu_shift_reg,alu_shift_imm")]
 )
 
 (define_insn "*addsi3_carryin_clobercc_<optab>"
@@ -920,37 +918,33 @@
 )
 
 (define_insn "*subsi3_carryin_shift"
-  [(set (match_operand:SI 0 "s_register_operand" "=r")
+  [(set (match_operand:SI 0 "s_register_operand" "=r,r")
 	(minus:SI (minus:SI
-		  (match_operand:SI 1 "s_register_operand" "r")
+		  (match_operand:SI 1 "s_register_operand" "r,r")
                   (match_operator:SI 2 "shift_operator"
-                   [(match_operand:SI 3 "s_register_operand" "r")
-                    (match_operand:SI 4 "reg_or_int_operand" "rM")]))
+                   [(match_operand:SI 3 "s_register_operand" "r,r")
+                    (match_operand:SI 4 "reg_or_int_operand" "r,M")]))
                  (ltu:SI (reg:CC_C CC_REGNUM) (const_int 0))))]
   "TARGET_32BIT"
   "sbc%?\\t%0, %1, %3%S2"
   [(set_attr "conds" "use")
    (set_attr "predicable" "yes")
-   (set (attr "type") (if_then_else (match_operand 4 "const_int_operand" "")
-		      (const_string "alu_shift_imm")
-                     (const_string "alu_shift_reg")))]
+   (set_attr "type" "alu_shift_reg,alu_shift_imm")]
 )
 
 (define_insn "*rsbsi3_carryin_shift"
-  [(set (match_operand:SI 0 "s_register_operand" "=r")
+  [(set (match_operand:SI 0 "s_register_operand" "=r,r")
 	(minus:SI (minus:SI
                   (match_operator:SI 2 "shift_operator"
-                   [(match_operand:SI 3 "s_register_operand" "r")
-                    (match_operand:SI 4 "reg_or_int_operand" "rM")])
-		   (match_operand:SI 1 "s_register_operand" "r"))
+                   [(match_operand:SI 3 "s_register_operand" "r,r")
+                    (match_operand:SI 4 "reg_or_int_operand" "r,M")])
+		   (match_operand:SI 1 "s_register_operand" "r,r"))
                  (ltu:SI (reg:CC_C CC_REGNUM) (const_int 0))))]
   "TARGET_ARM"
   "rsc%?\\t%0, %1, %3%S2"
   [(set_attr "conds" "use")
    (set_attr "predicable" "yes")
-   (set (attr "type") (if_then_else (match_operand 4 "const_int_operand" "")
-		      (const_string "alu_shift_imm")
-		      (const_string "alu_shift_reg")))]
+   (set_attr "type" "alu_shift_reg,alu_shift_imm")]
 )
 
 ; transform ((x << y) - 1) to ~(~(x-1) << y)  Where X is a constant.
@@ -2772,18 +2766,16 @@
 )
 
 (define_insn "andsi_not_shiftsi_si"
-  [(set (match_operand:SI 0 "s_register_operand" "=r")
+  [(set (match_operand:SI 0 "s_register_operand" "=r,r")
 	(and:SI (not:SI (match_operator:SI 4 "shift_operator"
-			 [(match_operand:SI 2 "s_register_operand" "r")
-			  (match_operand:SI 3 "arm_rhs_operand" "rM")]))
-		(match_operand:SI 1 "s_register_operand" "r")))]
+			 [(match_operand:SI 2 "s_register_operand" "r,r")
+			  (match_operand:SI 3 "arm_rhs_operand" "r,M")]))
+		(match_operand:SI 1 "s_register_operand" "r,r")))]
   "TARGET_ARM"
   "bic%?\\t%0, %1, %2%S4"
   [(set_attr "predicable" "yes")
    (set_attr "shift" "2")
-   (set (attr "type") (if_then_else (match_operand 3 "const_int_operand" "")
-		      (const_string "logic_shift_imm")
-		      (const_string "logic_shift_reg")))]
+   (set_attr "type" "logic_shift_reg,logic_shift_imm")]
 )
 
 ;; Shifted bics pattern used to set up CC status register and not reusing
@@ -2793,20 +2785,18 @@
   [(set (reg:CC_NOOV CC_REGNUM)
 	(compare:CC_NOOV
 		(and:SI (not:SI (match_operator:SI 0 "shift_operator"
-			[(match_operand:SI 1 "s_register_operand" "r")
-			 (match_operand:SI 2 "arm_rhs_operand" "rM")]))
-			(match_operand:SI 3 "s_register_operand" "r"))
+			[(match_operand:SI 1 "s_register_operand" "r,r")
+			 (match_operand:SI 2 "arm_rhs_operand" "r,M")]))
+			(match_operand:SI 3 "s_register_operand" "r,r"))
 		(const_int 0)))
-   (clobber (match_scratch:SI 4 "=r"))]
+   (clobber (match_scratch:SI 4 "=r,r"))]
   "TARGET_ARM || (TARGET_THUMB2 && CONST_INT_P (operands[2]))"
   "bics%?\\t%4, %3, %1%S0"
   [(set_attr "predicable" "yes")
    (set_attr "predicable_short_it" "no")
    (set_attr "conds" "set")
    (set_attr "shift" "1")
-   (set (attr "type") (if_then_else (match_operand 2 "const_int_operand" "")
-		      (const_string "logic_shift_imm")
-		      (const_string "logic_shift_reg")))]
+   (set_attr "type" "logic_shift_reg,logic_shift_imm")]
 )
 
 ;; Same as andsi_not_shiftsi_si_scc_no_reuse, but the bics result is also
@@ -2815,11 +2805,11 @@
   [(parallel [(set (reg:CC_NOOV CC_REGNUM)
 	(compare:CC_NOOV
 		(and:SI (not:SI (match_operator:SI 0 "shift_operator"
-			[(match_operand:SI 1 "s_register_operand" "r")
-			 (match_operand:SI 2 "arm_rhs_operand" "rM")]))
-			(match_operand:SI 3 "s_register_operand" "r"))
+			[(match_operand:SI 1 "s_register_operand" "r,r")
+			 (match_operand:SI 2 "arm_rhs_operand" "r,M")]))
+			(match_operand:SI 3 "s_register_operand" "r,r"))
 		(const_int 0)))
-	(set (match_operand:SI 4 "s_register_operand" "=r")
+	(set (match_operand:SI 4 "s_register_operand" "=r,r")
 	     (and:SI (not:SI (match_op_dup 0
 		     [(match_dup 1)
 		      (match_dup 2)]))
@@ -2830,9 +2820,7 @@
    (set_attr "predicable_short_it" "no")
    (set_attr "conds" "set")
    (set_attr "shift" "1")
-   (set (attr "type") (if_then_else (match_operand 2 "const_int_operand" "")
-		      (const_string "logic_shift_imm")
-		      (const_string "logic_shift_reg")))]
+   (set_attr "type" "logic_shift_reg,logic_shift_imm")]
 )
 
 (define_insn "*andsi_notsi_si_compare0"
@@ -6343,30 +6331,24 @@
 
 ;; Pattern to recognize insn generated default case above
 (define_insn "*movhi_insn_arch4"
-  [(set (match_operand:HI 0 "nonimmediate_operand" "=r,r,r,m,r")
-	(match_operand:HI 1 "general_operand"      "rIk,K,n,r,mi"))]
+  [(set (match_operand:HI 0 "nonimmediate_operand" "=r,r,r,r,m,r")
+	(match_operand:HI 1 "general_operand"      "rk,I,K,n,r,mi"))]
   "TARGET_ARM
    && arm_arch4
    && (register_operand (operands[0], HImode)
        || register_operand (operands[1], HImode))"
   "@
    mov%?\\t%0, %1\\t%@ movhi
+   mov%?\\t%0, %1\\t%@ movhi
    mvn%?\\t%0, #%B1\\t%@ movhi
    movw%?\\t%0, %L1\\t%@ movhi
    strh%?\\t%1, %0\\t%@ movhi
    ldrh%?\\t%0, %1\\t%@ movhi"
   [(set_attr "predicable" "yes")
-   (set_attr "pool_range" "*,*,*,*,256")
-   (set_attr "neg_pool_range" "*,*,*,*,244")
-   (set_attr "arch" "*,*,v6t2,*,*")
-   (set_attr_alternative "type"
-                         [(if_then_else (match_operand 1 "const_int_operand" "")
-                                        (const_string "mov_imm" )
-                                        (const_string "mov_reg"))
-                          (const_string "mvn_imm")
-                          (const_string "mov_imm")
-                          (const_string "store1")
-                          (const_string "load1")])]
+   (set_attr "pool_range" "*,*,*,*,*,256")
+   (set_attr "neg_pool_range" "*,*,*,*,*,244")
+   (set_attr "arch" "*,*,*,v6t2,*,*")
+   (set_attr "type" "mov_reg,mov_imm,mvn_imm,mov_imm,store1,load1")]
 )
 
 (define_insn "*movhi_bytes"
@@ -6964,15 +6946,13 @@
   [(set (reg:CC_Z CC_REGNUM)
 	(compare:CC_Z
 	 (neg:SI (match_operator:SI 1 "shift_operator"
-		    [(match_operand:SI 2 "s_register_operand" "r")
-		     (match_operand:SI 3 "reg_or_int_operand" "rM")]))
-	 (match_operand:SI 0 "s_register_operand" "r")))]
+		    [(match_operand:SI 2 "s_register_operand" "r,r")
+		     (match_operand:SI 3 "reg_or_int_operand" "r,M")]))
+	 (match_operand:SI 0 "s_register_operand" "r,r")))]
   "TARGET_ARM"
   "cmn%?\\t%0, %2%S1"
   [(set_attr "conds" "set")
-   (set (attr "type") (if_then_else (match_operand 3 "const_int_operand" "")
-				    (const_string "alus_shift_imm")
-				    (const_string "alus_shift_reg")))
+   (set_attr "type" "alus_shift_reg,alus_shift_imm")
    (set_attr "predicable" "yes")]
 )
 
@@ -7489,17 +7469,19 @@
 )
 
 (define_insn_and_split "*movsicc_insn"
-  [(set (match_operand:SI 0 "s_register_operand" "=r,r,r,r,r,r,r,r")
+  [(set (match_operand:SI 0 "s_register_operand" "=r,r,r,r,r,r,r,r,r,r")
 	(if_then_else:SI
 	 (match_operator 3 "arm_comparison_operator"
 	  [(match_operand 4 "cc_register" "") (const_int 0)])
-	 (match_operand:SI 1 "arm_not_operand" "0,0,rI,K,rI,rI,K,K")
-	 (match_operand:SI 2 "arm_not_operand" "rI,K,0,0,rI,K,rI,K")))]
+	 (match_operand:SI 1 "arm_not_operand" "0,0,0,r,I,K,rI,rI,K,K")
+	 (match_operand:SI 2 "arm_not_operand" "r,I,K,0,0,0,rI,K,rI,K")))]
   "TARGET_ARM"
   "@
    mov%D3\\t%0, %2
+   mov%D3\\t%0, %2
    mvn%D3\\t%0, #%B2
    mov%d3\\t%0, %1
+   mov%d3\\t%0, %1
    mvn%d3\\t%0, #%B1
    #
    #
@@ -7536,21 +7518,9 @@
                                   gen_rtx_SET (operands[0], operands[2])));
     DONE;
   }
-  [(set_attr "length" "4,4,4,4,8,8,8,8")
+  [(set_attr "length" "4,4,4,4,4,4,8,8,8,8")
    (set_attr "conds" "use")
-   (set_attr_alternative "type"
-                         [(if_then_else (match_operand 2 "const_int_operand" "")
-                                        (const_string "mov_imm")
-                                        (const_string "mov_reg"))
-                          (const_string "mvn_imm")
-                          (if_then_else (match_operand 1 "const_int_operand" "")
-                                        (const_string "mov_imm")
-                                        (const_string "mov_reg"))
-                          (const_string "mvn_imm")
-                          (const_string "multiple")
-                          (const_string "multiple")
-                          (const_string "multiple")
-                          (const_string "multiple")])]
+   (set_attr "type" "mov_reg,mov_imm,mvn_imm,mov_reg,mov_imm,mvn_imm,multiple,multiple,multiple,multiple")]
 )
 
 (define_insn "*movsfcc_soft_insn"
@@ -8713,39 +8683,32 @@
   ")
 
 (define_insn "*cond_move"
-  [(set (match_operand:SI 0 "s_register_operand" "=r,r,r")
+  [(set (match_operand:SI 0 "s_register_operand" "=r,r,r,r,r")
 	(if_then_else:SI (match_operator 3 "equality_operator"
 			  [(match_operator 4 "arm_comparison_operator"
 			    [(match_operand 5 "cc_register" "") (const_int 0)])
 			   (const_int 0)])
-			 (match_operand:SI 1 "arm_rhs_operand" "0,rI,?rI")
-			 (match_operand:SI 2 "arm_rhs_operand" "rI,0,rI")))]
+			 (match_operand:SI 1 "arm_rhs_operand" "0,0,r,I,?rI")
+			 (match_operand:SI 2 "arm_rhs_operand" "r,I,0,0,rI")))]
   "TARGET_ARM"
   "*
     if (GET_CODE (operands[3]) == NE)
       {
-        if (which_alternative != 1)
+        if (which_alternative != 2 && which_alternative != 3)
 	  output_asm_insn (\"mov%D4\\t%0, %2\", operands);
-        if (which_alternative != 0)
+        if (which_alternative != 0 && which_alternative != 1)
 	  output_asm_insn (\"mov%d4\\t%0, %1\", operands);
         return \"\";
       }
-    if (which_alternative != 0)
+    if (which_alternative != 0 && which_alternative != 1)
       output_asm_insn (\"mov%D4\\t%0, %1\", operands);
-    if (which_alternative != 1)
+    if (which_alternative != 2 && which_alternative != 3)
       output_asm_insn (\"mov%d4\\t%0, %2\", operands);
     return \"\";
   "
   [(set_attr "conds" "use")
-   (set_attr_alternative "type"
-                         [(if_then_else (match_operand 2 "const_int_operand" "")
-                                        (const_string "mov_imm")
-                                        (const_string "mov_reg"))
-                          (if_then_else (match_operand 1 "const_int_operand" "")
-                                        (const_string "mov_imm")
-                                        (const_string "mov_reg"))
-                          (const_string "multiple")])
-   (set_attr "length" "4,4,8")]
+   (set_attr "type" "mov_reg,mov_imm,mov_reg,mov_imm,multiple")
+   (set_attr "length" "4,4,4,4,8")]
 )
 
 (define_insn "*cond_arith"
@@ -9515,29 +9478,24 @@
 )
 
 (define_insn "*if_plus_move"
-  [(set (match_operand:SI 0 "s_register_operand" "=r,r,r,r")
+  [(set (match_operand:SI 0 "s_register_operand" "=r,r,r,r,r")
 	(if_then_else:SI
 	 (match_operator 4 "arm_comparison_operator"
 	  [(match_operand 5 "cc_register" "") (const_int 0)])
 	 (plus:SI
-	  (match_operand:SI 2 "s_register_operand" "r,r,r,r")
-	  (match_operand:SI 3 "arm_add_operand" "rI,L,rI,L"))
-	 (match_operand:SI 1 "arm_rhs_operand" "0,0,?rI,?rI")))]
+	  (match_operand:SI 2 "s_register_operand" "r,r,r,r,r")
+	  (match_operand:SI 3 "arm_add_operand" "r,I,L,rI,L"))
+	 (match_operand:SI 1 "arm_rhs_operand" "0,0,0,?rI,?rI")))]
   "TARGET_ARM"
   "@
    add%d4\\t%0, %2, %3
+   add%d4\\t%0, %2, %3
    sub%d4\\t%0, %2, #%n3
    add%d4\\t%0, %2, %3\;mov%D4\\t%0, %1
    sub%d4\\t%0, %2, #%n3\;mov%D4\\t%0, %1"
   [(set_attr "conds" "use")
-   (set_attr "length" "4,4,8,8")
-   (set_attr_alternative "type"
-                         [(if_then_else (match_operand 3 "const_int_operand" "")
-                                        (const_string "alu_imm" )
-                                        (const_string "alu_sreg"))
-                          (const_string "alu_imm")
-                          (const_string "multiple")
-                          (const_string "multiple")])]
+   (set_attr "length" "4,4,4,8,8")
+   (set_attr "type" "alu_sreg,alu_imm,alu_imm,multiple,multiple")]
 )
 
 (define_insn "*ifcompare_move_plus"
@@ -9558,29 +9516,24 @@
 )
 
 (define_insn "*if_move_plus"
-  [(set (match_operand:SI 0 "s_register_operand" "=r,r,r,r")
+  [(set (match_operand:SI 0 "s_register_operand" "=r,r,r,r,r")
 	(if_then_else:SI
 	 (match_operator 4 "arm_comparison_operator"
 	  [(match_operand 5 "cc_register" "") (const_int 0)])
-	 (match_operand:SI 1 "arm_rhs_operand" "0,0,?rI,?rI")
+	 (match_operand:SI 1 "arm_rhs_operand" "0,0,0,?rI,?rI")
 	 (plus:SI
-	  (match_operand:SI 2 "s_register_operand" "r,r,r,r")
-	  (match_operand:SI 3 "arm_add_operand" "rI,L,rI,L"))))]
+	  (match_operand:SI 2 "s_register_operand" "r,r,r,r,r")
+	  (match_operand:SI 3 "arm_add_operand" "r,I,L,rI,L"))))]
   "TARGET_ARM"
   "@
    add%D4\\t%0, %2, %3
+   add%D4\\t%0, %2, %3
    sub%D4\\t%0, %2, #%n3
    add%D4\\t%0, %2, %3\;mov%d4\\t%0, %1
    sub%D4\\t%0, %2, #%n3\;mov%d4\\t%0, %1"
   [(set_attr "conds" "use")
-   (set_attr "length" "4,4,8,8")
-   (set_attr_alternative "type"
-                         [(if_then_else (match_operand 3 "const_int_operand" "")
-                                        (const_string "alu_imm" )
-                                        (const_string "alu_sreg"))
-                          (const_string "alu_imm")
-                          (const_string "multiple")
-                          (const_string "multiple")])]
+   (set_attr "length" "4,4,4,8,8")
+   (set_attr "type" "alu_sreg,alu_imm,alu_imm,multiple,multiple")]
 )
 
 (define_insn "*ifcompare_arith_arith"
@@ -9662,24 +9615,21 @@
 )
 
 (define_insn "*if_arith_move"
-  [(set (match_operand:SI 0 "s_register_operand" "=r,r")
+  [(set (match_operand:SI 0 "s_register_operand" "=r,r,r")
 	(if_then_else:SI (match_operator 4 "arm_comparison_operator"
 			  [(match_operand 6 "cc_register" "") (const_int 0)])
 			 (match_operator:SI 5 "shiftable_operator"
-			  [(match_operand:SI 2 "s_register_operand" "r,r")
-			   (match_operand:SI 3 "arm_rhs_operand" "rI,rI")])
-			 (match_operand:SI 1 "arm_rhs_operand" "0,?rI")))]
+			  [(match_operand:SI 2 "s_register_operand" "r,r,r")
+			   (match_operand:SI 3 "arm_rhs_operand" "r,I,rI")])
+			 (match_operand:SI 1 "arm_rhs_operand" "0,0,?rI")))]
   "TARGET_ARM"
   "@
    %I5%d4\\t%0, %2, %3
+   %I5%d4\\t%0, %2, %3
    %I5%d4\\t%0, %2, %3\;mov%D4\\t%0, %1"
   [(set_attr "conds" "use")
-   (set_attr "length" "4,8")
-   (set_attr_alternative "type"
-                         [(if_then_else (match_operand 3 "const_int_operand" "")
-                                        (const_string "alu_shift_imm" )
-                                        (const_string "alu_shift_reg"))
-                          (const_string "multiple")])]
+   (set_attr "length" "4,4,8")
+   (set_attr "type" "alu_shift_reg,alu_shift_imm,multiple")]
 )
 
 (define_insn "*ifcompare_move_arith"
@@ -9726,25 +9676,22 @@
 )
 
 (define_insn "*if_move_arith"
-  [(set (match_operand:SI 0 "s_register_operand" "=r,r")
+  [(set (match_operand:SI 0 "s_register_operand" "=r,r,r")
 	(if_then_else:SI
 	 (match_operator 4 "arm_comparison_operator"
 	  [(match_operand 6 "cc_register" "") (const_int 0)])
-	 (match_operand:SI 1 "arm_rhs_operand" "0,?rI")
+	 (match_operand:SI 1 "arm_rhs_operand" "0,0,?rI")
 	 (match_operator:SI 5 "shiftable_operator"
-	  [(match_operand:SI 2 "s_register_operand" "r,r")
-	   (match_operand:SI 3 "arm_rhs_operand" "rI,rI")])))]
+	  [(match_operand:SI 2 "s_register_operand" "r,r,r")
+	   (match_operand:SI 3 "arm_rhs_operand" "r,I,rI")])))]
   "TARGET_ARM"
   "@
    %I5%D4\\t%0, %2, %3
+   %I5%D4\\t%0, %2, %3
    %I5%D4\\t%0, %2, %3\;mov%d4\\t%0, %1"
   [(set_attr "conds" "use")
-   (set_attr "length" "4,8")
-   (set_attr_alternative "type"
-                         [(if_then_else (match_operand 3 "const_int_operand" "")
-                                        (const_string "alu_shift_imm" )
-                                        (const_string "alu_shift_reg"))
-                          (const_string "multiple")])]
+   (set_attr "length" "4,4,8")
+   (set_attr "type" "alu_shift_reg,alu_shift_imm,multiple")]
 )
 
 (define_insn "*ifcompare_move_not"
@@ -9835,28 +9782,24 @@
 )
 
 (define_insn "*if_shift_move"
-  [(set (match_operand:SI 0 "s_register_operand" "=r,r,r")
+  [(set (match_operand:SI 0 "s_register_operand" "=r,r,r,r")
 	(if_then_else:SI
 	 (match_operator 5 "arm_comparison_operator"
 	  [(match_operand 6 "cc_register" "") (const_int 0)])
 	 (match_operator:SI 4 "shift_operator"
-	  [(match_operand:SI 2 "s_register_operand" "r,r,r")
-	   (match_operand:SI 3 "arm_rhs_operand" "rM,rM,rM")])
-	 (match_operand:SI 1 "arm_not_operand" "0,?rI,K")))]
+	  [(match_operand:SI 2 "s_register_operand" "r,r,r,r")
+	   (match_operand:SI 3 "arm_rhs_operand" "r,M,rM,rM")])
+	 (match_operand:SI 1 "arm_not_operand" "0,0,?rI,K")))]
   "TARGET_ARM"
   "@
    mov%d5\\t%0, %2%S4
+   mov%d5\\t%0, %2%S4
    mov%D5\\t%0, %1\;mov%d5\\t%0, %2%S4
    mvn%D5\\t%0, #%B1\;mov%d5\\t%0, %2%S4"
   [(set_attr "conds" "use")
    (set_attr "shift" "2")
-   (set_attr "length" "4,8,8")
-   (set_attr_alternative "type"
-                         [(if_then_else (match_operand 3 "const_int_operand" "")
-                                        (const_string "mov_shift" )
-                                        (const_string "mov_shift_reg"))
-                          (const_string "multiple")
-                          (const_string "multiple")])]
+   (set_attr "length" "4,4,8,8")
+   (set_attr "type" "mov_shift_reg,mov_shift,multiple,multiple")]
 )
 
 (define_insn "*ifcompare_move_shift"
@@ -9878,28 +9821,24 @@
 )
 
 (define_insn "*if_move_shift"
-  [(set (match_operand:SI 0 "s_register_operand" "=r,r,r")
+  [(set (match_operand:SI 0 "s_register_operand" "=r,r,r,r")
 	(if_then_else:SI
 	 (match_operator 5 "arm_comparison_operator"
 	  [(match_operand 6 "cc_register" "") (const_int 0)])
-	 (match_operand:SI 1 "arm_not_operand" "0,?rI,K")
+	 (match_operand:SI 1 "arm_not_operand" "0,0,?rI,K")
 	 (match_operator:SI 4 "shift_operator"
-	  [(match_operand:SI 2 "s_register_operand" "r,r,r")
-	   (match_operand:SI 3 "arm_rhs_operand" "rM,rM,rM")])))]
+	  [(match_operand:SI 2 "s_register_operand" "r,r,r,r")
+	   (match_operand:SI 3 "arm_rhs_operand" "r,M,rM,rM")])))]
   "TARGET_ARM"
   "@
    mov%D5\\t%0, %2%S4
+   mov%D5\\t%0, %2%S4
    mov%d5\\t%0, %1\;mov%D5\\t%0, %2%S4
    mvn%d5\\t%0, #%B1\;mov%D5\\t%0, %2%S4"
   [(set_attr "conds" "use")
    (set_attr "shift" "2")
-   (set_attr "length" "4,8,8")
-   (set_attr_alternative "type"
-                         [(if_then_else (match_operand 3 "const_int_operand" "")
-                                        (const_string "mov_shift" )
-                                        (const_string "mov_shift_reg"))
-                          (const_string "multiple")
-                          (const_string "multiple")])]
+   (set_attr "length" "4,4,8,8")
+   (set_attr "type" "mov_shift_reg,mov_shift,multiple,multiple")]
 )
 
 (define_insn "*ifcompare_shift_shift"
@@ -9923,26 +9862,22 @@
 )
 
 (define_insn "*if_shift_shift"
-  [(set (match_operand:SI 0 "s_register_operand" "=r")
+  [(set (match_operand:SI 0 "s_register_operand" "=r,r,r,r")
 	(if_then_else:SI
 	 (match_operator 5 "arm_comparison_operator"
 	  [(match_operand 8 "cc_register" "") (const_int 0)])
 	 (match_operator:SI 6 "shift_operator"
-	  [(match_operand:SI 1 "s_register_operand" "r")
-	   (match_operand:SI 2 "arm_rhs_operand" "rM")])
+	  [(match_operand:SI 1 "s_register_operand" "r,r,r,r")
+	   (match_operand:SI 2 "arm_rhs_operand" "r,r,M,M")])
 	 (match_operator:SI 7 "shift_operator"
-	  [(match_operand:SI 3 "s_register_operand" "r")
-	   (match_operand:SI 4 "arm_rhs_operand" "rM")])))]
+	  [(match_operand:SI 3 "s_register_operand" "r,r,r,r")
+	   (match_operand:SI 4 "arm_rhs_operand" "r,M,r,M")])))]
   "TARGET_ARM"
   "mov%d5\\t%0, %1%S6\;mov%D5\\t%0, %3%S7"
   [(set_attr "conds" "use")
    (set_attr "shift" "1")
    (set_attr "length" "8")
-   (set (attr "type") (if_then_else
-		        (and (match_operand 2 "const_int_operand" "")
-                             (match_operand 4 "const_int_operand" ""))
-		      (const_string "mov_shift")
-		      (const_string "mov_shift_reg")))]
+   (set_attr "type" "mov_shift_reg,mov_shift_reg,mov_shift_reg,mov_shift")]
 )
 
 (define_insn "*ifcompare_not_arith"
diff --git a/gcc/config/arm/neon.md b/gcc/config/arm/neon.md
index 62fb6da..a346927 100644
--- a/gcc/config/arm/neon.md
+++ b/gcc/config/arm/neon.md
@@ -2196,10 +2196,7 @@
     output_asm_insn (pattern, operands);
     return "";
   }
-  [(set (attr "type")
-        (if_then_else (match_operand 2 "zero_operand")
-                      (const_string "neon_compare_zero<q>")
-                      (const_string "neon_compare<q>")))]
+  [(set_attr "type" "neon_compare<q>,neon_compare_zero<q>")]
 )
 
 (define_insn "neon_vc<cmp_op_unsp><mode>_insn_unspec"
diff --git a/gcc/config/arm/thumb2.md b/gcc/config/arm/thumb2.md
index a724752..c7beda4 100644
--- a/gcc/config/arm/thumb2.md
+++ b/gcc/config/arm/thumb2.md
@@ -478,19 +478,23 @@
 )
 
 (define_insn_and_split "*thumb2_movsicc_insn"
-  [(set (match_operand:SI 0 "s_register_operand" "=l,l,r,r,r,r,r,r,r,r,r,r")
+  [(set (match_operand:SI 0 "s_register_operand" "=l,l,l,l,r,r,r,r,r,r,r,r,r,r,r,r")
 	(if_then_else:SI
 	 (match_operator 3 "arm_comparison_operator"
 	  [(match_operand 4 "cc_register" "") (const_int 0)])
-	 (match_operand:SI 1 "arm_not_operand" "0 ,lPy,0 ,0,rI,K,I ,r,rI,K ,K,r")
-	 (match_operand:SI 2 "arm_not_operand" "lPy,0 ,rI,K,0 ,0,rI,I,K ,rI,K,r")))]
+	 (match_operand:SI 1 "arm_not_operand" "0,0 ,l,Py,0,0,0,r,I,K,I ,r,rI,K ,K,r")
+	 (match_operand:SI 2 "arm_not_operand" "l,Py,0,0 ,r,I,K,0,0,0,rI,I,K ,rI,K,r")))]
   "TARGET_THUMB2"
   "@
    it\\t%D3\;mov%D3\\t%0, %2
+   it\\t%D3\;mov%D3\\t%0, %2
+   it\\t%d3\;mov%d3\\t%0, %1
    it\\t%d3\;mov%d3\\t%0, %1
    it\\t%D3\;mov%D3\\t%0, %2
+   it\\t%D3\;mov%D3\\t%0, %2
    it\\t%D3\;mvn%D3\\t%0, #%B2
    it\\t%d3\;mov%d3\\t%0, %1
+   it\\t%d3\;mov%d3\\t%0, %1
    it\\t%d3\;mvn%d3\\t%0, #%B1
    #
    #
@@ -530,30 +534,10 @@
                                   gen_rtx_SET (operands[0], operands[2])));
     DONE;
   }
-  [(set_attr "length" "4,4,6,6,6,6,10,8,10,10,10,6")
-   (set_attr "enabled_for_depr_it" "yes,yes,no,no,no,no,no,no,no,no,no,yes")
+  [(set_attr "length" "4,4,4,4,6,6,6,6,6,6,10,8,10,10,10,6")
+   (set_attr "enabled_for_depr_it" "yes,yes,yes,yes,no,no,no,no,no,no,no,no,no,no,no,yes")
    (set_attr "conds" "use")
-   (set_attr_alternative "type"
-                         [(if_then_else (match_operand 2 "const_int_operand" "")
-                                        (const_string "mov_imm")
-                                        (const_string "mov_reg"))
-                          (if_then_else (match_operand 1 "const_int_operand" "")
-                                        (const_string "mov_imm")
-                                        (const_string "mov_reg"))
-                          (if_then_else (match_operand 2 "const_int_operand" "")
-                                        (const_string "mov_imm")
-                                        (const_string "mov_reg"))
-                          (const_string "mvn_imm")
-                          (if_then_else (match_operand 1 "const_int_operand" "")
-                                        (const_string "mov_imm")
-                                        (const_string "mov_reg"))
-                          (const_string "mvn_imm")
-                          (const_string "multiple")
-                          (const_string "multiple")
-                          (const_string "multiple")
-                          (const_string "multiple")
-                          (const_string "multiple")
-                          (const_string "multiple")])]
+   (set_attr "type" "mov_reg,mov_imm,mov_reg,mov_imm,mov_reg,mov_imm,mvn_imm,mov_reg,mov_imm,mvn_imm,multiple,multiple,multiple,multiple,multiple,multiple")]
 )
 
 (define_insn "*thumb2_movsfcc_soft_insn"
@@ -1152,9 +1136,7 @@
   [(set_attr "predicable" "yes")
    (set_attr "shift" "1")
    (set_attr "length" "2")
-   (set (attr "type") (if_then_else (match_operand 2 "const_int_operand" "")
-		      (const_string "alu_shift_imm")
-		      (const_string "alu_shift_reg")))]
+   (set_attr "type" "alu_shift_reg,alu_shift_imm")]
 )
 
 (define_insn "*thumb2_mov<mode>_shortim"
@@ -1169,9 +1151,9 @@
 )
 
 (define_insn "*thumb2_addsi_short"
-  [(set (match_operand:SI 0 "low_register_operand" "=l,l")
-	(plus:SI (match_operand:SI 1 "low_register_operand" "l,0")
-		 (match_operand:SI 2 "low_reg_or_int_operand" "lPt,Ps")))
+  [(set (match_operand:SI 0 "low_register_operand" "=l,l,l")
+	(plus:SI (match_operand:SI 1 "low_register_operand" "l,l,0")
+		 (match_operand:SI 2 "low_reg_or_int_operand" "l,Pt,Ps")))
    (clobber (reg:CC CC_REGNUM))]
   "TARGET_THUMB2 && reload_completed"
   "*
@@ -1190,11 +1172,7 @@
   "
   [(set_attr "predicable" "yes")
    (set_attr "length" "2")
-   (set_attr_alternative "type"
-                         [(if_then_else (match_operand 2 "const_int_operand" "")
-                                        (const_string "alu_imm")
-                                        (const_string "alu_sreg"))
-                          (const_string "alu_imm")])]
+   (set_attr "type" "alu_sreg,alu_imm,alu_imm")]
 )
 
 (define_insn "*thumb2_subsi_short"
@@ -1238,10 +1216,10 @@
 (define_insn "thumb2_addsi3_compare0"
   [(set (reg:CC_NOOV CC_REGNUM)
 	(compare:CC_NOOV
-	  (plus:SI (match_operand:SI 1 "s_register_operand" "l,  0, r")
-		   (match_operand:SI 2 "arm_add_operand"    "lPt,Ps,rIL"))
+	  (plus:SI (match_operand:SI 1 "s_register_operand" "l,l, 0, r,r")
+		   (match_operand:SI 2 "arm_add_operand"    "l,Pt,Ps,r,IL"))
 	  (const_int 0)))
-   (set (match_operand:SI 0 "s_register_operand" "=l,l,r")
+   (set (match_operand:SI 0 "s_register_operand" "=l,l,l,r,r")
 	(plus:SI (match_dup 1) (match_dup 2)))]
   "TARGET_THUMB2"
   "*
@@ -1258,22 +1236,15 @@
       return \"adds\\t%0, %1, %2\";
   "
   [(set_attr "conds" "set")
-   (set_attr "length" "2,2,4")
-   (set_attr_alternative "type"
-                         [(if_then_else (match_operand 2 "const_int_operand" "")
-                                        (const_string "alus_imm")
-                                        (const_string "alus_sreg"))
-                          (const_string "alus_imm")
-                          (if_then_else (match_operand 2 "const_int_operand" "")
-                                        (const_string "alus_imm")
-                                        (const_string "alus_sreg"))])]
+   (set_attr "length" "2,2,2,4,4")
+   (set_attr "type" "alus_sreg,alus_imm,alus_imm,alus_sreg,alus_imm")]
 )
 
 (define_insn "*thumb2_addsi3_compare0_scratch"
   [(set (reg:CC_NOOV CC_REGNUM)
 	(compare:CC_NOOV
-	  (plus:SI (match_operand:SI 0 "s_register_operand" "l,  r")
-		   (match_operand:SI 1 "arm_add_operand"    "lPv,rIL"))
+	  (plus:SI (match_operand:SI 0 "s_register_operand" "l,l, r,r")
+		   (match_operand:SI 1 "arm_add_operand"    "l,Pv,r,IL"))
 	  (const_int 0)))]
   "TARGET_THUMB2"
   "*
@@ -1290,10 +1261,8 @@
       return \"cmn\\t%0, %1\";
   "
   [(set_attr "conds" "set")
-   (set_attr "length" "2,4")
-   (set (attr "type") (if_then_else (match_operand 1 "const_int_operand" "")
-                                    (const_string "alus_imm")
-                                    (const_string "alus_sreg")))]
+   (set_attr "length" "2,2,4,4")
+   (set_attr "type" "alus_sreg,alus_imm,alus_sreg,alus_imm")]
 )
 
 (define_insn "*thumb2_mulsi_short"

  reply	other threads:[~2015-11-25 12:22 UTC|newest]

Thread overview: 45+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-11-25 12:22 [PR68432 00/26] Handle size/speed choices for internal functions Richard Sandiford
2015-11-25 12:23 ` Richard Sandiford [this message]
2015-11-25 13:55   ` [PR68432 01/22][ARM] Remove operand dependency from "type" attribute Bernd Schmidt
2015-11-25 14:11     ` Yvan Roux
2015-11-25 12:24 ` [PR68432 02/22][ARM] Remove operand dependency from use_literal_pool Richard Sandiford
2015-11-25 12:26 ` [PR68432 03/22][NDS32] Remove "length" dependency from "enabled" attribute Richard Sandiford
2015-11-25 12:28 ` [PR68432 04/22] Remove global which_alternative Richard Sandiford
2015-11-25 16:09   ` Bernd Schmidt
2015-11-25 16:21     ` Richard Sandiford
2015-11-25 16:42       ` Bernd Schmidt
2015-11-25 16:50         ` Richard Sandiford
2015-11-25 12:29 ` [PR68432 06/22] Use code,alternative attributes for aarch64 Richard Sandiford
2015-11-25 12:29 ` [PR68432 05/22] Add support attributes that operate on insn codes Richard Sandiford
2015-11-25 12:30 ` [PR68432 07/22] Use code,alternative attributes for alpha Richard Sandiford
2015-11-25 12:30 ` [PR68432 10/22] Use code,alternative attributes for avr Richard Sandiford
2015-11-25 12:31 ` [PR68432 09/22] Use code,alternative attributes for arm Richard Sandiford
2015-11-25 12:31 ` [PR68432 12/22] Use code,alternative attributes for i386 Richard Sandiford
2015-11-25 12:31 ` [PR68432 11/22] Use code,alternative attributes for c6x Richard Sandiford
2015-11-25 12:31 ` [PR68432 08/22] Use code,alternative attributes for arc Richard Sandiford
2015-11-25 12:32 ` [PR68432 15/22] Use code,alternative attributes for mn10300 Richard Sandiford
2015-11-25 12:32 ` [PR68432 14/22] Use code,alternative attributes for mips Richard Sandiford
2015-11-25 12:32 ` [PR68432 13/22] Use code,alternative attributes for m68k Richard Sandiford
2015-11-25 12:33 ` [PR68432 16/22] Use code,alternative attributes for nds32 Richard Sandiford
2015-11-25 12:33 ` [PR68432 17/22] Use code,alternative attributes for s390 Richard Sandiford
2015-11-25 12:34 ` [PR68432 18/22] Use code,alternative attributes for sparc Richard Sandiford
2015-11-25 12:35 ` [PR68432 19/22] Use code,alternative for bool_attrs Richard Sandiford
2015-11-25 12:36 ` [PR68432 20/22] Record attributes for define_expand Richard Sandiford
2015-11-25 15:55   ` Bernd Schmidt
2015-11-25 16:09     ` Richard Sandiford
2015-11-26 14:29       ` Bernd Schmidt
2015-11-25 12:37 ` [PR68432 21/22] Pass optimization type to direct_internal_fn_supported_p Richard Sandiford
2015-11-25 12:38 ` [PR68432 22/22] Use preferred_for_size in i386 internal fn optabs Richard Sandiford
2015-11-25 12:51 ` [PR68432 00/26] Handle size/speed choices for internal functions Richard Biener
2015-11-25 13:47   ` Richard Sandiford
2015-11-26 14:21 ` Bernd Schmidt
2015-11-26 15:43   ` Richard Sandiford
2015-11-26 16:10     ` Bernd Schmidt
2015-11-26 16:26       ` Richard Sandiford
2015-11-26 16:45         ` Bernd Schmidt
2015-11-26 17:10           ` Richard Sandiford
2015-12-01 11:54         ` Bernd Schmidt
2015-12-01 12:17           ` Richard Biener
2015-12-01 12:21             ` Bernd Schmidt
2015-12-01 13:43           ` Richard Sandiford
2015-12-01 13:59             ` Bernd Schmidt

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=87ziy2i80z.fsf@e105548-lin.cambridge.arm.com \
    --to=richard.sandiford@arm.com \
    --cc=gcc-patches@gcc.gnu.org \
    --cc=kyrylo.tkachov@arm.com \
    --cc=nickc@redhat.com \
    --cc=ramana.radhakrishnan@arm.com \
    --cc=richard.earnshaw@arm.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).