Hi, A new test case introduced for PR81303 failed on powerpc64 (BE, LE). This turns out to be due to a missing standard pattern (vcondv2div2df). This and a couple of other patterns are easy to support with existing logic by just adding new patterns with appropriate modes. That's all this patch does. That's sufficient to cause the failing test to pass.
Bootstrapped and tested on powerpc64le-linux-gnu with no regressions. Is this okay for trunk? Thanks, Bill 2017-12-11 Bill Schmidt <wschm...@linux.vnet.ibm.com> PR target/83332 * config/rs6000/vector.md (vcondv2dfv2di): New define_expand. (vcondv2div2df): Likewise. (vconduv2dfv2di): Likewise. Index: gcc/config/rs6000/vector.md =================================================================== --- gcc/config/rs6000/vector.md (revision 255539) +++ gcc/config/rs6000/vector.md (working copy) @@ -455,6 +455,44 @@ FAIL; }") +(define_expand "vcondv2dfv2di" + [(set (match_operand:V2DF 0 "vfloat_operand" "") + (if_then_else:V2DF + (match_operator 3 "comparison_operator" + [(match_operand:V2DI 4 "vint_operand" "") + (match_operand:V2DI 5 "vint_operand" "")]) + (match_operand:V2DF 1 "vfloat_operand" "") + (match_operand:V2DF 2 "vfloat_operand" "")))] + "VECTOR_UNIT_ALTIVEC_OR_VSX_P (V2DFmode) + && VECTOR_UNIT_ALTIVEC_OR_VSX_P (V2DImode)" + " +{ + if (rs6000_emit_vector_cond_expr (operands[0], operands[1], operands[2], + operands[3], operands[4], operands[5])) + DONE; + else + FAIL; +}") + +(define_expand "vcondv2div2df" + [(set (match_operand:V2DI 0 "vint_operand" "") + (if_then_else:V2DI + (match_operator 3 "comparison_operator" + [(match_operand:V2DF 4 "vfloat_operand" "") + (match_operand:V2DF 5 "vfloat_operand" "")]) + (match_operand:V2DI 1 "vint_operand" "") + (match_operand:V2DI 2 "vint_operand" "")))] + "VECTOR_UNIT_ALTIVEC_OR_VSX_P (V2DFmode) + && VECTOR_UNIT_ALTIVEC_OR_VSX_P (V2DImode)" + " +{ + if (rs6000_emit_vector_cond_expr (operands[0], operands[1], operands[2], + operands[3], operands[4], operands[5])) + DONE; + else + FAIL; +}") + (define_expand "vcondu<mode><mode>" [(set (match_operand:VEC_I 0 "vint_operand") (if_then_else:VEC_I @@ -492,6 +530,25 @@ FAIL; }") +(define_expand "vconduv2dfv2di" + [(set (match_operand:V2DF 0 "vfloat_operand" "") + (if_then_else:V2DF + (match_operator 3 "comparison_operator" + [(match_operand:V2DI 4 "vint_operand" "") + (match_operand:V2DI 5 "vint_operand" "")]) + (match_operand:V2DF 1 "vfloat_operand" "") + (match_operand:V2DF 2 "vfloat_operand" "")))] + "VECTOR_UNIT_ALTIVEC_OR_VSX_P (V2DFmode) + && VECTOR_UNIT_ALTIVEC_OR_VSX_P (V2DImode)" + " +{ + if (rs6000_emit_vector_cond_expr (operands[0], operands[1], operands[2], + operands[3], operands[4], operands[5])) + DONE; + else + FAIL; +}") + (define_expand "vector_eq<mode>" [(set (match_operand:VEC_C 0 "vlogical_operand" "") (eq:VEC_C (match_operand:VEC_C 1 "vlogical_operand" "")