diff -urN ../gcc-cross-4.1.2-r4/gcc-4.1.2/gcc/config/arm/arm.md gcc-4.1.2/gcc/config/arm/arm.md --- ../gcc-cross-4.1.2-r4/gcc-4.1.2/gcc/config/arm/arm.md 2007-06-14 11:50:53.000000000 +1000 +++ gcc-4.1.2/gcc/config/arm/arm.md 2007-06-14 11:43:17.000000000 +1000 @@ -7488,6 +7488,22 @@ arm_compare_op1);" ) +;(define_expand "suneq" +; [(set (match_operand:SI 0 "s_register_operand" "") +; (uneq:SI (match_dup 1) (const_int 0)))] +; "TARGET_ARM && TARGET_HARD_FLOAT && (TARGET_MAVERICK)" +; "operands[1] = arm_gen_compare_reg (UNEQ, arm_compare_op0, +; arm_compare_op1);" +;) + +;(define_expand "sltgt" +; [(set (match_operand:SI 0 "s_register_operand" "") +; (ltgt:SI (match_dup 1) (const_int 0)))] +; "TARGET_ARM && TARGET_HARD_FLOAT && (TARGET_MAVERICK)" +; "operands[1] = arm_gen_compare_reg (LTGT, arm_compare_op0, +; arm_compare_op1);" +;) + ;;; DO NOT add patterns for SUNEQ or SLTGT, these can't be represented with ;;; simple ARM instructions. ; @@ -10284,13 +10284,73 @@ "TARGET_ARM && arm_arch5e" "pld\\t%a0") +;; Special predication pattern for Maverick Crunch floating-point + +(define_cond_exec + [(match_operator 0 "maverick_comparison_operator" + [(match_operand:CCFP 1 "cc_register" "") + (const_int 0)])] + "TARGET_ARM && TARGET_HARD_FLOAT && TARGET_MAVERICK" + "" +) + +;; Special predication pattern for Maverick Crunch - !CCFP + +(define_cond_exec + [(match_operator 0 "arm_comparison_operator" + [(match_operand:CC_NOOV 1 "cc_register" "") + (const_int 0)])] + "TARGET_ARM && TARGET_HARD_FLOAT && TARGET_MAVERICK" + "" +) + +(define_cond_exec + [(match_operator 0 "arm_comparison_operator" + [(match_operand:CC_Z 1 "cc_register" "") + (const_int 0)])] + "TARGET_ARM && TARGET_HARD_FLOAT && TARGET_MAVERICK" + "" +) + +(define_cond_exec + [(match_operator 0 "arm_comparison_operator" + [(match_operand:CC_SWP 1 "cc_register" "") + (const_int 0)])] + "TARGET_ARM && TARGET_HARD_FLOAT && TARGET_MAVERICK" + "" +) + +(define_cond_exec + [(match_operator 0 "arm_comparison_operator" + [(match_operand:CC_C 1 "cc_register" "") + (const_int 0)])] + "TARGET_ARM && TARGET_HARD_FLOAT && TARGET_MAVERICK" + "" +) + +(define_cond_exec + [(match_operator 0 "arm_comparison_operator" + [(match_operand:CC_N 1 "cc_register" "") + (const_int 0)])] + "TARGET_ARM && TARGET_HARD_FLOAT && TARGET_MAVERICK" + "" +) + +(define_cond_exec + [(match_operator 0 "arm_comparison_operator" + [(match_operand:CC 1 "cc_register" "") + (const_int 0)])] + "TARGET_ARM && TARGET_HARD_FLOAT && TARGET_MAVERICK" + "" +) + ;; General predication pattern (define_cond_exec [(match_operator 0 "arm_comparison_operator" [(match_operand 1 "cc_register" "") (const_int 0)])] - "TARGET_ARM" + "TARGET_ARM && !(TARGET_HARD_FLOAT && TARGET_MAVERICK)" "" ) diff -urN ../gcc-cross-4.1.2-r4/gcc-4.1.2/gcc/config/arm/predicates.md gcc-4.1.2/gcc/config/arm/predicates.md --- ../gcc-cross-4.1.2-r4/gcc-4.1.2/gcc/config/arm/predicates.md 2005-09-11 17:38:02.000000000 +1000 +++ gcc-4.1.2/gcc/config/arm/predicates.md 2007-06-14 11:46:13.000000000 +1000 @@ -172,7 +172,11 @@ ;; True 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")) + +;; True for comparisons other than GE, GEU, UNLT, UNORDERED or ORDERED - TODO add LTGT and UNEQ - needs extra support elsewhere +(define_special_predicate "maverick_comparison_operator" +(match_code "eq,ne,le,lt,gt,gtu,leu,ltu,unle,unge,ungt")) (define_special_predicate "minmax_operator" (and (match_code "smin,smax,umin,umax")