| Index: gcc/gcc/config/arm/predicates.md
|
| diff --git a/gcc/gcc/config/arm/predicates.md b/gcc/gcc/config/arm/predicates.md
|
| index c7d63355d34429f502fb415a23e1686c938c7676..cdaaca6fecd9808da43972ffd55c3f5ed5b0ac0f 100644
|
| --- a/gcc/gcc/config/arm/predicates.md
|
| +++ b/gcc/gcc/config/arm/predicates.md
|
| @@ -73,6 +73,25 @@
|
| || REGNO_REG_CLASS (REGNO (op)) == FPA_REGS));
|
| })
|
|
|
| +(define_predicate "vfp_register_operand"
|
| + (match_code "reg,subreg")
|
| +{
|
| + if (GET_CODE (op) == SUBREG)
|
| + op = SUBREG_REG (op);
|
| +
|
| + /* We don't consider registers whose class is NO_REGS
|
| + to be a register operand. */
|
| + return (GET_CODE (op) == REG
|
| + && (REGNO (op) >= FIRST_PSEUDO_REGISTER
|
| + || REGNO_REG_CLASS (REGNO (op)) == VFP_LO_REGS
|
| + || (TARGET_VFPD32
|
| + && REGNO_REG_CLASS (REGNO (op)) == VFP_REGS)));
|
| +})
|
| +
|
| +(define_special_predicate "subreg_lowpart_operator"
|
| + (and (match_code "subreg")
|
| + (match_test "subreg_lowpart_p (op)")))
|
| +
|
| ;; Reg, subreg(reg) or const_int.
|
| (define_predicate "reg_or_int_operand"
|
| (ior (match_code "const_int")
|
| @@ -191,9 +210,13 @@
|
| (define_special_predicate "equality_operator"
|
| (match_code "eq,ne"))
|
|
|
| -;; True for comparisons other than LTGT or UNEQ.
|
| +;; True for integer comparisons and, if FP is active, for comparisons
|
| +;; other than LTGT or UNEQ.
|
| (define_special_predicate "arm_comparison_operator"
|
| - (match_code "eq,ne,le,lt,ge,gt,geu,gtu,leu,ltu,unordered,ordered,unlt,unle,unge,ungt"))
|
| + (ior (match_code "eq,ne,le,lt,ge,gt,geu,gtu,leu,ltu")
|
| + (and (match_test "TARGET_32BIT && TARGET_HARD_FLOAT
|
| + && (TARGET_FPA || TARGET_VFP)")
|
| + (match_code "unordered,ordered,unlt,unle,unge,ungt"))))
|
|
|
| (define_special_predicate "minmax_operator"
|
| (and (match_code "smin,smax,umin,umax")
|
| @@ -231,8 +254,8 @@
|
|
|
| (define_special_predicate "arm_extendqisi_mem_op"
|
| (and (match_operand 0 "memory_operand")
|
| - (match_test "arm_legitimate_address_p (mode, XEXP (op, 0), SIGN_EXTEND,
|
| - 0)")))
|
| + (match_test "arm_legitimate_address_outer_p (mode, XEXP (op, 0),
|
| + SIGN_EXTEND, 0)")))
|
|
|
| (define_special_predicate "arm_reg_or_extendqisi_mem_op"
|
| (ior (match_operand 0 "arm_extendqisi_mem_op")
|
|
|