Hi, It's the second patch of a series of patches optimizing CC modes on rs6000.
This patch adds a new type of CC mode - CCLTEQ used for the case which only set CR bit 0 and 2. The bit 1 and 3 are not used. The vector compare and test data class instructions are the cases. Bootstrapped and tested on powerpc64-linux BE and LE with no regressions. Is it OK for the trunk? Thanks Gui Haochen ChangeLog rs6000: Add a new type of CC mode - CCLTEQ The new mode is used for the case which only checks cr bit 0 and 2. gcc/ * config/rs6000/altivec.md (altivec_vcmpequ<VI_char>_p): Replace CCFP with CCLTEQ. (altivec_vcmpequt_p): Likewise. (*altivec_vcmpgts<VI_char>_p): Likewise. (*altivec_vcmpgtst_p): Likewise. (*altivec_vcmpgtu<VI_char>_p): Likewise. (*altivec_vcmpgtut_p): Likewise. (*altivec_vcmpeqfp_p): Likewise. (*altivec_vcmpgtfp_p): Likewise. (*altivec_vcmpgefp_p): Likewise. (altivec_vcmpbfp_p): Likewise. * config/rs6000/predicates.md (branch_comparison_operator): Add CCLTEQ and its supported comparison codes. * config/rs6000/rs6000-modes.def (CC_MODE): Add CCLTEQ. * config/rs6000/rs6000.cc (validate_condition_mode): Add assertion for CCLTEQ. * config/rs6000/rs6000.md (CC_any): Add CCLTEQ. * config/rs6000/vector.md (vector_eq_<mode>_p): Replace CCFP with CCLTEQ. (vector_eq_v1ti_p): Likewise. (vector_ne_<mode>_p): Likewise. (vector_ae_<mode>_p): Likewise. (vector_nez_<mode>_p): Likewise. (vector_ne_v2di_p): Likewise. (vector_ne_v1ti_p): Likewise. (vector_ae_v2di_p): Likewise. (vector_ae_v1ti_p): Likewise. (vector_ne_<mode>_p): Likewise. (vector_ae_<mode>_p): Likewise. (vector_gt_<mode>_p): Likewise. (vector_gt_v1ti_p): Likewise. (vector_ge_<mode>_p): Likewise. (vector_gtu_<mode>_p): Likewise. (cr6_test_for_zero): Likewise. (cr6_test_for_zero_reverse): Likewise. (cr6_test_for_lt): Likewise. (cr6_test_for_lt_reverse): Likewise. * config/rs6000/vsx.md (*vsx_eq_<mode>_p): Likewise. (*vsx_gt_<mode>_p): Likewise. (*vsx_ge_<mode>_p): Likewise. (xststdcqp_<mode>): Likewise. (xststdc<sd>p): Likewise. (xststdcnegqp_<mode>): Likewise. (xststdcneg<sd>p): Likewise. (*xststdcqp_<mode>): Likewise. (*xststdc<sd>p): Likewise. (*vsx_ne_<mode>_p): Likewise. (*vector_nez_<mode>_p): Likewise. (vcmpnezb_p): Likewise. patch.diff diff --git a/gcc/config/rs6000/altivec.md b/gcc/config/rs6000/altivec.md index 9fa8cf89f61..bd79a3f9e84 100644 --- a/gcc/config/rs6000/altivec.md +++ b/gcc/config/rs6000/altivec.md @@ -2650,10 +2650,10 @@ (define_expand "cbranchv16qi4" ;; Compare vectors producing a vector result and a predicate, setting CR6 to ;; indicate a combined status (define_insn "altivec_vcmpequ<VI_char>_p" - [(set (reg:CC CR6_REGNO) - (unspec:CC [(eq:CC (match_operand:VI2 1 "register_operand" "v") - (match_operand:VI2 2 "register_operand" "v"))] - UNSPEC_PREDICATE)) + [(set (reg:CCLTEQ CR6_REGNO) + (unspec:CCLTEQ [(eq:CC (match_operand:VI2 1 "register_operand" "v") + (match_operand:VI2 2 "register_operand" "v"))] + UNSPEC_PREDICATE)) (set (match_operand:VI2 0 "register_operand" "=v") (eq:VI2 (match_dup 1) (match_dup 2)))] @@ -2662,10 +2662,11 @@ (define_insn "altivec_vcmpequ<VI_char>_p" [(set_attr "type" "veccmpfx")]) (define_insn "altivec_vcmpequt_p" - [(set (reg:CC CR6_REGNO) - (unspec:CC [(eq:CC (match_operand:V1TI 1 "altivec_register_operand" "v") - (match_operand:V1TI 2 "altivec_register_operand" "v"))] - UNSPEC_PREDICATE)) + [(set (reg:CCLTEQ CR6_REGNO) + (unspec:CCLTEQ + [(eq:CC (match_operand:V1TI 1 "altivec_register_operand" "v") + (match_operand:V1TI 2 "altivec_register_operand" "v"))] + UNSPEC_PREDICATE)) (set (match_operand:V1TI 0 "altivec_register_operand" "=v") (eq:V1TI (match_dup 1) (match_dup 2)))] @@ -2686,10 +2687,10 @@ (define_expand "altivec_vcmpne_<mode>" }) (define_insn "*altivec_vcmpgts<VI_char>_p" - [(set (reg:CC CR6_REGNO) - (unspec:CC [(gt:CC (match_operand:VI2 1 "register_operand" "v") - (match_operand:VI2 2 "register_operand" "v"))] - UNSPEC_PREDICATE)) + [(set (reg:CCLTEQ CR6_REGNO) + (unspec:CCLTEQ [(gt:CC (match_operand:VI2 1 "register_operand" "v") + (match_operand:VI2 2 "register_operand" "v"))] + UNSPEC_PREDICATE)) (set (match_operand:VI2 0 "register_operand" "=v") (gt:VI2 (match_dup 1) (match_dup 2)))] @@ -2698,10 +2699,10 @@ (define_insn "*altivec_vcmpgts<VI_char>_p" [(set_attr "type" "veccmpfx")]) (define_insn "*altivec_vcmpgtst_p" - [(set (reg:CC CR6_REGNO) - (unspec:CC [(gt:CC (match_operand:V1TI 1 "register_operand" "v") - (match_operand:V1TI 2 "register_operand" "v"))] - UNSPEC_PREDICATE)) + [(set (reg:CCLTEQ CR6_REGNO) + (unspec:CCLTEQ [(gt:CC (match_operand:V1TI 1 "register_operand" "v") + (match_operand:V1TI 2 "register_operand" "v"))] + UNSPEC_PREDICATE)) (set (match_operand:V1TI 0 "register_operand" "=v") (gt:V1TI (match_dup 1) (match_dup 2)))] @@ -2710,10 +2711,10 @@ (define_insn "*altivec_vcmpgtst_p" [(set_attr "type" "veccmpfx")]) (define_insn "*altivec_vcmpgtu<VI_char>_p" - [(set (reg:CC CR6_REGNO) - (unspec:CC [(gtu:CC (match_operand:VI2 1 "register_operand" "v") - (match_operand:VI2 2 "register_operand" "v"))] - UNSPEC_PREDICATE)) + [(set (reg:CCLTEQ CR6_REGNO) + (unspec:CCLTEQ [(gtu:CC (match_operand:VI2 1 "register_operand" "v") + (match_operand:VI2 2 "register_operand" "v"))] + UNSPEC_PREDICATE)) (set (match_operand:VI2 0 "register_operand" "=v") (gtu:VI2 (match_dup 1) (match_dup 2)))] @@ -2722,10 +2723,10 @@ (define_insn "*altivec_vcmpgtu<VI_char>_p" [(set_attr "type" "veccmpfx")]) (define_insn "*altivec_vcmpgtut_p" - [(set (reg:CC CR6_REGNO) - (unspec:CC [(gtu:CC (match_operand:V1TI 1 "register_operand" "v") - (match_operand:V1TI 2 "register_operand" "v"))] - UNSPEC_PREDICATE)) + [(set (reg:CCLTEQ CR6_REGNO) + (unspec:CCLTEQ [(gtu:CC (match_operand:V1TI 1 "register_operand" "v") + (match_operand:V1TI 2 "register_operand" "v"))] + UNSPEC_PREDICATE)) (set (match_operand:V1TI 0 "register_operand" "=v") (gtu:V1TI (match_dup 1) (match_dup 2)))] @@ -2734,10 +2735,10 @@ (define_insn "*altivec_vcmpgtut_p" [(set_attr "type" "veccmpfx")]) (define_insn "*altivec_vcmpeqfp_p" - [(set (reg:CC CR6_REGNO) - (unspec:CC [(eq:CC (match_operand:V4SF 1 "register_operand" "v") - (match_operand:V4SF 2 "register_operand" "v"))] - UNSPEC_PREDICATE)) + [(set (reg:CCLTEQ CR6_REGNO) + (unspec:CCLTEQ [(eq:CC (match_operand:V4SF 1 "register_operand" "v") + (match_operand:V4SF 2 "register_operand" "v"))] + UNSPEC_PREDICATE)) (set (match_operand:V4SF 0 "register_operand" "=v") (eq:V4SF (match_dup 1) (match_dup 2)))] @@ -2746,10 +2747,10 @@ (define_insn "*altivec_vcmpeqfp_p" [(set_attr "type" "veccmp")]) (define_insn "*altivec_vcmpgtfp_p" - [(set (reg:CC CR6_REGNO) - (unspec:CC [(gt:CC (match_operand:V4SF 1 "register_operand" "v") - (match_operand:V4SF 2 "register_operand" "v"))] - UNSPEC_PREDICATE)) + [(set (reg:CCLTEQ CR6_REGNO) + (unspec:CCLTEQ [(gt:CC (match_operand:V4SF 1 "register_operand" "v") + (match_operand:V4SF 2 "register_operand" "v"))] + UNSPEC_PREDICATE)) (set (match_operand:V4SF 0 "register_operand" "=v") (gt:V4SF (match_dup 1) (match_dup 2)))] @@ -2758,10 +2759,10 @@ (define_insn "*altivec_vcmpgtfp_p" [(set_attr "type" "veccmp")]) (define_insn "*altivec_vcmpgefp_p" - [(set (reg:CC CR6_REGNO) - (unspec:CC [(ge:CC (match_operand:V4SF 1 "register_operand" "v") - (match_operand:V4SF 2 "register_operand" "v"))] - UNSPEC_PREDICATE)) + [(set (reg:CCLTEQ CR6_REGNO) + (unspec:CCLTEQ [(ge:CC (match_operand:V4SF 1 "register_operand" "v") + (match_operand:V4SF 2 "register_operand" "v"))] + UNSPEC_PREDICATE)) (set (match_operand:V4SF 0 "register_operand" "=v") (ge:V4SF (match_dup 1) (match_dup 2)))] @@ -2770,10 +2771,10 @@ (define_insn "*altivec_vcmpgefp_p" [(set_attr "type" "veccmp")]) (define_insn "altivec_vcmpbfp_p" - [(set (reg:CC CR6_REGNO) - (unspec:CC [(match_operand:V4SF 1 "register_operand" "v") - (match_operand:V4SF 2 "register_operand" "v")] - UNSPEC_VCMPBFP)) + [(set (reg:CCLTEQ CR6_REGNO) + (unspec:CCLTEQ [(match_operand:V4SF 1 "register_operand" "v") + (match_operand:V4SF 2 "register_operand" "v")] + UNSPEC_VCMPBFP)) (set (match_operand:V4SF 0 "register_operand" "=v") (unspec:V4SF [(match_dup 1) (match_dup 2)] diff --git a/gcc/config/rs6000/predicates.md b/gcc/config/rs6000/predicates.md index 18198add744..322e7639fd4 100644 --- a/gcc/config/rs6000/predicates.md +++ b/gcc/config/rs6000/predicates.md @@ -1352,7 +1352,9 @@ (define_predicate "branch_comparison_operator" (match_code "lt,gt,eq,unordered,unge,unle,ne,ordered")) (if_then_else (match_test "GET_MODE (XEXP (op, 0)) == CCBCDmode") (match_code "lt,le,gt,ge,eq,ne,unordered,ordered") - (match_code "lt,ltu,le,leu,gt,gtu,ge,geu,eq,ne"))) + (if_then_else (match_test "GET_MODE (XEXP (op, 0)) == CCLTEQmode") + (match_code "lt,ge,eq,ne") + (match_code "lt,ltu,le,leu,gt,gtu,ge,geu,eq,ne")))) (match_test "validate_condition_mode (GET_CODE (op), GET_MODE (XEXP (op, 0))), 1"))) diff --git a/gcc/config/rs6000/rs6000-modes.def b/gcc/config/rs6000/rs6000-modes.def index 3e2e6dfb4ff..9c2e2432957 100644 --- a/gcc/config/rs6000/rs6000-modes.def +++ b/gcc/config/rs6000/rs6000-modes.def @@ -62,6 +62,7 @@ FRACTIONAL_FLOAT_MODE (TF, FLOAT_PRECISION_TFmode, 16, ieee_quad_format); CC_MODE (CCUNS); CC_MODE (CCFP); CC_MODE (CCBCD); /* Used for bcd insns */ +CC_MODE (CCLTEQ); /* Used for the case only checks cr bit 0 and bit 2 */ CC_MODE (CCEQ); /* Vector modes. */ diff --git a/gcc/config/rs6000/rs6000.cc b/gcc/config/rs6000/rs6000.cc index 4068cd8b929..97023ebe323 100644 --- a/gcc/config/rs6000/rs6000.cc +++ b/gcc/config/rs6000/rs6000.cc @@ -11594,6 +11594,9 @@ validate_condition_mode (enum rtx_code code, machine_mode mode) gcc_assert ((code != GT && code != LT && code != GE && code != LE) || mode != CCUNSmode); + gcc_assert (mode != CCLTEQmode + || (code != GT && code != LE)); + gcc_assert ((code != GTU && code != LTU && code != GEU && code != LEU) || mode == CCUNSmode); diff --git a/gcc/config/rs6000/rs6000.md b/gcc/config/rs6000/rs6000.md index 9b5fcdc8db0..2c6255395d1 100644 --- a/gcc/config/rs6000/rs6000.md +++ b/gcc/config/rs6000/rs6000.md @@ -8115,7 +8115,7 @@ (define_expand "movcc" "" "") -(define_mode_iterator CC_any [CC CCUNS CCEQ CCFP CCBCD]) +(define_mode_iterator CC_any [CC CCUNS CCEQ CCFP CCBCD CCLTEQ]) (define_insn "*movcc_<mode>" [(set (match_operand:CC_any 0 "nonimmediate_operand" diff --git a/gcc/config/rs6000/vector.md b/gcc/config/rs6000/vector.md index f9796fb3781..f86c1f2990e 100644 --- a/gcc/config/rs6000/vector.md +++ b/gcc/config/rs6000/vector.md @@ -888,10 +888,10 @@ (define_expand "vector_select_<mode>_uns" ;; setting CR6 to indicate a combined status (define_expand "vector_eq_<mode>_p" [(parallel - [(set (reg:CC CR6_REGNO) - (unspec:CC [(eq:CC (match_operand:VEC_A 1 "vlogical_operand") - (match_operand:VEC_A 2 "vlogical_operand"))] - UNSPEC_PREDICATE)) + [(set (reg:CCLTEQ CR6_REGNO) + (unspec:CCLTEQ [(eq:CC (match_operand:VEC_A 1 "vlogical_operand") + (match_operand:VEC_A 2 "vlogical_operand"))] + UNSPEC_PREDICATE)) (set (match_operand:VEC_A 0 "vlogical_operand") (eq:VEC_A (match_dup 1) (match_dup 2)))])] @@ -900,10 +900,11 @@ (define_expand "vector_eq_<mode>_p" (define_expand "vector_eq_v1ti_p" [(parallel - [(set (reg:CC CR6_REGNO) - (unspec:CC [(eq:CC (match_operand:V1TI 1 "altivec_register_operand") - (match_operand:V1TI 2 "altivec_register_operand"))] - UNSPEC_PREDICATE)) + [(set (reg:CCLTEQ CR6_REGNO) + (unspec:CCLTEQ + [(eq:CC (match_operand:V1TI 1 "altivec_register_operand") + (match_operand:V1TI 2 "altivec_register_operand"))] + UNSPEC_PREDICATE)) (set (match_operand:V1TI 0 "vlogical_operand") (eq:V1TI (match_dup 1) (match_dup 2)))])] @@ -914,15 +915,15 @@ (define_expand "vector_eq_v1ti_p" ;; implementation of the vec_all_ne built-in functions on Power9. (define_expand "vector_ne_<mode>_p" [(parallel - [(set (reg:CC CR6_REGNO) - (unspec:CC [(ne:CC (match_operand:VI 1 "vlogical_operand") - (match_operand:VI 2 "vlogical_operand"))] + [(set (reg:CCLTEQ CR6_REGNO) + (unspec:CCLTEQ [(ne:CC (match_operand:VI 1 "vlogical_operand") + (match_operand:VI 2 "vlogical_operand"))] UNSPEC_PREDICATE)) (set (match_dup 3) (ne:VI (match_dup 1) (match_dup 2)))]) (set (match_operand:SI 0 "register_operand" "=r") - (lt:SI (reg:CC CR6_REGNO) + (lt:SI (reg:CCLTEQ CR6_REGNO) (const_int 0)))] "TARGET_P9_VECTOR" { @@ -933,15 +934,15 @@ (define_expand "vector_ne_<mode>_p" ;; implementation of the vec_any_eq built-in functions on Power9. (define_expand "vector_ae_<mode>_p" [(parallel - [(set (reg:CC CR6_REGNO) - (unspec:CC [(ne:CC (match_operand:VI 1 "vlogical_operand") - (match_operand:VI 2 "vlogical_operand"))] + [(set (reg:CCLTEQ CR6_REGNO) + (unspec:CCLTEQ [(ne:CC (match_operand:VI 1 "vlogical_operand") + (match_operand:VI 2 "vlogical_operand"))] UNSPEC_PREDICATE)) (set (match_dup 3) (ne:VI (match_dup 1) (match_dup 2)))]) (set (match_operand:SI 0 "register_operand" "=r") - (lt:SI (reg:CC CR6_REGNO) + (lt:SI (reg:CCLTEQ CR6_REGNO) (const_int 0))) (set (match_dup 0) (xor:SI (match_dup 0) @@ -956,11 +957,11 @@ (define_expand "vector_ae_<mode>_p" ;; functions on Power9. (define_expand "vector_nez_<mode>_p" [(parallel - [(set (reg:CC CR6_REGNO) - (unspec:CC [(unspec:VI - [(match_operand:VI 1 "vlogical_operand") - (match_operand:VI 2 "vlogical_operand")] - UNSPEC_NEZ_P)] + [(set (reg:CCLTEQ CR6_REGNO) + (unspec:CCLTEQ [(unspec:VI + [(match_operand:VI 1 "vlogical_operand") + (match_operand:VI 2 "vlogical_operand")] + UNSPEC_NEZ_P)] UNSPEC_PREDICATE)) (set (match_operand:VI 0 "vlogical_operand") (unspec:VI [(match_dup 1) @@ -977,15 +978,15 @@ (define_expand "vector_nez_<mode>_p" ;; architecture. (define_expand "vector_ne_v2di_p" [(parallel - [(set (reg:CC CR6_REGNO) - (unspec:CC [(eq:CC (match_operand:V2DI 1 "vlogical_operand") - (match_operand:V2DI 2 "vlogical_operand"))] - UNSPEC_PREDICATE)) + [(set (reg:CCLTEQ CR6_REGNO) + (unspec:CCLTEQ [(eq:CC (match_operand:V2DI 1 "vlogical_operand") + (match_operand:V2DI 2 "vlogical_operand"))] + UNSPEC_PREDICATE)) (set (match_dup 3) (eq:V2DI (match_dup 1) (match_dup 2)))]) (set (match_operand:SI 0 "register_operand" "=r") - (eq:SI (reg:CC CR6_REGNO) + (eq:SI (reg:CCLTEQ CR6_REGNO) (const_int 0)))] "TARGET_P9_VECTOR" { @@ -994,15 +995,16 @@ (define_expand "vector_ne_v2di_p" (define_expand "vector_ne_v1ti_p" [(parallel - [(set (reg:CC CR6_REGNO) - (unspec:CC [(eq:CC (match_operand:V1TI 1 "altivec_register_operand") - (match_operand:V1TI 2 "altivec_register_operand"))] - UNSPEC_PREDICATE)) + [(set (reg:CCLTEQ CR6_REGNO) + (unspec:CCLTEQ + [(eq:CC (match_operand:V1TI 1 "altivec_register_operand") + (match_operand:V1TI 2 "altivec_register_operand"))] + UNSPEC_PREDICATE)) (set (match_dup 3) (eq:V1TI (match_dup 1) (match_dup 2)))]) (set (match_operand:SI 0 "register_operand" "=r") - (eq:SI (reg:CC CR6_REGNO) + (eq:SI (reg:CCLTEQ CR6_REGNO) (const_int 0)))] "TARGET_POWER10" { @@ -1017,15 +1019,15 @@ (define_expand "vector_ne_v1ti_p" ;; architecture. (define_expand "vector_ae_v2di_p" [(parallel - [(set (reg:CC CR6_REGNO) - (unspec:CC [(eq:CC (match_operand:V2DI 1 "vlogical_operand") - (match_operand:V2DI 2 "vlogical_operand"))] - UNSPEC_PREDICATE)) + [(set (reg:CCLTEQ CR6_REGNO) + (unspec:CCLTEQ [(eq:CC (match_operand:V2DI 1 "vlogical_operand") + (match_operand:V2DI 2 "vlogical_operand"))] + UNSPEC_PREDICATE)) (set (match_dup 3) (eq:V2DI (match_dup 1) (match_dup 2)))]) (set (match_operand:SI 0 "register_operand" "=r") - (eq:SI (reg:CC CR6_REGNO) + (eq:SI (reg:CCLTEQ CR6_REGNO) (const_int 0))) (set (match_dup 0) (xor:SI (match_dup 0) @@ -1037,15 +1039,16 @@ (define_expand "vector_ae_v2di_p" (define_expand "vector_ae_v1ti_p" [(parallel - [(set (reg:CC CR6_REGNO) - (unspec:CC [(eq:CC (match_operand:V1TI 1 "altivec_register_operand") - (match_operand:V1TI 2 "altivec_register_operand"))] - UNSPEC_PREDICATE)) + [(set (reg:CCLTEQ CR6_REGNO) + (unspec:CCLTEQ + [(eq:CC (match_operand:V1TI 1 "altivec_register_operand") + (match_operand:V1TI 2 "altivec_register_operand"))] + UNSPEC_PREDICATE)) (set (match_dup 3) (eq:V1TI (match_dup 1) (match_dup 2)))]) (set (match_operand:SI 0 "register_operand" "=r") - (eq:SI (reg:CC CR6_REGNO) + (eq:SI (reg:CCLTEQ CR6_REGNO) (const_int 0))) (set (match_dup 0) (xor:SI (match_dup 0) @@ -1062,15 +1065,15 @@ (define_expand "vector_ae_v1ti_p" ;; for vector compare not equal with floating point arguments. (define_expand "vector_ne_<mode>_p" [(parallel - [(set (reg:CC CR6_REGNO) - (unspec:CC [(eq:CC (match_operand:VEC_F 1 "vlogical_operand") - (match_operand:VEC_F 2 "vlogical_operand"))] - UNSPEC_PREDICATE)) + [(set (reg:CCLTEQ CR6_REGNO) + (unspec:CCLTEQ [(eq:CC (match_operand:VEC_F 1 "vlogical_operand") + (match_operand:VEC_F 2 "vlogical_operand"))] + UNSPEC_PREDICATE)) (set (match_dup 3) (eq:VEC_F (match_dup 1) (match_dup 2)))]) (set (match_operand:SI 0 "register_operand" "=r") - (eq:SI (reg:CC CR6_REGNO) + (eq:SI (reg:CCLTEQ CR6_REGNO) (const_int 0)))] "TARGET_P9_VECTOR" { @@ -1084,15 +1087,15 @@ (define_expand "vector_ne_<mode>_p" ;; for vector compare not equal with floating point arguments. (define_expand "vector_ae_<mode>_p" [(parallel - [(set (reg:CC CR6_REGNO) - (unspec:CC [(eq:CC (match_operand:VEC_F 1 "vlogical_operand") - (match_operand:VEC_F 2 "vlogical_operand"))] - UNSPEC_PREDICATE)) + [(set (reg:CCLTEQ CR6_REGNO) + (unspec:CCLTEQ [(eq:CC (match_operand:VEC_F 1 "vlogical_operand") + (match_operand:VEC_F 2 "vlogical_operand"))] + UNSPEC_PREDICATE)) (set (match_dup 3) (eq:VEC_F (match_dup 1) (match_dup 2)))]) (set (match_operand:SI 0 "register_operand" "=r") - (eq:SI (reg:CC CR6_REGNO) + (eq:SI (reg:CCLTEQ CR6_REGNO) (const_int 0))) (set (match_dup 0) (xor:SI (match_dup 0) @@ -1104,10 +1107,10 @@ (define_expand "vector_ae_<mode>_p" (define_expand "vector_gt_<mode>_p" [(parallel - [(set (reg:CC CR6_REGNO) - (unspec:CC [(gt:CC (match_operand:VEC_A 1 "vlogical_operand") - (match_operand:VEC_A 2 "vlogical_operand"))] - UNSPEC_PREDICATE)) + [(set (reg:CCLTEQ CR6_REGNO) + (unspec:CCLTEQ [(gt:CC (match_operand:VEC_A 1 "vlogical_operand") + (match_operand:VEC_A 2 "vlogical_operand"))] + UNSPEC_PREDICATE)) (set (match_operand:VEC_A 0 "vlogical_operand") (gt:VEC_A (match_dup 1) (match_dup 2)))])] @@ -1116,10 +1119,10 @@ (define_expand "vector_gt_<mode>_p" (define_expand "vector_gt_v1ti_p" [(parallel - [(set (reg:CC CR6_REGNO) - (unspec:CC [(gt:CC (match_operand:V1TI 1 "vlogical_operand") - (match_operand:V1TI 2 "vlogical_operand"))] - UNSPEC_PREDICATE)) + [(set (reg:CCLTEQ CR6_REGNO) + (unspec:CCLTEQ [(gt:CC (match_operand:V1TI 1 "vlogical_operand") + (match_operand:V1TI 2 "vlogical_operand"))] + UNSPEC_PREDICATE)) (set (match_operand:V1TI 0 "vlogical_operand") (gt:V1TI (match_dup 1) (match_dup 2)))])] @@ -1128,10 +1131,10 @@ (define_expand "vector_gt_v1ti_p" (define_expand "vector_ge_<mode>_p" [(parallel - [(set (reg:CC CR6_REGNO) - (unspec:CC [(ge:CC (match_operand:VEC_F 1 "vfloat_operand") - (match_operand:VEC_F 2 "vfloat_operand"))] - UNSPEC_PREDICATE)) + [(set (reg:CCLTEQ CR6_REGNO) + (unspec:CCLTEQ [(ge:CC (match_operand:VEC_F 1 "vfloat_operand") + (match_operand:VEC_F 2 "vfloat_operand"))] + UNSPEC_PREDICATE)) (set (match_operand:VEC_F 0 "vfloat_operand") (ge:VEC_F (match_dup 1) (match_dup 2)))])] @@ -1140,10 +1143,10 @@ (define_expand "vector_ge_<mode>_p" (define_expand "vector_gtu_<mode>_p" [(parallel - [(set (reg:CC CR6_REGNO) - (unspec:CC [(gtu:CC (match_operand:VEC_IC 1 "vint_operand") - (match_operand:VEC_IC 2 "vint_operand"))] - UNSPEC_PREDICATE)) + [(set (reg:CCLTEQ CR6_REGNO) + (unspec:CCLTEQ [(gtu:CC (match_operand:VEC_IC 1 "vint_operand") + (match_operand:VEC_IC 2 "vint_operand"))] + UNSPEC_PREDICATE)) (set (match_operand:VEC_IC 0 "vlogical_operand") (gtu:VEC_IC (match_dup 1) (match_dup 2)))])] @@ -1158,7 +1161,7 @@ (define_expand "vector_gtu_<mode>_p" ;; integer constant first argument equals zero (aka __CR6_EQ in altivec.h). (define_expand "cr6_test_for_zero" [(set (match_operand:SI 0 "register_operand" "=r") - (eq:SI (reg:CC CR6_REGNO) + (eq:SI (reg:CCLTEQ CR6_REGNO) (const_int 0)))] "TARGET_ALTIVEC || TARGET_VSX" "") @@ -1169,7 +1172,7 @@ (define_expand "cr6_test_for_zero" ;; integer constant first argument equals one (aka __CR6_EQ_REV in altivec.h). (define_expand "cr6_test_for_zero_reverse" [(set (match_operand:SI 0 "register_operand" "=r") - (eq:SI (reg:CC CR6_REGNO) + (eq:SI (reg:CCLTEQ CR6_REGNO) (const_int 0))) (set (match_dup 0) (xor:SI (match_dup 0) @@ -1183,7 +1186,7 @@ (define_expand "cr6_test_for_zero_reverse" ;; integer constant first argument equals two (aka __CR6_LT in altivec.h). (define_expand "cr6_test_for_lt" [(set (match_operand:SI 0 "register_operand" "=r") - (lt:SI (reg:CC CR6_REGNO) + (lt:SI (reg:CCLTEQ CR6_REGNO) (const_int 0)))] "TARGET_ALTIVEC || TARGET_VSX" "") @@ -1195,7 +1198,7 @@ (define_expand "cr6_test_for_lt" ;; (aka __CR6_LT_REV in altivec.h). (define_expand "cr6_test_for_lt_reverse" [(set (match_operand:SI 0 "register_operand" "=r") - (lt:SI (reg:CC CR6_REGNO) + (lt:SI (reg:CCLTEQ CR6_REGNO) (const_int 0))) (set (match_dup 0) (xor:SI (match_dup 0) diff --git a/gcc/config/rs6000/vsx.md b/gcc/config/rs6000/vsx.md index f135fa079bd..58d8ef1ad18 100644 --- a/gcc/config/rs6000/vsx.md +++ b/gcc/config/rs6000/vsx.md @@ -2180,8 +2180,8 @@ (define_insn "*vsx_ge<mode>" ;; Compare vectors producing a vector result and a predicate, setting CR6 to ;; indicate a combined status (define_insn "*vsx_eq_<mode>_p" - [(set (reg:CC CR6_REGNO) - (unspec:CC + [(set (reg:CCLTEQ CR6_REGNO) + (unspec:CCLTEQ [(eq:CC (match_operand:VSX_F 1 "vsx_register_operand" "wa") (match_operand:VSX_F 2 "vsx_register_operand" "wa"))] UNSPEC_PREDICATE)) @@ -2193,8 +2193,8 @@ (define_insn "*vsx_eq_<mode>_p" [(set_attr "type" "<VStype_simple>")]) (define_insn "*vsx_gt_<mode>_p" - [(set (reg:CC CR6_REGNO) - (unspec:CC + [(set (reg:CCLTEQ CR6_REGNO) + (unspec:CCLTEQ [(gt:CC (match_operand:VSX_F 1 "vsx_register_operand" "wa") (match_operand:VSX_F 2 "vsx_register_operand" "wa"))] UNSPEC_PREDICATE)) @@ -2245,8 +2245,8 @@ (define_expand "xvtlsbbz" }) (define_insn "*vsx_ge_<mode>_p" - [(set (reg:CC CR6_REGNO) - (unspec:CC + [(set (reg:CCLTEQ CR6_REGNO) + (unspec:CCLTEQ [(ge:CC (match_operand:VSX_F 1 "vsx_register_operand" "wa") (match_operand:VSX_F 2 "vsx_register_operand" "wa"))] UNSPEC_PREDICATE)) @@ -5278,7 +5278,7 @@ (define_insn "*xscmpexpqp" ;; are satisfied, and clearing the gt and undordered bits to zero.) (define_expand "xststdcqp_<mode>" [(set (match_dup 3) - (compare:CCFP + (compare:CCLTEQ (unspec:IEEE128 [(match_operand:IEEE128 1 "altivec_register_operand" "v") (match_operand:SI 2 "u7bit_cint_operand" "n")] @@ -5289,7 +5289,7 @@ (define_expand "xststdcqp_<mode>" (const_int 0)))] "TARGET_P9_VECTOR" { - operands[3] = gen_reg_rtx (CCFPmode); + operands[3] = gen_reg_rtx (CCLTEQmode); }) ;; VSX Scalar Test Data Class Double- and Single-Precision @@ -5298,7 +5298,7 @@ (define_expand "xststdcqp_<mode>" ;; The gt and unordered bits are cleared to zero.) (define_expand "xststdc<sd>p" [(set (match_dup 3) - (compare:CCFP + (compare:CCLTEQ (unspec:SFDF [(match_operand:SFDF 1 "vsx_register_operand" "wa") (match_operand:SI 2 "u7bit_cint_operand" "n")] @@ -5309,14 +5309,14 @@ (define_expand "xststdc<sd>p" (const_int 0)))] "TARGET_P9_VECTOR" { - operands[3] = gen_reg_rtx (CCFPmode); + operands[3] = gen_reg_rtx (CCLTEQmode); operands[4] = CONST0_RTX (SImode); }) ;; The VSX Scalar Test Negative Quad-Precision (define_expand "xststdcnegqp_<mode>" [(set (match_dup 2) - (compare:CCFP + (compare:CCLTEQ (unspec:IEEE128 [(match_operand:IEEE128 1 "altivec_register_operand" "v") (const_int 0)] @@ -5327,13 +5327,13 @@ (define_expand "xststdcnegqp_<mode>" (const_int 0)))] "TARGET_P9_VECTOR" { - operands[2] = gen_reg_rtx (CCFPmode); + operands[2] = gen_reg_rtx (CCLTEQmode); }) ;; The VSX Scalar Test Negative Double- and Single-Precision (define_expand "xststdcneg<sd>p" [(set (match_dup 2) - (compare:CCFP + (compare:CCLTEQ (unspec:SFDF [(match_operand:SFDF 1 "vsx_register_operand" "wa") (const_int 0)] @@ -5344,13 +5344,13 @@ (define_expand "xststdcneg<sd>p" (const_int 0)))] "TARGET_P9_VECTOR" { - operands[2] = gen_reg_rtx (CCFPmode); + operands[2] = gen_reg_rtx (CCLTEQmode); operands[3] = CONST0_RTX (SImode); }) (define_insn "*xststdcqp_<mode>" - [(set (match_operand:CCFP 0 "" "=y") - (compare:CCFP + [(set (match_operand:CCLTEQ 0 "" "=y") + (compare:CCLTEQ (unspec:IEEE128 [(match_operand:IEEE128 1 "altivec_register_operand" "v") (match_operand:SI 2 "u7bit_cint_operand" "n")] @@ -5361,8 +5361,8 @@ (define_insn "*xststdcqp_<mode>" [(set_attr "type" "fpcompare")]) (define_insn "*xststdc<sd>p" - [(set (match_operand:CCFP 0 "" "=y") - (compare:CCFP + [(set (match_operand:CCLTEQ 0 "" "=y") + (compare:CCLTEQ (unspec:SFDF [(match_operand:SFDF 1 "vsx_register_operand" "wa") (match_operand:SI 2 "u7bit_cint_operand" "n")] UNSPEC_VSX_STSTDC) @@ -5423,8 +5423,8 @@ (define_insn "xvtstdc<sd>p" ;; need to match v4sf, v2df, or v2di modes because those are expanded ;; to use Power8 instructions. (define_insn "*vsx_ne_<mode>_p" - [(set (reg:CC CR6_REGNO) - (unspec:CC + [(set (reg:CCLTEQ CR6_REGNO) + (unspec:CCLTEQ [(ne:CC (match_operand:VSX_EXTRACT_I 1 "gpc_reg_operand" "v") (match_operand:VSX_EXTRACT_I 2 "gpc_reg_operand" "v"))] UNSPEC_PREDICATE)) @@ -5436,12 +5436,12 @@ (define_insn "*vsx_ne_<mode>_p" [(set_attr "type" "vecsimple")]) (define_insn "*vector_nez_<mode>_p" - [(set (reg:CC CR6_REGNO) - (unspec:CC [(unspec:VI - [(match_operand:VI 1 "gpc_reg_operand" "v") - (match_operand:VI 2 "gpc_reg_operand" "v")] - UNSPEC_NEZ_P)] - UNSPEC_PREDICATE)) + [(set (reg:CCLTEQ CR6_REGNO) + (unspec:CCLTEQ [(unspec:VI + [(match_operand:VI 1 "gpc_reg_operand" "v") + (match_operand:VI 2 "gpc_reg_operand" "v")] + UNSPEC_NEZ_P)] + UNSPEC_PREDICATE)) (set (match_operand:VI 0 "gpc_reg_operand" "=v") (unspec:VI [(match_dup 1) (match_dup 2)] @@ -5807,8 +5807,8 @@ (define_insn "vcmpnezb" ;; Vector Compare Not Equal or Zero Byte predicate or record-form (define_insn "vcmpnezb_p" - [(set (reg:CC CR6_REGNO) - (unspec:CC + [(set (reg:CCLTEQ CR6_REGNO) + (unspec:CCLTEQ [(match_operand:V16QI 1 "altivec_register_operand" "v") (match_operand:V16QI 2 "altivec_register_operand" "v")] UNSPEC_VCMPNEZB))