[PATCH][ARM][11/n] Partial IT block deprecation in ARMv8 AArch32 - final arm.md changes

Richard Earnshaw rearnsha@arm.com
Tue Jul 2 10:54:00 GMT 2013


On 21/06/13 11:53, Kyrylo Tkachov wrote:
> Hi all,
>
> This is the final patch in the series. It adjusts patterns in arm.md that do
> arithmetic operations and comparisons. We add alternatives for 16-bit
> encodings to the patterns. Some alternatives and patterns are disabled for
> arm_restrict_it or their cond_exec variants.
>
> The "Pd" constraint is relaxed to match for any Thumb target, not just Thumb1,
> because the 0<= i <=7 range comes in handy in the add and subtract patterns. A
> new Pz constraint is created that is needed to define the (rsb rd, rn, #0)
> variant of subtraction, the only variant of rsb that can be encoded in 16
> bits.
>
>
> Bootstrapped on a Cortex-A15, tested on model and qemu with ARMv7 and ARMv8
> architecture levels.
>
> Ok for trunk?
>
> Thanks,
> Kyrill
>
>
> 2013-06-21  Kyrylo Tkachov  <kyrylo.tkachov@arm.com>
>
> 	* config/arm/constraints.md (Pd): Allow TARGET_THUMB
> 	instead of TARGET_THUMB1.
> 	(Pz): New constraint.
> 	* config/arm/arm.md (arm_addsi3): Add alternatives for 16-bit
> encodings.
> 	(compare_negsi_si): Likewise.
> 	(compare_addsi2_op0): Likewise.
> 	(compare_addsi2_op1): Likewise.
> 	(addsi3_carryin_<optab>): Likewise.
> 	(addsi3_carryin_alt2_<optab>): Likewise.
> 	(addsi3_carryin_shift_<optab>): Disable cond_exec variant
> 	for arm_restrict_it.
> 	(subsi3_carryin): Likewise.
> 	(arm_subsi3_insn): Add alternatives for 16-bit encoding.
> 	(minmax_arithsi): Disable for arm_restrict_it.
> 	(minmax_arithsi_non_canon): Adjust for arm_restrict_it.
> 	(satsi_<SAT:code>): Disable cond_exec variant for arm_restrict_it.
> 	(satsi_<SAT:code>_shift): Likewise.
> 	(arm_shiftsi3): Add alternative for 16-bit encoding.
> 	(arm32_movhf): Disable for arm_restrict_it.
> 	(arm_cmpdi_unsigned): Add alternatives for 16-bit encoding.
> 	(arm_movtas_ze): Disable cond_exec variant for arm_restrict_it.
>
>


   (define_insn_and_split "*arm_addsi3"
-  [(set (match_operand:SI          0 "s_register_operand" "=rk, r,k, 
r,r, k, r, k,k,r, k, r")
-	(plus:SI (match_operand:SI 1 "s_register_operand" "%0, rk,k, r,rk,k, 
rk,k,r,rk,k, rk")
-		 (match_operand:SI 2 "reg_or_int_operand" "rk, rI,rI,k,Pj,Pj,L, 
L,L,PJ,PJ,?n")))]
+  [(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")))]

Please make sure you keep the alternatives correctly aligned.  With this 
many alternatives matching up the constraints is becoming a nightmare if 
they aren't in columns

  (define_insn "*arm_shiftsi3"
-  [(set (match_operand:SI   0 "s_register_operand" "=r")
+  [(set (match_operand:SI   0 "s_register_operand" "=l,r")
  	(match_operator:SI  3 "shift_operator"
-	 [(match_operand:SI 1 "s_register_operand"  "r")
-	  (match_operand:SI 2 "reg_or_int_operand" "rM")]))]
+	 [(match_operand:SI 1 "s_register_operand"  "0,r")
+	  (match_operand:SI 2 "reg_or_int_operand" "l,rM")]))]
    "TARGET_32BIT"
    "* return arm_output_shift(operands, 0);"
    [(set_attr "predicable" "yes")
+   (set_attr "arch" "t2,*")
+   (set_attr "predicable_short_it" "yes,no")
+   (set_attr "length" "2,4")

The first alternative will only be 2 bytes long when predicated or 
changed into the flag-clobbering form.  It should be left as 4 here.

  (define_insn_and_split "*arm_cmpdi_unsigned"
    [(set (reg:CC_CZ CC_REGNUM)
-	(compare:CC_CZ (match_operand:DI 0 "s_register_operand" "r")
-		       (match_operand:DI 1 "arm_di_operand"	"rDi")))]
+	(compare:CC_CZ (match_operand:DI 0 "s_register_operand" "l,r,r")
+		       (match_operand:DI 1 "arm_di_operand"	"Py,r,rDi")))]


'r' constraint for operand 1 on third alternative is now redundant.

OK with the above issues fixed.

R.



More information about the Gcc-patches mailing list