diff --git a/llvm/lib/Target/PowerPC/PPCISelLowering.cpp b/llvm/lib/Target/PowerPC/PPCISelLowering.cpp --- a/llvm/lib/Target/PowerPC/PPCISelLowering.cpp +++ b/llvm/lib/Target/PowerPC/PPCISelLowering.cpp @@ -7720,24 +7720,62 @@ return DAG.getNode(PPCISD::XSMINCDP, dl, Op.getValueType(), LHS, RHS); } } + // Cannot do any optimization if there is NaNs. + if (!DAG.getTarget().Options.NoNaNsFPMath) + return Op; + + SDNodeFlags Flags; + Flags.setNoNaNs(true); + + bool IsValidFpType = (CmpVT == MVT::f32 || CmpVT == MVT::f64) && + (ResVT == MVT::f32 || ResVT == MVT::f64); + bool IsRHSZero = isFloatingPointZero(RHS); + + // (select_cc A, B, C, D, Pred) can be selected as + // (xxsel D, C, (xscmpeqdp/xscmpgtdp/... A, B)) if VSX is enabled. Don't do + // this if the rhs is zero as we could do some optimization later. + if (Subtarget.hasVSX() && IsValidFpType && !IsRHSZero) { + SDValue RegIdx = DAG.getTargetConstant(1, dl, MVT::i64); + SDValue SubReg = DAG.getTargetConstant(PPC::sub_64, dl, MVT::i32); + + // Promote the type f32/f64 to v4i32 which vselect prefer. + LHS = SDValue(DAG.getMachineNode(TargetOpcode::SUBREG_TO_REG, dl, + MVT::v4i32, RegIdx, LHS, SubReg), + 0); + RHS = SDValue(DAG.getMachineNode(TargetOpcode::SUBREG_TO_REG, dl, + MVT::v4i32, RegIdx, RHS, SubReg), + 0); + TV = SDValue(DAG.getMachineNode(TargetOpcode::SUBREG_TO_REG, dl, MVT::v4i32, + RegIdx, TV, SubReg), + 0); + FV = SDValue(DAG.getMachineNode(TargetOpcode::SUBREG_TO_REG, dl, MVT::v4i32, + RegIdx, FV, SubReg), + 0); + + // Lowering the select_cc to vselect + setcc. + SDValue SetCC = DAG.getNode(ISD::SETCC, dl, MVT::v4i32, LHS, RHS, + Op.getOperand(4), Flags); + SDValue SEL = + DAG.getNode(ISD::VSELECT, dl, MVT::v4i32, SetCC, TV, FV, Flags); + return SDValue(DAG.getMachineNode(TargetOpcode::EXTRACT_SUBREG, dl, + MVT::f64, SEL, SubReg), + 0); + } // We might be able to do better than this under some circumstances, but in // general, fsel-based lowering of select is a finite-math-only optimization. // For more information, see section F.3 of the 2.06 ISA specification. // With ISA 3.0 - if (!DAG.getTarget().Options.NoInfsFPMath || - !DAG.getTarget().Options.NoNaNsFPMath) + if (!DAG.getTarget().Options.NoInfsFPMath) return Op; // TODO: Propagate flags from the select rather than global settings. - SDNodeFlags Flags; Flags.setNoInfs(true); - Flags.setNoNaNs(true); // If the RHS of the comparison is a 0.0, we don't need to do the // subtraction at all. SDValue Sel1; - if (isFloatingPointZero(RHS)) + if (IsRHSZero) switch (CC) { default: break; // SETUO etc aren't handled by fsel. case ISD::SETNE: diff --git a/llvm/lib/Target/PowerPC/PPCInstrVSX.td b/llvm/lib/Target/PowerPC/PPCInstrVSX.td --- a/llvm/lib/Target/PowerPC/PPCInstrVSX.td +++ b/llvm/lib/Target/PowerPC/PPCInstrVSX.td @@ -1221,6 +1221,23 @@ def : Pat<(vselect v2i64:$vA, v2f64:$vB, v2f64:$vC), (XXSEL $vC, $vB, $vA)>; +multiclass SelectCmpPat { + def : Pat<(vselect (v4i32(setcc v4i32:$lhs, v4i32:$rhs, CmpPred)), + v4i32:$tval, v4i32:$fval), + (XXSEL $fval, $tval, (Cmp $lhs, $rhs))>; + + def : Pat<(vselect (v4i32(setcc v4i32:$lhs, v4i32:$rhs, NCmpPred)), + v4i32:$tval, v4i32:$fval), + (XXSEL $tval, $fval, (Cmp $lhs, $rhs))>; +} + +defm : SelectCmpPat; +defm : SelectCmpPat; +defm : SelectCmpPat; +defm : SelectCmpPat; +defm : SelectCmpPat; +defm : SelectCmpPat; + def : Pat<(v4f32 (fmaxnum v4f32:$src1, v4f32:$src2)), (v4f32 (XVMAXSP $src1, $src2))>; def : Pat<(v4f32 (fminnum v4f32:$src1, v4f32:$src2)), @@ -2778,13 +2795,27 @@ // DP Compare ==, >=, >, != // Use vsrc for XT, because the entire register of XT is set. // XT.dword[1] = 0x0000_0000_0000_0000 - def XSCMPEQDP : XX3_XT5_XA5_XB5<60, 3, "xscmpeqdp", vsrc, vsfrc, vsfrc, + def XSCMPEQDP : XX3_XT5_XA5_XB5<60, 3, "xscmpeqdp", vsrc, vsrc, vsrc, IIC_FPCompare, []>; - def XSCMPGEDP : XX3_XT5_XA5_XB5<60, 19, "xscmpgedp", vsrc, vsfrc, vsfrc, + def XSCMPGEDP : XX3_XT5_XA5_XB5<60, 19, "xscmpgedp", vsrc, vsrc, vsrc, IIC_FPCompare, []>; - def XSCMPGTDP : XX3_XT5_XA5_XB5<60, 11, "xscmpgtdp", vsrc, vsfrc, vsfrc, + def XSCMPGTDP : XX3_XT5_XA5_XB5<60, 11, "xscmpgtdp", vsrc, vsrc, vsrc, IIC_FPCompare, []>; + // Prefer the "VSX Scalar Compare Equal Double-Precision" instruction to + // "VSX Vector Compare Equal To Double-Precision" as it didn't update the CR6. + + // FIXME - use a better mechanism instead of hardcode the complexity. Assume + // the complexity of XV instruction is 400. + let AddedComplexity = 410 in { + defm : SelectCmpPat; + defm : SelectCmpPat; + defm : SelectCmpPat; + defm : SelectCmpPat; + defm : SelectCmpPat; + defm : SelectCmpPat; + } + //===--------------------------------------------------------------------===// // Quad-Precision Floating-Point Conversion Instructions: diff --git a/llvm/test/CodeGen/PowerPC/fmf-propagation.ll b/llvm/test/CodeGen/PowerPC/fmf-propagation.ll --- a/llvm/test/CodeGen/PowerPC/fmf-propagation.ll +++ b/llvm/test/CodeGen/PowerPC/fmf-propagation.ll @@ -303,24 +303,22 @@ ; ; GLOBAL-LABEL: sqrt_afn_ieee: ; GLOBAL: # %bb.0: -; GLOBAL-NEXT: addis 3, 2, .LCPI10_2@toc@ha -; GLOBAL-NEXT: fabs 0, 1 -; GLOBAL-NEXT: lfs 2, .LCPI10_2@toc@l(3) -; GLOBAL-NEXT: fcmpu 0, 0, 2 -; GLOBAL-NEXT: xxlxor 0, 0, 0 -; GLOBAL-NEXT: blt 0, .LBB10_2 -; GLOBAL-NEXT: # %bb.1: ; GLOBAL-NEXT: xsrsqrtesp 0, 1 ; GLOBAL-NEXT: addis 3, 2, .LCPI10_0@toc@ha ; GLOBAL-NEXT: addis 4, 2, .LCPI10_1@toc@ha -; GLOBAL-NEXT: lfs 2, .LCPI10_0@toc@l(3) -; GLOBAL-NEXT: lfs 3, .LCPI10_1@toc@l(4) -; GLOBAL-NEXT: xsmulsp 1, 1, 0 -; GLOBAL-NEXT: xsmaddasp 2, 1, 0 -; GLOBAL-NEXT: xsmulsp 0, 1, 3 -; GLOBAL-NEXT: xsmulsp 0, 0, 2 -; GLOBAL-NEXT: .LBB10_2: -; GLOBAL-NEXT: fmr 1, 0 +; GLOBAL-NEXT: lfs 3, .LCPI10_0@toc@l(3) +; GLOBAL-NEXT: lfs 4, .LCPI10_1@toc@l(4) +; GLOBAL-NEXT: addis 3, 2, .LCPI10_2@toc@ha +; GLOBAL-NEXT: xsmulsp 2, 1, 0 +; GLOBAL-NEXT: fabs 1, 1 +; GLOBAL-NEXT: xsmaddasp 3, 2, 0 +; GLOBAL-NEXT: xsmulsp 0, 2, 4 +; GLOBAL-NEXT: lfs 2, .LCPI10_2@toc@l(3) +; GLOBAL-NEXT: xvcmpgedp 1, 1, 2 +; GLOBAL-NEXT: xxlxor 2, 2, 2 +; GLOBAL-NEXT: xsmulsp 0, 0, 3 +; GLOBAL-NEXT: xxsel 1, 2, 0, 1 +; GLOBAL-NEXT: # kill: def $f1 killed $f1 killed $vsl1 ; GLOBAL-NEXT: blr %rt = call afn float @llvm.sqrt.f32(float %x) ret float %rt @@ -412,24 +410,22 @@ ; ; GLOBAL-LABEL: sqrt_fast_ieee: ; GLOBAL: # %bb.0: -; GLOBAL-NEXT: addis 3, 2, .LCPI12_2@toc@ha -; GLOBAL-NEXT: fabs 0, 1 -; GLOBAL-NEXT: lfs 2, .LCPI12_2@toc@l(3) -; GLOBAL-NEXT: fcmpu 0, 0, 2 -; GLOBAL-NEXT: xxlxor 0, 0, 0 -; GLOBAL-NEXT: blt 0, .LBB12_2 -; GLOBAL-NEXT: # %bb.1: ; GLOBAL-NEXT: xsrsqrtesp 0, 1 ; GLOBAL-NEXT: addis 3, 2, .LCPI12_0@toc@ha ; GLOBAL-NEXT: addis 4, 2, .LCPI12_1@toc@ha -; GLOBAL-NEXT: lfs 2, .LCPI12_0@toc@l(3) -; GLOBAL-NEXT: lfs 3, .LCPI12_1@toc@l(4) -; GLOBAL-NEXT: xsmulsp 1, 1, 0 -; GLOBAL-NEXT: xsmaddasp 2, 1, 0 -; GLOBAL-NEXT: xsmulsp 0, 1, 3 -; GLOBAL-NEXT: xsmulsp 0, 0, 2 -; GLOBAL-NEXT: .LBB12_2: -; GLOBAL-NEXT: fmr 1, 0 +; GLOBAL-NEXT: lfs 3, .LCPI12_0@toc@l(3) +; GLOBAL-NEXT: lfs 4, .LCPI12_1@toc@l(4) +; GLOBAL-NEXT: addis 3, 2, .LCPI12_2@toc@ha +; GLOBAL-NEXT: xsmulsp 2, 1, 0 +; GLOBAL-NEXT: fabs 1, 1 +; GLOBAL-NEXT: xsmaddasp 3, 2, 0 +; GLOBAL-NEXT: xsmulsp 0, 2, 4 +; GLOBAL-NEXT: lfs 2, .LCPI12_2@toc@l(3) +; GLOBAL-NEXT: xvcmpgedp 1, 1, 2 +; GLOBAL-NEXT: xxlxor 2, 2, 2 +; GLOBAL-NEXT: xsmulsp 0, 0, 3 +; GLOBAL-NEXT: xxsel 1, 2, 0, 1 +; GLOBAL-NEXT: # kill: def $f1 killed $f1 killed $vsl1 ; GLOBAL-NEXT: blr %rt = call fast float @llvm.sqrt.f32(float %x) ret float %rt diff --git a/llvm/test/CodeGen/PowerPC/fsel.ll b/llvm/test/CodeGen/PowerPC/fsel.ll --- a/llvm/test/CodeGen/PowerPC/fsel.ll +++ b/llvm/test/CodeGen/PowerPC/fsel.ll @@ -83,8 +83,8 @@ ; CHECK-FM: blr ; CHECK-FM-VSX: @min1 -; CHECK-FM-VSX: xssubdp [[REG:[0-9]+]], 2, 1 -; CHECK-FM-VSX: fsel 1, [[REG]], 1, 2 +; CHECK-FM-VSX: xvcmpgtdp [[REG:[0-9]+]], 1, 2 +; CHECK-FM-VSX: xxsel 1, 1, 2, [[REG]] ; CHECK-FM-VSX: blr } @@ -104,8 +104,8 @@ ; CHECK-FM: blr ; CHECK-FM-VSX: @max1 -; CHECK-FM-VSX: xssubdp [[REG:[0-9]+]], 1, 2 -; CHECK-FM-VSX: fsel 1, [[REG]], 1, 2 +; CHECK-FM-VSX: xvcmpgedp [[REG:[0-9]+]], 1, 2 +; CHECK-FM-VSX: xxsel 1, 2, 1, [[REG]] ; CHECK-FM-VSX: blr } @@ -125,8 +125,8 @@ ; CHECK-FM: blr ; CHECK-FM-VSX: @cmp1 -; CHECK-FM-VSX: xssubdp [[REG:[0-9]+]], 1, 2 -; CHECK-FM-VSX: fsel 1, [[REG]], 3, 4 +; CHECK-FM-VSX: xvcmpgedp [[REG:[0-9]+]], 1, 2 +; CHECK-FM-VSX: xxsel 1, 4, 3, [[REG]] ; CHECK-FM-VSX: blr } @@ -146,8 +146,8 @@ ; CHECK-FM: blr ; CHECK-FM-VSX: @cmp2 -; CHECK-FM-VSX: xssubdp [[REG:[0-9]+]], 2, 1 -; CHECK-FM-VSX: fsel 1, [[REG]], 4, 3 +; CHECK-FM-VSX: xvcmpgtdp [[REG:[0-9]+]], 1, 2 +; CHECK-FM-VSX: xxsel 1, 4, 3, [[REG]] ; CHECK-FM-VSX: blr } @@ -169,10 +169,8 @@ ; CHECK-FM: blr ; CHECK-FM-VSX: @cmp3 -; CHECK-FM-VSX: xssubdp [[REG:[0-9]+]], 1, 2 -; CHECK-FM-VSX: xsnegdp [[REG3:[0-9]+]], [[REG]] -; CHECK-FM-VSX: fsel [[REG2:[0-9]+]], [[REG]], 3, 4 -; CHECK-FM-VSX: fsel 1, [[REG3]], [[REG2]], 4 +; CHECK-FM-VSX: xvcmpeqdp [[REG:[0-9]+]], 1, 2 +; CHECK-FM-VSX: xxsel 1, 4, 3, [[REG]] ; CHECK-FM-VSX: blr } diff --git a/llvm/test/CodeGen/PowerPC/scalar-equal.ll b/llvm/test/CodeGen/PowerPC/scalar-equal.ll --- a/llvm/test/CodeGen/PowerPC/scalar-equal.ll +++ b/llvm/test/CodeGen/PowerPC/scalar-equal.ll @@ -19,18 +19,24 @@ define double @testoeq(double %a, double %b, double %c, double %d) { ; FAST-P8-LABEL: testoeq: ; FAST-P8: # %bb.0: # %entry -; FAST-P8-NEXT: xssubdp f0, f1, f2 -; FAST-P8-NEXT: xsnegdp f1, f0 -; FAST-P8-NEXT: fsel f0, f0, f3, f4 -; FAST-P8-NEXT: fsel f1, f1, f0, f4 +; FAST-P8-NEXT: # kill: def $f2 killed $f2 def $vsl2 +; FAST-P8-NEXT: # kill: def $f1 killed $f1 def $vsl1 +; FAST-P8-NEXT: xvcmpeqdp vs0, vs1, vs2 +; FAST-P8-NEXT: # kill: def $f4 killed $f4 def $vsl4 +; FAST-P8-NEXT: # kill: def $f3 killed $f3 def $vsl3 +; FAST-P8-NEXT: xxsel vs1, vs4, vs3, vs0 +; FAST-P8-NEXT: # kill: def $f1 killed $f1 killed $vsl1 ; FAST-P8-NEXT: blr ; ; FAST-P9-LABEL: testoeq: ; FAST-P9: # %bb.0: # %entry -; FAST-P9-NEXT: xssubdp f0, f1, f2 -; FAST-P9-NEXT: fsel f1, f0, f3, f4 -; FAST-P9-NEXT: xsnegdp f0, f0 -; FAST-P9-NEXT: fsel f1, f0, f1, f4 +; FAST-P9-NEXT: # kill: def $f2 killed $f2 def $vsl2 +; FAST-P9-NEXT: # kill: def $f1 killed $f1 def $vsl1 +; FAST-P9-NEXT: xscmpeqdp vs0, vs1, vs2 +; FAST-P9-NEXT: # kill: def $f4 killed $f4 def $vsl4 +; FAST-P9-NEXT: # kill: def $f3 killed $f3 def $vsl3 +; FAST-P9-NEXT: xxsel vs1, vs4, vs3, vs0 +; FAST-P9-NEXT: # kill: def $f1 killed $f1 killed $vsl1 ; FAST-P9-NEXT: blr ; ; NO-FAST-P9-LABEL: testoeq: diff --git a/llvm/test/CodeGen/PowerPC/scalar_cmp.ll b/llvm/test/CodeGen/PowerPC/scalar_cmp.ll --- a/llvm/test/CodeGen/PowerPC/scalar_cmp.ll +++ b/llvm/test/CodeGen/PowerPC/scalar_cmp.ll @@ -20,18 +20,24 @@ define float @select_oeq_float(float %a, float %b, float %c, float %d) { ; FAST-P8-LABEL: select_oeq_float: ; FAST-P8: # %bb.0: # %entry -; FAST-P8-NEXT: xssubsp f0, f1, f2 -; FAST-P8-NEXT: xssubsp f1, f2, f1 -; FAST-P8-NEXT: fsel f0, f0, f3, f4 -; FAST-P8-NEXT: fsel f1, f1, f0, f4 +; FAST-P8-NEXT: # kill: def $f2 killed $f2 def $vsl2 +; FAST-P8-NEXT: # kill: def $f1 killed $f1 def $vsl1 +; FAST-P8-NEXT: xvcmpeqdp vs0, vs1, vs2 +; FAST-P8-NEXT: # kill: def $f4 killed $f4 def $vsl4 +; FAST-P8-NEXT: # kill: def $f3 killed $f3 def $vsl3 +; FAST-P8-NEXT: xxsel vs1, vs4, vs3, vs0 +; FAST-P8-NEXT: # kill: def $f1 killed $f1 killed $vsl1 ; FAST-P8-NEXT: blr ; ; FAST-P9-LABEL: select_oeq_float: ; FAST-P9: # %bb.0: # %entry -; FAST-P9-NEXT: xssubsp f0, f2, f1 -; FAST-P9-NEXT: xssubsp f1, f1, f2 -; FAST-P9-NEXT: fsel f1, f1, f3, f4 -; FAST-P9-NEXT: fsel f1, f0, f1, f4 +; FAST-P9-NEXT: # kill: def $f2 killed $f2 def $vsl2 +; FAST-P9-NEXT: # kill: def $f1 killed $f1 def $vsl1 +; FAST-P9-NEXT: xscmpeqdp vs0, vs1, vs2 +; FAST-P9-NEXT: # kill: def $f4 killed $f4 def $vsl4 +; FAST-P9-NEXT: # kill: def $f3 killed $f3 def $vsl3 +; FAST-P9-NEXT: xxsel vs1, vs4, vs3, vs0 +; FAST-P9-NEXT: # kill: def $f1 killed $f1 killed $vsl1 ; FAST-P9-NEXT: blr ; ; NO-FAST-P8-LABEL: select_oeq_float: @@ -61,18 +67,24 @@ define double @select_oeq_double(double %a, double %b, double %c, double %d) { ; FAST-P8-LABEL: select_oeq_double: ; FAST-P8: # %bb.0: # %entry -; FAST-P8-NEXT: xssubdp f0, f1, f2 -; FAST-P8-NEXT: xsnegdp f1, f0 -; FAST-P8-NEXT: fsel f0, f0, f3, f4 -; FAST-P8-NEXT: fsel f1, f1, f0, f4 +; FAST-P8-NEXT: # kill: def $f2 killed $f2 def $vsl2 +; FAST-P8-NEXT: # kill: def $f1 killed $f1 def $vsl1 +; FAST-P8-NEXT: xvcmpeqdp vs0, vs1, vs2 +; FAST-P8-NEXT: # kill: def $f4 killed $f4 def $vsl4 +; FAST-P8-NEXT: # kill: def $f3 killed $f3 def $vsl3 +; FAST-P8-NEXT: xxsel vs1, vs4, vs3, vs0 +; FAST-P8-NEXT: # kill: def $f1 killed $f1 killed $vsl1 ; FAST-P8-NEXT: blr ; ; FAST-P9-LABEL: select_oeq_double: ; FAST-P9: # %bb.0: # %entry -; FAST-P9-NEXT: xssubdp f0, f1, f2 -; FAST-P9-NEXT: fsel f1, f0, f3, f4 -; FAST-P9-NEXT: xsnegdp f0, f0 -; FAST-P9-NEXT: fsel f1, f0, f1, f4 +; FAST-P9-NEXT: # kill: def $f2 killed $f2 def $vsl2 +; FAST-P9-NEXT: # kill: def $f1 killed $f1 def $vsl1 +; FAST-P9-NEXT: xscmpeqdp vs0, vs1, vs2 +; FAST-P9-NEXT: # kill: def $f4 killed $f4 def $vsl4 +; FAST-P9-NEXT: # kill: def $f3 killed $f3 def $vsl3 +; FAST-P9-NEXT: xxsel vs1, vs4, vs3, vs0 +; FAST-P9-NEXT: # kill: def $f1 killed $f1 killed $vsl1 ; FAST-P9-NEXT: blr ; ; NO-FAST-P8-LABEL: select_oeq_double: @@ -102,18 +114,24 @@ define float @select_fast_oeq_float(float %a, float %b, float %c, float %d) { ; FAST-P8-LABEL: select_fast_oeq_float: ; FAST-P8: # %bb.0: # %entry -; FAST-P8-NEXT: xssubsp f0, f1, f2 -; FAST-P8-NEXT: xssubsp f1, f2, f1 -; FAST-P8-NEXT: fsel f0, f0, f3, f4 -; FAST-P8-NEXT: fsel f1, f1, f0, f4 +; FAST-P8-NEXT: # kill: def $f2 killed $f2 def $vsl2 +; FAST-P8-NEXT: # kill: def $f1 killed $f1 def $vsl1 +; FAST-P8-NEXT: xvcmpeqdp vs0, vs1, vs2 +; FAST-P8-NEXT: # kill: def $f4 killed $f4 def $vsl4 +; FAST-P8-NEXT: # kill: def $f3 killed $f3 def $vsl3 +; FAST-P8-NEXT: xxsel vs1, vs4, vs3, vs0 +; FAST-P8-NEXT: # kill: def $f1 killed $f1 killed $vsl1 ; FAST-P8-NEXT: blr ; ; FAST-P9-LABEL: select_fast_oeq_float: ; FAST-P9: # %bb.0: # %entry -; FAST-P9-NEXT: xssubsp f0, f2, f1 -; FAST-P9-NEXT: xssubsp f1, f1, f2 -; FAST-P9-NEXT: fsel f1, f1, f3, f4 -; FAST-P9-NEXT: fsel f1, f0, f1, f4 +; FAST-P9-NEXT: # kill: def $f2 killed $f2 def $vsl2 +; FAST-P9-NEXT: # kill: def $f1 killed $f1 def $vsl1 +; FAST-P9-NEXT: xscmpeqdp vs0, vs1, vs2 +; FAST-P9-NEXT: # kill: def $f4 killed $f4 def $vsl4 +; FAST-P9-NEXT: # kill: def $f3 killed $f3 def $vsl3 +; FAST-P9-NEXT: xxsel vs1, vs4, vs3, vs0 +; FAST-P9-NEXT: # kill: def $f1 killed $f1 killed $vsl1 ; FAST-P9-NEXT: blr ; ; NO-FAST-P8-LABEL: select_fast_oeq_float: @@ -143,18 +161,24 @@ define double @select_fast_oeq_double(double %a, double %b, double %c, double %d) { ; FAST-P8-LABEL: select_fast_oeq_double: ; FAST-P8: # %bb.0: # %entry -; FAST-P8-NEXT: xssubdp f0, f1, f2 -; FAST-P8-NEXT: xsnegdp f1, f0 -; FAST-P8-NEXT: fsel f0, f0, f3, f4 -; FAST-P8-NEXT: fsel f1, f1, f0, f4 +; FAST-P8-NEXT: # kill: def $f2 killed $f2 def $vsl2 +; FAST-P8-NEXT: # kill: def $f1 killed $f1 def $vsl1 +; FAST-P8-NEXT: xvcmpeqdp vs0, vs1, vs2 +; FAST-P8-NEXT: # kill: def $f4 killed $f4 def $vsl4 +; FAST-P8-NEXT: # kill: def $f3 killed $f3 def $vsl3 +; FAST-P8-NEXT: xxsel vs1, vs4, vs3, vs0 +; FAST-P8-NEXT: # kill: def $f1 killed $f1 killed $vsl1 ; FAST-P8-NEXT: blr ; ; FAST-P9-LABEL: select_fast_oeq_double: ; FAST-P9: # %bb.0: # %entry -; FAST-P9-NEXT: xssubdp f0, f1, f2 -; FAST-P9-NEXT: fsel f1, f0, f3, f4 -; FAST-P9-NEXT: xsnegdp f0, f0 -; FAST-P9-NEXT: fsel f1, f0, f1, f4 +; FAST-P9-NEXT: # kill: def $f2 killed $f2 def $vsl2 +; FAST-P9-NEXT: # kill: def $f1 killed $f1 def $vsl1 +; FAST-P9-NEXT: xscmpeqdp vs0, vs1, vs2 +; FAST-P9-NEXT: # kill: def $f4 killed $f4 def $vsl4 +; FAST-P9-NEXT: # kill: def $f3 killed $f3 def $vsl3 +; FAST-P9-NEXT: xxsel vs1, vs4, vs3, vs0 +; FAST-P9-NEXT: # kill: def $f1 killed $f1 killed $vsl1 ; FAST-P9-NEXT: blr ; ; NO-FAST-P8-LABEL: select_fast_oeq_double: @@ -186,18 +210,24 @@ define float @select_one_float(float %a, float %b, float %c, float %d) { ; FAST-P8-LABEL: select_one_float: ; FAST-P8: # %bb.0: # %entry -; FAST-P8-NEXT: xssubsp f0, f1, f2 -; FAST-P8-NEXT: xssubsp f1, f2, f1 -; FAST-P8-NEXT: fsel f0, f0, f4, f3 -; FAST-P8-NEXT: fsel f1, f1, f0, f3 +; FAST-P8-NEXT: # kill: def $f2 killed $f2 def $vsl2 +; FAST-P8-NEXT: # kill: def $f1 killed $f1 def $vsl1 +; FAST-P8-NEXT: xvcmpeqdp vs0, vs1, vs2 +; FAST-P8-NEXT: # kill: def $f4 killed $f4 def $vsl4 +; FAST-P8-NEXT: # kill: def $f3 killed $f3 def $vsl3 +; FAST-P8-NEXT: xxsel vs1, vs3, vs4, vs0 +; FAST-P8-NEXT: # kill: def $f1 killed $f1 killed $vsl1 ; FAST-P8-NEXT: blr ; ; FAST-P9-LABEL: select_one_float: ; FAST-P9: # %bb.0: # %entry -; FAST-P9-NEXT: xssubsp f0, f2, f1 -; FAST-P9-NEXT: xssubsp f1, f1, f2 -; FAST-P9-NEXT: fsel f1, f1, f4, f3 -; FAST-P9-NEXT: fsel f1, f0, f1, f3 +; FAST-P9-NEXT: # kill: def $f2 killed $f2 def $vsl2 +; FAST-P9-NEXT: # kill: def $f1 killed $f1 def $vsl1 +; FAST-P9-NEXT: xscmpeqdp vs0, vs1, vs2 +; FAST-P9-NEXT: # kill: def $f4 killed $f4 def $vsl4 +; FAST-P9-NEXT: # kill: def $f3 killed $f3 def $vsl3 +; FAST-P9-NEXT: xxsel vs1, vs3, vs4, vs0 +; FAST-P9-NEXT: # kill: def $f1 killed $f1 killed $vsl1 ; FAST-P9-NEXT: blr ; ; NO-FAST-P8-LABEL: select_one_float: @@ -229,18 +259,24 @@ define double @select_one_double(double %a, double %b, double %c, double %d) { ; FAST-P8-LABEL: select_one_double: ; FAST-P8: # %bb.0: # %entry -; FAST-P8-NEXT: xssubdp f0, f1, f2 -; FAST-P8-NEXT: xsnegdp f1, f0 -; FAST-P8-NEXT: fsel f0, f0, f4, f3 -; FAST-P8-NEXT: fsel f1, f1, f0, f3 +; FAST-P8-NEXT: # kill: def $f2 killed $f2 def $vsl2 +; FAST-P8-NEXT: # kill: def $f1 killed $f1 def $vsl1 +; FAST-P8-NEXT: xvcmpeqdp vs0, vs1, vs2 +; FAST-P8-NEXT: # kill: def $f4 killed $f4 def $vsl4 +; FAST-P8-NEXT: # kill: def $f3 killed $f3 def $vsl3 +; FAST-P8-NEXT: xxsel vs1, vs3, vs4, vs0 +; FAST-P8-NEXT: # kill: def $f1 killed $f1 killed $vsl1 ; FAST-P8-NEXT: blr ; ; FAST-P9-LABEL: select_one_double: ; FAST-P9: # %bb.0: # %entry -; FAST-P9-NEXT: xssubdp f0, f1, f2 -; FAST-P9-NEXT: fsel f1, f0, f4, f3 -; FAST-P9-NEXT: xsnegdp f0, f0 -; FAST-P9-NEXT: fsel f1, f0, f1, f3 +; FAST-P9-NEXT: # kill: def $f2 killed $f2 def $vsl2 +; FAST-P9-NEXT: # kill: def $f1 killed $f1 def $vsl1 +; FAST-P9-NEXT: xscmpeqdp vs0, vs1, vs2 +; FAST-P9-NEXT: # kill: def $f4 killed $f4 def $vsl4 +; FAST-P9-NEXT: # kill: def $f3 killed $f3 def $vsl3 +; FAST-P9-NEXT: xxsel vs1, vs3, vs4, vs0 +; FAST-P9-NEXT: # kill: def $f1 killed $f1 killed $vsl1 ; FAST-P9-NEXT: blr ; ; NO-FAST-P8-LABEL: select_one_double: @@ -272,18 +308,24 @@ define float @select_fast_one_float(float %a, float %b, float %c, float %d) { ; FAST-P8-LABEL: select_fast_one_float: ; FAST-P8: # %bb.0: # %entry -; FAST-P8-NEXT: xssubsp f0, f1, f2 -; FAST-P8-NEXT: xssubsp f1, f2, f1 -; FAST-P8-NEXT: fsel f0, f0, f4, f3 -; FAST-P8-NEXT: fsel f1, f1, f0, f3 +; FAST-P8-NEXT: # kill: def $f2 killed $f2 def $vsl2 +; FAST-P8-NEXT: # kill: def $f1 killed $f1 def $vsl1 +; FAST-P8-NEXT: xvcmpeqdp vs0, vs1, vs2 +; FAST-P8-NEXT: # kill: def $f4 killed $f4 def $vsl4 +; FAST-P8-NEXT: # kill: def $f3 killed $f3 def $vsl3 +; FAST-P8-NEXT: xxsel vs1, vs3, vs4, vs0 +; FAST-P8-NEXT: # kill: def $f1 killed $f1 killed $vsl1 ; FAST-P8-NEXT: blr ; ; FAST-P9-LABEL: select_fast_one_float: ; FAST-P9: # %bb.0: # %entry -; FAST-P9-NEXT: xssubsp f0, f2, f1 -; FAST-P9-NEXT: xssubsp f1, f1, f2 -; FAST-P9-NEXT: fsel f1, f1, f4, f3 -; FAST-P9-NEXT: fsel f1, f0, f1, f3 +; FAST-P9-NEXT: # kill: def $f2 killed $f2 def $vsl2 +; FAST-P9-NEXT: # kill: def $f1 killed $f1 def $vsl1 +; FAST-P9-NEXT: xscmpeqdp vs0, vs1, vs2 +; FAST-P9-NEXT: # kill: def $f4 killed $f4 def $vsl4 +; FAST-P9-NEXT: # kill: def $f3 killed $f3 def $vsl3 +; FAST-P9-NEXT: xxsel vs1, vs3, vs4, vs0 +; FAST-P9-NEXT: # kill: def $f1 killed $f1 killed $vsl1 ; FAST-P9-NEXT: blr ; ; NO-FAST-P8-LABEL: select_fast_one_float: @@ -313,18 +355,24 @@ define double @select_fast_one_double(double %a, double %b, double %c, double %d) { ; FAST-P8-LABEL: select_fast_one_double: ; FAST-P8: # %bb.0: # %entry -; FAST-P8-NEXT: xssubdp f0, f1, f2 -; FAST-P8-NEXT: xsnegdp f1, f0 -; FAST-P8-NEXT: fsel f0, f0, f4, f3 -; FAST-P8-NEXT: fsel f1, f1, f0, f3 +; FAST-P8-NEXT: # kill: def $f2 killed $f2 def $vsl2 +; FAST-P8-NEXT: # kill: def $f1 killed $f1 def $vsl1 +; FAST-P8-NEXT: xvcmpeqdp vs0, vs1, vs2 +; FAST-P8-NEXT: # kill: def $f4 killed $f4 def $vsl4 +; FAST-P8-NEXT: # kill: def $f3 killed $f3 def $vsl3 +; FAST-P8-NEXT: xxsel vs1, vs3, vs4, vs0 +; FAST-P8-NEXT: # kill: def $f1 killed $f1 killed $vsl1 ; FAST-P8-NEXT: blr ; ; FAST-P9-LABEL: select_fast_one_double: ; FAST-P9: # %bb.0: # %entry -; FAST-P9-NEXT: xssubdp f0, f1, f2 -; FAST-P9-NEXT: fsel f1, f0, f4, f3 -; FAST-P9-NEXT: xsnegdp f0, f0 -; FAST-P9-NEXT: fsel f1, f0, f1, f3 +; FAST-P9-NEXT: # kill: def $f2 killed $f2 def $vsl2 +; FAST-P9-NEXT: # kill: def $f1 killed $f1 def $vsl1 +; FAST-P9-NEXT: xscmpeqdp vs0, vs1, vs2 +; FAST-P9-NEXT: # kill: def $f4 killed $f4 def $vsl4 +; FAST-P9-NEXT: # kill: def $f3 killed $f3 def $vsl3 +; FAST-P9-NEXT: xxsel vs1, vs3, vs4, vs0 +; FAST-P9-NEXT: # kill: def $f1 killed $f1 killed $vsl1 ; FAST-P9-NEXT: blr ; ; NO-FAST-P8-LABEL: select_fast_one_double: @@ -356,14 +404,24 @@ define float @select_oge_float(float %a, float %b, float %c, float %d) { ; FAST-P8-LABEL: select_oge_float: ; FAST-P8: # %bb.0: # %entry -; FAST-P8-NEXT: xssubsp f0, f1, f2 -; FAST-P8-NEXT: fsel f1, f0, f3, f4 +; FAST-P8-NEXT: # kill: def $f2 killed $f2 def $vsl2 +; FAST-P8-NEXT: # kill: def $f1 killed $f1 def $vsl1 +; FAST-P8-NEXT: xvcmpgedp vs0, vs1, vs2 +; FAST-P8-NEXT: # kill: def $f4 killed $f4 def $vsl4 +; FAST-P8-NEXT: # kill: def $f3 killed $f3 def $vsl3 +; FAST-P8-NEXT: xxsel vs1, vs4, vs3, vs0 +; FAST-P8-NEXT: # kill: def $f1 killed $f1 killed $vsl1 ; FAST-P8-NEXT: blr ; ; FAST-P9-LABEL: select_oge_float: ; FAST-P9: # %bb.0: # %entry -; FAST-P9-NEXT: xssubsp f0, f1, f2 -; FAST-P9-NEXT: fsel f1, f0, f3, f4 +; FAST-P9-NEXT: # kill: def $f2 killed $f2 def $vsl2 +; FAST-P9-NEXT: # kill: def $f1 killed $f1 def $vsl1 +; FAST-P9-NEXT: xscmpgedp vs0, vs1, vs2 +; FAST-P9-NEXT: # kill: def $f4 killed $f4 def $vsl4 +; FAST-P9-NEXT: # kill: def $f3 killed $f3 def $vsl3 +; FAST-P9-NEXT: xxsel vs1, vs4, vs3, vs0 +; FAST-P9-NEXT: # kill: def $f1 killed $f1 killed $vsl1 ; FAST-P9-NEXT: blr ; ; NO-FAST-P8-LABEL: select_oge_float: @@ -395,14 +453,24 @@ define double @select_oge_double(double %a, double %b, double %c, double %d) { ; FAST-P8-LABEL: select_oge_double: ; FAST-P8: # %bb.0: # %entry -; FAST-P8-NEXT: xssubdp f0, f1, f2 -; FAST-P8-NEXT: fsel f1, f0, f3, f4 +; FAST-P8-NEXT: # kill: def $f2 killed $f2 def $vsl2 +; FAST-P8-NEXT: # kill: def $f1 killed $f1 def $vsl1 +; FAST-P8-NEXT: xvcmpgedp vs0, vs1, vs2 +; FAST-P8-NEXT: # kill: def $f4 killed $f4 def $vsl4 +; FAST-P8-NEXT: # kill: def $f3 killed $f3 def $vsl3 +; FAST-P8-NEXT: xxsel vs1, vs4, vs3, vs0 +; FAST-P8-NEXT: # kill: def $f1 killed $f1 killed $vsl1 ; FAST-P8-NEXT: blr ; ; FAST-P9-LABEL: select_oge_double: ; FAST-P9: # %bb.0: # %entry -; FAST-P9-NEXT: xssubdp f0, f1, f2 -; FAST-P9-NEXT: fsel f1, f0, f3, f4 +; FAST-P9-NEXT: # kill: def $f2 killed $f2 def $vsl2 +; FAST-P9-NEXT: # kill: def $f1 killed $f1 def $vsl1 +; FAST-P9-NEXT: xscmpgedp vs0, vs1, vs2 +; FAST-P9-NEXT: # kill: def $f4 killed $f4 def $vsl4 +; FAST-P9-NEXT: # kill: def $f3 killed $f3 def $vsl3 +; FAST-P9-NEXT: xxsel vs1, vs4, vs3, vs0 +; FAST-P9-NEXT: # kill: def $f1 killed $f1 killed $vsl1 ; FAST-P9-NEXT: blr ; ; NO-FAST-P8-LABEL: select_oge_double: @@ -434,14 +502,24 @@ define float @select_fast_oge_float(float %a, float %b, float %c, float %d) { ; FAST-P8-LABEL: select_fast_oge_float: ; FAST-P8: # %bb.0: # %entry -; FAST-P8-NEXT: xssubsp f0, f1, f2 -; FAST-P8-NEXT: fsel f1, f0, f3, f4 +; FAST-P8-NEXT: # kill: def $f2 killed $f2 def $vsl2 +; FAST-P8-NEXT: # kill: def $f1 killed $f1 def $vsl1 +; FAST-P8-NEXT: xvcmpgedp vs0, vs1, vs2 +; FAST-P8-NEXT: # kill: def $f4 killed $f4 def $vsl4 +; FAST-P8-NEXT: # kill: def $f3 killed $f3 def $vsl3 +; FAST-P8-NEXT: xxsel vs1, vs4, vs3, vs0 +; FAST-P8-NEXT: # kill: def $f1 killed $f1 killed $vsl1 ; FAST-P8-NEXT: blr ; ; FAST-P9-LABEL: select_fast_oge_float: ; FAST-P9: # %bb.0: # %entry -; FAST-P9-NEXT: xssubsp f0, f1, f2 -; FAST-P9-NEXT: fsel f1, f0, f3, f4 +; FAST-P9-NEXT: # kill: def $f2 killed $f2 def $vsl2 +; FAST-P9-NEXT: # kill: def $f1 killed $f1 def $vsl1 +; FAST-P9-NEXT: xscmpgedp vs0, vs1, vs2 +; FAST-P9-NEXT: # kill: def $f4 killed $f4 def $vsl4 +; FAST-P9-NEXT: # kill: def $f3 killed $f3 def $vsl3 +; FAST-P9-NEXT: xxsel vs1, vs4, vs3, vs0 +; FAST-P9-NEXT: # kill: def $f1 killed $f1 killed $vsl1 ; FAST-P9-NEXT: blr ; ; NO-FAST-P8-LABEL: select_fast_oge_float: @@ -471,14 +549,24 @@ define double @select_fast_oge_double(double %a, double %b, double %c, double %d) { ; FAST-P8-LABEL: select_fast_oge_double: ; FAST-P8: # %bb.0: # %entry -; FAST-P8-NEXT: xssubdp f0, f1, f2 -; FAST-P8-NEXT: fsel f1, f0, f3, f4 +; FAST-P8-NEXT: # kill: def $f2 killed $f2 def $vsl2 +; FAST-P8-NEXT: # kill: def $f1 killed $f1 def $vsl1 +; FAST-P8-NEXT: xvcmpgedp vs0, vs1, vs2 +; FAST-P8-NEXT: # kill: def $f4 killed $f4 def $vsl4 +; FAST-P8-NEXT: # kill: def $f3 killed $f3 def $vsl3 +; FAST-P8-NEXT: xxsel vs1, vs4, vs3, vs0 +; FAST-P8-NEXT: # kill: def $f1 killed $f1 killed $vsl1 ; FAST-P8-NEXT: blr ; ; FAST-P9-LABEL: select_fast_oge_double: ; FAST-P9: # %bb.0: # %entry -; FAST-P9-NEXT: xssubdp f0, f1, f2 -; FAST-P9-NEXT: fsel f1, f0, f3, f4 +; FAST-P9-NEXT: # kill: def $f2 killed $f2 def $vsl2 +; FAST-P9-NEXT: # kill: def $f1 killed $f1 def $vsl1 +; FAST-P9-NEXT: xscmpgedp vs0, vs1, vs2 +; FAST-P9-NEXT: # kill: def $f4 killed $f4 def $vsl4 +; FAST-P9-NEXT: # kill: def $f3 killed $f3 def $vsl3 +; FAST-P9-NEXT: xxsel vs1, vs4, vs3, vs0 +; FAST-P9-NEXT: # kill: def $f1 killed $f1 killed $vsl1 ; FAST-P9-NEXT: blr ; ; NO-FAST-P8-LABEL: select_fast_oge_double: @@ -510,14 +598,24 @@ define float @select_olt_float(float %a, float %b, float %c, float %d) { ; FAST-P8-LABEL: select_olt_float: ; FAST-P8: # %bb.0: # %entry -; FAST-P8-NEXT: xssubsp f0, f1, f2 -; FAST-P8-NEXT: fsel f1, f0, f4, f3 +; FAST-P8-NEXT: # kill: def $f2 killed $f2 def $vsl2 +; FAST-P8-NEXT: # kill: def $f1 killed $f1 def $vsl1 +; FAST-P8-NEXT: xvcmpgedp vs0, vs1, vs2 +; FAST-P8-NEXT: # kill: def $f4 killed $f4 def $vsl4 +; FAST-P8-NEXT: # kill: def $f3 killed $f3 def $vsl3 +; FAST-P8-NEXT: xxsel vs1, vs3, vs4, vs0 +; FAST-P8-NEXT: # kill: def $f1 killed $f1 killed $vsl1 ; FAST-P8-NEXT: blr ; ; FAST-P9-LABEL: select_olt_float: ; FAST-P9: # %bb.0: # %entry -; FAST-P9-NEXT: xssubsp f0, f1, f2 -; FAST-P9-NEXT: fsel f1, f0, f4, f3 +; FAST-P9-NEXT: # kill: def $f2 killed $f2 def $vsl2 +; FAST-P9-NEXT: # kill: def $f1 killed $f1 def $vsl1 +; FAST-P9-NEXT: xscmpgedp vs0, vs1, vs2 +; FAST-P9-NEXT: # kill: def $f4 killed $f4 def $vsl4 +; FAST-P9-NEXT: # kill: def $f3 killed $f3 def $vsl3 +; FAST-P9-NEXT: xxsel vs1, vs3, vs4, vs0 +; FAST-P9-NEXT: # kill: def $f1 killed $f1 killed $vsl1 ; FAST-P9-NEXT: blr ; ; NO-FAST-P8-LABEL: select_olt_float: @@ -547,14 +645,24 @@ define double @select_olt_double(double %a, double %b, double %c, double %d) { ; FAST-P8-LABEL: select_olt_double: ; FAST-P8: # %bb.0: # %entry -; FAST-P8-NEXT: xssubdp f0, f1, f2 -; FAST-P8-NEXT: fsel f1, f0, f4, f3 +; FAST-P8-NEXT: # kill: def $f2 killed $f2 def $vsl2 +; FAST-P8-NEXT: # kill: def $f1 killed $f1 def $vsl1 +; FAST-P8-NEXT: xvcmpgedp vs0, vs1, vs2 +; FAST-P8-NEXT: # kill: def $f4 killed $f4 def $vsl4 +; FAST-P8-NEXT: # kill: def $f3 killed $f3 def $vsl3 +; FAST-P8-NEXT: xxsel vs1, vs3, vs4, vs0 +; FAST-P8-NEXT: # kill: def $f1 killed $f1 killed $vsl1 ; FAST-P8-NEXT: blr ; ; FAST-P9-LABEL: select_olt_double: ; FAST-P9: # %bb.0: # %entry -; FAST-P9-NEXT: xssubdp f0, f1, f2 -; FAST-P9-NEXT: fsel f1, f0, f4, f3 +; FAST-P9-NEXT: # kill: def $f2 killed $f2 def $vsl2 +; FAST-P9-NEXT: # kill: def $f1 killed $f1 def $vsl1 +; FAST-P9-NEXT: xscmpgedp vs0, vs1, vs2 +; FAST-P9-NEXT: # kill: def $f4 killed $f4 def $vsl4 +; FAST-P9-NEXT: # kill: def $f3 killed $f3 def $vsl3 +; FAST-P9-NEXT: xxsel vs1, vs3, vs4, vs0 +; FAST-P9-NEXT: # kill: def $f1 killed $f1 killed $vsl1 ; FAST-P9-NEXT: blr ; ; NO-FAST-P8-LABEL: select_olt_double: @@ -584,14 +692,24 @@ define float @select_fast_olt_float(float %a, float %b, float %c, float %d) { ; FAST-P8-LABEL: select_fast_olt_float: ; FAST-P8: # %bb.0: # %entry -; FAST-P8-NEXT: xssubsp f0, f1, f2 -; FAST-P8-NEXT: fsel f1, f0, f4, f3 +; FAST-P8-NEXT: # kill: def $f2 killed $f2 def $vsl2 +; FAST-P8-NEXT: # kill: def $f1 killed $f1 def $vsl1 +; FAST-P8-NEXT: xvcmpgedp vs0, vs1, vs2 +; FAST-P8-NEXT: # kill: def $f4 killed $f4 def $vsl4 +; FAST-P8-NEXT: # kill: def $f3 killed $f3 def $vsl3 +; FAST-P8-NEXT: xxsel vs1, vs3, vs4, vs0 +; FAST-P8-NEXT: # kill: def $f1 killed $f1 killed $vsl1 ; FAST-P8-NEXT: blr ; ; FAST-P9-LABEL: select_fast_olt_float: ; FAST-P9: # %bb.0: # %entry -; FAST-P9-NEXT: xssubsp f0, f1, f2 -; FAST-P9-NEXT: fsel f1, f0, f4, f3 +; FAST-P9-NEXT: # kill: def $f2 killed $f2 def $vsl2 +; FAST-P9-NEXT: # kill: def $f1 killed $f1 def $vsl1 +; FAST-P9-NEXT: xscmpgedp vs0, vs1, vs2 +; FAST-P9-NEXT: # kill: def $f4 killed $f4 def $vsl4 +; FAST-P9-NEXT: # kill: def $f3 killed $f3 def $vsl3 +; FAST-P9-NEXT: xxsel vs1, vs3, vs4, vs0 +; FAST-P9-NEXT: # kill: def $f1 killed $f1 killed $vsl1 ; FAST-P9-NEXT: blr ; ; NO-FAST-P8-LABEL: select_fast_olt_float: @@ -621,14 +739,24 @@ define double @select_fast_olt_double(double %a, double %b, double %c, double %d) { ; FAST-P8-LABEL: select_fast_olt_double: ; FAST-P8: # %bb.0: # %entry -; FAST-P8-NEXT: xssubdp f0, f1, f2 -; FAST-P8-NEXT: fsel f1, f0, f4, f3 +; FAST-P8-NEXT: # kill: def $f2 killed $f2 def $vsl2 +; FAST-P8-NEXT: # kill: def $f1 killed $f1 def $vsl1 +; FAST-P8-NEXT: xvcmpgedp vs0, vs1, vs2 +; FAST-P8-NEXT: # kill: def $f4 killed $f4 def $vsl4 +; FAST-P8-NEXT: # kill: def $f3 killed $f3 def $vsl3 +; FAST-P8-NEXT: xxsel vs1, vs3, vs4, vs0 +; FAST-P8-NEXT: # kill: def $f1 killed $f1 killed $vsl1 ; FAST-P8-NEXT: blr ; ; FAST-P9-LABEL: select_fast_olt_double: ; FAST-P9: # %bb.0: # %entry -; FAST-P9-NEXT: xssubdp f0, f1, f2 -; FAST-P9-NEXT: fsel f1, f0, f4, f3 +; FAST-P9-NEXT: # kill: def $f2 killed $f2 def $vsl2 +; FAST-P9-NEXT: # kill: def $f1 killed $f1 def $vsl1 +; FAST-P9-NEXT: xscmpgedp vs0, vs1, vs2 +; FAST-P9-NEXT: # kill: def $f4 killed $f4 def $vsl4 +; FAST-P9-NEXT: # kill: def $f3 killed $f3 def $vsl3 +; FAST-P9-NEXT: xxsel vs1, vs3, vs4, vs0 +; FAST-P9-NEXT: # kill: def $f1 killed $f1 killed $vsl1 ; FAST-P9-NEXT: blr ; ; NO-FAST-P8-LABEL: select_fast_olt_double: @@ -660,14 +788,24 @@ define float @select_ogt_float(float %a, float %b, float %c, float %d) { ; FAST-P8-LABEL: select_ogt_float: ; FAST-P8: # %bb.0: # %entry -; FAST-P8-NEXT: xssubsp f0, f2, f1 -; FAST-P8-NEXT: fsel f1, f0, f4, f3 +; FAST-P8-NEXT: # kill: def $f2 killed $f2 def $vsl2 +; FAST-P8-NEXT: # kill: def $f1 killed $f1 def $vsl1 +; FAST-P8-NEXT: xvcmpgtdp vs0, vs1, vs2 +; FAST-P8-NEXT: # kill: def $f4 killed $f4 def $vsl4 +; FAST-P8-NEXT: # kill: def $f3 killed $f3 def $vsl3 +; FAST-P8-NEXT: xxsel vs1, vs4, vs3, vs0 +; FAST-P8-NEXT: # kill: def $f1 killed $f1 killed $vsl1 ; FAST-P8-NEXT: blr ; ; FAST-P9-LABEL: select_ogt_float: ; FAST-P9: # %bb.0: # %entry -; FAST-P9-NEXT: xssubsp f0, f2, f1 -; FAST-P9-NEXT: fsel f1, f0, f4, f3 +; FAST-P9-NEXT: # kill: def $f2 killed $f2 def $vsl2 +; FAST-P9-NEXT: # kill: def $f1 killed $f1 def $vsl1 +; FAST-P9-NEXT: xscmpgtdp vs0, vs1, vs2 +; FAST-P9-NEXT: # kill: def $f4 killed $f4 def $vsl4 +; FAST-P9-NEXT: # kill: def $f3 killed $f3 def $vsl3 +; FAST-P9-NEXT: xxsel vs1, vs4, vs3, vs0 +; FAST-P9-NEXT: # kill: def $f1 killed $f1 killed $vsl1 ; FAST-P9-NEXT: blr ; ; NO-FAST-P8-LABEL: select_ogt_float: @@ -697,14 +835,24 @@ define double @select_ogt_double(double %a, double %b, double %c, double %d) { ; FAST-P8-LABEL: select_ogt_double: ; FAST-P8: # %bb.0: # %entry -; FAST-P8-NEXT: xssubdp f0, f2, f1 -; FAST-P8-NEXT: fsel f1, f0, f4, f3 +; FAST-P8-NEXT: # kill: def $f2 killed $f2 def $vsl2 +; FAST-P8-NEXT: # kill: def $f1 killed $f1 def $vsl1 +; FAST-P8-NEXT: xvcmpgtdp vs0, vs1, vs2 +; FAST-P8-NEXT: # kill: def $f4 killed $f4 def $vsl4 +; FAST-P8-NEXT: # kill: def $f3 killed $f3 def $vsl3 +; FAST-P8-NEXT: xxsel vs1, vs4, vs3, vs0 +; FAST-P8-NEXT: # kill: def $f1 killed $f1 killed $vsl1 ; FAST-P8-NEXT: blr ; ; FAST-P9-LABEL: select_ogt_double: ; FAST-P9: # %bb.0: # %entry -; FAST-P9-NEXT: xssubdp f0, f2, f1 -; FAST-P9-NEXT: fsel f1, f0, f4, f3 +; FAST-P9-NEXT: # kill: def $f2 killed $f2 def $vsl2 +; FAST-P9-NEXT: # kill: def $f1 killed $f1 def $vsl1 +; FAST-P9-NEXT: xscmpgtdp vs0, vs1, vs2 +; FAST-P9-NEXT: # kill: def $f4 killed $f4 def $vsl4 +; FAST-P9-NEXT: # kill: def $f3 killed $f3 def $vsl3 +; FAST-P9-NEXT: xxsel vs1, vs4, vs3, vs0 +; FAST-P9-NEXT: # kill: def $f1 killed $f1 killed $vsl1 ; FAST-P9-NEXT: blr ; ; NO-FAST-P8-LABEL: select_ogt_double: @@ -734,14 +882,24 @@ define float @select_fast_ogt_float(float %a, float %b, float %c, float %d) { ; FAST-P8-LABEL: select_fast_ogt_float: ; FAST-P8: # %bb.0: # %entry -; FAST-P8-NEXT: xssubsp f0, f2, f1 -; FAST-P8-NEXT: fsel f1, f0, f4, f3 +; FAST-P8-NEXT: # kill: def $f2 killed $f2 def $vsl2 +; FAST-P8-NEXT: # kill: def $f1 killed $f1 def $vsl1 +; FAST-P8-NEXT: xvcmpgtdp vs0, vs1, vs2 +; FAST-P8-NEXT: # kill: def $f4 killed $f4 def $vsl4 +; FAST-P8-NEXT: # kill: def $f3 killed $f3 def $vsl3 +; FAST-P8-NEXT: xxsel vs1, vs4, vs3, vs0 +; FAST-P8-NEXT: # kill: def $f1 killed $f1 killed $vsl1 ; FAST-P8-NEXT: blr ; ; FAST-P9-LABEL: select_fast_ogt_float: ; FAST-P9: # %bb.0: # %entry -; FAST-P9-NEXT: xssubsp f0, f2, f1 -; FAST-P9-NEXT: fsel f1, f0, f4, f3 +; FAST-P9-NEXT: # kill: def $f2 killed $f2 def $vsl2 +; FAST-P9-NEXT: # kill: def $f1 killed $f1 def $vsl1 +; FAST-P9-NEXT: xscmpgtdp vs0, vs1, vs2 +; FAST-P9-NEXT: # kill: def $f4 killed $f4 def $vsl4 +; FAST-P9-NEXT: # kill: def $f3 killed $f3 def $vsl3 +; FAST-P9-NEXT: xxsel vs1, vs4, vs3, vs0 +; FAST-P9-NEXT: # kill: def $f1 killed $f1 killed $vsl1 ; FAST-P9-NEXT: blr ; ; NO-FAST-P8-LABEL: select_fast_ogt_float: @@ -771,14 +929,24 @@ define double @select_fast_ogt_double(double %a, double %b, double %c, double %d) { ; FAST-P8-LABEL: select_fast_ogt_double: ; FAST-P8: # %bb.0: # %entry -; FAST-P8-NEXT: xssubdp f0, f2, f1 -; FAST-P8-NEXT: fsel f1, f0, f4, f3 +; FAST-P8-NEXT: # kill: def $f2 killed $f2 def $vsl2 +; FAST-P8-NEXT: # kill: def $f1 killed $f1 def $vsl1 +; FAST-P8-NEXT: xvcmpgtdp vs0, vs1, vs2 +; FAST-P8-NEXT: # kill: def $f4 killed $f4 def $vsl4 +; FAST-P8-NEXT: # kill: def $f3 killed $f3 def $vsl3 +; FAST-P8-NEXT: xxsel vs1, vs4, vs3, vs0 +; FAST-P8-NEXT: # kill: def $f1 killed $f1 killed $vsl1 ; FAST-P8-NEXT: blr ; ; FAST-P9-LABEL: select_fast_ogt_double: ; FAST-P9: # %bb.0: # %entry -; FAST-P9-NEXT: xssubdp f0, f2, f1 -; FAST-P9-NEXT: fsel f1, f0, f4, f3 +; FAST-P9-NEXT: # kill: def $f2 killed $f2 def $vsl2 +; FAST-P9-NEXT: # kill: def $f1 killed $f1 def $vsl1 +; FAST-P9-NEXT: xscmpgtdp vs0, vs1, vs2 +; FAST-P9-NEXT: # kill: def $f4 killed $f4 def $vsl4 +; FAST-P9-NEXT: # kill: def $f3 killed $f3 def $vsl3 +; FAST-P9-NEXT: xxsel vs1, vs4, vs3, vs0 +; FAST-P9-NEXT: # kill: def $f1 killed $f1 killed $vsl1 ; FAST-P9-NEXT: blr ; ; NO-FAST-P8-LABEL: select_fast_ogt_double: @@ -810,14 +978,24 @@ define float @select_ole_float(float %a, float %b, float %c, float %d) { ; FAST-P8-LABEL: select_ole_float: ; FAST-P8: # %bb.0: # %entry -; FAST-P8-NEXT: xssubsp f0, f2, f1 -; FAST-P8-NEXT: fsel f1, f0, f3, f4 +; FAST-P8-NEXT: # kill: def $f2 killed $f2 def $vsl2 +; FAST-P8-NEXT: # kill: def $f1 killed $f1 def $vsl1 +; FAST-P8-NEXT: xvcmpgtdp vs0, vs1, vs2 +; FAST-P8-NEXT: # kill: def $f4 killed $f4 def $vsl4 +; FAST-P8-NEXT: # kill: def $f3 killed $f3 def $vsl3 +; FAST-P8-NEXT: xxsel vs1, vs3, vs4, vs0 +; FAST-P8-NEXT: # kill: def $f1 killed $f1 killed $vsl1 ; FAST-P8-NEXT: blr ; ; FAST-P9-LABEL: select_ole_float: ; FAST-P9: # %bb.0: # %entry -; FAST-P9-NEXT: xssubsp f0, f2, f1 -; FAST-P9-NEXT: fsel f1, f0, f3, f4 +; FAST-P9-NEXT: # kill: def $f2 killed $f2 def $vsl2 +; FAST-P9-NEXT: # kill: def $f1 killed $f1 def $vsl1 +; FAST-P9-NEXT: xscmpgtdp vs0, vs1, vs2 +; FAST-P9-NEXT: # kill: def $f4 killed $f4 def $vsl4 +; FAST-P9-NEXT: # kill: def $f3 killed $f3 def $vsl3 +; FAST-P9-NEXT: xxsel vs1, vs3, vs4, vs0 +; FAST-P9-NEXT: # kill: def $f1 killed $f1 killed $vsl1 ; FAST-P9-NEXT: blr ; ; NO-FAST-P8-LABEL: select_ole_float: @@ -849,14 +1027,24 @@ define double @select_ole_double(double %a, double %b, double %c, double %d) { ; FAST-P8-LABEL: select_ole_double: ; FAST-P8: # %bb.0: # %entry -; FAST-P8-NEXT: xssubdp f0, f2, f1 -; FAST-P8-NEXT: fsel f1, f0, f3, f4 +; FAST-P8-NEXT: # kill: def $f2 killed $f2 def $vsl2 +; FAST-P8-NEXT: # kill: def $f1 killed $f1 def $vsl1 +; FAST-P8-NEXT: xvcmpgtdp vs0, vs1, vs2 +; FAST-P8-NEXT: # kill: def $f4 killed $f4 def $vsl4 +; FAST-P8-NEXT: # kill: def $f3 killed $f3 def $vsl3 +; FAST-P8-NEXT: xxsel vs1, vs3, vs4, vs0 +; FAST-P8-NEXT: # kill: def $f1 killed $f1 killed $vsl1 ; FAST-P8-NEXT: blr ; ; FAST-P9-LABEL: select_ole_double: ; FAST-P9: # %bb.0: # %entry -; FAST-P9-NEXT: xssubdp f0, f2, f1 -; FAST-P9-NEXT: fsel f1, f0, f3, f4 +; FAST-P9-NEXT: # kill: def $f2 killed $f2 def $vsl2 +; FAST-P9-NEXT: # kill: def $f1 killed $f1 def $vsl1 +; FAST-P9-NEXT: xscmpgtdp vs0, vs1, vs2 +; FAST-P9-NEXT: # kill: def $f4 killed $f4 def $vsl4 +; FAST-P9-NEXT: # kill: def $f3 killed $f3 def $vsl3 +; FAST-P9-NEXT: xxsel vs1, vs3, vs4, vs0 +; FAST-P9-NEXT: # kill: def $f1 killed $f1 killed $vsl1 ; FAST-P9-NEXT: blr ; ; NO-FAST-P8-LABEL: select_ole_double: @@ -888,14 +1076,24 @@ define float @select_fast_ole_float(float %a, float %b, float %c, float %d) { ; FAST-P8-LABEL: select_fast_ole_float: ; FAST-P8: # %bb.0: # %entry -; FAST-P8-NEXT: xssubsp f0, f2, f1 -; FAST-P8-NEXT: fsel f1, f0, f3, f4 +; FAST-P8-NEXT: # kill: def $f2 killed $f2 def $vsl2 +; FAST-P8-NEXT: # kill: def $f1 killed $f1 def $vsl1 +; FAST-P8-NEXT: xvcmpgtdp vs0, vs1, vs2 +; FAST-P8-NEXT: # kill: def $f4 killed $f4 def $vsl4 +; FAST-P8-NEXT: # kill: def $f3 killed $f3 def $vsl3 +; FAST-P8-NEXT: xxsel vs1, vs3, vs4, vs0 +; FAST-P8-NEXT: # kill: def $f1 killed $f1 killed $vsl1 ; FAST-P8-NEXT: blr ; ; FAST-P9-LABEL: select_fast_ole_float: ; FAST-P9: # %bb.0: # %entry -; FAST-P9-NEXT: xssubsp f0, f2, f1 -; FAST-P9-NEXT: fsel f1, f0, f3, f4 +; FAST-P9-NEXT: # kill: def $f2 killed $f2 def $vsl2 +; FAST-P9-NEXT: # kill: def $f1 killed $f1 def $vsl1 +; FAST-P9-NEXT: xscmpgtdp vs0, vs1, vs2 +; FAST-P9-NEXT: # kill: def $f4 killed $f4 def $vsl4 +; FAST-P9-NEXT: # kill: def $f3 killed $f3 def $vsl3 +; FAST-P9-NEXT: xxsel vs1, vs3, vs4, vs0 +; FAST-P9-NEXT: # kill: def $f1 killed $f1 killed $vsl1 ; FAST-P9-NEXT: blr ; ; NO-FAST-P8-LABEL: select_fast_ole_float: @@ -925,14 +1123,24 @@ define double @select_fast_ole_double(double %a, double %b, double %c, double %d) { ; FAST-P8-LABEL: select_fast_ole_double: ; FAST-P8: # %bb.0: # %entry -; FAST-P8-NEXT: xssubdp f0, f2, f1 -; FAST-P8-NEXT: fsel f1, f0, f3, f4 +; FAST-P8-NEXT: # kill: def $f2 killed $f2 def $vsl2 +; FAST-P8-NEXT: # kill: def $f1 killed $f1 def $vsl1 +; FAST-P8-NEXT: xvcmpgtdp vs0, vs1, vs2 +; FAST-P8-NEXT: # kill: def $f4 killed $f4 def $vsl4 +; FAST-P8-NEXT: # kill: def $f3 killed $f3 def $vsl3 +; FAST-P8-NEXT: xxsel vs1, vs3, vs4, vs0 +; FAST-P8-NEXT: # kill: def $f1 killed $f1 killed $vsl1 ; FAST-P8-NEXT: blr ; ; FAST-P9-LABEL: select_fast_ole_double: ; FAST-P9: # %bb.0: # %entry -; FAST-P9-NEXT: xssubdp f0, f2, f1 -; FAST-P9-NEXT: fsel f1, f0, f3, f4 +; FAST-P9-NEXT: # kill: def $f2 killed $f2 def $vsl2 +; FAST-P9-NEXT: # kill: def $f1 killed $f1 def $vsl1 +; FAST-P9-NEXT: xscmpgtdp vs0, vs1, vs2 +; FAST-P9-NEXT: # kill: def $f4 killed $f4 def $vsl4 +; FAST-P9-NEXT: # kill: def $f3 killed $f3 def $vsl3 +; FAST-P9-NEXT: xxsel vs1, vs3, vs4, vs0 +; FAST-P9-NEXT: # kill: def $f1 killed $f1 killed $vsl1 ; FAST-P9-NEXT: blr ; ; NO-FAST-P8-LABEL: select_fast_ole_double: @@ -964,17 +1172,25 @@ ; FAST-P8-LABEL: onecmp1: ; FAST-P8: # %bb.0: # %entry ; FAST-P8-NEXT: addis r3, r2, .LCPI24_0@toc@ha +; FAST-P8-NEXT: # kill: def $f1 killed $f1 def $vsl1 +; FAST-P8-NEXT: # kill: def $f3 killed $f3 def $vsl3 +; FAST-P8-NEXT: # kill: def $f2 killed $f2 def $vsl2 ; FAST-P8-NEXT: lfs f0, .LCPI24_0@toc@l(r3) -; FAST-P8-NEXT: xssubdp f0, f1, f0 -; FAST-P8-NEXT: fsel f1, f0, f2, f3 +; FAST-P8-NEXT: xvcmpgedp vs0, vs1, vs0 +; FAST-P8-NEXT: xxsel vs1, vs3, vs2, vs0 +; FAST-P8-NEXT: # kill: def $f1 killed $f1 killed $vsl1 ; FAST-P8-NEXT: blr ; ; FAST-P9-LABEL: onecmp1: ; FAST-P9: # %bb.0: # %entry ; FAST-P9-NEXT: addis r3, r2, .LCPI24_0@toc@ha ; FAST-P9-NEXT: lfs f0, .LCPI24_0@toc@l(r3) -; FAST-P9-NEXT: xssubdp f0, f1, f0 -; FAST-P9-NEXT: fsel f1, f0, f2, f3 +; FAST-P9-NEXT: # kill: def $f1 killed $f1 def $vsl1 +; FAST-P9-NEXT: xscmpgedp vs0, vs1, vs0 +; FAST-P9-NEXT: # kill: def $f3 killed $f3 def $vsl3 +; FAST-P9-NEXT: # kill: def $f2 killed $f2 def $vsl2 +; FAST-P9-NEXT: xxsel vs1, vs3, vs2, vs0 +; FAST-P9-NEXT: # kill: def $f1 killed $f1 killed $vsl1 ; FAST-P9-NEXT: blr ; ; NO-FAST-P8-LABEL: onecmp1: @@ -1012,17 +1228,25 @@ ; FAST-P8-LABEL: onecmp2: ; FAST-P8: # %bb.0: # %entry ; FAST-P8-NEXT: addis r3, r2, .LCPI25_0@toc@ha +; FAST-P8-NEXT: # kill: def $f1 killed $f1 def $vsl1 +; FAST-P8-NEXT: # kill: def $f3 killed $f3 def $vsl3 +; FAST-P8-NEXT: # kill: def $f2 killed $f2 def $vsl2 ; FAST-P8-NEXT: lfs f0, .LCPI25_0@toc@l(r3) -; FAST-P8-NEXT: xssubdp f0, f0, f1 -; FAST-P8-NEXT: fsel f1, f0, f3, f2 +; FAST-P8-NEXT: xvcmpgtdp vs0, vs1, vs0 +; FAST-P8-NEXT: xxsel vs1, vs3, vs2, vs0 +; FAST-P8-NEXT: # kill: def $f1 killed $f1 killed $vsl1 ; FAST-P8-NEXT: blr ; ; FAST-P9-LABEL: onecmp2: ; FAST-P9: # %bb.0: # %entry ; FAST-P9-NEXT: addis r3, r2, .LCPI25_0@toc@ha ; FAST-P9-NEXT: lfs f0, .LCPI25_0@toc@l(r3) -; FAST-P9-NEXT: xssubdp f0, f0, f1 -; FAST-P9-NEXT: fsel f1, f0, f3, f2 +; FAST-P9-NEXT: # kill: def $f1 killed $f1 def $vsl1 +; FAST-P9-NEXT: xscmpgtdp vs0, vs1, vs0 +; FAST-P9-NEXT: # kill: def $f3 killed $f3 def $vsl3 +; FAST-P9-NEXT: # kill: def $f2 killed $f2 def $vsl2 +; FAST-P9-NEXT: xxsel vs1, vs3, vs2, vs0 +; FAST-P9-NEXT: # kill: def $f1 killed $f1 killed $vsl1 ; FAST-P9-NEXT: blr ; ; NO-FAST-P8-LABEL: onecmp2: @@ -1057,21 +1281,25 @@ ; FAST-P8-LABEL: onecmp3: ; FAST-P8: # %bb.0: # %entry ; FAST-P8-NEXT: addis r3, r2, .LCPI26_0@toc@ha +; FAST-P8-NEXT: # kill: def $f1 killed $f1 def $vsl1 +; FAST-P8-NEXT: # kill: def $f3 killed $f3 def $vsl3 +; FAST-P8-NEXT: # kill: def $f2 killed $f2 def $vsl2 ; FAST-P8-NEXT: lfs f0, .LCPI26_0@toc@l(r3) -; FAST-P8-NEXT: xssubdp f0, f1, f0 -; FAST-P8-NEXT: xsnegdp f1, f0 -; FAST-P8-NEXT: fsel f0, f0, f2, f3 -; FAST-P8-NEXT: fsel f1, f1, f0, f3 +; FAST-P8-NEXT: xvcmpeqdp vs0, vs1, vs0 +; FAST-P8-NEXT: xxsel vs1, vs3, vs2, vs0 +; FAST-P8-NEXT: # kill: def $f1 killed $f1 killed $vsl1 ; FAST-P8-NEXT: blr ; ; FAST-P9-LABEL: onecmp3: ; FAST-P9: # %bb.0: # %entry ; FAST-P9-NEXT: addis r3, r2, .LCPI26_0@toc@ha ; FAST-P9-NEXT: lfs f0, .LCPI26_0@toc@l(r3) -; FAST-P9-NEXT: xssubdp f0, f1, f0 -; FAST-P9-NEXT: fsel f1, f0, f2, f3 -; FAST-P9-NEXT: xsnegdp f0, f0 -; FAST-P9-NEXT: fsel f1, f0, f1, f3 +; FAST-P9-NEXT: # kill: def $f1 killed $f1 def $vsl1 +; FAST-P9-NEXT: xscmpeqdp vs0, vs1, vs0 +; FAST-P9-NEXT: # kill: def $f3 killed $f3 def $vsl3 +; FAST-P9-NEXT: # kill: def $f2 killed $f2 def $vsl2 +; FAST-P9-NEXT: xxsel vs1, vs3, vs2, vs0 +; FAST-P9-NEXT: # kill: def $f1 killed $f1 killed $vsl1 ; FAST-P9-NEXT: blr ; ; NO-FAST-P8-LABEL: onecmp3: diff --git a/llvm/test/CodeGen/PowerPC/vec_select.ll b/llvm/test/CodeGen/PowerPC/vec_select.ll --- a/llvm/test/CodeGen/PowerPC/vec_select.ll +++ b/llvm/test/CodeGen/PowerPC/vec_select.ll @@ -74,8 +74,8 @@ ret <4 x i32> %v } ; CHECK-VSX-LABLE: test5 -; CHECK-VSX: vcmpequw v[[REG1:[0-9]+]], v4, v5 -; CHECK-VSX: xxsel v2, v3, v2, v[[REG1]] +; CHECK-VSX: xvcmpeqdp vs[[REG1:[0-9]+]], v4, v5 +; CHECK-VSX: xxsel v2, v3, v2, vs[[REG1]] ; CHECK-VSX: blr ; CHECK-NOVSX-LABLE: test5 diff --git a/llvm/test/CodeGen/PowerPC/vselect-constants.ll b/llvm/test/CodeGen/PowerPC/vselect-constants.ll --- a/llvm/test/CodeGen/PowerPC/vselect-constants.ll +++ b/llvm/test/CodeGen/PowerPC/vselect-constants.ll @@ -30,14 +30,14 @@ define <4 x i32> @cmp_sel_C1_or_C2_vec(<4 x i32> %x, <4 x i32> %y) { ; CHECK-LABEL: cmp_sel_C1_or_C2_vec: ; CHECK: # %bb.0: -; CHECK-NEXT: vcmpequw 2, 2, 3 +; CHECK-NEXT: xvcmpeqdp 0, 34, 35 ; CHECK-NEXT: addis 3, 2, .LCPI1_0@toc@ha ; CHECK-NEXT: addis 4, 2, .LCPI1_1@toc@ha ; CHECK-NEXT: addi 3, 3, .LCPI1_0@toc@l ; CHECK-NEXT: addi 4, 4, .LCPI1_1@toc@l -; CHECK-NEXT: lvx 3, 0, 3 -; CHECK-NEXT: lvx 4, 0, 4 -; CHECK-NEXT: xxsel 34, 36, 35, 34 +; CHECK-NEXT: lvx 2, 0, 3 +; CHECK-NEXT: lvx 3, 0, 4 +; CHECK-NEXT: xxsel 34, 35, 34, 0 ; CHECK-NEXT: blr %cond = icmp eq <4 x i32> %x, %y %add = select <4 x i1> %cond, <4 x i32> , <4 x i32> diff --git a/llvm/test/CodeGen/PowerPC/vsx.ll b/llvm/test/CodeGen/PowerPC/vsx.ll --- a/llvm/test/CodeGen/PowerPC/vsx.ll +++ b/llvm/test/CodeGen/PowerPC/vsx.ll @@ -572,26 +572,26 @@ define <4 x i32> @test20(<4 x i32> %a, <4 x i32> %b, <4 x i32> %c, <4 x i32> %d) { ; CHECK-LABEL: test20: ; CHECK: # %bb.0: # %entry -; CHECK-NEXT: vcmpequw v4, v4, v5 -; CHECK-NEXT: xxsel v2, v3, v2, v4 +; CHECK-NEXT: xvcmpeqdp vs0, v4, v5 +; CHECK-NEXT: xxsel v2, v3, v2, vs0 ; CHECK-NEXT: blr ; ; CHECK-REG-LABEL: test20: ; CHECK-REG: # %bb.0: # %entry -; CHECK-REG-NEXT: vcmpequw v4, v4, v5 -; CHECK-REG-NEXT: xxsel v2, v3, v2, v4 +; CHECK-REG-NEXT: xvcmpeqdp vs0, v4, v5 +; CHECK-REG-NEXT: xxsel v2, v3, v2, vs0 ; CHECK-REG-NEXT: blr ; ; CHECK-FISL-LABEL: test20: ; CHECK-FISL: # %bb.0: # %entry -; CHECK-FISL-NEXT: vcmpequw v4, v4, v5 -; CHECK-FISL-NEXT: xxsel v2, v3, v2, v4 +; CHECK-FISL-NEXT: xvcmpeqdp vs0, v4, v5 +; CHECK-FISL-NEXT: xxsel v2, v3, v2, vs0 ; CHECK-FISL-NEXT: blr ; ; CHECK-LE-LABEL: test20: ; CHECK-LE: # %bb.0: # %entry -; CHECK-LE-NEXT: vcmpequw v4, v4, v5 -; CHECK-LE-NEXT: xxsel v2, v3, v2, v4 +; CHECK-LE-NEXT: xvcmpeqdp vs0, v4, v5 +; CHECK-LE-NEXT: xxsel v2, v3, v2, vs0 ; CHECK-LE-NEXT: blr entry: %m = icmp eq <4 x i32> %c, %d