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 @@ -14936,16 +14936,18 @@ // On little endian, that's just the corresponding element in the other // half of the vector. On big endian, it is in the same half but right // justified rather than left justified in that half. -static void fixupShuffleMaskForPermutedSToV(SmallVectorImpl &ShuffV, - int LHSMaxIdx, int RHSMinIdx, - int RHSMaxIdx, int HalfVec, - unsigned ValidLaneWidth, - const PPCSubtarget &Subtarget) { +static void fixupShuffleMaskForPermutedSToV( + SmallVectorImpl &ShuffV, int LHSFirstElt, int LHSLastElt, + int RHSFirstElt, int RHSLastElt, int HalfVec, unsigned LHSValidLaneWidth, + unsigned RHSValidLaneWidth, const PPCSubtarget &Subtarget) { for (int i = 0, e = ShuffV.size(); i < e; i++) { int Idx = ShuffV[i]; - if ((Idx >= 0 && Idx < LHSMaxIdx) || (Idx >= RHSMinIdx && Idx < RHSMaxIdx)) + if (Idx >= LHSFirstElt && Idx <= LHSLastElt) ShuffV[i] += - Subtarget.isLittleEndian() ? HalfVec : HalfVec - ValidLaneWidth; + Subtarget.isLittleEndian() ? HalfVec : HalfVec - LHSValidLaneWidth; + if (Idx >= RHSFirstElt && Idx <= RHSLastElt) + ShuffV[i] += + Subtarget.isLittleEndian() ? HalfVec : HalfVec - RHSValidLaneWidth; } } @@ -14984,6 +14986,27 @@ OrigSToV.getOperand(0)); } +static bool isShuffleMaskInRange(SmallVectorImpl &ShuffV, int HalfVec, + int LHSLastByteDefined, + int RHSLastByteDefined) { + for (int i = 0, elt = ShuffV.size(); i < elt; i++) { + int Index = ShuffV[i]; + if (Index < 0) // Skip explicit undefined mask indices. + continue; + // Handle first input vector of the vector_shuffle. + if (Index < HalfVec && LHSLastByteDefined >= 0) { + if (!(Index <= LHSLastByteDefined)) + return false; + } + // Handle second input vector of the vector_shuffle. + if (Index >= HalfVec && RHSLastByteDefined >= 0) { + if (!(Index <= Index + (RHSLastByteDefined))) + return false; + } + } + return true; +} + // On little endian subtargets, combine shuffles such as: // vector_shuffle<16,1,17,3,18,5,19,7,20,9,21,11,22,13,23,15>, , %b // into: @@ -15031,36 +15054,24 @@ SDValue SToVLHS = isScalarToVec(LHS); SDValue SToVRHS = isScalarToVec(RHS); if (SToVLHS || SToVRHS) { - // FIXME: If both LHS and RHS are SCALAR_TO_VECTOR, but are not the - // same type and have differing element sizes, then do not perform - // the following transformation. The current transformation for - // SCALAR_TO_VECTOR assumes that both input vectors have the same - // element size. This will be updated in the future to account for - // differing sizes of the LHS and RHS. - if (SToVLHS && SToVRHS && - (SToVLHS.getValueType().getScalarSizeInBits() != - SToVRHS.getValueType().getScalarSizeInBits())) - return Res; - - int NumEltsIn = SToVLHS ? SToVLHS.getValueType().getVectorNumElements() - : SToVRHS.getValueType().getVectorNumElements(); - int NumEltsOut = ShuffV.size(); + EVT VT = SVN->getValueType(0); + uint64_t ShuffleEltWidth = VT.getVectorElementType().getSizeInBits(); + int ShuffleNumElts = ShuffV.size(); + int HalfVec = ShuffleNumElts / 2; // The width of the "valid lane" (i.e. the lane that contains the value that // is vectorized) needs to be expressed in terms of the number of elements // of the shuffle. It is thereby the ratio of the values before and after - // any bitcast. - unsigned ValidLaneWidth = - SToVLHS ? SToVLHS.getValueType().getScalarSizeInBits() / - LHS.getValueType().getScalarSizeInBits() - : SToVRHS.getValueType().getScalarSizeInBits() / - RHS.getValueType().getScalarSizeInBits(); + // any bitcast, which will be set later on if the LHS or RHS are + // SCALAR_TO_VECTOR nodes. + unsigned LHSValidLaneWidth = HalfVec; + unsigned RHSValidLaneWidth = HalfVec; // Initially assume that neither input is permuted. These will be adjusted // accordingly if either input is. - int LHSMaxIdx = -1; - int RHSMinIdx = -1; - int RHSMaxIdx = -1; - int HalfVec = LHS.getValueType().getVectorNumElements() / 2; + int LHSFirstElt = 0; + int RHSFirstElt = ShuffleNumElts; + int LHSLastElt = -1; + int RHSLastElt = -1; // Get the permuted scalar to vector nodes for the source(s) that come from // ISD::SCALAR_TO_VECTOR. @@ -15072,7 +15083,10 @@ if (!IsLittleEndian && SToVLHS.getValueType().getScalarSizeInBits() >= 64) return Res; // Set up the values for the shuffle vector fixup. - LHSMaxIdx = NumEltsOut / NumEltsIn; + LHSValidLaneWidth = SToVLHS.getValueType().getScalarSizeInBits() / + LHS.getValueType().getScalarSizeInBits(); + int LHSScalarSize = SToVLHS.getValueType().getScalarSizeInBits(); + LHSLastElt = LHSScalarSize / (ShuffleEltWidth + 1); SToVLHS = getSToVPermuted(SToVLHS, DAG, Subtarget); if (SToVLHS.getValueType() != LHS.getValueType()) SToVLHS = DAG.getBitcast(LHS.getValueType(), SToVLHS); @@ -15081,21 +15095,27 @@ if (SToVRHS) { if (!IsLittleEndian && SToVRHS.getValueType().getScalarSizeInBits() >= 64) return Res; - RHSMinIdx = NumEltsOut; - RHSMaxIdx = NumEltsOut / NumEltsIn + RHSMinIdx; + RHSValidLaneWidth = SToVRHS.getValueType().getScalarSizeInBits() / + RHS.getValueType().getScalarSizeInBits(); + int RHSScalarSize = SToVRHS.getValueType().getScalarSizeInBits(); + RHSLastElt = RHSScalarSize / (ShuffleEltWidth + 1) + RHSFirstElt; SToVRHS = getSToVPermuted(SToVRHS, DAG, Subtarget); if (SToVRHS.getValueType() != RHS.getValueType()) SToVRHS = DAG.getBitcast(RHS.getValueType(), SToVRHS); RHS = SToVRHS; } + if (!isShuffleMaskInRange(ShuffV, HalfVec, LHSLastElt, RHSLastElt)) + return Res; + // Fix up the shuffle mask to reflect where the desired element actually is. // The minimum and maximum indices that correspond to element zero for both // the LHS and RHS are computed and will control which shuffle mask entries // are to be changed. For example, if the RHS is permuted, any shuffle mask - // entries in the range [RHSMinIdx,RHSMaxIdx) will be adjusted. - fixupShuffleMaskForPermutedSToV(ShuffV, LHSMaxIdx, RHSMinIdx, RHSMaxIdx, - HalfVec, ValidLaneWidth, Subtarget); + // entries in the range [RHSFirstElt,RHSLastElt] will be adjusted. + fixupShuffleMaskForPermutedSToV( + ShuffV, LHSFirstElt, LHSLastElt, RHSFirstElt, RHSLastElt, HalfVec, + LHSValidLaneWidth, RHSValidLaneWidth, Subtarget); Res = DAG.getVectorShuffle(SVN->getValueType(0), dl, LHS, RHS, ShuffV); // We may have simplified away the shuffle. We won't be able to do anything diff --git a/llvm/test/CodeGen/PowerPC/p8-scalar_vector_conversions.ll b/llvm/test/CodeGen/PowerPC/p8-scalar_vector_conversions.ll --- a/llvm/test/CodeGen/PowerPC/p8-scalar_vector_conversions.ll +++ b/llvm/test/CodeGen/PowerPC/p8-scalar_vector_conversions.ll @@ -2511,11 +2511,9 @@ ; ; CHECK-LE-LABEL: buildi2: ; CHECK-LE: # %bb.0: # %entry -; CHECK-LE-NEXT: mtfprd f0, r4 +; CHECK-LE-NEXT: mtfprwz f0, r4 ; CHECK-LE-NEXT: mtfprd f1, r3 -; CHECK-LE-NEXT: xxswapd vs0, vs0 -; CHECK-LE-NEXT: xxswapd v2, vs1 -; CHECK-LE-NEXT: xxmrgld v2, v2, vs0 +; CHECK-LE-NEXT: xxmrghd v2, vs1, vs0 ; CHECK-LE-NEXT: blr ; ; CHECK-AIX-LABEL: buildi2: diff --git a/llvm/test/CodeGen/PowerPC/v16i8_scalar_to_vector_shuffle.ll b/llvm/test/CodeGen/PowerPC/v16i8_scalar_to_vector_shuffle.ll --- a/llvm/test/CodeGen/PowerPC/v16i8_scalar_to_vector_shuffle.ll +++ b/llvm/test/CodeGen/PowerPC/v16i8_scalar_to_vector_shuffle.ll @@ -267,56 +267,54 @@ define <16 x i8> @test_v16i8_v8i16(i16 %arg, i8 %arg1) { ; CHECK-LE-P8-LABEL: test_v16i8_v8i16: ; CHECK-LE-P8: # %bb.0: # %entry -; CHECK-LE-P8-NEXT: mtfprd f0, r4 -; CHECK-LE-P8-NEXT: mtfprd f1, r3 -; CHECK-LE-P8-NEXT: xxswapd v2, vs0 -; CHECK-LE-P8-NEXT: xxswapd v3, vs1 -; CHECK-LE-P8-NEXT: vmrglh v2, v3, v2 +; CHECK-LE-P8-NEXT: mtvsrd v2, r4 +; CHECK-LE-P8-NEXT: mtvsrd v3, r3 +; CHECK-LE-P8-NEXT: vmrghh v2, v3, v2 ; CHECK-LE-P8-NEXT: blr ; ; CHECK-LE-P9-LABEL: test_v16i8_v8i16: ; CHECK-LE-P9: # %bb.0: # %entry -; CHECK-LE-P9-NEXT: mtfprd f0, r4 -; CHECK-LE-P9-NEXT: xxswapd v2, vs0 -; CHECK-LE-P9-NEXT: mtfprd f0, r3 -; CHECK-LE-P9-NEXT: xxswapd v3, vs0 -; CHECK-LE-P9-NEXT: vmrglh v2, v3, v2 +; CHECK-LE-P9-NEXT: mtvsrd v2, r4 +; CHECK-LE-P9-NEXT: mtvsrd v3, r3 +; CHECK-LE-P9-NEXT: vmrghh v2, v3, v2 ; CHECK-LE-P9-NEXT: blr ; ; CHECK-BE-P8-LABEL: test_v16i8_v8i16: ; CHECK-BE-P8: # %bb.0: # %entry -; CHECK-BE-P8-NEXT: sldi r4, r4, 56 -; CHECK-BE-P8-NEXT: sldi r3, r3, 48 -; CHECK-BE-P8-NEXT: mtvsrd v2, r4 -; CHECK-BE-P8-NEXT: mtvsrd v3, r3 -; CHECK-BE-P8-NEXT: vmrghh v2, v2, v3 +; CHECK-BE-P8-NEXT: addis r5, r2, .LCPI3_0@toc@ha +; CHECK-BE-P8-NEXT: mtvsrwz v2, r4 +; CHECK-BE-P8-NEXT: addi r5, r5, .LCPI3_0@toc@l +; CHECK-BE-P8-NEXT: mtvsrwz v4, r3 +; CHECK-BE-P8-NEXT: lxvw4x v3, 0, r5 +; CHECK-BE-P8-NEXT: vperm v2, v2, v4, v3 ; CHECK-BE-P8-NEXT: blr ; ; CHECK-BE-P9-LABEL: test_v16i8_v8i16: ; CHECK-BE-P9: # %bb.0: # %entry -; CHECK-BE-P9-NEXT: sldi r4, r4, 56 -; CHECK-BE-P9-NEXT: sldi r3, r3, 48 -; CHECK-BE-P9-NEXT: mtvsrd v2, r4 -; CHECK-BE-P9-NEXT: mtvsrd v3, r3 -; CHECK-BE-P9-NEXT: vmrghh v2, v2, v3 +; CHECK-BE-P9-NEXT: mtvsrwz v2, r3 +; CHECK-BE-P9-NEXT: addis r3, r2, .LCPI3_0@toc@ha +; CHECK-BE-P9-NEXT: mtfprwz f0, r4 +; CHECK-BE-P9-NEXT: addi r3, r3, .LCPI3_0@toc@l +; CHECK-BE-P9-NEXT: lxv vs1, 0(r3) +; CHECK-BE-P9-NEXT: xxperm v2, vs0, vs1 ; CHECK-BE-P9-NEXT: blr ; ; CHECK-AIX-64-P8-LABEL: test_v16i8_v8i16: ; CHECK-AIX-64-P8: # %bb.0: # %entry -; CHECK-AIX-64-P8-NEXT: sldi r4, r4, 56 -; CHECK-AIX-64-P8-NEXT: sldi r3, r3, 48 -; CHECK-AIX-64-P8-NEXT: mtvsrd v2, r4 -; CHECK-AIX-64-P8-NEXT: mtvsrd v3, r3 -; CHECK-AIX-64-P8-NEXT: vmrghh v2, v2, v3 +; CHECK-AIX-64-P8-NEXT: ld r5, L..C3(r2) # %const.0 +; CHECK-AIX-64-P8-NEXT: mtvsrwz v2, r4 +; CHECK-AIX-64-P8-NEXT: mtvsrwz v4, r3 +; CHECK-AIX-64-P8-NEXT: lxvw4x v3, 0, r5 +; CHECK-AIX-64-P8-NEXT: vperm v2, v2, v4, v3 ; CHECK-AIX-64-P8-NEXT: blr ; ; CHECK-AIX-64-P9-LABEL: test_v16i8_v8i16: ; CHECK-AIX-64-P9: # %bb.0: # %entry -; CHECK-AIX-64-P9-NEXT: sldi r4, r4, 56 -; CHECK-AIX-64-P9-NEXT: sldi r3, r3, 48 -; CHECK-AIX-64-P9-NEXT: mtvsrd v2, r4 -; CHECK-AIX-64-P9-NEXT: mtvsrd v3, r3 -; CHECK-AIX-64-P9-NEXT: vmrghh v2, v2, v3 +; CHECK-AIX-64-P9-NEXT: mtvsrwz v2, r3 +; CHECK-AIX-64-P9-NEXT: ld r3, L..C2(r2) # %const.0 +; CHECK-AIX-64-P9-NEXT: mtfprwz f0, r4 +; CHECK-AIX-64-P9-NEXT: lxv vs1, 0(r3) +; CHECK-AIX-64-P9-NEXT: xxperm v2, vs0, vs1 ; CHECK-AIX-64-P9-NEXT: blr ; ; CHECK-AIX-32-P8-LABEL: test_v16i8_v8i16: @@ -349,56 +347,54 @@ define <16 x i8> @test_v8i16_v16i8(i16 %arg, i8 %arg1) { ; CHECK-LE-P8-LABEL: test_v8i16_v16i8: ; CHECK-LE-P8: # %bb.0: # %entry -; CHECK-LE-P8-NEXT: mtfprd f0, r4 -; CHECK-LE-P8-NEXT: mtfprd f1, r3 -; CHECK-LE-P8-NEXT: xxswapd v2, vs0 -; CHECK-LE-P8-NEXT: xxswapd v3, vs1 -; CHECK-LE-P8-NEXT: vmrglh v2, v2, v3 +; CHECK-LE-P8-NEXT: mtvsrd v2, r4 +; CHECK-LE-P8-NEXT: mtvsrd v3, r3 +; CHECK-LE-P8-NEXT: vmrghh v2, v2, v3 ; CHECK-LE-P8-NEXT: blr ; ; CHECK-LE-P9-LABEL: test_v8i16_v16i8: ; CHECK-LE-P9: # %bb.0: # %entry -; CHECK-LE-P9-NEXT: mtfprd f0, r4 -; CHECK-LE-P9-NEXT: xxswapd v2, vs0 -; CHECK-LE-P9-NEXT: mtfprd f0, r3 -; CHECK-LE-P9-NEXT: xxswapd v3, vs0 -; CHECK-LE-P9-NEXT: vmrglh v2, v2, v3 +; CHECK-LE-P9-NEXT: mtvsrd v2, r4 +; CHECK-LE-P9-NEXT: mtvsrd v3, r3 +; CHECK-LE-P9-NEXT: vmrghh v2, v2, v3 ; CHECK-LE-P9-NEXT: blr ; ; CHECK-BE-P8-LABEL: test_v8i16_v16i8: ; CHECK-BE-P8: # %bb.0: # %entry -; CHECK-BE-P8-NEXT: sldi r4, r4, 56 -; CHECK-BE-P8-NEXT: sldi r3, r3, 48 -; CHECK-BE-P8-NEXT: mtvsrd v2, r4 -; CHECK-BE-P8-NEXT: mtvsrd v3, r3 -; CHECK-BE-P8-NEXT: vmrghh v2, v3, v2 +; CHECK-BE-P8-NEXT: addis r5, r2, .LCPI4_0@toc@ha +; CHECK-BE-P8-NEXT: mtvsrwz v2, r4 +; CHECK-BE-P8-NEXT: addi r5, r5, .LCPI4_0@toc@l +; CHECK-BE-P8-NEXT: mtvsrwz v4, r3 +; CHECK-BE-P8-NEXT: lxvw4x v3, 0, r5 +; CHECK-BE-P8-NEXT: vperm v2, v4, v2, v3 ; CHECK-BE-P8-NEXT: blr ; ; CHECK-BE-P9-LABEL: test_v8i16_v16i8: ; CHECK-BE-P9: # %bb.0: # %entry -; CHECK-BE-P9-NEXT: sldi r4, r4, 56 -; CHECK-BE-P9-NEXT: sldi r3, r3, 48 -; CHECK-BE-P9-NEXT: mtvsrd v2, r4 -; CHECK-BE-P9-NEXT: mtvsrd v3, r3 -; CHECK-BE-P9-NEXT: vmrghh v2, v3, v2 +; CHECK-BE-P9-NEXT: mtfprwz f0, r3 +; CHECK-BE-P9-NEXT: addis r3, r2, .LCPI4_0@toc@ha +; CHECK-BE-P9-NEXT: mtvsrwz v2, r4 +; CHECK-BE-P9-NEXT: addi r3, r3, .LCPI4_0@toc@l +; CHECK-BE-P9-NEXT: lxv vs1, 0(r3) +; CHECK-BE-P9-NEXT: xxperm v2, vs0, vs1 ; CHECK-BE-P9-NEXT: blr ; ; CHECK-AIX-64-P8-LABEL: test_v8i16_v16i8: ; CHECK-AIX-64-P8: # %bb.0: # %entry -; CHECK-AIX-64-P8-NEXT: sldi r4, r4, 56 -; CHECK-AIX-64-P8-NEXT: sldi r3, r3, 48 -; CHECK-AIX-64-P8-NEXT: mtvsrd v2, r4 -; CHECK-AIX-64-P8-NEXT: mtvsrd v3, r3 -; CHECK-AIX-64-P8-NEXT: vmrghh v2, v3, v2 +; CHECK-AIX-64-P8-NEXT: ld r5, L..C4(r2) # %const.0 +; CHECK-AIX-64-P8-NEXT: mtvsrwz v2, r4 +; CHECK-AIX-64-P8-NEXT: mtvsrwz v4, r3 +; CHECK-AIX-64-P8-NEXT: lxvw4x v3, 0, r5 +; CHECK-AIX-64-P8-NEXT: vperm v2, v4, v2, v3 ; CHECK-AIX-64-P8-NEXT: blr ; ; CHECK-AIX-64-P9-LABEL: test_v8i16_v16i8: ; CHECK-AIX-64-P9: # %bb.0: # %entry -; CHECK-AIX-64-P9-NEXT: sldi r4, r4, 56 -; CHECK-AIX-64-P9-NEXT: sldi r3, r3, 48 -; CHECK-AIX-64-P9-NEXT: mtvsrd v2, r4 -; CHECK-AIX-64-P9-NEXT: mtvsrd v3, r3 -; CHECK-AIX-64-P9-NEXT: vmrghh v2, v3, v2 +; CHECK-AIX-64-P9-NEXT: mtfprwz f0, r3 +; CHECK-AIX-64-P9-NEXT: ld r3, L..C3(r2) # %const.0 +; CHECK-AIX-64-P9-NEXT: mtvsrwz v2, r4 +; CHECK-AIX-64-P9-NEXT: lxv vs1, 0(r3) +; CHECK-AIX-64-P9-NEXT: xxperm v2, vs0, vs1 ; CHECK-AIX-64-P9-NEXT: blr ; ; CHECK-AIX-32-P8-LABEL: test_v8i16_v16i8: @@ -473,7 +469,7 @@ ; ; CHECK-AIX-64-P8-LABEL: test_none_v8i16: ; CHECK-AIX-64-P8: # %bb.0: # %entry -; CHECK-AIX-64-P8-NEXT: ld r5, L..C3(r2) # %const.0 +; CHECK-AIX-64-P8-NEXT: ld r5, L..C5(r2) # %const.0 ; CHECK-AIX-64-P8-NEXT: lxvw4x v2, 0, r4 ; CHECK-AIX-64-P8-NEXT: mtvsrwz v4, r3 ; CHECK-AIX-64-P8-NEXT: lxvw4x v3, 0, r5 @@ -483,7 +479,7 @@ ; CHECK-AIX-64-P9-LABEL: test_none_v8i16: ; CHECK-AIX-64-P9: # %bb.0: # %entry ; CHECK-AIX-64-P9-NEXT: mtfprwz f0, r3 -; CHECK-AIX-64-P9-NEXT: ld r3, L..C2(r2) # %const.0 +; CHECK-AIX-64-P9-NEXT: ld r3, L..C4(r2) # %const.0 ; CHECK-AIX-64-P9-NEXT: lxv v2, 0(r4) ; CHECK-AIX-64-P9-NEXT: lxv vs1, 0(r3) ; CHECK-AIX-64-P9-NEXT: xxperm v2, vs0, vs1 @@ -547,7 +543,7 @@ ; ; CHECK-AIX-64-P8-LABEL: test_v8i16_none: ; CHECK-AIX-64-P8: # %bb.0: # %entry -; CHECK-AIX-64-P8-NEXT: ld r4, L..C4(r2) # %const.0 +; CHECK-AIX-64-P8-NEXT: ld r4, L..C6(r2) # %const.0 ; CHECK-AIX-64-P8-NEXT: mtvsrwz v4, r3 ; CHECK-AIX-64-P8-NEXT: lxvw4x v3, 0, r4 ; CHECK-AIX-64-P8-NEXT: vperm v2, v4, v2, v3 @@ -582,53 +578,54 @@ define <16 x i8> @test_v16i8_v4i32(i8 %arg, i32 %arg1, <16 x i8> %a, <4 x i32> %b) { ; CHECK-LE-P8-LABEL: test_v16i8_v4i32: ; CHECK-LE-P8: # %bb.0: # %entry -; CHECK-LE-P8-NEXT: mtfprd f0, r3 -; CHECK-LE-P8-NEXT: mtfprd f1, r4 -; CHECK-LE-P8-NEXT: xxswapd v2, vs0 -; CHECK-LE-P8-NEXT: xxswapd v3, vs1 -; CHECK-LE-P8-NEXT: vmrglb v2, v3, v2 +; CHECK-LE-P8-NEXT: mtvsrd v2, r3 +; CHECK-LE-P8-NEXT: mtvsrwz v3, r4 +; CHECK-LE-P8-NEXT: vmrghb v2, v3, v2 ; CHECK-LE-P8-NEXT: blr ; ; CHECK-LE-P9-LABEL: test_v16i8_v4i32: ; CHECK-LE-P9: # %bb.0: # %entry -; CHECK-LE-P9-NEXT: mtfprd f0, r3 -; CHECK-LE-P9-NEXT: mtvsrws v3, r4 -; CHECK-LE-P9-NEXT: xxswapd v2, vs0 -; CHECK-LE-P9-NEXT: vmrglb v2, v3, v2 +; CHECK-LE-P9-NEXT: mtvsrd v2, r3 +; CHECK-LE-P9-NEXT: mtvsrwz v3, r4 +; CHECK-LE-P9-NEXT: vmrghb v2, v3, v2 ; CHECK-LE-P9-NEXT: blr ; ; CHECK-BE-P8-LABEL: test_v16i8_v4i32: ; CHECK-BE-P8: # %bb.0: # %entry -; CHECK-BE-P8-NEXT: sldi r3, r3, 56 -; CHECK-BE-P8-NEXT: sldi r4, r4, 32 -; CHECK-BE-P8-NEXT: mtvsrd v2, r3 -; CHECK-BE-P8-NEXT: mtvsrd v3, r4 -; CHECK-BE-P8-NEXT: vmrghb v2, v2, v3 +; CHECK-BE-P8-NEXT: addis r5, r2, .LCPI7_0@toc@ha +; CHECK-BE-P8-NEXT: mtvsrwz v2, r3 +; CHECK-BE-P8-NEXT: addi r5, r5, .LCPI7_0@toc@l +; CHECK-BE-P8-NEXT: mtvsrwz v4, r4 +; CHECK-BE-P8-NEXT: lxvw4x v3, 0, r5 +; CHECK-BE-P8-NEXT: vperm v2, v2, v4, v3 ; CHECK-BE-P8-NEXT: blr ; ; CHECK-BE-P9-LABEL: test_v16i8_v4i32: ; CHECK-BE-P9: # %bb.0: # %entry -; CHECK-BE-P9-NEXT: sldi r3, r3, 56 -; CHECK-BE-P9-NEXT: mtvsrws v3, r4 -; CHECK-BE-P9-NEXT: mtvsrd v2, r3 -; CHECK-BE-P9-NEXT: vmrghb v2, v2, v3 +; CHECK-BE-P9-NEXT: mtfprwz f0, r3 +; CHECK-BE-P9-NEXT: addis r3, r2, .LCPI7_0@toc@ha +; CHECK-BE-P9-NEXT: mtvsrwz v2, r4 +; CHECK-BE-P9-NEXT: addi r3, r3, .LCPI7_0@toc@l +; CHECK-BE-P9-NEXT: lxv vs1, 0(r3) +; CHECK-BE-P9-NEXT: xxperm v2, vs0, vs1 ; CHECK-BE-P9-NEXT: blr ; ; CHECK-AIX-64-P8-LABEL: test_v16i8_v4i32: ; CHECK-AIX-64-P8: # %bb.0: # %entry -; CHECK-AIX-64-P8-NEXT: sldi r3, r3, 56 -; CHECK-AIX-64-P8-NEXT: sldi r4, r4, 32 -; CHECK-AIX-64-P8-NEXT: mtvsrd v2, r3 -; CHECK-AIX-64-P8-NEXT: mtvsrd v3, r4 -; CHECK-AIX-64-P8-NEXT: vmrghb v2, v2, v3 +; CHECK-AIX-64-P8-NEXT: ld r5, L..C7(r2) # %const.0 +; CHECK-AIX-64-P8-NEXT: mtvsrwz v2, r3 +; CHECK-AIX-64-P8-NEXT: mtvsrwz v4, r4 +; CHECK-AIX-64-P8-NEXT: lxvw4x v3, 0, r5 +; CHECK-AIX-64-P8-NEXT: vperm v2, v2, v4, v3 ; CHECK-AIX-64-P8-NEXT: blr ; ; CHECK-AIX-64-P9-LABEL: test_v16i8_v4i32: ; CHECK-AIX-64-P9: # %bb.0: # %entry -; CHECK-AIX-64-P9-NEXT: sldi r3, r3, 56 -; CHECK-AIX-64-P9-NEXT: mtvsrws v3, r4 -; CHECK-AIX-64-P9-NEXT: mtvsrd v2, r3 -; CHECK-AIX-64-P9-NEXT: vmrghb v2, v2, v3 +; CHECK-AIX-64-P9-NEXT: mtfprwz f0, r3 +; CHECK-AIX-64-P9-NEXT: ld r3, L..C5(r2) # %const.0 +; CHECK-AIX-64-P9-NEXT: mtvsrwz v2, r4 +; CHECK-AIX-64-P9-NEXT: lxv vs1, 0(r3) +; CHECK-AIX-64-P9-NEXT: xxperm v2, vs0, vs1 ; CHECK-AIX-64-P9-NEXT: blr ; ; CHECK-AIX-32-P8-LABEL: test_v16i8_v4i32: @@ -662,53 +659,54 @@ define <16 x i8> @test_v4i32_v16i8(i32 %arg, i8 %arg1) { ; CHECK-LE-P8-LABEL: test_v4i32_v16i8: ; CHECK-LE-P8: # %bb.0: # %entry -; CHECK-LE-P8-NEXT: mtfprd f0, r4 -; CHECK-LE-P8-NEXT: mtfprd f1, r3 -; CHECK-LE-P8-NEXT: xxswapd v2, vs0 -; CHECK-LE-P8-NEXT: xxswapd v3, vs1 -; CHECK-LE-P8-NEXT: vmrglh v2, v2, v3 +; CHECK-LE-P8-NEXT: mtvsrd v2, r4 +; CHECK-LE-P8-NEXT: mtvsrwz v3, r3 +; CHECK-LE-P8-NEXT: vmrghh v2, v2, v3 ; CHECK-LE-P8-NEXT: blr ; ; CHECK-LE-P9-LABEL: test_v4i32_v16i8: ; CHECK-LE-P9: # %bb.0: # %entry -; CHECK-LE-P9-NEXT: mtfprd f0, r4 -; CHECK-LE-P9-NEXT: mtvsrws v3, r3 -; CHECK-LE-P9-NEXT: xxswapd v2, vs0 -; CHECK-LE-P9-NEXT: vmrglh v2, v2, v3 +; CHECK-LE-P9-NEXT: mtvsrd v2, r4 +; CHECK-LE-P9-NEXT: mtvsrwz v3, r3 +; CHECK-LE-P9-NEXT: vmrghh v2, v2, v3 ; CHECK-LE-P9-NEXT: blr ; ; CHECK-BE-P8-LABEL: test_v4i32_v16i8: ; CHECK-BE-P8: # %bb.0: # %entry -; CHECK-BE-P8-NEXT: sldi r4, r4, 56 -; CHECK-BE-P8-NEXT: sldi r3, r3, 32 -; CHECK-BE-P8-NEXT: mtvsrd v2, r4 -; CHECK-BE-P8-NEXT: mtvsrd v3, r3 -; CHECK-BE-P8-NEXT: vmrghh v2, v3, v2 +; CHECK-BE-P8-NEXT: addis r5, r2, .LCPI8_0@toc@ha +; CHECK-BE-P8-NEXT: mtvsrwz v2, r4 +; CHECK-BE-P8-NEXT: addi r5, r5, .LCPI8_0@toc@l +; CHECK-BE-P8-NEXT: mtvsrwz v4, r3 +; CHECK-BE-P8-NEXT: lxvw4x v3, 0, r5 +; CHECK-BE-P8-NEXT: vperm v2, v4, v2, v3 ; CHECK-BE-P8-NEXT: blr ; ; CHECK-BE-P9-LABEL: test_v4i32_v16i8: ; CHECK-BE-P9: # %bb.0: # %entry -; CHECK-BE-P9-NEXT: sldi r4, r4, 56 -; CHECK-BE-P9-NEXT: mtvsrws v3, r3 -; CHECK-BE-P9-NEXT: mtvsrd v2, r4 -; CHECK-BE-P9-NEXT: vmrghh v2, v3, v2 +; CHECK-BE-P9-NEXT: mtfprwz f0, r3 +; CHECK-BE-P9-NEXT: addis r3, r2, .LCPI8_0@toc@ha +; CHECK-BE-P9-NEXT: mtvsrwz v2, r4 +; CHECK-BE-P9-NEXT: addi r3, r3, .LCPI8_0@toc@l +; CHECK-BE-P9-NEXT: lxv vs1, 0(r3) +; CHECK-BE-P9-NEXT: xxperm v2, vs0, vs1 ; CHECK-BE-P9-NEXT: blr ; ; CHECK-AIX-64-P8-LABEL: test_v4i32_v16i8: ; CHECK-AIX-64-P8: # %bb.0: # %entry -; CHECK-AIX-64-P8-NEXT: sldi r4, r4, 56 -; CHECK-AIX-64-P8-NEXT: sldi r3, r3, 32 -; CHECK-AIX-64-P8-NEXT: mtvsrd v2, r4 -; CHECK-AIX-64-P8-NEXT: mtvsrd v3, r3 -; CHECK-AIX-64-P8-NEXT: vmrghh v2, v3, v2 +; CHECK-AIX-64-P8-NEXT: ld r5, L..C8(r2) # %const.0 +; CHECK-AIX-64-P8-NEXT: mtvsrwz v2, r4 +; CHECK-AIX-64-P8-NEXT: mtvsrwz v4, r3 +; CHECK-AIX-64-P8-NEXT: lxvw4x v3, 0, r5 +; CHECK-AIX-64-P8-NEXT: vperm v2, v4, v2, v3 ; CHECK-AIX-64-P8-NEXT: blr ; ; CHECK-AIX-64-P9-LABEL: test_v4i32_v16i8: ; CHECK-AIX-64-P9: # %bb.0: # %entry -; CHECK-AIX-64-P9-NEXT: sldi r4, r4, 56 -; CHECK-AIX-64-P9-NEXT: mtvsrws v3, r3 -; CHECK-AIX-64-P9-NEXT: mtvsrd v2, r4 -; CHECK-AIX-64-P9-NEXT: vmrghh v2, v3, v2 +; CHECK-AIX-64-P9-NEXT: mtfprwz f0, r3 +; CHECK-AIX-64-P9-NEXT: ld r3, L..C6(r2) # %const.0 +; CHECK-AIX-64-P9-NEXT: mtvsrwz v2, r4 +; CHECK-AIX-64-P9-NEXT: lxv vs1, 0(r3) +; CHECK-AIX-64-P9-NEXT: xxperm v2, vs0, vs1 ; CHECK-AIX-64-P9-NEXT: blr ; ; CHECK-AIX-32-P8-LABEL: test_v4i32_v16i8: @@ -783,9 +781,9 @@ ; ; CHECK-AIX-64-P8-LABEL: test_none_v4i32: ; CHECK-AIX-64-P8: # %bb.0: # %entry -; CHECK-AIX-64-P8-NEXT: ld r4, L..C5(r2) # %const.0 +; CHECK-AIX-64-P8-NEXT: ld r4, L..C9(r2) # %const.0 ; CHECK-AIX-64-P8-NEXT: mtvsrwz v4, r3 -; CHECK-AIX-64-P8-NEXT: ld r3, L..C6(r2) # %const.1 +; CHECK-AIX-64-P8-NEXT: ld r3, L..C10(r2) # %const.1 ; CHECK-AIX-64-P8-NEXT: lxvw4x v3, 0, r4 ; CHECK-AIX-64-P8-NEXT: vperm v2, v2, v4, v3 ; CHECK-AIX-64-P8-NEXT: lxvw4x v3, 0, r3 @@ -876,7 +874,7 @@ ; CHECK-AIX-64-P8-LABEL: test_v4i32_none: ; CHECK-AIX-64-P8: # %bb.0: # %entry ; CHECK-AIX-64-P8-NEXT: lbzx r4, 0, r4 -; CHECK-AIX-64-P8-NEXT: ld r5, L..C7(r2) # %const.0 +; CHECK-AIX-64-P8-NEXT: ld r5, L..C11(r2) # %const.0 ; CHECK-AIX-64-P8-NEXT: lxsiwzx v3, 0, r3 ; CHECK-AIX-64-P8-NEXT: mtvsrwz v2, r4 ; CHECK-AIX-64-P8-NEXT: lxvw4x v4, 0, r5 @@ -887,7 +885,7 @@ ; CHECK-AIX-64-P9-LABEL: test_v4i32_none: ; CHECK-AIX-64-P9: # %bb.0: # %entry ; CHECK-AIX-64-P9-NEXT: lfiwzx f0, 0, r3 -; CHECK-AIX-64-P9-NEXT: ld r3, L..C3(r2) # %const.0 +; CHECK-AIX-64-P9-NEXT: ld r3, L..C7(r2) # %const.0 ; CHECK-AIX-64-P9-NEXT: lxsibzx v2, 0, r4 ; CHECK-AIX-64-P9-NEXT: lxv vs1, 0(r3) ; CHECK-AIX-64-P9-NEXT: vspltb v2, v2, 7 @@ -930,20 +928,16 @@ define <16 x i8> @test_v16i8_v2i64(i8 %arg, i64 %arg1, <16 x i8> %a, <2 x i64> %b) { ; CHECK-LE-P8-LABEL: test_v16i8_v2i64: ; CHECK-LE-P8: # %bb.0: # %entry -; CHECK-LE-P8-NEXT: mtfprd f0, r3 -; CHECK-LE-P8-NEXT: mtfprd f1, r4 -; CHECK-LE-P8-NEXT: xxswapd v2, vs0 -; CHECK-LE-P8-NEXT: xxswapd v3, vs1 -; CHECK-LE-P8-NEXT: vmrglb v2, v3, v2 +; CHECK-LE-P8-NEXT: mtvsrd v2, r3 +; CHECK-LE-P8-NEXT: mtvsrd v3, r4 +; CHECK-LE-P8-NEXT: vmrghb v2, v3, v2 ; CHECK-LE-P8-NEXT: blr ; ; CHECK-LE-P9-LABEL: test_v16i8_v2i64: ; CHECK-LE-P9: # %bb.0: # %entry -; CHECK-LE-P9-NEXT: mtfprd f0, r3 -; CHECK-LE-P9-NEXT: xxswapd v2, vs0 -; CHECK-LE-P9-NEXT: mtfprd f0, r4 -; CHECK-LE-P9-NEXT: xxswapd v3, vs0 -; CHECK-LE-P9-NEXT: vmrglb v2, v3, v2 +; CHECK-LE-P9-NEXT: mtvsrd v2, r3 +; CHECK-LE-P9-NEXT: mtvsrd v3, r4 +; CHECK-LE-P9-NEXT: vmrghb v2, v3, v2 ; CHECK-LE-P9-NEXT: blr ; ; CHECK-BE-P8-LABEL: test_v16i8_v2i64: @@ -1009,20 +1003,16 @@ define <16 x i8> @test_v2i64_v16i8(i64 %arg, i8 %arg1) { ; CHECK-LE-P8-LABEL: test_v2i64_v16i8: ; CHECK-LE-P8: # %bb.0: # %entry -; CHECK-LE-P8-NEXT: mtfprd f0, r4 -; CHECK-LE-P8-NEXT: mtfprd f1, r3 -; CHECK-LE-P8-NEXT: xxswapd v2, vs0 -; CHECK-LE-P8-NEXT: xxswapd v3, vs1 -; CHECK-LE-P8-NEXT: vmrglh v2, v2, v3 +; CHECK-LE-P8-NEXT: mtvsrd v2, r4 +; CHECK-LE-P8-NEXT: mtvsrd v3, r3 +; CHECK-LE-P8-NEXT: vmrghh v2, v2, v3 ; CHECK-LE-P8-NEXT: blr ; ; CHECK-LE-P9-LABEL: test_v2i64_v16i8: ; CHECK-LE-P9: # %bb.0: # %entry -; CHECK-LE-P9-NEXT: mtfprd f0, r4 -; CHECK-LE-P9-NEXT: xxswapd v2, vs0 -; CHECK-LE-P9-NEXT: mtfprd f0, r3 -; CHECK-LE-P9-NEXT: xxswapd v3, vs0 -; CHECK-LE-P9-NEXT: vmrglh v2, v2, v3 +; CHECK-LE-P9-NEXT: mtvsrd v2, r4 +; CHECK-LE-P9-NEXT: mtvsrd v3, r3 +; CHECK-LE-P9-NEXT: vmrghh v2, v2, v3 ; CHECK-LE-P9-NEXT: blr ; ; CHECK-BE-P8-LABEL: test_v2i64_v16i8: @@ -1394,7 +1384,7 @@ ; ; CHECK-AIX-64-P8-LABEL: test_v8i16_v8i16rhs: ; CHECK-AIX-64-P8: # %bb.0: # %entry -; CHECK-AIX-64-P8-NEXT: ld r5, L..C8(r2) # %const.0 +; CHECK-AIX-64-P8-NEXT: ld r5, L..C12(r2) # %const.0 ; CHECK-AIX-64-P8-NEXT: mtvsrwz v2, r4 ; CHECK-AIX-64-P8-NEXT: mtvsrwz v4, r3 ; CHECK-AIX-64-P8-NEXT: lxvw4x v3, 0, r5 @@ -1403,7 +1393,7 @@ ; ; CHECK-AIX-64-P9-LABEL: test_v8i16_v8i16rhs: ; CHECK-AIX-64-P9: # %bb.0: # %entry -; CHECK-AIX-64-P9-NEXT: ld r5, L..C4(r2) # %const.0 +; CHECK-AIX-64-P9-NEXT: ld r5, L..C8(r2) # %const.0 ; CHECK-AIX-64-P9-NEXT: mtvsrwz v2, r4 ; CHECK-AIX-64-P9-NEXT: mtfprwz f1, r3 ; CHECK-AIX-64-P9-NEXT: lxv vs0, 0(r5) @@ -1441,53 +1431,54 @@ define <16 x i8> @test_v8i16_v4i32(<8 x i16> %a, <4 x i32> %b, i16 %arg, i32 %arg1) { ; CHECK-LE-P8-LABEL: test_v8i16_v4i32: ; CHECK-LE-P8: # %bb.0: # %entry -; CHECK-LE-P8-NEXT: mtfprd f0, r7 -; CHECK-LE-P8-NEXT: mtfprd f1, r8 -; CHECK-LE-P8-NEXT: xxswapd v2, vs0 -; CHECK-LE-P8-NEXT: xxswapd v3, vs1 -; CHECK-LE-P8-NEXT: vmrglb v2, v3, v2 +; CHECK-LE-P8-NEXT: mtvsrd v2, r7 +; CHECK-LE-P8-NEXT: mtvsrwz v3, r8 +; CHECK-LE-P8-NEXT: vmrghb v2, v3, v2 ; CHECK-LE-P8-NEXT: blr ; ; CHECK-LE-P9-LABEL: test_v8i16_v4i32: ; CHECK-LE-P9: # %bb.0: # %entry -; CHECK-LE-P9-NEXT: mtfprd f0, r7 -; CHECK-LE-P9-NEXT: mtvsrws v3, r8 -; CHECK-LE-P9-NEXT: xxswapd v2, vs0 -; CHECK-LE-P9-NEXT: vmrglb v2, v3, v2 +; CHECK-LE-P9-NEXT: mtvsrd v2, r7 +; CHECK-LE-P9-NEXT: mtvsrwz v3, r8 +; CHECK-LE-P9-NEXT: vmrghb v2, v3, v2 ; CHECK-LE-P9-NEXT: blr ; ; CHECK-BE-P8-LABEL: test_v8i16_v4i32: ; CHECK-BE-P8: # %bb.0: # %entry -; CHECK-BE-P8-NEXT: sldi r3, r7, 48 -; CHECK-BE-P8-NEXT: sldi r4, r8, 32 -; CHECK-BE-P8-NEXT: mtvsrd v2, r3 -; CHECK-BE-P8-NEXT: mtvsrd v3, r4 -; CHECK-BE-P8-NEXT: vmrghb v2, v2, v3 +; CHECK-BE-P8-NEXT: addis r3, r2, .LCPI17_0@toc@ha +; CHECK-BE-P8-NEXT: mtvsrwz v2, r7 +; CHECK-BE-P8-NEXT: addi r3, r3, .LCPI17_0@toc@l +; CHECK-BE-P8-NEXT: mtvsrwz v4, r8 +; CHECK-BE-P8-NEXT: lxvw4x v3, 0, r3 +; CHECK-BE-P8-NEXT: vperm v2, v2, v4, v3 ; CHECK-BE-P8-NEXT: blr ; ; CHECK-BE-P9-LABEL: test_v8i16_v4i32: ; CHECK-BE-P9: # %bb.0: # %entry -; CHECK-BE-P9-NEXT: sldi r3, r7, 48 -; CHECK-BE-P9-NEXT: mtvsrws v3, r8 -; CHECK-BE-P9-NEXT: mtvsrd v2, r3 -; CHECK-BE-P9-NEXT: vmrghb v2, v2, v3 +; CHECK-BE-P9-NEXT: addis r3, r2, .LCPI17_0@toc@ha +; CHECK-BE-P9-NEXT: mtfprwz f0, r7 +; CHECK-BE-P9-NEXT: mtvsrwz v2, r8 +; CHECK-BE-P9-NEXT: addi r3, r3, .LCPI17_0@toc@l +; CHECK-BE-P9-NEXT: lxv vs1, 0(r3) +; CHECK-BE-P9-NEXT: xxperm v2, vs0, vs1 ; CHECK-BE-P9-NEXT: blr ; ; CHECK-AIX-64-P8-LABEL: test_v8i16_v4i32: ; CHECK-AIX-64-P8: # %bb.0: # %entry -; CHECK-AIX-64-P8-NEXT: sldi r3, r3, 48 -; CHECK-AIX-64-P8-NEXT: sldi r4, r4, 32 -; CHECK-AIX-64-P8-NEXT: mtvsrd v2, r3 -; CHECK-AIX-64-P8-NEXT: mtvsrd v3, r4 -; CHECK-AIX-64-P8-NEXT: vmrghb v2, v2, v3 +; CHECK-AIX-64-P8-NEXT: ld r5, L..C13(r2) # %const.0 +; CHECK-AIX-64-P8-NEXT: mtvsrwz v2, r3 +; CHECK-AIX-64-P8-NEXT: mtvsrwz v4, r4 +; CHECK-AIX-64-P8-NEXT: lxvw4x v3, 0, r5 +; CHECK-AIX-64-P8-NEXT: vperm v2, v2, v4, v3 ; CHECK-AIX-64-P8-NEXT: blr ; ; CHECK-AIX-64-P9-LABEL: test_v8i16_v4i32: ; CHECK-AIX-64-P9: # %bb.0: # %entry -; CHECK-AIX-64-P9-NEXT: sldi r3, r3, 48 -; CHECK-AIX-64-P9-NEXT: mtvsrws v3, r4 -; CHECK-AIX-64-P9-NEXT: mtvsrd v2, r3 -; CHECK-AIX-64-P9-NEXT: vmrghb v2, v2, v3 +; CHECK-AIX-64-P9-NEXT: mtfprwz f0, r3 +; CHECK-AIX-64-P9-NEXT: ld r3, L..C9(r2) # %const.0 +; CHECK-AIX-64-P9-NEXT: mtvsrwz v2, r4 +; CHECK-AIX-64-P9-NEXT: lxv vs1, 0(r3) +; CHECK-AIX-64-P9-NEXT: xxperm v2, vs0, vs1 ; CHECK-AIX-64-P9-NEXT: blr ; ; CHECK-AIX-32-P8-LABEL: test_v8i16_v4i32: @@ -1521,20 +1512,16 @@ define <16 x i8> @test_v8i16_v2i64(<8 x i16> %a, <2 x i64> %b, i16 %arg, i64 %arg1) { ; CHECK-LE-P8-LABEL: test_v8i16_v2i64: ; CHECK-LE-P8: # %bb.0: # %entry -; CHECK-LE-P8-NEXT: mtfprd f0, r7 -; CHECK-LE-P8-NEXT: mtfprd f1, r8 -; CHECK-LE-P8-NEXT: xxswapd v2, vs0 -; CHECK-LE-P8-NEXT: xxswapd v3, vs1 -; CHECK-LE-P8-NEXT: vmrglb v2, v3, v2 +; CHECK-LE-P8-NEXT: mtvsrd v2, r7 +; CHECK-LE-P8-NEXT: mtvsrd v3, r8 +; CHECK-LE-P8-NEXT: vmrghb v2, v3, v2 ; CHECK-LE-P8-NEXT: blr ; ; CHECK-LE-P9-LABEL: test_v8i16_v2i64: ; CHECK-LE-P9: # %bb.0: # %entry -; CHECK-LE-P9-NEXT: mtfprd f0, r7 -; CHECK-LE-P9-NEXT: xxswapd v2, vs0 -; CHECK-LE-P9-NEXT: mtfprd f0, r8 -; CHECK-LE-P9-NEXT: xxswapd v3, vs0 -; CHECK-LE-P9-NEXT: vmrglb v2, v3, v2 +; CHECK-LE-P9-NEXT: mtvsrd v2, r7 +; CHECK-LE-P9-NEXT: mtvsrd v3, r8 +; CHECK-LE-P9-NEXT: vmrghb v2, v3, v2 ; CHECK-LE-P9-NEXT: blr ; ; CHECK-BE-P8-LABEL: test_v8i16_v2i64: @@ -1671,53 +1658,54 @@ define <16 x i8> @test_v4i32_v8i16(i32 %arg, i16 %arg1) { ; CHECK-LE-P8-LABEL: test_v4i32_v8i16: ; CHECK-LE-P8: # %bb.0: # %entry -; CHECK-LE-P8-NEXT: mtfprd f0, r3 -; CHECK-LE-P8-NEXT: mtfprd f1, r4 -; CHECK-LE-P8-NEXT: xxswapd v2, vs0 -; CHECK-LE-P8-NEXT: xxswapd v3, vs1 -; CHECK-LE-P8-NEXT: vmrglh v2, v3, v2 +; CHECK-LE-P8-NEXT: mtvsrwz v2, r3 +; CHECK-LE-P8-NEXT: mtvsrd v3, r4 +; CHECK-LE-P8-NEXT: vmrghh v2, v3, v2 ; CHECK-LE-P8-NEXT: blr ; ; CHECK-LE-P9-LABEL: test_v4i32_v8i16: ; CHECK-LE-P9: # %bb.0: # %entry -; CHECK-LE-P9-NEXT: mtfprd f0, r4 -; CHECK-LE-P9-NEXT: mtvsrws v2, r3 -; CHECK-LE-P9-NEXT: xxswapd v3, vs0 -; CHECK-LE-P9-NEXT: vmrglh v2, v3, v2 +; CHECK-LE-P9-NEXT: mtvsrwz v2, r3 +; CHECK-LE-P9-NEXT: mtvsrd v3, r4 +; CHECK-LE-P9-NEXT: vmrghh v2, v3, v2 ; CHECK-LE-P9-NEXT: blr ; ; CHECK-BE-P8-LABEL: test_v4i32_v8i16: ; CHECK-BE-P8: # %bb.0: # %entry -; CHECK-BE-P8-NEXT: sldi r3, r3, 32 -; CHECK-BE-P8-NEXT: sldi r4, r4, 48 -; CHECK-BE-P8-NEXT: mtvsrd v2, r3 -; CHECK-BE-P8-NEXT: mtvsrd v3, r4 -; CHECK-BE-P8-NEXT: vmrghh v2, v2, v3 +; CHECK-BE-P8-NEXT: addis r5, r2, .LCPI20_0@toc@ha +; CHECK-BE-P8-NEXT: mtvsrwz v2, r3 +; CHECK-BE-P8-NEXT: addi r5, r5, .LCPI20_0@toc@l +; CHECK-BE-P8-NEXT: mtvsrwz v4, r4 +; CHECK-BE-P8-NEXT: lxvw4x v3, 0, r5 +; CHECK-BE-P8-NEXT: vperm v2, v2, v4, v3 ; CHECK-BE-P8-NEXT: blr ; ; CHECK-BE-P9-LABEL: test_v4i32_v8i16: ; CHECK-BE-P9: # %bb.0: # %entry -; CHECK-BE-P9-NEXT: mtvsrws v2, r3 -; CHECK-BE-P9-NEXT: sldi r3, r4, 48 -; CHECK-BE-P9-NEXT: mtvsrd v3, r3 -; CHECK-BE-P9-NEXT: vmrghh v2, v2, v3 +; CHECK-BE-P9-NEXT: mtfprwz f0, r3 +; CHECK-BE-P9-NEXT: addis r3, r2, .LCPI20_0@toc@ha +; CHECK-BE-P9-NEXT: mtvsrwz v2, r4 +; CHECK-BE-P9-NEXT: addi r3, r3, .LCPI20_0@toc@l +; CHECK-BE-P9-NEXT: lxv vs1, 0(r3) +; CHECK-BE-P9-NEXT: xxperm v2, vs0, vs1 ; CHECK-BE-P9-NEXT: blr ; ; CHECK-AIX-64-P8-LABEL: test_v4i32_v8i16: ; CHECK-AIX-64-P8: # %bb.0: # %entry -; CHECK-AIX-64-P8-NEXT: sldi r3, r3, 32 -; CHECK-AIX-64-P8-NEXT: sldi r4, r4, 48 -; CHECK-AIX-64-P8-NEXT: mtvsrd v2, r3 -; CHECK-AIX-64-P8-NEXT: mtvsrd v3, r4 -; CHECK-AIX-64-P8-NEXT: vmrghh v2, v2, v3 +; CHECK-AIX-64-P8-NEXT: ld r5, L..C14(r2) # %const.0 +; CHECK-AIX-64-P8-NEXT: mtvsrwz v2, r3 +; CHECK-AIX-64-P8-NEXT: mtvsrwz v4, r4 +; CHECK-AIX-64-P8-NEXT: lxvw4x v3, 0, r5 +; CHECK-AIX-64-P8-NEXT: vperm v2, v2, v4, v3 ; CHECK-AIX-64-P8-NEXT: blr ; ; CHECK-AIX-64-P9-LABEL: test_v4i32_v8i16: ; CHECK-AIX-64-P9: # %bb.0: # %entry -; CHECK-AIX-64-P9-NEXT: mtvsrws v2, r3 -; CHECK-AIX-64-P9-NEXT: sldi r3, r4, 48 -; CHECK-AIX-64-P9-NEXT: mtvsrd v3, r3 -; CHECK-AIX-64-P9-NEXT: vmrghh v2, v2, v3 +; CHECK-AIX-64-P9-NEXT: mtfprwz f0, r3 +; CHECK-AIX-64-P9-NEXT: ld r3, L..C10(r2) # %const.0 +; CHECK-AIX-64-P9-NEXT: mtvsrwz v2, r4 +; CHECK-AIX-64-P9-NEXT: lxv vs1, 0(r3) +; CHECK-AIX-64-P9-NEXT: xxperm v2, vs0, vs1 ; CHECK-AIX-64-P9-NEXT: blr ; ; CHECK-AIX-32-P8-LABEL: test_v4i32_v8i16: @@ -1826,18 +1814,15 @@ ; CHECK-LE-P8-LABEL: test_v2i64_v4i32: ; CHECK-LE-P8: # %bb.0: # %entry ; CHECK-LE-P8-NEXT: mtfprd f0, r3 -; CHECK-LE-P8-NEXT: mtfprd f1, r4 -; CHECK-LE-P8-NEXT: xxswapd vs0, vs0 -; CHECK-LE-P8-NEXT: xxswapd vs1, vs1 -; CHECK-LE-P8-NEXT: xxmrglw v2, vs1, vs0 +; CHECK-LE-P8-NEXT: mtfprwz f1, r4 +; CHECK-LE-P8-NEXT: xxmrghw v2, vs1, vs0 ; CHECK-LE-P8-NEXT: blr ; ; CHECK-LE-P9-LABEL: test_v2i64_v4i32: ; CHECK-LE-P9: # %bb.0: # %entry ; CHECK-LE-P9-NEXT: mtfprd f0, r3 -; CHECK-LE-P9-NEXT: mtvsrws vs1, r4 -; CHECK-LE-P9-NEXT: xxswapd vs0, vs0 -; CHECK-LE-P9-NEXT: xxmrglw v2, vs1, vs0 +; CHECK-LE-P9-NEXT: mtfprwz f1, r4 +; CHECK-LE-P9-NEXT: xxmrghw v2, vs1, vs0 ; CHECK-LE-P9-NEXT: blr ; ; CHECK-BE-P8-LABEL: test_v2i64_v4i32: @@ -1901,20 +1886,16 @@ define <16 x i8> @test_v2i64_v8i16(i64 %arg, i16 %arg1) { ; CHECK-LE-P8-LABEL: test_v2i64_v8i16: ; CHECK-LE-P8: # %bb.0: # %entry -; CHECK-LE-P8-NEXT: mtfprd f0, r3 -; CHECK-LE-P8-NEXT: mtfprd f1, r4 -; CHECK-LE-P8-NEXT: xxswapd v2, vs0 -; CHECK-LE-P8-NEXT: xxswapd v3, vs1 -; CHECK-LE-P8-NEXT: vmrglh v2, v3, v2 +; CHECK-LE-P8-NEXT: mtvsrd v2, r3 +; CHECK-LE-P8-NEXT: mtvsrd v3, r4 +; CHECK-LE-P8-NEXT: vmrghh v2, v3, v2 ; CHECK-LE-P8-NEXT: blr ; ; CHECK-LE-P9-LABEL: test_v2i64_v8i16: ; CHECK-LE-P9: # %bb.0: # %entry -; CHECK-LE-P9-NEXT: mtfprd f0, r3 -; CHECK-LE-P9-NEXT: xxswapd v2, vs0 -; CHECK-LE-P9-NEXT: mtfprd f0, r4 -; CHECK-LE-P9-NEXT: xxswapd v3, vs0 -; CHECK-LE-P9-NEXT: vmrglh v2, v3, v2 +; CHECK-LE-P9-NEXT: mtvsrd v2, r3 +; CHECK-LE-P9-NEXT: mtvsrd v3, r4 +; CHECK-LE-P9-NEXT: vmrghh v2, v3, v2 ; CHECK-LE-P9-NEXT: blr ; ; CHECK-BE-P8-LABEL: test_v2i64_v8i16: @@ -1981,26 +1962,22 @@ ; CHECK-LE-P8-LABEL: test_v4i32_v2i64: ; CHECK-LE-P8: # %bb.0: # %entry ; CHECK-LE-P8-NEXT: addis r5, r2, .LCPI24_0@toc@ha -; CHECK-LE-P8-NEXT: lfiwzx f0, 0, r3 -; CHECK-LE-P8-NEXT: lfdx f1, 0, r4 -; CHECK-LE-P8-NEXT: addi r3, r5, .LCPI24_0@toc@l -; CHECK-LE-P8-NEXT: lxvd2x vs2, 0, r3 -; CHECK-LE-P8-NEXT: xxswapd v2, f0 -; CHECK-LE-P8-NEXT: xxswapd v3, f1 -; CHECK-LE-P8-NEXT: xxswapd v4, vs2 +; CHECK-LE-P8-NEXT: lxsiwzx v2, 0, r3 +; CHECK-LE-P8-NEXT: lxsdx v3, 0, r4 +; CHECK-LE-P8-NEXT: addi r5, r5, .LCPI24_0@toc@l +; CHECK-LE-P8-NEXT: lxvd2x vs0, 0, r5 +; CHECK-LE-P8-NEXT: xxswapd v4, vs0 ; CHECK-LE-P8-NEXT: vperm v2, v3, v2, v4 ; CHECK-LE-P8-NEXT: blr ; ; CHECK-LE-P9-LABEL: test_v4i32_v2i64: ; CHECK-LE-P9: # %bb.0: # %entry -; CHECK-LE-P9-NEXT: lfiwzx f0, 0, r3 +; CHECK-LE-P9-NEXT: lxsiwzx v2, 0, r3 ; CHECK-LE-P9-NEXT: addis r3, r2, .LCPI24_0@toc@ha -; CHECK-LE-P9-NEXT: addi r3, r3, .LCPI24_0@toc@l -; CHECK-LE-P9-NEXT: xxswapd v2, f0 ; CHECK-LE-P9-NEXT: lfd f0, 0(r4) -; CHECK-LE-P9-NEXT: xxswapd v3, f0 -; CHECK-LE-P9-NEXT: lxv vs0, 0(r3) -; CHECK-LE-P9-NEXT: xxperm v2, v3, vs0 +; CHECK-LE-P9-NEXT: addi r3, r3, .LCPI24_0@toc@l +; CHECK-LE-P9-NEXT: lxv vs1, 0(r3) +; CHECK-LE-P9-NEXT: xxperm v2, vs0, vs1 ; CHECK-LE-P9-NEXT: blr ; ; CHECK-BE-P8-LABEL: test_v4i32_v2i64: @@ -2027,7 +2004,7 @@ ; ; CHECK-AIX-64-P8-LABEL: test_v4i32_v2i64: ; CHECK-AIX-64-P8: # %bb.0: # %entry -; CHECK-AIX-64-P8-NEXT: ld r5, L..C9(r2) # %const.0 +; CHECK-AIX-64-P8-NEXT: ld r5, L..C15(r2) # %const.0 ; CHECK-AIX-64-P8-NEXT: lfiwzx f0, 0, r3 ; CHECK-AIX-64-P8-NEXT: lxsdx v3, 0, r4 ; CHECK-AIX-64-P8-NEXT: xxsldwi v2, f0, f0, 1 @@ -2038,7 +2015,7 @@ ; CHECK-AIX-64-P9-LABEL: test_v4i32_v2i64: ; CHECK-AIX-64-P9: # %bb.0: # %entry ; CHECK-AIX-64-P9-NEXT: lfiwzx f0, 0, r3 -; CHECK-AIX-64-P9-NEXT: ld r3, L..C5(r2) # %const.0 +; CHECK-AIX-64-P9-NEXT: ld r3, L..C11(r2) # %const.0 ; CHECK-AIX-64-P9-NEXT: lxsd v2, 0(r4) ; CHECK-AIX-64-P9-NEXT: xxsldwi vs0, f0, f0, 1 ; CHECK-AIX-64-P9-NEXT: lxv vs1, 0(r3) diff --git a/llvm/test/CodeGen/PowerPC/v2i64_scalar_to_vector_shuffle.ll b/llvm/test/CodeGen/PowerPC/v2i64_scalar_to_vector_shuffle.ll --- a/llvm/test/CodeGen/PowerPC/v2i64_scalar_to_vector_shuffle.ll +++ b/llvm/test/CodeGen/PowerPC/v2i64_scalar_to_vector_shuffle.ll @@ -30,42 +30,42 @@ ; CHECK-LE-P8: # %bb.0: # %entry ; CHECK-LE-P8-NEXT: mtfprd f0, r3 ; CHECK-LE-P8-NEXT: mtfprd f1, r4 -; CHECK-LE-P8-NEXT: xxmrgld v2, vs1, vs0 +; CHECK-LE-P8-NEXT: xxmrghd v2, vs1, vs0 ; CHECK-LE-P8-NEXT: blr ; ; CHECK-LE-P9-LABEL: test_v16i8_v16i8: ; CHECK-LE-P9: # %bb.0: # %entry ; CHECK-LE-P9-NEXT: mtfprd f0, r3 ; CHECK-LE-P9-NEXT: mtfprd f1, r4 -; CHECK-LE-P9-NEXT: xxmrgld v2, vs1, vs0 +; CHECK-LE-P9-NEXT: xxmrghd v2, vs1, vs0 ; CHECK-LE-P9-NEXT: blr ; ; CHECK-BE-P8-LABEL: test_v16i8_v16i8: ; CHECK-BE-P8: # %bb.0: # %entry ; CHECK-BE-P8-NEXT: mtfprwz f0, r3 ; CHECK-BE-P8-NEXT: mtfprwz f1, r4 -; CHECK-BE-P8-NEXT: xxmrghd v2, vs0, vs1 +; CHECK-BE-P8-NEXT: xxmrgld v2, vs0, vs1 ; CHECK-BE-P8-NEXT: blr ; ; CHECK-BE-P9-LABEL: test_v16i8_v16i8: ; CHECK-BE-P9: # %bb.0: # %entry ; CHECK-BE-P9-NEXT: mtfprwz f0, r3 ; CHECK-BE-P9-NEXT: mtfprwz f1, r4 -; CHECK-BE-P9-NEXT: xxmrghd v2, vs0, vs1 +; CHECK-BE-P9-NEXT: xxmrgld v2, vs0, vs1 ; CHECK-BE-P9-NEXT: blr ; ; CHECK-AIX-64-P8-LABEL: test_v16i8_v16i8: ; CHECK-AIX-64-P8: # %bb.0: # %entry ; CHECK-AIX-64-P8-NEXT: mtfprwz f0, r3 ; CHECK-AIX-64-P8-NEXT: mtfprwz f1, r4 -; CHECK-AIX-64-P8-NEXT: xxmrghd v2, vs0, vs1 +; CHECK-AIX-64-P8-NEXT: xxmrgld v2, vs0, vs1 ; CHECK-AIX-64-P8-NEXT: blr ; ; CHECK-AIX-64-P9-LABEL: test_v16i8_v16i8: ; CHECK-AIX-64-P9: # %bb.0: # %entry ; CHECK-AIX-64-P9-NEXT: mtfprwz f0, r3 ; CHECK-AIX-64-P9-NEXT: mtfprwz f1, r4 -; CHECK-AIX-64-P9-NEXT: xxmrghd v2, vs0, vs1 +; CHECK-AIX-64-P9-NEXT: xxmrgld v2, vs0, vs1 ; CHECK-AIX-64-P9-NEXT: blr ; ; CHECK-AIX-32-P8-LABEL: test_v16i8_v16i8: @@ -102,42 +102,42 @@ ; CHECK-LE-P8-NEXT: lxvd2x vs0, 0, r4 ; CHECK-LE-P8-NEXT: xxswapd v2, vs0 ; CHECK-LE-P8-NEXT: mtfprd f0, r3 -; CHECK-LE-P8-NEXT: xxmrgld v2, vs0, v2 +; CHECK-LE-P8-NEXT: xxpermdi v2, vs0, v2, 1 ; CHECK-LE-P8-NEXT: blr ; ; CHECK-LE-P9-LABEL: test_none_v16i8: ; CHECK-LE-P9: # %bb.0: # %entry ; CHECK-LE-P9-NEXT: lxv v2, 0(r4) ; CHECK-LE-P9-NEXT: mtfprd f0, r3 -; CHECK-LE-P9-NEXT: xxmrgld v2, vs0, v2 +; CHECK-LE-P9-NEXT: xxpermdi v2, vs0, v2, 1 ; CHECK-LE-P9-NEXT: blr ; ; CHECK-BE-P8-LABEL: test_none_v16i8: ; CHECK-BE-P8: # %bb.0: # %entry ; CHECK-BE-P8-NEXT: lxvd2x v2, 0, r4 ; CHECK-BE-P8-NEXT: mtfprwz f0, r3 -; CHECK-BE-P8-NEXT: xxmrghd v2, v2, vs0 +; CHECK-BE-P8-NEXT: xxpermdi v2, v2, vs0, 1 ; CHECK-BE-P8-NEXT: blr ; ; CHECK-BE-P9-LABEL: test_none_v16i8: ; CHECK-BE-P9: # %bb.0: # %entry ; CHECK-BE-P9-NEXT: lxv v2, 0(r4) ; CHECK-BE-P9-NEXT: mtfprwz f0, r3 -; CHECK-BE-P9-NEXT: xxmrghd v2, v2, vs0 +; CHECK-BE-P9-NEXT: xxpermdi v2, v2, vs0, 1 ; CHECK-BE-P9-NEXT: blr ; ; CHECK-AIX-64-P8-LABEL: test_none_v16i8: ; CHECK-AIX-64-P8: # %bb.0: # %entry ; CHECK-AIX-64-P8-NEXT: lxvd2x v2, 0, r4 ; CHECK-AIX-64-P8-NEXT: mtfprwz f0, r3 -; CHECK-AIX-64-P8-NEXT: xxmrghd v2, v2, vs0 +; CHECK-AIX-64-P8-NEXT: xxpermdi v2, v2, vs0, 1 ; CHECK-AIX-64-P8-NEXT: blr ; ; CHECK-AIX-64-P9-LABEL: test_none_v16i8: ; CHECK-AIX-64-P9: # %bb.0: # %entry ; CHECK-AIX-64-P9-NEXT: lxv v2, 0(r4) ; CHECK-AIX-64-P9-NEXT: mtfprwz f0, r3 -; CHECK-AIX-64-P9-NEXT: xxmrghd v2, v2, vs0 +; CHECK-AIX-64-P9-NEXT: xxpermdi v2, v2, vs0, 1 ; CHECK-AIX-64-P9-NEXT: blr ; ; CHECK-AIX-32-P8-LABEL: test_none_v16i8: @@ -170,42 +170,42 @@ ; CHECK-LE-P8-NEXT: lxvd2x vs0, 0, r4 ; CHECK-LE-P8-NEXT: xxswapd v2, vs0 ; CHECK-LE-P8-NEXT: mtfprd f0, r3 -; CHECK-LE-P8-NEXT: xxmrgld v2, v2, vs0 +; CHECK-LE-P8-NEXT: xxpermdi v2, v2, vs0, 2 ; CHECK-LE-P8-NEXT: blr ; ; CHECK-LE-P9-LABEL: test_v16i8_none: ; CHECK-LE-P9: # %bb.0: # %entry ; CHECK-LE-P9-NEXT: lxv v2, 0(r4) ; CHECK-LE-P9-NEXT: mtfprd f0, r3 -; CHECK-LE-P9-NEXT: xxmrgld v2, v2, vs0 +; CHECK-LE-P9-NEXT: xxpermdi v2, v2, vs0, 2 ; CHECK-LE-P9-NEXT: blr ; ; CHECK-BE-P8-LABEL: test_v16i8_none: ; CHECK-BE-P8: # %bb.0: # %entry ; CHECK-BE-P8-NEXT: lxvd2x v2, 0, r4 ; CHECK-BE-P8-NEXT: mtfprwz f0, r3 -; CHECK-BE-P8-NEXT: xxmrghd v2, vs0, v2 +; CHECK-BE-P8-NEXT: xxpermdi v2, vs0, v2, 2 ; CHECK-BE-P8-NEXT: blr ; ; CHECK-BE-P9-LABEL: test_v16i8_none: ; CHECK-BE-P9: # %bb.0: # %entry ; CHECK-BE-P9-NEXT: lxv v2, 0(r4) ; CHECK-BE-P9-NEXT: mtfprwz f0, r3 -; CHECK-BE-P9-NEXT: xxmrghd v2, vs0, v2 +; CHECK-BE-P9-NEXT: xxpermdi v2, vs0, v2, 2 ; CHECK-BE-P9-NEXT: blr ; ; CHECK-AIX-64-P8-LABEL: test_v16i8_none: ; CHECK-AIX-64-P8: # %bb.0: # %entry ; CHECK-AIX-64-P8-NEXT: lxvd2x v2, 0, r4 ; CHECK-AIX-64-P8-NEXT: mtfprwz f0, r3 -; CHECK-AIX-64-P8-NEXT: xxmrghd v2, vs0, v2 +; CHECK-AIX-64-P8-NEXT: xxpermdi v2, vs0, v2, 2 ; CHECK-AIX-64-P8-NEXT: blr ; ; CHECK-AIX-64-P9-LABEL: test_v16i8_none: ; CHECK-AIX-64-P9: # %bb.0: # %entry ; CHECK-AIX-64-P9-NEXT: lxv v2, 0(r4) ; CHECK-AIX-64-P9-NEXT: mtfprwz f0, r3 -; CHECK-AIX-64-P9-NEXT: xxmrghd v2, vs0, v2 +; CHECK-AIX-64-P9-NEXT: xxpermdi v2, vs0, v2, 2 ; CHECK-AIX-64-P9-NEXT: blr ; ; CHECK-AIX-32-P8-LABEL: test_v16i8_none: @@ -237,54 +237,42 @@ ; CHECK-LE-P8: # %bb.0: # %entry ; CHECK-LE-P8-NEXT: mtfprd f0, r3 ; CHECK-LE-P8-NEXT: mtfprd f1, r4 -; CHECK-LE-P8-NEXT: xxswapd vs0, vs0 -; CHECK-LE-P8-NEXT: xxswapd vs1, vs1 -; CHECK-LE-P8-NEXT: xxmrgld v2, vs1, vs0 +; CHECK-LE-P8-NEXT: xxmrghd v2, vs1, vs0 ; CHECK-LE-P8-NEXT: blr ; ; CHECK-LE-P9-LABEL: test_v16i8_v8i16: ; CHECK-LE-P9: # %bb.0: # %entry ; CHECK-LE-P9-NEXT: mtfprd f0, r3 ; CHECK-LE-P9-NEXT: mtfprd f1, r4 -; CHECK-LE-P9-NEXT: xxswapd vs0, vs0 -; CHECK-LE-P9-NEXT: xxswapd vs1, vs1 -; CHECK-LE-P9-NEXT: xxmrgld v2, vs1, vs0 +; CHECK-LE-P9-NEXT: xxmrghd v2, vs1, vs0 ; CHECK-LE-P9-NEXT: blr ; ; CHECK-BE-P8-LABEL: test_v16i8_v8i16: ; CHECK-BE-P8: # %bb.0: # %entry -; CHECK-BE-P8-NEXT: sldi r3, r3, 56 -; CHECK-BE-P8-NEXT: sldi r4, r4, 48 -; CHECK-BE-P8-NEXT: mtfprd f0, r3 -; CHECK-BE-P8-NEXT: mtfprd f1, r4 -; CHECK-BE-P8-NEXT: xxmrghd v2, vs0, vs1 +; CHECK-BE-P8-NEXT: mtfprwz f0, r3 +; CHECK-BE-P8-NEXT: mtfprwz f1, r4 +; CHECK-BE-P8-NEXT: xxmrgld v2, vs0, vs1 ; CHECK-BE-P8-NEXT: blr ; ; CHECK-BE-P9-LABEL: test_v16i8_v8i16: ; CHECK-BE-P9: # %bb.0: # %entry -; CHECK-BE-P9-NEXT: sldi r3, r3, 56 -; CHECK-BE-P9-NEXT: mtfprd f0, r3 -; CHECK-BE-P9-NEXT: sldi r3, r4, 48 -; CHECK-BE-P9-NEXT: mtfprd f1, r3 -; CHECK-BE-P9-NEXT: xxmrghd v2, vs0, vs1 +; CHECK-BE-P9-NEXT: mtfprwz f0, r3 +; CHECK-BE-P9-NEXT: mtfprwz f1, r4 +; CHECK-BE-P9-NEXT: xxmrgld v2, vs0, vs1 ; CHECK-BE-P9-NEXT: blr ; ; CHECK-AIX-64-P8-LABEL: test_v16i8_v8i16: ; CHECK-AIX-64-P8: # %bb.0: # %entry -; CHECK-AIX-64-P8-NEXT: sldi r3, r3, 56 -; CHECK-AIX-64-P8-NEXT: sldi r4, r4, 48 -; CHECK-AIX-64-P8-NEXT: mtfprd f0, r3 -; CHECK-AIX-64-P8-NEXT: mtfprd f1, r4 -; CHECK-AIX-64-P8-NEXT: xxmrghd v2, vs0, vs1 +; CHECK-AIX-64-P8-NEXT: mtfprwz f0, r3 +; CHECK-AIX-64-P8-NEXT: mtfprwz f1, r4 +; CHECK-AIX-64-P8-NEXT: xxmrgld v2, vs0, vs1 ; CHECK-AIX-64-P8-NEXT: blr ; ; CHECK-AIX-64-P9-LABEL: test_v16i8_v8i16: ; CHECK-AIX-64-P9: # %bb.0: # %entry -; CHECK-AIX-64-P9-NEXT: sldi r3, r3, 56 -; CHECK-AIX-64-P9-NEXT: mtfprd f0, r3 -; CHECK-AIX-64-P9-NEXT: sldi r3, r4, 48 -; CHECK-AIX-64-P9-NEXT: mtfprd f1, r3 -; CHECK-AIX-64-P9-NEXT: xxmrghd v2, vs0, vs1 +; CHECK-AIX-64-P9-NEXT: mtfprwz f0, r3 +; CHECK-AIX-64-P9-NEXT: mtfprwz f1, r4 +; CHECK-AIX-64-P9-NEXT: xxmrgld v2, vs0, vs1 ; CHECK-AIX-64-P9-NEXT: blr ; ; CHECK-AIX-32-P8-LABEL: test_v16i8_v8i16: @@ -320,54 +308,42 @@ ; CHECK-LE-P8: # %bb.0: # %entry ; CHECK-LE-P8-NEXT: mtfprd f0, r3 ; CHECK-LE-P8-NEXT: mtfprd f1, r4 -; CHECK-LE-P8-NEXT: xxswapd vs0, vs0 -; CHECK-LE-P8-NEXT: xxswapd vs1, vs1 -; CHECK-LE-P8-NEXT: xxmrgld v2, vs0, vs1 +; CHECK-LE-P8-NEXT: xxmrghd v2, vs0, vs1 ; CHECK-LE-P8-NEXT: blr ; ; CHECK-LE-P9-LABEL: test_v8i16_v16i8: ; CHECK-LE-P9: # %bb.0: # %entry ; CHECK-LE-P9-NEXT: mtfprd f0, r3 ; CHECK-LE-P9-NEXT: mtfprd f1, r4 -; CHECK-LE-P9-NEXT: xxswapd vs0, vs0 -; CHECK-LE-P9-NEXT: xxswapd vs1, vs1 -; CHECK-LE-P9-NEXT: xxmrgld v2, vs0, vs1 +; CHECK-LE-P9-NEXT: xxmrghd v2, vs0, vs1 ; CHECK-LE-P9-NEXT: blr ; ; CHECK-BE-P8-LABEL: test_v8i16_v16i8: ; CHECK-BE-P8: # %bb.0: # %entry -; CHECK-BE-P8-NEXT: sldi r3, r3, 56 -; CHECK-BE-P8-NEXT: sldi r4, r4, 48 -; CHECK-BE-P8-NEXT: mtfprd f0, r3 -; CHECK-BE-P8-NEXT: mtfprd f1, r4 -; CHECK-BE-P8-NEXT: xxmrghd v2, vs1, vs0 +; CHECK-BE-P8-NEXT: mtfprwz f0, r3 +; CHECK-BE-P8-NEXT: mtfprwz f1, r4 +; CHECK-BE-P8-NEXT: xxmrgld v2, vs1, vs0 ; CHECK-BE-P8-NEXT: blr ; ; CHECK-BE-P9-LABEL: test_v8i16_v16i8: ; CHECK-BE-P9: # %bb.0: # %entry -; CHECK-BE-P9-NEXT: sldi r3, r3, 56 -; CHECK-BE-P9-NEXT: mtfprd f0, r3 -; CHECK-BE-P9-NEXT: sldi r3, r4, 48 -; CHECK-BE-P9-NEXT: mtfprd f1, r3 -; CHECK-BE-P9-NEXT: xxmrghd v2, vs1, vs0 +; CHECK-BE-P9-NEXT: mtfprwz f0, r3 +; CHECK-BE-P9-NEXT: mtfprwz f1, r4 +; CHECK-BE-P9-NEXT: xxmrgld v2, vs1, vs0 ; CHECK-BE-P9-NEXT: blr ; ; CHECK-AIX-64-P8-LABEL: test_v8i16_v16i8: ; CHECK-AIX-64-P8: # %bb.0: # %entry -; CHECK-AIX-64-P8-NEXT: sldi r3, r3, 56 -; CHECK-AIX-64-P8-NEXT: sldi r4, r4, 48 -; CHECK-AIX-64-P8-NEXT: mtfprd f0, r3 -; CHECK-AIX-64-P8-NEXT: mtfprd f1, r4 -; CHECK-AIX-64-P8-NEXT: xxmrghd v2, vs1, vs0 +; CHECK-AIX-64-P8-NEXT: mtfprwz f0, r3 +; CHECK-AIX-64-P8-NEXT: mtfprwz f1, r4 +; CHECK-AIX-64-P8-NEXT: xxmrgld v2, vs1, vs0 ; CHECK-AIX-64-P8-NEXT: blr ; ; CHECK-AIX-64-P9-LABEL: test_v8i16_v16i8: ; CHECK-AIX-64-P9: # %bb.0: # %entry -; CHECK-AIX-64-P9-NEXT: sldi r3, r3, 56 -; CHECK-AIX-64-P9-NEXT: mtfprd f0, r3 -; CHECK-AIX-64-P9-NEXT: sldi r3, r4, 48 -; CHECK-AIX-64-P9-NEXT: mtfprd f1, r3 -; CHECK-AIX-64-P9-NEXT: xxmrghd v2, vs1, vs0 +; CHECK-AIX-64-P9-NEXT: mtfprwz f0, r3 +; CHECK-AIX-64-P9-NEXT: mtfprwz f1, r4 +; CHECK-AIX-64-P9-NEXT: xxmrgld v2, vs1, vs0 ; CHECK-AIX-64-P9-NEXT: blr ; ; CHECK-AIX-32-P8-LABEL: test_v8i16_v16i8: @@ -404,42 +380,42 @@ ; CHECK-LE-P8-NEXT: lxvd2x vs0, 0, r4 ; CHECK-LE-P8-NEXT: xxswapd v2, vs0 ; CHECK-LE-P8-NEXT: mtfprd f0, r3 -; CHECK-LE-P8-NEXT: xxmrgld v2, v2, vs0 +; CHECK-LE-P8-NEXT: xxpermdi v2, v2, vs0, 2 ; CHECK-LE-P8-NEXT: blr ; ; CHECK-LE-P9-LABEL: test_v8i16_none: ; CHECK-LE-P9: # %bb.0: # %entry ; CHECK-LE-P9-NEXT: lxv v2, 0(r4) ; CHECK-LE-P9-NEXT: mtfprd f0, r3 -; CHECK-LE-P9-NEXT: xxmrgld v2, v2, vs0 +; CHECK-LE-P9-NEXT: xxpermdi v2, v2, vs0, 2 ; CHECK-LE-P9-NEXT: blr ; ; CHECK-BE-P8-LABEL: test_v8i16_none: ; CHECK-BE-P8: # %bb.0: # %entry ; CHECK-BE-P8-NEXT: lxvd2x v2, 0, r4 ; CHECK-BE-P8-NEXT: mtfprwz f0, r3 -; CHECK-BE-P8-NEXT: xxmrghd v2, vs0, v2 +; CHECK-BE-P8-NEXT: xxpermdi v2, vs0, v2, 2 ; CHECK-BE-P8-NEXT: blr ; ; CHECK-BE-P9-LABEL: test_v8i16_none: ; CHECK-BE-P9: # %bb.0: # %entry ; CHECK-BE-P9-NEXT: lxv v2, 0(r4) ; CHECK-BE-P9-NEXT: mtfprwz f0, r3 -; CHECK-BE-P9-NEXT: xxmrghd v2, vs0, v2 +; CHECK-BE-P9-NEXT: xxpermdi v2, vs0, v2, 2 ; CHECK-BE-P9-NEXT: blr ; ; CHECK-AIX-64-P8-LABEL: test_v8i16_none: ; CHECK-AIX-64-P8: # %bb.0: # %entry ; CHECK-AIX-64-P8-NEXT: lxvd2x v2, 0, r4 ; CHECK-AIX-64-P8-NEXT: mtfprwz f0, r3 -; CHECK-AIX-64-P8-NEXT: xxmrghd v2, vs0, v2 +; CHECK-AIX-64-P8-NEXT: xxpermdi v2, vs0, v2, 2 ; CHECK-AIX-64-P8-NEXT: blr ; ; CHECK-AIX-64-P9-LABEL: test_v8i16_none: ; CHECK-AIX-64-P9: # %bb.0: # %entry ; CHECK-AIX-64-P9-NEXT: lxv v2, 0(r4) ; CHECK-AIX-64-P9-NEXT: mtfprwz f0, r3 -; CHECK-AIX-64-P9-NEXT: xxmrghd v2, vs0, v2 +; CHECK-AIX-64-P9-NEXT: xxpermdi v2, vs0, v2, 2 ; CHECK-AIX-64-P9-NEXT: blr ; ; CHECK-AIX-32-P8-LABEL: test_v8i16_none: @@ -472,42 +448,42 @@ ; CHECK-LE-P8-NEXT: lxvd2x vs0, 0, r4 ; CHECK-LE-P8-NEXT: xxswapd v2, vs0 ; CHECK-LE-P8-NEXT: mtfprd f0, r3 -; CHECK-LE-P8-NEXT: xxmrgld v2, vs0, v2 +; CHECK-LE-P8-NEXT: xxpermdi v2, vs0, v2, 1 ; CHECK-LE-P8-NEXT: blr ; ; CHECK-LE-P9-LABEL: test_none_v8i16: ; CHECK-LE-P9: # %bb.0: # %entry ; CHECK-LE-P9-NEXT: lxv v2, 0(r4) ; CHECK-LE-P9-NEXT: mtfprd f0, r3 -; CHECK-LE-P9-NEXT: xxmrgld v2, vs0, v2 +; CHECK-LE-P9-NEXT: xxpermdi v2, vs0, v2, 1 ; CHECK-LE-P9-NEXT: blr ; ; CHECK-BE-P8-LABEL: test_none_v8i16: ; CHECK-BE-P8: # %bb.0: # %entry ; CHECK-BE-P8-NEXT: lxvd2x v2, 0, r4 ; CHECK-BE-P8-NEXT: mtfprwz f0, r3 -; CHECK-BE-P8-NEXT: xxmrghd v2, v2, vs0 +; CHECK-BE-P8-NEXT: xxpermdi v2, v2, vs0, 1 ; CHECK-BE-P8-NEXT: blr ; ; CHECK-BE-P9-LABEL: test_none_v8i16: ; CHECK-BE-P9: # %bb.0: # %entry ; CHECK-BE-P9-NEXT: lxv v2, 0(r4) ; CHECK-BE-P9-NEXT: mtfprwz f0, r3 -; CHECK-BE-P9-NEXT: xxmrghd v2, v2, vs0 +; CHECK-BE-P9-NEXT: xxpermdi v2, v2, vs0, 1 ; CHECK-BE-P9-NEXT: blr ; ; CHECK-AIX-64-P8-LABEL: test_none_v8i16: ; CHECK-AIX-64-P8: # %bb.0: # %entry ; CHECK-AIX-64-P8-NEXT: lxvd2x v2, 0, r4 ; CHECK-AIX-64-P8-NEXT: mtfprwz f0, r3 -; CHECK-AIX-64-P8-NEXT: xxmrghd v2, v2, vs0 +; CHECK-AIX-64-P8-NEXT: xxpermdi v2, v2, vs0, 1 ; CHECK-AIX-64-P8-NEXT: blr ; ; CHECK-AIX-64-P9-LABEL: test_none_v8i16: ; CHECK-AIX-64-P9: # %bb.0: # %entry ; CHECK-AIX-64-P9-NEXT: lxv v2, 0(r4) ; CHECK-AIX-64-P9-NEXT: mtfprwz f0, r3 -; CHECK-AIX-64-P9-NEXT: xxmrghd v2, v2, vs0 +; CHECK-AIX-64-P9-NEXT: xxpermdi v2, v2, vs0, 1 ; CHECK-AIX-64-P9-NEXT: blr ; ; CHECK-AIX-32-P8-LABEL: test_none_v8i16: @@ -538,52 +514,43 @@ ; CHECK-LE-P8-LABEL: test_v16i8_v4i32: ; CHECK-LE-P8: # %bb.0: # %entry ; CHECK-LE-P8-NEXT: mtfprd f0, r3 -; CHECK-LE-P8-NEXT: mtfprd f1, r4 -; CHECK-LE-P8-NEXT: xxswapd vs0, vs0 -; CHECK-LE-P8-NEXT: xxswapd vs1, vs1 -; CHECK-LE-P8-NEXT: xxmrgld v2, vs1, vs0 +; CHECK-LE-P8-NEXT: mtfprwz f1, r4 +; CHECK-LE-P8-NEXT: xxmrghd v2, vs1, vs0 ; CHECK-LE-P8-NEXT: blr ; ; CHECK-LE-P9-LABEL: test_v16i8_v4i32: ; CHECK-LE-P9: # %bb.0: # %entry ; CHECK-LE-P9-NEXT: mtfprd f0, r3 -; CHECK-LE-P9-NEXT: mtvsrws vs1, r4 -; CHECK-LE-P9-NEXT: xxswapd vs0, vs0 -; CHECK-LE-P9-NEXT: xxmrgld v2, vs1, vs0 +; CHECK-LE-P9-NEXT: mtfprwz f1, r4 +; CHECK-LE-P9-NEXT: xxmrghd v2, vs1, vs0 ; CHECK-LE-P9-NEXT: blr ; ; CHECK-BE-P8-LABEL: test_v16i8_v4i32: ; CHECK-BE-P8: # %bb.0: # %entry -; CHECK-BE-P8-NEXT: sldi r3, r3, 56 -; CHECK-BE-P8-NEXT: sldi r4, r4, 32 -; CHECK-BE-P8-NEXT: mtfprd f0, r3 -; CHECK-BE-P8-NEXT: mtfprd f1, r4 -; CHECK-BE-P8-NEXT: xxmrghd v2, vs0, vs1 +; CHECK-BE-P8-NEXT: mtfprwz f0, r3 +; CHECK-BE-P8-NEXT: mtfprwz f1, r4 +; CHECK-BE-P8-NEXT: xxmrgld v2, vs0, vs1 ; CHECK-BE-P8-NEXT: blr ; ; CHECK-BE-P9-LABEL: test_v16i8_v4i32: ; CHECK-BE-P9: # %bb.0: # %entry -; CHECK-BE-P9-NEXT: sldi r3, r3, 56 -; CHECK-BE-P9-NEXT: mtvsrws vs1, r4 -; CHECK-BE-P9-NEXT: mtfprd f0, r3 -; CHECK-BE-P9-NEXT: xxmrghd v2, vs0, vs1 +; CHECK-BE-P9-NEXT: mtfprwz f0, r3 +; CHECK-BE-P9-NEXT: mtfprwz f1, r4 +; CHECK-BE-P9-NEXT: xxmrgld v2, vs0, vs1 ; CHECK-BE-P9-NEXT: blr ; ; CHECK-AIX-64-P8-LABEL: test_v16i8_v4i32: ; CHECK-AIX-64-P8: # %bb.0: # %entry -; CHECK-AIX-64-P8-NEXT: sldi r3, r3, 56 -; CHECK-AIX-64-P8-NEXT: sldi r4, r4, 32 -; CHECK-AIX-64-P8-NEXT: mtfprd f0, r3 -; CHECK-AIX-64-P8-NEXT: mtfprd f1, r4 -; CHECK-AIX-64-P8-NEXT: xxmrghd v2, vs0, vs1 +; CHECK-AIX-64-P8-NEXT: mtfprwz f0, r3 +; CHECK-AIX-64-P8-NEXT: mtfprwz f1, r4 +; CHECK-AIX-64-P8-NEXT: xxmrgld v2, vs0, vs1 ; CHECK-AIX-64-P8-NEXT: blr ; ; CHECK-AIX-64-P9-LABEL: test_v16i8_v4i32: ; CHECK-AIX-64-P9: # %bb.0: # %entry -; CHECK-AIX-64-P9-NEXT: sldi r3, r3, 56 -; CHECK-AIX-64-P9-NEXT: mtvsrws vs1, r4 -; CHECK-AIX-64-P9-NEXT: mtfprd f0, r3 -; CHECK-AIX-64-P9-NEXT: xxmrghd v2, vs0, vs1 +; CHECK-AIX-64-P9-NEXT: mtfprwz f0, r3 +; CHECK-AIX-64-P9-NEXT: mtfprwz f1, r4 +; CHECK-AIX-64-P9-NEXT: xxmrgld v2, vs0, vs1 ; CHECK-AIX-64-P9-NEXT: blr ; ; CHECK-AIX-32-P8-LABEL: test_v16i8_v4i32: @@ -618,52 +585,43 @@ ; CHECK-LE-P8-LABEL: test_v4i32_v16i8: ; CHECK-LE-P8: # %bb.0: # %entry ; CHECK-LE-P8-NEXT: mtfprd f0, r3 -; CHECK-LE-P8-NEXT: mtfprd f1, r4 -; CHECK-LE-P8-NEXT: xxswapd vs0, vs0 -; CHECK-LE-P8-NEXT: xxswapd vs1, vs1 -; CHECK-LE-P8-NEXT: xxmrgld v2, vs0, vs1 +; CHECK-LE-P8-NEXT: mtfprwz f1, r4 +; CHECK-LE-P8-NEXT: xxmrghd v2, vs0, vs1 ; CHECK-LE-P8-NEXT: blr ; ; CHECK-LE-P9-LABEL: test_v4i32_v16i8: ; CHECK-LE-P9: # %bb.0: # %entry ; CHECK-LE-P9-NEXT: mtfprd f0, r3 -; CHECK-LE-P9-NEXT: mtvsrws vs1, r4 -; CHECK-LE-P9-NEXT: xxswapd vs0, vs0 -; CHECK-LE-P9-NEXT: xxmrgld v2, vs0, vs1 +; CHECK-LE-P9-NEXT: mtfprwz f1, r4 +; CHECK-LE-P9-NEXT: xxmrghd v2, vs0, vs1 ; CHECK-LE-P9-NEXT: blr ; ; CHECK-BE-P8-LABEL: test_v4i32_v16i8: ; CHECK-BE-P8: # %bb.0: # %entry -; CHECK-BE-P8-NEXT: sldi r3, r3, 56 -; CHECK-BE-P8-NEXT: sldi r4, r4, 32 -; CHECK-BE-P8-NEXT: mtfprd f0, r3 -; CHECK-BE-P8-NEXT: mtfprd f1, r4 -; CHECK-BE-P8-NEXT: xxmrghd v2, vs1, vs0 +; CHECK-BE-P8-NEXT: mtfprwz f0, r3 +; CHECK-BE-P8-NEXT: mtfprwz f1, r4 +; CHECK-BE-P8-NEXT: xxmrgld v2, vs1, vs0 ; CHECK-BE-P8-NEXT: blr ; ; CHECK-BE-P9-LABEL: test_v4i32_v16i8: ; CHECK-BE-P9: # %bb.0: # %entry -; CHECK-BE-P9-NEXT: sldi r3, r3, 56 -; CHECK-BE-P9-NEXT: mtvsrws vs1, r4 -; CHECK-BE-P9-NEXT: mtfprd f0, r3 -; CHECK-BE-P9-NEXT: xxmrghd v2, vs1, vs0 +; CHECK-BE-P9-NEXT: mtfprwz f0, r3 +; CHECK-BE-P9-NEXT: mtfprwz f1, r4 +; CHECK-BE-P9-NEXT: xxmrgld v2, vs1, vs0 ; CHECK-BE-P9-NEXT: blr ; ; CHECK-AIX-64-P8-LABEL: test_v4i32_v16i8: ; CHECK-AIX-64-P8: # %bb.0: # %entry -; CHECK-AIX-64-P8-NEXT: sldi r3, r3, 56 -; CHECK-AIX-64-P8-NEXT: sldi r4, r4, 32 -; CHECK-AIX-64-P8-NEXT: mtfprd f0, r3 -; CHECK-AIX-64-P8-NEXT: mtfprd f1, r4 -; CHECK-AIX-64-P8-NEXT: xxmrghd v2, vs1, vs0 +; CHECK-AIX-64-P8-NEXT: mtfprwz f0, r3 +; CHECK-AIX-64-P8-NEXT: mtfprwz f1, r4 +; CHECK-AIX-64-P8-NEXT: xxmrgld v2, vs1, vs0 ; CHECK-AIX-64-P8-NEXT: blr ; ; CHECK-AIX-64-P9-LABEL: test_v4i32_v16i8: ; CHECK-AIX-64-P9: # %bb.0: # %entry -; CHECK-AIX-64-P9-NEXT: sldi r3, r3, 56 -; CHECK-AIX-64-P9-NEXT: mtvsrws vs1, r4 -; CHECK-AIX-64-P9-NEXT: mtfprd f0, r3 -; CHECK-AIX-64-P9-NEXT: xxmrghd v2, vs1, vs0 +; CHECK-AIX-64-P9-NEXT: mtfprwz f0, r3 +; CHECK-AIX-64-P9-NEXT: mtfprwz f1, r4 +; CHECK-AIX-64-P9-NEXT: xxmrgld v2, vs1, vs0 ; CHECK-AIX-64-P9-NEXT: blr ; ; CHECK-AIX-32-P8-LABEL: test_v4i32_v16i8: @@ -700,42 +658,42 @@ ; CHECK-LE-P8-NEXT: lxvd2x vs0, 0, r4 ; CHECK-LE-P8-NEXT: xxswapd v2, vs0 ; CHECK-LE-P8-NEXT: mtfprwz f0, r3 -; CHECK-LE-P8-NEXT: xxmrgld v2, vs0, v2 +; CHECK-LE-P8-NEXT: xxpermdi v2, vs0, v2, 1 ; CHECK-LE-P8-NEXT: blr ; ; CHECK-LE-P9-LABEL: test_none_v4i32: ; CHECK-LE-P9: # %bb.0: # %entry ; CHECK-LE-P9-NEXT: lxv v2, 0(r4) ; CHECK-LE-P9-NEXT: mtfprwz f0, r3 -; CHECK-LE-P9-NEXT: xxmrgld v2, vs0, v2 +; CHECK-LE-P9-NEXT: xxpermdi v2, vs0, v2, 1 ; CHECK-LE-P9-NEXT: blr ; ; CHECK-BE-P8-LABEL: test_none_v4i32: ; CHECK-BE-P8: # %bb.0: # %entry ; CHECK-BE-P8-NEXT: lxvd2x v2, 0, r4 ; CHECK-BE-P8-NEXT: mtfprwz f0, r3 -; CHECK-BE-P8-NEXT: xxmrghd v2, v2, vs0 +; CHECK-BE-P8-NEXT: xxpermdi v2, v2, vs0, 1 ; CHECK-BE-P8-NEXT: blr ; ; CHECK-BE-P9-LABEL: test_none_v4i32: ; CHECK-BE-P9: # %bb.0: # %entry ; CHECK-BE-P9-NEXT: lxv v2, 0(r4) ; CHECK-BE-P9-NEXT: mtfprwz f0, r3 -; CHECK-BE-P9-NEXT: xxmrghd v2, v2, vs0 +; CHECK-BE-P9-NEXT: xxpermdi v2, v2, vs0, 1 ; CHECK-BE-P9-NEXT: blr ; ; CHECK-AIX-64-P8-LABEL: test_none_v4i32: ; CHECK-AIX-64-P8: # %bb.0: # %entry ; CHECK-AIX-64-P8-NEXT: lxvd2x v2, 0, r4 ; CHECK-AIX-64-P8-NEXT: mtfprwz f0, r3 -; CHECK-AIX-64-P8-NEXT: xxmrghd v2, v2, vs0 +; CHECK-AIX-64-P8-NEXT: xxpermdi v2, v2, vs0, 1 ; CHECK-AIX-64-P8-NEXT: blr ; ; CHECK-AIX-64-P9-LABEL: test_none_v4i32: ; CHECK-AIX-64-P9: # %bb.0: # %entry ; CHECK-AIX-64-P9-NEXT: lxv v2, 0(r4) ; CHECK-AIX-64-P9-NEXT: mtfprwz f0, r3 -; CHECK-AIX-64-P9-NEXT: xxmrghd v2, v2, vs0 +; CHECK-AIX-64-P9-NEXT: xxpermdi v2, v2, vs0, 1 ; CHECK-AIX-64-P9-NEXT: blr ; ; CHECK-AIX-32-P8-LABEL: test_none_v4i32: @@ -768,42 +726,42 @@ ; CHECK-LE-P8-NEXT: lxvd2x vs0, 0, r4 ; CHECK-LE-P8-NEXT: xxswapd v2, vs0 ; CHECK-LE-P8-NEXT: mtfprwz f0, r3 -; CHECK-LE-P8-NEXT: xxmrgld v2, v2, vs0 +; CHECK-LE-P8-NEXT: xxpermdi v2, v2, vs0, 2 ; CHECK-LE-P8-NEXT: blr ; ; CHECK-LE-P9-LABEL: test_v4i32_none: ; CHECK-LE-P9: # %bb.0: # %entry ; CHECK-LE-P9-NEXT: lxv v2, 0(r4) ; CHECK-LE-P9-NEXT: mtfprwz f0, r3 -; CHECK-LE-P9-NEXT: xxmrgld v2, v2, vs0 +; CHECK-LE-P9-NEXT: xxpermdi v2, v2, vs0, 2 ; CHECK-LE-P9-NEXT: blr ; ; CHECK-BE-P8-LABEL: test_v4i32_none: ; CHECK-BE-P8: # %bb.0: # %entry ; CHECK-BE-P8-NEXT: lxvd2x v2, 0, r4 ; CHECK-BE-P8-NEXT: mtfprwz f0, r3 -; CHECK-BE-P8-NEXT: xxmrghd v2, vs0, v2 +; CHECK-BE-P8-NEXT: xxpermdi v2, vs0, v2, 2 ; CHECK-BE-P8-NEXT: blr ; ; CHECK-BE-P9-LABEL: test_v4i32_none: ; CHECK-BE-P9: # %bb.0: # %entry ; CHECK-BE-P9-NEXT: lxv v2, 0(r4) ; CHECK-BE-P9-NEXT: mtfprwz f0, r3 -; CHECK-BE-P9-NEXT: xxmrghd v2, vs0, v2 +; CHECK-BE-P9-NEXT: xxpermdi v2, vs0, v2, 2 ; CHECK-BE-P9-NEXT: blr ; ; CHECK-AIX-64-P8-LABEL: test_v4i32_none: ; CHECK-AIX-64-P8: # %bb.0: # %entry ; CHECK-AIX-64-P8-NEXT: lxvd2x v2, 0, r4 ; CHECK-AIX-64-P8-NEXT: mtfprwz f0, r3 -; CHECK-AIX-64-P8-NEXT: xxmrghd v2, vs0, v2 +; CHECK-AIX-64-P8-NEXT: xxpermdi v2, vs0, v2, 2 ; CHECK-AIX-64-P8-NEXT: blr ; ; CHECK-AIX-64-P9-LABEL: test_v4i32_none: ; CHECK-AIX-64-P9: # %bb.0: # %entry ; CHECK-AIX-64-P9-NEXT: lxv v2, 0(r4) ; CHECK-AIX-64-P9-NEXT: mtfprwz f0, r3 -; CHECK-AIX-64-P9-NEXT: xxmrghd v2, vs0, v2 +; CHECK-AIX-64-P9-NEXT: xxpermdi v2, vs0, v2, 2 ; CHECK-AIX-64-P9-NEXT: blr ; ; CHECK-AIX-32-P8-LABEL: test_v4i32_none: @@ -835,18 +793,14 @@ ; CHECK-LE-P8: # %bb.0: # %entry ; CHECK-LE-P8-NEXT: mtfprd f0, r3 ; CHECK-LE-P8-NEXT: mtfprd f1, r4 -; CHECK-LE-P8-NEXT: xxswapd vs0, vs0 -; CHECK-LE-P8-NEXT: xxswapd v2, vs1 -; CHECK-LE-P8-NEXT: xxmrgld v2, v2, vs0 +; CHECK-LE-P8-NEXT: xxmrghd v2, vs1, vs0 ; CHECK-LE-P8-NEXT: blr ; ; CHECK-LE-P9-LABEL: test_v16i8_v2i64: ; CHECK-LE-P9: # %bb.0: # %entry ; CHECK-LE-P9-NEXT: mtfprd f0, r3 ; CHECK-LE-P9-NEXT: mtfprd f1, r4 -; CHECK-LE-P9-NEXT: xxswapd vs0, vs0 -; CHECK-LE-P9-NEXT: xxswapd v2, vs1 -; CHECK-LE-P9-NEXT: xxmrgld v2, v2, vs0 +; CHECK-LE-P9-NEXT: xxmrghd v2, vs1, vs0 ; CHECK-LE-P9-NEXT: blr ; ; CHECK-BE-P8-LABEL: test_v16i8_v2i64: @@ -923,18 +877,14 @@ ; CHECK-LE-P8: # %bb.0: # %entry ; CHECK-LE-P8-NEXT: mtfprd f0, r3 ; CHECK-LE-P8-NEXT: mtfprd f1, r4 -; CHECK-LE-P8-NEXT: xxswapd vs0, vs0 -; CHECK-LE-P8-NEXT: xxswapd v2, vs1 -; CHECK-LE-P8-NEXT: xxmrgld v2, vs0, v2 +; CHECK-LE-P8-NEXT: xxmrghd v2, vs0, vs1 ; CHECK-LE-P8-NEXT: blr ; ; CHECK-LE-P9-LABEL: test_v2i64_v16i8: ; CHECK-LE-P9: # %bb.0: # %entry ; CHECK-LE-P9-NEXT: mtfprd f0, r3 ; CHECK-LE-P9-NEXT: mtfprd f1, r4 -; CHECK-LE-P9-NEXT: xxswapd vs0, vs0 -; CHECK-LE-P9-NEXT: xxswapd v2, vs1 -; CHECK-LE-P9-NEXT: xxmrgld v2, vs0, v2 +; CHECK-LE-P9-NEXT: xxmrghd v2, vs0, vs1 ; CHECK-LE-P9-NEXT: blr ; ; CHECK-BE-P8-LABEL: test_v2i64_v16i8: @@ -942,14 +892,14 @@ ; CHECK-BE-P8-NEXT: mtfprd f0, r4 ; CHECK-BE-P8-NEXT: xxspltd v2, vs0, 0 ; CHECK-BE-P8-NEXT: mtfprwz f0, r3 -; CHECK-BE-P8-NEXT: xxmrghd v2, v2, vs0 +; CHECK-BE-P8-NEXT: xxmrgld v2, v2, vs0 ; CHECK-BE-P8-NEXT: blr ; ; CHECK-BE-P9-LABEL: test_v2i64_v16i8: ; CHECK-BE-P9: # %bb.0: # %entry ; CHECK-BE-P9-NEXT: mtfprwz f0, r3 ; CHECK-BE-P9-NEXT: mtvsrdd v2, r4, r4 -; CHECK-BE-P9-NEXT: xxmrghd v2, v2, vs0 +; CHECK-BE-P9-NEXT: xxmrgld v2, v2, vs0 ; CHECK-BE-P9-NEXT: blr ; ; CHECK-AIX-64-P8-LABEL: test_v2i64_v16i8: @@ -957,14 +907,14 @@ ; CHECK-AIX-64-P8-NEXT: mtfprd f0, r4 ; CHECK-AIX-64-P8-NEXT: xxmrghd v2, vs0, vs0 ; CHECK-AIX-64-P8-NEXT: mtfprwz f0, r3 -; CHECK-AIX-64-P8-NEXT: xxmrghd v2, v2, vs0 +; CHECK-AIX-64-P8-NEXT: xxmrgld v2, v2, vs0 ; CHECK-AIX-64-P8-NEXT: blr ; ; CHECK-AIX-64-P9-LABEL: test_v2i64_v16i8: ; CHECK-AIX-64-P9: # %bb.0: # %entry ; CHECK-AIX-64-P9-NEXT: mtfprwz f0, r3 ; CHECK-AIX-64-P9-NEXT: mtvsrdd v2, r4, r4 -; CHECK-AIX-64-P9-NEXT: xxmrghd v2, v2, vs0 +; CHECK-AIX-64-P9-NEXT: xxmrgld v2, v2, vs0 ; CHECK-AIX-64-P9-NEXT: blr ; ; CHECK-AIX-32-P8-LABEL: test_v2i64_v16i8: @@ -1159,42 +1109,42 @@ ; CHECK-LE-P8: # %bb.0: # %entry ; CHECK-LE-P8-NEXT: mtfprd f0, r3 ; CHECK-LE-P8-NEXT: mtfprd f1, r4 -; CHECK-LE-P8-NEXT: xxmrgld v2, vs1, vs0 +; CHECK-LE-P8-NEXT: xxmrghd v2, vs1, vs0 ; CHECK-LE-P8-NEXT: blr ; ; CHECK-LE-P9-LABEL: test_v8i16_v8i16: ; CHECK-LE-P9: # %bb.0: # %entry ; CHECK-LE-P9-NEXT: mtfprd f0, r3 ; CHECK-LE-P9-NEXT: mtfprd f1, r4 -; CHECK-LE-P9-NEXT: xxmrgld v2, vs1, vs0 +; CHECK-LE-P9-NEXT: xxmrghd v2, vs1, vs0 ; CHECK-LE-P9-NEXT: blr ; ; CHECK-BE-P8-LABEL: test_v8i16_v8i16: ; CHECK-BE-P8: # %bb.0: # %entry ; CHECK-BE-P8-NEXT: mtfprwz f0, r3 ; CHECK-BE-P8-NEXT: mtfprwz f1, r4 -; CHECK-BE-P8-NEXT: xxmrghd v2, vs0, vs1 +; CHECK-BE-P8-NEXT: xxmrgld v2, vs0, vs1 ; CHECK-BE-P8-NEXT: blr ; ; CHECK-BE-P9-LABEL: test_v8i16_v8i16: ; CHECK-BE-P9: # %bb.0: # %entry ; CHECK-BE-P9-NEXT: mtfprwz f0, r3 ; CHECK-BE-P9-NEXT: mtfprwz f1, r4 -; CHECK-BE-P9-NEXT: xxmrghd v2, vs0, vs1 +; CHECK-BE-P9-NEXT: xxmrgld v2, vs0, vs1 ; CHECK-BE-P9-NEXT: blr ; ; CHECK-AIX-64-P8-LABEL: test_v8i16_v8i16: ; CHECK-AIX-64-P8: # %bb.0: # %entry ; CHECK-AIX-64-P8-NEXT: mtfprwz f0, r3 ; CHECK-AIX-64-P8-NEXT: mtfprwz f1, r4 -; CHECK-AIX-64-P8-NEXT: xxmrghd v2, vs0, vs1 +; CHECK-AIX-64-P8-NEXT: xxmrgld v2, vs0, vs1 ; CHECK-AIX-64-P8-NEXT: blr ; ; CHECK-AIX-64-P9-LABEL: test_v8i16_v8i16: ; CHECK-AIX-64-P9: # %bb.0: # %entry ; CHECK-AIX-64-P9-NEXT: mtfprwz f0, r3 ; CHECK-AIX-64-P9-NEXT: mtfprwz f1, r4 -; CHECK-AIX-64-P9-NEXT: xxmrghd v2, vs0, vs1 +; CHECK-AIX-64-P9-NEXT: xxmrgld v2, vs0, vs1 ; CHECK-AIX-64-P9-NEXT: blr ; ; CHECK-AIX-32-P8-LABEL: test_v8i16_v8i16: @@ -1229,52 +1179,43 @@ ; CHECK-LE-P8-LABEL: test_v8i16_v4i32: ; CHECK-LE-P8: # %bb.0: # %entry ; CHECK-LE-P8-NEXT: mtfprd f0, r3 -; CHECK-LE-P8-NEXT: mtfprd f1, r4 -; CHECK-LE-P8-NEXT: xxswapd vs0, vs0 -; CHECK-LE-P8-NEXT: xxswapd vs1, vs1 -; CHECK-LE-P8-NEXT: xxmrgld v2, vs1, vs0 +; CHECK-LE-P8-NEXT: mtfprwz f1, r4 +; CHECK-LE-P8-NEXT: xxmrghd v2, vs1, vs0 ; CHECK-LE-P8-NEXT: blr ; ; CHECK-LE-P9-LABEL: test_v8i16_v4i32: ; CHECK-LE-P9: # %bb.0: # %entry ; CHECK-LE-P9-NEXT: mtfprd f0, r3 -; CHECK-LE-P9-NEXT: mtvsrws vs1, r4 -; CHECK-LE-P9-NEXT: xxswapd vs0, vs0 -; CHECK-LE-P9-NEXT: xxmrgld v2, vs1, vs0 +; CHECK-LE-P9-NEXT: mtfprwz f1, r4 +; CHECK-LE-P9-NEXT: xxmrghd v2, vs1, vs0 ; CHECK-LE-P9-NEXT: blr ; ; CHECK-BE-P8-LABEL: test_v8i16_v4i32: ; CHECK-BE-P8: # %bb.0: # %entry -; CHECK-BE-P8-NEXT: sldi r3, r3, 48 -; CHECK-BE-P8-NEXT: sldi r4, r4, 32 -; CHECK-BE-P8-NEXT: mtfprd f0, r3 -; CHECK-BE-P8-NEXT: mtfprd f1, r4 -; CHECK-BE-P8-NEXT: xxmrghd v2, vs0, vs1 +; CHECK-BE-P8-NEXT: mtfprwz f0, r3 +; CHECK-BE-P8-NEXT: mtfprwz f1, r4 +; CHECK-BE-P8-NEXT: xxmrgld v2, vs0, vs1 ; CHECK-BE-P8-NEXT: blr ; ; CHECK-BE-P9-LABEL: test_v8i16_v4i32: ; CHECK-BE-P9: # %bb.0: # %entry -; CHECK-BE-P9-NEXT: sldi r3, r3, 48 -; CHECK-BE-P9-NEXT: mtvsrws vs1, r4 -; CHECK-BE-P9-NEXT: mtfprd f0, r3 -; CHECK-BE-P9-NEXT: xxmrghd v2, vs0, vs1 +; CHECK-BE-P9-NEXT: mtfprwz f0, r3 +; CHECK-BE-P9-NEXT: mtfprwz f1, r4 +; CHECK-BE-P9-NEXT: xxmrgld v2, vs0, vs1 ; CHECK-BE-P9-NEXT: blr ; ; CHECK-AIX-64-P8-LABEL: test_v8i16_v4i32: ; CHECK-AIX-64-P8: # %bb.0: # %entry -; CHECK-AIX-64-P8-NEXT: sldi r3, r3, 48 -; CHECK-AIX-64-P8-NEXT: sldi r4, r4, 32 -; CHECK-AIX-64-P8-NEXT: mtfprd f0, r3 -; CHECK-AIX-64-P8-NEXT: mtfprd f1, r4 -; CHECK-AIX-64-P8-NEXT: xxmrghd v2, vs0, vs1 +; CHECK-AIX-64-P8-NEXT: mtfprwz f0, r3 +; CHECK-AIX-64-P8-NEXT: mtfprwz f1, r4 +; CHECK-AIX-64-P8-NEXT: xxmrgld v2, vs0, vs1 ; CHECK-AIX-64-P8-NEXT: blr ; ; CHECK-AIX-64-P9-LABEL: test_v8i16_v4i32: ; CHECK-AIX-64-P9: # %bb.0: # %entry -; CHECK-AIX-64-P9-NEXT: sldi r3, r3, 48 -; CHECK-AIX-64-P9-NEXT: mtvsrws vs1, r4 -; CHECK-AIX-64-P9-NEXT: mtfprd f0, r3 -; CHECK-AIX-64-P9-NEXT: xxmrghd v2, vs0, vs1 +; CHECK-AIX-64-P9-NEXT: mtfprwz f0, r3 +; CHECK-AIX-64-P9-NEXT: mtfprwz f1, r4 +; CHECK-AIX-64-P9-NEXT: xxmrgld v2, vs0, vs1 ; CHECK-AIX-64-P9-NEXT: blr ; ; CHECK-AIX-32-P8-LABEL: test_v8i16_v4i32: @@ -1310,18 +1251,14 @@ ; CHECK-LE-P8: # %bb.0: # %entry ; CHECK-LE-P8-NEXT: mtfprd f0, r3 ; CHECK-LE-P8-NEXT: mtfprd f1, r4 -; CHECK-LE-P8-NEXT: xxswapd vs0, vs0 -; CHECK-LE-P8-NEXT: xxswapd v2, vs1 -; CHECK-LE-P8-NEXT: xxmrgld v2, v2, vs0 +; CHECK-LE-P8-NEXT: xxmrghd v2, vs1, vs0 ; CHECK-LE-P8-NEXT: blr ; ; CHECK-LE-P9-LABEL: test_v8i16_v2i64: ; CHECK-LE-P9: # %bb.0: # %entry ; CHECK-LE-P9-NEXT: mtfprd f0, r3 ; CHECK-LE-P9-NEXT: mtfprd f1, r4 -; CHECK-LE-P9-NEXT: xxswapd vs0, vs0 -; CHECK-LE-P9-NEXT: xxswapd v2, vs1 -; CHECK-LE-P9-NEXT: xxmrgld v2, v2, vs0 +; CHECK-LE-P9-NEXT: xxmrghd v2, vs1, vs0 ; CHECK-LE-P9-NEXT: blr ; ; CHECK-BE-P8-LABEL: test_v8i16_v2i64: @@ -1398,42 +1335,42 @@ ; CHECK-LE-P8: # %bb.0: # %entry ; CHECK-LE-P8-NEXT: mtfprwz f0, r3 ; CHECK-LE-P8-NEXT: mtfprwz f1, r4 -; CHECK-LE-P8-NEXT: xxmrgld v2, vs1, vs0 +; CHECK-LE-P8-NEXT: xxmrghd v2, vs1, vs0 ; CHECK-LE-P8-NEXT: blr ; ; CHECK-LE-P9-LABEL: test_v4i32_v4i32: ; CHECK-LE-P9: # %bb.0: # %entry ; CHECK-LE-P9-NEXT: mtfprwz f0, r3 ; CHECK-LE-P9-NEXT: mtfprwz f1, r4 -; CHECK-LE-P9-NEXT: xxmrgld v2, vs1, vs0 +; CHECK-LE-P9-NEXT: xxmrghd v2, vs1, vs0 ; CHECK-LE-P9-NEXT: blr ; ; CHECK-BE-P8-LABEL: test_v4i32_v4i32: ; CHECK-BE-P8: # %bb.0: # %entry ; CHECK-BE-P8-NEXT: mtfprwz f0, r3 ; CHECK-BE-P8-NEXT: mtfprwz f1, r4 -; CHECK-BE-P8-NEXT: xxmrghd v2, vs0, vs1 +; CHECK-BE-P8-NEXT: xxmrgld v2, vs0, vs1 ; CHECK-BE-P8-NEXT: blr ; ; CHECK-BE-P9-LABEL: test_v4i32_v4i32: ; CHECK-BE-P9: # %bb.0: # %entry ; CHECK-BE-P9-NEXT: mtfprwz f0, r3 ; CHECK-BE-P9-NEXT: mtfprwz f1, r4 -; CHECK-BE-P9-NEXT: xxmrghd v2, vs0, vs1 +; CHECK-BE-P9-NEXT: xxmrgld v2, vs0, vs1 ; CHECK-BE-P9-NEXT: blr ; ; CHECK-AIX-64-P8-LABEL: test_v4i32_v4i32: ; CHECK-AIX-64-P8: # %bb.0: # %entry ; CHECK-AIX-64-P8-NEXT: mtfprwz f0, r3 ; CHECK-AIX-64-P8-NEXT: mtfprwz f1, r4 -; CHECK-AIX-64-P8-NEXT: xxmrghd v2, vs0, vs1 +; CHECK-AIX-64-P8-NEXT: xxmrgld v2, vs0, vs1 ; CHECK-AIX-64-P8-NEXT: blr ; ; CHECK-AIX-64-P9-LABEL: test_v4i32_v4i32: ; CHECK-AIX-64-P9: # %bb.0: # %entry ; CHECK-AIX-64-P9-NEXT: mtfprwz f0, r3 ; CHECK-AIX-64-P9-NEXT: mtfprwz f1, r4 -; CHECK-AIX-64-P9-NEXT: xxmrghd v2, vs0, vs1 +; CHECK-AIX-64-P9-NEXT: xxmrgld v2, vs0, vs1 ; CHECK-AIX-64-P9-NEXT: blr ; ; CHECK-AIX-32-P8-LABEL: test_v4i32_v4i32: @@ -1467,53 +1404,44 @@ define <2 x i64> @test_v4i32_v8i16(i32 %arg1, i16 %arg) { ; CHECK-LE-P8-LABEL: test_v4i32_v8i16: ; CHECK-LE-P8: # %bb.0: # %entry -; CHECK-LE-P8-NEXT: mtfprd f0, r3 +; CHECK-LE-P8-NEXT: mtfprwz f0, r3 ; CHECK-LE-P8-NEXT: mtfprd f1, r4 -; CHECK-LE-P8-NEXT: xxswapd vs0, vs0 -; CHECK-LE-P8-NEXT: xxswapd vs1, vs1 -; CHECK-LE-P8-NEXT: xxmrgld v2, vs1, vs0 +; CHECK-LE-P8-NEXT: xxmrghd v2, vs1, vs0 ; CHECK-LE-P8-NEXT: blr ; ; CHECK-LE-P9-LABEL: test_v4i32_v8i16: ; CHECK-LE-P9: # %bb.0: # %entry +; CHECK-LE-P9-NEXT: mtfprwz f0, r3 ; CHECK-LE-P9-NEXT: mtfprd f1, r4 -; CHECK-LE-P9-NEXT: mtvsrws vs0, r3 -; CHECK-LE-P9-NEXT: xxswapd vs1, vs1 -; CHECK-LE-P9-NEXT: xxmrgld v2, vs1, vs0 +; CHECK-LE-P9-NEXT: xxmrghd v2, vs1, vs0 ; CHECK-LE-P9-NEXT: blr ; ; CHECK-BE-P8-LABEL: test_v4i32_v8i16: ; CHECK-BE-P8: # %bb.0: # %entry -; CHECK-BE-P8-NEXT: sldi r3, r3, 32 -; CHECK-BE-P8-NEXT: sldi r4, r4, 48 -; CHECK-BE-P8-NEXT: mtfprd f0, r3 -; CHECK-BE-P8-NEXT: mtfprd f1, r4 -; CHECK-BE-P8-NEXT: xxmrghd v2, vs0, vs1 +; CHECK-BE-P8-NEXT: mtfprwz f0, r3 +; CHECK-BE-P8-NEXT: mtfprwz f1, r4 +; CHECK-BE-P8-NEXT: xxmrgld v2, vs0, vs1 ; CHECK-BE-P8-NEXT: blr ; ; CHECK-BE-P9-LABEL: test_v4i32_v8i16: ; CHECK-BE-P9: # %bb.0: # %entry -; CHECK-BE-P9-NEXT: mtvsrws vs0, r3 -; CHECK-BE-P9-NEXT: sldi r3, r4, 48 -; CHECK-BE-P9-NEXT: mtfprd f1, r3 -; CHECK-BE-P9-NEXT: xxmrghd v2, vs0, vs1 +; CHECK-BE-P9-NEXT: mtfprwz f0, r3 +; CHECK-BE-P9-NEXT: mtfprwz f1, r4 +; CHECK-BE-P9-NEXT: xxmrgld v2, vs0, vs1 ; CHECK-BE-P9-NEXT: blr ; ; CHECK-AIX-64-P8-LABEL: test_v4i32_v8i16: ; CHECK-AIX-64-P8: # %bb.0: # %entry -; CHECK-AIX-64-P8-NEXT: sldi r3, r3, 32 -; CHECK-AIX-64-P8-NEXT: sldi r4, r4, 48 -; CHECK-AIX-64-P8-NEXT: mtfprd f0, r3 -; CHECK-AIX-64-P8-NEXT: mtfprd f1, r4 -; CHECK-AIX-64-P8-NEXT: xxmrghd v2, vs0, vs1 +; CHECK-AIX-64-P8-NEXT: mtfprwz f0, r3 +; CHECK-AIX-64-P8-NEXT: mtfprwz f1, r4 +; CHECK-AIX-64-P8-NEXT: xxmrgld v2, vs0, vs1 ; CHECK-AIX-64-P8-NEXT: blr ; ; CHECK-AIX-64-P9-LABEL: test_v4i32_v8i16: ; CHECK-AIX-64-P9: # %bb.0: # %entry -; CHECK-AIX-64-P9-NEXT: mtvsrws vs0, r3 -; CHECK-AIX-64-P9-NEXT: sldi r3, r4, 48 -; CHECK-AIX-64-P9-NEXT: mtfprd f1, r3 -; CHECK-AIX-64-P9-NEXT: xxmrghd v2, vs0, vs1 +; CHECK-AIX-64-P9-NEXT: mtfprwz f0, r3 +; CHECK-AIX-64-P9-NEXT: mtfprwz f1, r4 +; CHECK-AIX-64-P9-NEXT: xxmrgld v2, vs0, vs1 ; CHECK-AIX-64-P9-NEXT: blr ; ; CHECK-AIX-32-P8-LABEL: test_v4i32_v8i16: @@ -1547,19 +1475,16 @@ define <2 x i64> @test_v4i32_v2i64(i32 %arg1, i64 %arg) { ; CHECK-LE-P8-LABEL: test_v4i32_v2i64: ; CHECK-LE-P8: # %bb.0: # %entry -; CHECK-LE-P8-NEXT: mtfprd f0, r3 +; CHECK-LE-P8-NEXT: mtfprwz f0, r3 ; CHECK-LE-P8-NEXT: mtfprd f1, r4 -; CHECK-LE-P8-NEXT: xxswapd vs0, vs0 -; CHECK-LE-P8-NEXT: xxswapd v2, vs1 -; CHECK-LE-P8-NEXT: xxmrgld v2, v2, vs0 +; CHECK-LE-P8-NEXT: xxmrghd v2, vs1, vs0 ; CHECK-LE-P8-NEXT: blr ; ; CHECK-LE-P9-LABEL: test_v4i32_v2i64: ; CHECK-LE-P9: # %bb.0: # %entry +; CHECK-LE-P9-NEXT: mtfprwz f0, r3 ; CHECK-LE-P9-NEXT: mtfprd f1, r4 -; CHECK-LE-P9-NEXT: mtvsrws vs0, r3 -; CHECK-LE-P9-NEXT: xxswapd v2, vs1 -; CHECK-LE-P9-NEXT: xxmrgld v2, v2, vs0 +; CHECK-LE-P9-NEXT: xxmrghd v2, vs1, vs0 ; CHECK-LE-P9-NEXT: blr ; ; CHECK-BE-P8-LABEL: test_v4i32_v2i64: @@ -1744,18 +1669,15 @@ ; CHECK-LE-P8-LABEL: test_v2i64_v4i32: ; CHECK-LE-P8: # %bb.0: # %entry ; CHECK-LE-P8-NEXT: mtfprd f0, r3 -; CHECK-LE-P8-NEXT: mtfprd f1, r4 -; CHECK-LE-P8-NEXT: xxswapd v2, vs0 -; CHECK-LE-P8-NEXT: xxswapd vs0, vs1 -; CHECK-LE-P8-NEXT: xxmrgld v2, vs0, v2 +; CHECK-LE-P8-NEXT: mtfprwz f1, r4 +; CHECK-LE-P8-NEXT: xxmrghd v2, vs1, vs0 ; CHECK-LE-P8-NEXT: blr ; ; CHECK-LE-P9-LABEL: test_v2i64_v4i32: ; CHECK-LE-P9: # %bb.0: # %entry ; CHECK-LE-P9-NEXT: mtfprd f0, r3 -; CHECK-LE-P9-NEXT: xxswapd v2, vs0 -; CHECK-LE-P9-NEXT: mtvsrws vs0, r4 -; CHECK-LE-P9-NEXT: xxmrgld v2, vs0, v2 +; CHECK-LE-P9-NEXT: mtfprwz f1, r4 +; CHECK-LE-P9-NEXT: xxmrghd v2, vs1, vs0 ; CHECK-LE-P9-NEXT: blr ; ; CHECK-BE-P8-LABEL: test_v2i64_v4i32: @@ -1763,14 +1685,14 @@ ; CHECK-BE-P8-NEXT: mtfprd f0, r3 ; CHECK-BE-P8-NEXT: xxspltd v2, vs0, 0 ; CHECK-BE-P8-NEXT: mtfprwz f0, r4 -; CHECK-BE-P8-NEXT: xxmrghd v2, v2, vs0 +; CHECK-BE-P8-NEXT: xxmrgld v2, v2, vs0 ; CHECK-BE-P8-NEXT: blr ; ; CHECK-BE-P9-LABEL: test_v2i64_v4i32: ; CHECK-BE-P9: # %bb.0: # %entry ; CHECK-BE-P9-NEXT: mtfprwz f0, r4 ; CHECK-BE-P9-NEXT: mtvsrdd v2, r3, r3 -; CHECK-BE-P9-NEXT: xxmrghd v2, v2, vs0 +; CHECK-BE-P9-NEXT: xxmrgld v2, v2, vs0 ; CHECK-BE-P9-NEXT: blr ; ; CHECK-AIX-64-P8-LABEL: test_v2i64_v4i32: @@ -1778,14 +1700,14 @@ ; CHECK-AIX-64-P8-NEXT: mtfprd f0, r3 ; CHECK-AIX-64-P8-NEXT: xxmrghd v2, vs0, vs0 ; CHECK-AIX-64-P8-NEXT: mtfprwz f0, r4 -; CHECK-AIX-64-P8-NEXT: xxmrghd v2, v2, vs0 +; CHECK-AIX-64-P8-NEXT: xxmrgld v2, v2, vs0 ; CHECK-AIX-64-P8-NEXT: blr ; ; CHECK-AIX-64-P9-LABEL: test_v2i64_v4i32: ; CHECK-AIX-64-P9: # %bb.0: # %entry ; CHECK-AIX-64-P9-NEXT: mtfprwz f0, r4 ; CHECK-AIX-64-P9-NEXT: mtvsrdd v2, r3, r3 -; CHECK-AIX-64-P9-NEXT: xxmrghd v2, v2, vs0 +; CHECK-AIX-64-P9-NEXT: xxmrgld v2, v2, vs0 ; CHECK-AIX-64-P9-NEXT: blr ; ; CHECK-AIX-32-P8-LABEL: test_v2i64_v4i32: @@ -1828,18 +1750,14 @@ ; CHECK-LE-P8: # %bb.0: # %entry ; CHECK-LE-P8-NEXT: mtfprd f0, r3 ; CHECK-LE-P8-NEXT: mtfprd f1, r4 -; CHECK-LE-P8-NEXT: xxswapd v2, vs0 -; CHECK-LE-P8-NEXT: xxswapd vs0, vs1 -; CHECK-LE-P8-NEXT: xxmrgld v2, vs0, v2 +; CHECK-LE-P8-NEXT: xxmrghd v2, vs1, vs0 ; CHECK-LE-P8-NEXT: blr ; ; CHECK-LE-P9-LABEL: test_v2i64_v8i16: ; CHECK-LE-P9: # %bb.0: # %entry ; CHECK-LE-P9-NEXT: mtfprd f0, r3 -; CHECK-LE-P9-NEXT: xxswapd v2, vs0 -; CHECK-LE-P9-NEXT: mtfprd f0, r4 -; CHECK-LE-P9-NEXT: xxswapd vs0, vs0 -; CHECK-LE-P9-NEXT: xxmrgld v2, vs0, v2 +; CHECK-LE-P9-NEXT: mtfprd f1, r4 +; CHECK-LE-P9-NEXT: xxmrghd v2, vs1, vs0 ; CHECK-LE-P9-NEXT: blr ; ; CHECK-BE-P8-LABEL: test_v2i64_v8i16: @@ -1847,14 +1765,14 @@ ; CHECK-BE-P8-NEXT: mtfprd f0, r3 ; CHECK-BE-P8-NEXT: xxspltd v2, vs0, 0 ; CHECK-BE-P8-NEXT: mtfprwz f0, r4 -; CHECK-BE-P8-NEXT: xxmrghd v2, v2, vs0 +; CHECK-BE-P8-NEXT: xxmrgld v2, v2, vs0 ; CHECK-BE-P8-NEXT: blr ; ; CHECK-BE-P9-LABEL: test_v2i64_v8i16: ; CHECK-BE-P9: # %bb.0: # %entry ; CHECK-BE-P9-NEXT: mtfprwz f0, r4 ; CHECK-BE-P9-NEXT: mtvsrdd v2, r3, r3 -; CHECK-BE-P9-NEXT: xxmrghd v2, v2, vs0 +; CHECK-BE-P9-NEXT: xxmrgld v2, v2, vs0 ; CHECK-BE-P9-NEXT: blr ; ; CHECK-AIX-64-P8-LABEL: test_v2i64_v8i16: @@ -1862,14 +1780,14 @@ ; CHECK-AIX-64-P8-NEXT: mtfprd f0, r3 ; CHECK-AIX-64-P8-NEXT: xxmrghd v2, vs0, vs0 ; CHECK-AIX-64-P8-NEXT: mtfprwz f0, r4 -; CHECK-AIX-64-P8-NEXT: xxmrghd v2, v2, vs0 +; CHECK-AIX-64-P8-NEXT: xxmrgld v2, v2, vs0 ; CHECK-AIX-64-P8-NEXT: blr ; ; CHECK-AIX-64-P9-LABEL: test_v2i64_v8i16: ; CHECK-AIX-64-P9: # %bb.0: # %entry ; CHECK-AIX-64-P9-NEXT: mtfprwz f0, r4 ; CHECK-AIX-64-P9-NEXT: mtvsrdd v2, r3, r3 -; CHECK-AIX-64-P9-NEXT: xxmrghd v2, v2, vs0 +; CHECK-AIX-64-P9-NEXT: xxmrgld v2, v2, vs0 ; CHECK-AIX-64-P9-NEXT: blr ; ; CHECK-AIX-32-P8-LABEL: test_v2i64_v8i16: diff --git a/llvm/test/CodeGen/PowerPC/v4i32_scalar_to_vector_shuffle.ll b/llvm/test/CodeGen/PowerPC/v4i32_scalar_to_vector_shuffle.ll --- a/llvm/test/CodeGen/PowerPC/v4i32_scalar_to_vector_shuffle.ll +++ b/llvm/test/CodeGen/PowerPC/v4i32_scalar_to_vector_shuffle.ll @@ -28,15 +28,11 @@ define void @test_none_v8i16(ptr %a) { ; CHECK-LE-P8-LABEL: test_none_v8i16: ; CHECK-LE-P8: # %bb.0: # %entry -; CHECK-LE-P8-NEXT: addis r4, r2, .LCPI0_0@toc@ha -; CHECK-LE-P8-NEXT: lxsdx v2, 0, r3 -; CHECK-LE-P8-NEXT: addi r4, r4, .LCPI0_0@toc@l -; CHECK-LE-P8-NEXT: lxvd2x vs0, 0, r4 ; CHECK-LE-P8-NEXT: lhz r4, 0(r3) -; CHECK-LE-P8-NEXT: mtvsrd v4, r4 -; CHECK-LE-P8-NEXT: xxswapd v3, vs0 -; CHECK-LE-P8-NEXT: vperm v2, v4, v2, v3 -; CHECK-LE-P8-NEXT: xxswapd vs0, v2 +; CHECK-LE-P8-NEXT: lfdx f0, 0, r3 +; CHECK-LE-P8-NEXT: mtfprd f1, r4 +; CHECK-LE-P8-NEXT: xxmrghw vs0, vs1, vs0 +; CHECK-LE-P8-NEXT: xxswapd vs0, vs0 ; CHECK-LE-P8-NEXT: stfdx f0, 0, r3 ; CHECK-LE-P8-NEXT: blr ; @@ -44,11 +40,8 @@ ; CHECK-LE-P9: # %bb.0: # %entry ; CHECK-LE-P9-NEXT: lxsihzx f0, 0, r3 ; CHECK-LE-P9-NEXT: lfd f1, 0(r3) -; CHECK-LE-P9-NEXT: addis r3, r2, .LCPI0_0@toc@ha -; CHECK-LE-P9-NEXT: addi r3, r3, .LCPI0_0@toc@l -; CHECK-LE-P9-NEXT: lxv vs2, 0(r3) -; CHECK-LE-P9-NEXT: xxperm vs1, vs0, vs2 -; CHECK-LE-P9-NEXT: xxswapd vs0, vs1 +; CHECK-LE-P9-NEXT: xxmrghw vs0, vs0, vs1 +; CHECK-LE-P9-NEXT: xxswapd vs0, vs0 ; CHECK-LE-P9-NEXT: stfd f0, 0(r3) ; CHECK-LE-P9-NEXT: blr ; @@ -130,12 +123,16 @@ define void @test_v8i16_none(ptr %a) { ; CHECK-LE-P8-LABEL: test_v8i16_none: ; CHECK-LE-P8: # %bb.0: # %entry +; CHECK-LE-P8-NEXT: addis r4, r2, .LCPI1_0@toc@ha ; CHECK-LE-P8-NEXT: lxvd2x vs0, 0, r3 ; CHECK-LE-P8-NEXT: lhz r3, 0(r3) -; CHECK-LE-P8-NEXT: mtfprd f1, r3 -; CHECK-LE-P8-NEXT: xxswapd vs0, vs0 -; CHECK-LE-P8-NEXT: xxmrglw vs0, vs0, vs1 -; CHECK-LE-P8-NEXT: xxswapd vs0, vs0 +; CHECK-LE-P8-NEXT: addi r4, r4, .LCPI1_0@toc@l +; CHECK-LE-P8-NEXT: lxvd2x vs1, 0, r4 +; CHECK-LE-P8-NEXT: mtvsrd v4, r3 +; CHECK-LE-P8-NEXT: xxswapd v2, vs0 +; CHECK-LE-P8-NEXT: xxswapd v3, vs1 +; CHECK-LE-P8-NEXT: vperm v2, v2, v4, v3 +; CHECK-LE-P8-NEXT: xxswapd vs0, v2 ; CHECK-LE-P8-NEXT: stxvd2x vs0, 0, r3 ; CHECK-LE-P8-NEXT: blr ; @@ -143,59 +140,76 @@ ; CHECK-LE-P9: # %bb.0: # %entry ; CHECK-LE-P9-NEXT: lxsihzx f0, 0, r3 ; CHECK-LE-P9-NEXT: lxv vs1, 0(r3) -; CHECK-LE-P9-NEXT: xxmrglw vs0, vs1, vs0 +; CHECK-LE-P9-NEXT: addis r3, r2, .LCPI1_0@toc@ha +; CHECK-LE-P9-NEXT: addi r3, r3, .LCPI1_0@toc@l +; CHECK-LE-P9-NEXT: lxv vs2, 0(r3) +; CHECK-LE-P9-NEXT: xxperm vs0, vs1, vs2 ; CHECK-LE-P9-NEXT: stxv vs0, 0(r3) ; CHECK-LE-P9-NEXT: blr ; ; CHECK-BE-P8-LABEL: test_v8i16_none: ; CHECK-BE-P8: # %bb.0: # %entry -; CHECK-BE-P8-NEXT: lhz r4, 0(r3) -; CHECK-BE-P8-NEXT: lxvw4x vs0, 0, r3 -; CHECK-BE-P8-NEXT: mtfprwz f1, r4 -; CHECK-BE-P8-NEXT: xxmrghw vs0, vs1, vs0 -; CHECK-BE-P8-NEXT: stxvw4x vs0, 0, r3 +; CHECK-BE-P8-NEXT: addis r4, r2, .LCPI1_0@toc@ha +; CHECK-BE-P8-NEXT: lhz r5, 0(r3) +; CHECK-BE-P8-NEXT: lxvw4x v2, 0, r3 +; CHECK-BE-P8-NEXT: addi r4, r4, .LCPI1_0@toc@l +; CHECK-BE-P8-NEXT: lxvw4x v3, 0, r4 +; CHECK-BE-P8-NEXT: mtvsrwz v4, r5 +; CHECK-BE-P8-NEXT: vperm v2, v4, v2, v3 +; CHECK-BE-P8-NEXT: stxvw4x v2, 0, r3 ; CHECK-BE-P8-NEXT: blr ; ; CHECK-BE-P9-LABEL: test_v8i16_none: ; CHECK-BE-P9: # %bb.0: # %entry ; CHECK-BE-P9-NEXT: lxsihzx f0, 0, r3 ; CHECK-BE-P9-NEXT: lxv vs1, 0(r3) -; CHECK-BE-P9-NEXT: xxmrghw vs0, vs0, vs1 -; CHECK-BE-P9-NEXT: stxv vs0, 0(r3) +; CHECK-BE-P9-NEXT: addis r3, r2, .LCPI1_0@toc@ha +; CHECK-BE-P9-NEXT: addi r3, r3, .LCPI1_0@toc@l +; CHECK-BE-P9-NEXT: lxv vs2, 0(r3) +; CHECK-BE-P9-NEXT: xxperm vs1, vs0, vs2 +; CHECK-BE-P9-NEXT: stxv vs1, 0(r3) ; CHECK-BE-P9-NEXT: blr ; ; CHECK-AIX-64-P8-LABEL: test_v8i16_none: ; CHECK-AIX-64-P8: # %bb.0: # %entry -; CHECK-AIX-64-P8-NEXT: lhz r4, 0(r3) -; CHECK-AIX-64-P8-NEXT: lxvw4x vs0, 0, r3 -; CHECK-AIX-64-P8-NEXT: mtfprwz f1, r4 -; CHECK-AIX-64-P8-NEXT: xxmrghw vs0, vs1, vs0 -; CHECK-AIX-64-P8-NEXT: stxvw4x vs0, 0, r3 +; CHECK-AIX-64-P8-NEXT: ld r4, L..C0(r2) # %const.0 +; CHECK-AIX-64-P8-NEXT: lhz r5, 0(r3) +; CHECK-AIX-64-P8-NEXT: lxvw4x v2, 0, r3 +; CHECK-AIX-64-P8-NEXT: mtvsrwz v4, r5 +; CHECK-AIX-64-P8-NEXT: lxvw4x v3, 0, r4 +; CHECK-AIX-64-P8-NEXT: vperm v2, v4, v2, v3 +; CHECK-AIX-64-P8-NEXT: stxvw4x v2, 0, r3 ; CHECK-AIX-64-P8-NEXT: blr ; ; CHECK-AIX-64-P9-LABEL: test_v8i16_none: ; CHECK-AIX-64-P9: # %bb.0: # %entry ; CHECK-AIX-64-P9-NEXT: lxsihzx f0, 0, r3 ; CHECK-AIX-64-P9-NEXT: lxv vs1, 0(r3) -; CHECK-AIX-64-P9-NEXT: xxmrghw vs0, vs0, vs1 -; CHECK-AIX-64-P9-NEXT: stxv vs0, 0(r3) +; CHECK-AIX-64-P9-NEXT: ld r3, L..C0(r2) # %const.0 +; CHECK-AIX-64-P9-NEXT: lxv vs2, 0(r3) +; CHECK-AIX-64-P9-NEXT: xxperm vs1, vs0, vs2 +; CHECK-AIX-64-P9-NEXT: stxv vs1, 0(r3) ; CHECK-AIX-64-P9-NEXT: blr ; ; CHECK-AIX-32-P8-LABEL: test_v8i16_none: ; CHECK-AIX-32-P8: # %bb.0: # %entry -; CHECK-AIX-32-P8-NEXT: lhz r4, 0(r3) -; CHECK-AIX-32-P8-NEXT: lxvw4x vs0, 0, r3 -; CHECK-AIX-32-P8-NEXT: mtfprwz f1, r4 -; CHECK-AIX-32-P8-NEXT: xxmrghw vs0, vs1, vs0 -; CHECK-AIX-32-P8-NEXT: stxvw4x vs0, 0, r3 +; CHECK-AIX-32-P8-NEXT: lwz r4, L..C0(r2) # %const.0 +; CHECK-AIX-32-P8-NEXT: lhz r5, 0(r3) +; CHECK-AIX-32-P8-NEXT: lxvw4x v2, 0, r3 +; CHECK-AIX-32-P8-NEXT: mtvsrwz v4, r5 +; CHECK-AIX-32-P8-NEXT: lxvw4x v3, 0, r4 +; CHECK-AIX-32-P8-NEXT: vperm v2, v4, v2, v3 +; CHECK-AIX-32-P8-NEXT: stxvw4x v2, 0, r3 ; CHECK-AIX-32-P8-NEXT: blr ; ; CHECK-AIX-32-P9-LABEL: test_v8i16_none: ; CHECK-AIX-32-P9: # %bb.0: # %entry ; CHECK-AIX-32-P9-NEXT: lxsihzx f0, 0, r3 ; CHECK-AIX-32-P9-NEXT: lxv vs1, 0(r3) -; CHECK-AIX-32-P9-NEXT: xxmrghw vs0, vs0, vs1 -; CHECK-AIX-32-P9-NEXT: stxv vs0, 0(r3) +; CHECK-AIX-32-P9-NEXT: lwz r3, L..C0(r2) # %const.0 +; CHECK-AIX-32-P9-NEXT: lxv vs2, 0(r3) +; CHECK-AIX-32-P9-NEXT: xxperm vs1, vs0, vs2 +; CHECK-AIX-32-P9-NEXT: stxv vs1, 0(r3) ; CHECK-AIX-32-P9-NEXT: blr entry: %0 = load <2 x i8>, ptr undef, align 1 @@ -262,7 +276,7 @@ ; CHECK-AIX-64-P8-LABEL: test_none_v4i32: ; CHECK-AIX-64-P8: # %bb.0: # %entry ; CHECK-AIX-64-P8-NEXT: xxsldwi vs0, v2, v2, 3 -; CHECK-AIX-64-P8-NEXT: ld r4, L..C0(r2) # %const.0 +; CHECK-AIX-64-P8-NEXT: ld r4, L..C1(r2) # %const.0 ; CHECK-AIX-64-P8-NEXT: mffprwz r5, f0 ; CHECK-AIX-64-P8-NEXT: lxvw4x v3, 0, r4 ; CHECK-AIX-64-P8-NEXT: mtvsrwz v4, r5 @@ -275,7 +289,7 @@ ; CHECK-AIX-64-P9-NEXT: li r4, 0 ; CHECK-AIX-64-P9-NEXT: vextuwlx r4, r4, v2 ; CHECK-AIX-64-P9-NEXT: mtfprwz f0, r4 -; CHECK-AIX-64-P9-NEXT: ld r4, L..C0(r2) # %const.0 +; CHECK-AIX-64-P9-NEXT: ld r4, L..C1(r2) # %const.0 ; CHECK-AIX-64-P9-NEXT: lxv vs1, 0(r4) ; CHECK-AIX-64-P9-NEXT: xxperm vs0, v2, vs1 ; CHECK-AIX-64-P9-NEXT: stxv vs0, 0(r3) @@ -283,7 +297,7 @@ ; ; CHECK-AIX-32-P8-LABEL: test_none_v4i32: ; CHECK-AIX-32-P8: # %bb.0: # %entry -; CHECK-AIX-32-P8-NEXT: lwz r4, L..C0(r2) # %const.0 +; CHECK-AIX-32-P8-NEXT: lwz r4, L..C1(r2) # %const.0 ; CHECK-AIX-32-P8-NEXT: addi r5, r1, -16 ; CHECK-AIX-32-P8-NEXT: stxvw4x v2, 0, r5 ; CHECK-AIX-32-P8-NEXT: lxsiwzx v3, 0, r5 @@ -297,7 +311,7 @@ ; CHECK-AIX-32-P9-NEXT: addi r4, r1, -16 ; CHECK-AIX-32-P9-NEXT: stxv v2, -16(r1) ; CHECK-AIX-32-P9-NEXT: lfiwzx f0, 0, r4 -; CHECK-AIX-32-P9-NEXT: lwz r4, L..C0(r2) # %const.0 +; CHECK-AIX-32-P9-NEXT: lwz r4, L..C1(r2) # %const.0 ; CHECK-AIX-32-P9-NEXT: lxv vs1, 0(r4) ; CHECK-AIX-32-P9-NEXT: xxperm vs0, v2, vs1 ; CHECK-AIX-32-P9-NEXT: stxv vs0, 0(r3) @@ -367,7 +381,7 @@ ; CHECK-AIX-64-P8-LABEL: test_v4i32_none: ; CHECK-AIX-64-P8: # %bb.0: # %entry ; CHECK-AIX-64-P8-NEXT: xxsldwi vs0, v2, v2, 3 -; CHECK-AIX-64-P8-NEXT: ld r4, L..C1(r2) # %const.0 +; CHECK-AIX-64-P8-NEXT: ld r4, L..C2(r2) # %const.0 ; CHECK-AIX-64-P8-NEXT: mffprwz r5, f0 ; CHECK-AIX-64-P8-NEXT: lxvw4x v3, 0, r4 ; CHECK-AIX-64-P8-NEXT: mtvsrwz v4, r5 @@ -380,7 +394,7 @@ ; CHECK-AIX-64-P9-NEXT: li r4, 0 ; CHECK-AIX-64-P9-NEXT: vextuwlx r4, r4, v2 ; CHECK-AIX-64-P9-NEXT: mtfprwz f0, r4 -; CHECK-AIX-64-P9-NEXT: ld r4, L..C1(r2) # %const.0 +; CHECK-AIX-64-P9-NEXT: ld r4, L..C2(r2) # %const.0 ; CHECK-AIX-64-P9-NEXT: lxv vs1, 0(r4) ; CHECK-AIX-64-P9-NEXT: xxperm v2, vs0, vs1 ; CHECK-AIX-64-P9-NEXT: stxv v2, 0(r3) @@ -388,7 +402,7 @@ ; ; CHECK-AIX-32-P8-LABEL: test_v4i32_none: ; CHECK-AIX-32-P8: # %bb.0: # %entry -; CHECK-AIX-32-P8-NEXT: lwz r4, L..C1(r2) # %const.0 +; CHECK-AIX-32-P8-NEXT: lwz r4, L..C2(r2) # %const.0 ; CHECK-AIX-32-P8-NEXT: addi r5, r1, -16 ; CHECK-AIX-32-P8-NEXT: stxvw4x v2, 0, r5 ; CHECK-AIX-32-P8-NEXT: lxsiwzx v3, 0, r5 @@ -402,7 +416,7 @@ ; CHECK-AIX-32-P9-NEXT: addi r4, r1, -16 ; CHECK-AIX-32-P9-NEXT: stxv v2, -16(r1) ; CHECK-AIX-32-P9-NEXT: lfiwzx f0, 0, r4 -; CHECK-AIX-32-P9-NEXT: lwz r4, L..C1(r2) # %const.0 +; CHECK-AIX-32-P9-NEXT: lwz r4, L..C2(r2) # %const.0 ; CHECK-AIX-32-P9-NEXT: lxv vs1, 0(r4) ; CHECK-AIX-32-P9-NEXT: xxperm v2, vs0, vs1 ; CHECK-AIX-32-P9-NEXT: stxv v2, 0(r3) @@ -474,9 +488,9 @@ ; ; CHECK-AIX-64-P8-LABEL: test_none_v2i64: ; CHECK-AIX-64-P8: # %bb.0: # %entry -; CHECK-AIX-64-P8-NEXT: ld r5, L..C2(r2) # %const.0 +; CHECK-AIX-64-P8-NEXT: ld r5, L..C3(r2) # %const.0 ; CHECK-AIX-64-P8-NEXT: mtvsrwz v4, r4 -; CHECK-AIX-64-P8-NEXT: ld r4, L..C3(r2) # %const.1 +; CHECK-AIX-64-P8-NEXT: ld r4, L..C4(r2) # %const.1 ; CHECK-AIX-64-P8-NEXT: lxvw4x v3, 0, r5 ; CHECK-AIX-64-P8-NEXT: vperm v2, v4, v2, v3 ; CHECK-AIX-64-P8-NEXT: lxsdx v3, 0, r3 @@ -487,7 +501,7 @@ ; CHECK-AIX-64-P9-LABEL: test_none_v2i64: ; CHECK-AIX-64-P9: # %bb.0: # %entry ; CHECK-AIX-64-P9-NEXT: lfd f0, 0(r3) -; CHECK-AIX-64-P9-NEXT: ld r3, L..C2(r2) # %const.0 +; CHECK-AIX-64-P9-NEXT: ld r3, L..C3(r2) # %const.0 ; CHECK-AIX-64-P9-NEXT: mtfprwz f1, r4 ; CHECK-AIX-64-P9-NEXT: xxinsertw v2, vs1, 0 ; CHECK-AIX-64-P9-NEXT: lxv vs1, 0(r3) @@ -496,12 +510,12 @@ ; ; CHECK-AIX-32-P8-LABEL: test_none_v2i64: ; CHECK-AIX-32-P8: # %bb.0: # %entry -; CHECK-AIX-32-P8-NEXT: lwz r5, L..C2(r2) # %const.0 +; CHECK-AIX-32-P8-NEXT: lwz r5, L..C3(r2) # %const.0 ; CHECK-AIX-32-P8-NEXT: lxsiwzx v3, 0, r3 ; CHECK-AIX-32-P8-NEXT: stw r4, -16(r1) ; CHECK-AIX-32-P8-NEXT: addi r3, r1, -16 ; CHECK-AIX-32-P8-NEXT: lxvw4x v5, 0, r3 -; CHECK-AIX-32-P8-NEXT: lwz r3, L..C3(r2) # %const.1 +; CHECK-AIX-32-P8-NEXT: lwz r3, L..C4(r2) # %const.1 ; CHECK-AIX-32-P8-NEXT: lxvw4x v4, 0, r5 ; CHECK-AIX-32-P8-NEXT: vperm v2, v5, v2, v4 ; CHECK-AIX-32-P8-NEXT: lxvw4x v4, 0, r3 @@ -511,7 +525,7 @@ ; CHECK-AIX-32-P9-LABEL: test_none_v2i64: ; CHECK-AIX-32-P9: # %bb.0: # %entry ; CHECK-AIX-32-P9-NEXT: lfiwzx f0, 0, r3 -; CHECK-AIX-32-P9-NEXT: lwz r3, L..C2(r2) # %const.0 +; CHECK-AIX-32-P9-NEXT: lwz r3, L..C3(r2) # %const.0 ; CHECK-AIX-32-P9-NEXT: mtfprwz f1, r4 ; CHECK-AIX-32-P9-NEXT: xxinsertw v2, vs1, 0 ; CHECK-AIX-32-P9-NEXT: lxv vs1, 0(r3) @@ -597,7 +611,7 @@ ; CHECK-LE-P8-NEXT: lhz r3, 0(r3) ; CHECK-LE-P8-NEXT: mtfprd f0, r4 ; CHECK-LE-P8-NEXT: mtfprd f1, r3 -; CHECK-LE-P8-NEXT: xxmrglw vs0, vs1, vs0 +; CHECK-LE-P8-NEXT: xxmrghw vs0, vs1, vs0 ; CHECK-LE-P8-NEXT: xxswapd vs0, vs0 ; CHECK-LE-P8-NEXT: stxvd2x vs0, 0, r3 ; CHECK-LE-P8-NEXT: blr @@ -606,7 +620,7 @@ ; CHECK-LE-P9: # %bb.0: # %entry ; CHECK-LE-P9-NEXT: lxsihzx f0, 0, r3 ; CHECK-LE-P9-NEXT: lxsihzx f1, 0, r3 -; CHECK-LE-P9-NEXT: xxmrglw vs0, vs1, vs0 +; CHECK-LE-P9-NEXT: xxmrghw vs0, vs1, vs0 ; CHECK-LE-P9-NEXT: stxv vs0, 0(r3) ; CHECK-LE-P9-NEXT: blr ; @@ -616,7 +630,7 @@ ; CHECK-BE-P8-NEXT: lhz r3, 0(r3) ; CHECK-BE-P8-NEXT: mtfprwz f0, r4 ; CHECK-BE-P8-NEXT: mtfprwz f1, r3 -; CHECK-BE-P8-NEXT: xxmrghw vs0, vs0, vs1 +; CHECK-BE-P8-NEXT: xxmrglw vs0, vs0, vs1 ; CHECK-BE-P8-NEXT: stxvw4x vs0, 0, r3 ; CHECK-BE-P8-NEXT: blr ; @@ -624,7 +638,7 @@ ; CHECK-BE-P9: # %bb.0: # %entry ; CHECK-BE-P9-NEXT: lxsihzx f0, 0, r3 ; CHECK-BE-P9-NEXT: lxsihzx f1, 0, r3 -; CHECK-BE-P9-NEXT: xxmrghw vs0, vs0, vs1 +; CHECK-BE-P9-NEXT: xxmrglw vs0, vs0, vs1 ; CHECK-BE-P9-NEXT: stxv vs0, 0(r3) ; CHECK-BE-P9-NEXT: blr ; @@ -634,7 +648,7 @@ ; CHECK-AIX-64-P8-NEXT: lhz r3, 0(r3) ; CHECK-AIX-64-P8-NEXT: mtfprwz f0, r4 ; CHECK-AIX-64-P8-NEXT: mtfprwz f1, r3 -; CHECK-AIX-64-P8-NEXT: xxmrghw vs0, vs0, vs1 +; CHECK-AIX-64-P8-NEXT: xxmrglw vs0, vs0, vs1 ; CHECK-AIX-64-P8-NEXT: stxvw4x vs0, 0, r3 ; CHECK-AIX-64-P8-NEXT: blr ; @@ -642,7 +656,7 @@ ; CHECK-AIX-64-P9: # %bb.0: # %entry ; CHECK-AIX-64-P9-NEXT: lxsihzx f0, 0, r3 ; CHECK-AIX-64-P9-NEXT: lxsihzx f1, 0, r3 -; CHECK-AIX-64-P9-NEXT: xxmrghw vs0, vs0, vs1 +; CHECK-AIX-64-P9-NEXT: xxmrglw vs0, vs0, vs1 ; CHECK-AIX-64-P9-NEXT: stxv vs0, 0(r3) ; CHECK-AIX-64-P9-NEXT: blr ; @@ -652,7 +666,7 @@ ; CHECK-AIX-32-P8-NEXT: lhz r3, 0(r3) ; CHECK-AIX-32-P8-NEXT: mtfprwz f0, r4 ; CHECK-AIX-32-P8-NEXT: mtfprwz f1, r3 -; CHECK-AIX-32-P8-NEXT: xxmrghw vs0, vs0, vs1 +; CHECK-AIX-32-P8-NEXT: xxmrglw vs0, vs0, vs1 ; CHECK-AIX-32-P8-NEXT: stxvw4x vs0, 0, r3 ; CHECK-AIX-32-P8-NEXT: blr ; @@ -660,7 +674,7 @@ ; CHECK-AIX-32-P9: # %bb.0: # %entry ; CHECK-AIX-32-P9-NEXT: lxsihzx f0, 0, r3 ; CHECK-AIX-32-P9-NEXT: lxsihzx f1, 0, r3 -; CHECK-AIX-32-P9-NEXT: xxmrghw vs0, vs0, vs1 +; CHECK-AIX-32-P9-NEXT: xxmrglw vs0, vs0, vs1 ; CHECK-AIX-32-P9-NEXT: stxv vs0, 0(r3) ; CHECK-AIX-32-P9-NEXT: blr entry: @@ -683,89 +697,82 @@ ; CHECK-LE-P8-NEXT: lhz r4, 0(r3) ; CHECK-LE-P8-NEXT: lfiwzx f0, 0, r3 ; CHECK-LE-P8-NEXT: mtfprd f1, r4 -; CHECK-LE-P8-NEXT: xxswapd vs0, f0 -; CHECK-LE-P8-NEXT: xxswapd vs1, vs1 -; CHECK-LE-P8-NEXT: xxmrglw vs0, vs0, vs1 +; CHECK-LE-P8-NEXT: xxmrghw vs0, vs0, vs1 ; CHECK-LE-P8-NEXT: xxswapd vs0, vs0 ; CHECK-LE-P8-NEXT: stxvd2x vs0, 0, r3 ; CHECK-LE-P8-NEXT: blr ; ; CHECK-LE-P9-LABEL: test_v8i16_v4i32: ; CHECK-LE-P9: # %bb.0: # %entry -; CHECK-LE-P9-NEXT: lxsihzx v2, 0, r3 -; CHECK-LE-P9-NEXT: lfiwzx f0, 0, r3 -; CHECK-LE-P9-NEXT: xxswapd vs0, f0 -; CHECK-LE-P9-NEXT: vsplth v2, v2, 3 -; CHECK-LE-P9-NEXT: xxmrglw vs0, vs0, v2 +; CHECK-LE-P9-NEXT: lxsihzx f0, 0, r3 +; CHECK-LE-P9-NEXT: lfiwzx f1, 0, r3 +; CHECK-LE-P9-NEXT: xxmrghw vs0, vs1, vs0 ; CHECK-LE-P9-NEXT: stxv vs0, 0(r3) ; CHECK-LE-P9-NEXT: blr ; ; CHECK-BE-P8-LABEL: test_v8i16_v4i32: ; CHECK-BE-P8: # %bb.0: # %entry -; CHECK-BE-P8-NEXT: lfiwzx f0, 0, r3 -; CHECK-BE-P8-NEXT: lhz r4, 0(r3) -; CHECK-BE-P8-NEXT: sldi r3, r4, 48 -; CHECK-BE-P8-NEXT: xxsldwi vs0, f0, f0, 1 -; CHECK-BE-P8-NEXT: mtfprd f1, r3 -; CHECK-BE-P8-NEXT: xxmrghw vs0, vs1, vs0 -; CHECK-BE-P8-NEXT: stxvw4x vs0, 0, r3 +; CHECK-BE-P8-NEXT: addis r4, r2, .LCPI7_0@toc@ha +; CHECK-BE-P8-NEXT: lhz r5, 0(r3) +; CHECK-BE-P8-NEXT: lxsiwzx v2, 0, r3 +; CHECK-BE-P8-NEXT: addi r4, r4, .LCPI7_0@toc@l +; CHECK-BE-P8-NEXT: lxvw4x v3, 0, r4 +; CHECK-BE-P8-NEXT: mtvsrwz v4, r5 +; CHECK-BE-P8-NEXT: vperm v2, v4, v2, v3 +; CHECK-BE-P8-NEXT: stxvw4x v2, 0, r3 ; CHECK-BE-P8-NEXT: blr ; ; CHECK-BE-P9-LABEL: test_v8i16_v4i32: ; CHECK-BE-P9: # %bb.0: # %entry -; CHECK-BE-P9-NEXT: lxsihzx v2, 0, r3 -; CHECK-BE-P9-NEXT: lfiwzx f0, 0, r3 -; CHECK-BE-P9-NEXT: xxsldwi vs0, f0, f0, 1 -; CHECK-BE-P9-NEXT: vsplth v2, v2, 3 -; CHECK-BE-P9-NEXT: xxmrghw vs0, v2, vs0 -; CHECK-BE-P9-NEXT: stxv vs0, 0(r3) +; CHECK-BE-P9-NEXT: lxsihzx f0, 0, r3 +; CHECK-BE-P9-NEXT: lfiwzx f1, 0, r3 +; CHECK-BE-P9-NEXT: addis r3, r2, .LCPI7_0@toc@ha +; CHECK-BE-P9-NEXT: addi r3, r3, .LCPI7_0@toc@l +; CHECK-BE-P9-NEXT: lxv vs2, 0(r3) +; CHECK-BE-P9-NEXT: xxperm vs1, vs0, vs2 +; CHECK-BE-P9-NEXT: stxv vs1, 0(r3) ; CHECK-BE-P9-NEXT: blr ; ; CHECK-AIX-64-P8-LABEL: test_v8i16_v4i32: ; CHECK-AIX-64-P8: # %bb.0: # %entry -; CHECK-AIX-64-P8-NEXT: lfiwzx f0, 0, r3 -; CHECK-AIX-64-P8-NEXT: lhz r4, 0(r3) -; CHECK-AIX-64-P8-NEXT: sldi r3, r4, 48 -; CHECK-AIX-64-P8-NEXT: xxsldwi vs0, f0, f0, 1 -; CHECK-AIX-64-P8-NEXT: mtfprd f1, r3 -; CHECK-AIX-64-P8-NEXT: xxmrghw vs0, vs1, vs0 -; CHECK-AIX-64-P8-NEXT: stxvw4x vs0, 0, r3 +; CHECK-AIX-64-P8-NEXT: ld r4, L..C5(r2) # %const.0 +; CHECK-AIX-64-P8-NEXT: lhz r5, 0(r3) +; CHECK-AIX-64-P8-NEXT: lxsiwzx v2, 0, r3 +; CHECK-AIX-64-P8-NEXT: mtvsrwz v4, r5 +; CHECK-AIX-64-P8-NEXT: lxvw4x v3, 0, r4 +; CHECK-AIX-64-P8-NEXT: vperm v2, v4, v2, v3 +; CHECK-AIX-64-P8-NEXT: stxvw4x v2, 0, r3 ; CHECK-AIX-64-P8-NEXT: blr ; ; CHECK-AIX-64-P9-LABEL: test_v8i16_v4i32: ; CHECK-AIX-64-P9: # %bb.0: # %entry -; CHECK-AIX-64-P9-NEXT: lxsihzx v2, 0, r3 -; CHECK-AIX-64-P9-NEXT: lfiwzx f0, 0, r3 -; CHECK-AIX-64-P9-NEXT: xxsldwi vs0, f0, f0, 1 -; CHECK-AIX-64-P9-NEXT: vsplth v2, v2, 3 -; CHECK-AIX-64-P9-NEXT: xxmrghw vs0, v2, vs0 -; CHECK-AIX-64-P9-NEXT: stxv vs0, 0(r3) +; CHECK-AIX-64-P9-NEXT: lxsihzx f0, 0, r3 +; CHECK-AIX-64-P9-NEXT: lfiwzx f1, 0, r3 +; CHECK-AIX-64-P9-NEXT: ld r3, L..C4(r2) # %const.0 +; CHECK-AIX-64-P9-NEXT: lxv vs2, 0(r3) +; CHECK-AIX-64-P9-NEXT: xxperm vs1, vs0, vs2 +; CHECK-AIX-64-P9-NEXT: stxv vs1, 0(r3) ; CHECK-AIX-64-P9-NEXT: blr ; ; CHECK-AIX-32-P8-LABEL: test_v8i16_v4i32: ; CHECK-AIX-32-P8: # %bb.0: # %entry -; CHECK-AIX-32-P8-NEXT: lhz r4, 0(r3) -; CHECK-AIX-32-P8-NEXT: sth r4, -32(r1) -; CHECK-AIX-32-P8-NEXT: addi r4, r1, -32 -; CHECK-AIX-32-P8-NEXT: lwz r3, 0(r3) -; CHECK-AIX-32-P8-NEXT: lxvw4x vs0, 0, r4 -; CHECK-AIX-32-P8-NEXT: stw r3, -16(r1) -; CHECK-AIX-32-P8-NEXT: addi r3, r1, -16 -; CHECK-AIX-32-P8-NEXT: lxvw4x vs1, 0, r3 -; CHECK-AIX-32-P8-NEXT: xxmrghw vs0, vs0, vs1 -; CHECK-AIX-32-P8-NEXT: stxvw4x vs0, 0, r3 +; CHECK-AIX-32-P8-NEXT: lwz r4, L..C5(r2) # %const.0 +; CHECK-AIX-32-P8-NEXT: lhz r5, 0(r3) +; CHECK-AIX-32-P8-NEXT: lxsiwzx v2, 0, r3 +; CHECK-AIX-32-P8-NEXT: mtvsrwz v4, r5 +; CHECK-AIX-32-P8-NEXT: lxvw4x v3, 0, r4 +; CHECK-AIX-32-P8-NEXT: vperm v2, v4, v2, v3 +; CHECK-AIX-32-P8-NEXT: stxvw4x v2, 0, r3 ; CHECK-AIX-32-P8-NEXT: blr ; ; CHECK-AIX-32-P9-LABEL: test_v8i16_v4i32: ; CHECK-AIX-32-P9: # %bb.0: # %entry -; CHECK-AIX-32-P9-NEXT: lhz r4, 0(r3) -; CHECK-AIX-32-P9-NEXT: sth r4, -32(r1) -; CHECK-AIX-32-P9-NEXT: lwz r3, 0(r3) -; CHECK-AIX-32-P9-NEXT: lxv vs0, -32(r1) -; CHECK-AIX-32-P9-NEXT: stw r3, -16(r1) -; CHECK-AIX-32-P9-NEXT: lxv vs1, -16(r1) -; CHECK-AIX-32-P9-NEXT: xxmrghw vs0, vs0, vs1 -; CHECK-AIX-32-P9-NEXT: stxv vs0, 0(r3) +; CHECK-AIX-32-P9-NEXT: lxsihzx f0, 0, r3 +; CHECK-AIX-32-P9-NEXT: lfiwzx f1, 0, r3 +; CHECK-AIX-32-P9-NEXT: lwz r3, L..C4(r2) # %const.0 +; CHECK-AIX-32-P9-NEXT: lxv vs2, 0(r3) +; CHECK-AIX-32-P9-NEXT: xxperm vs1, vs0, vs2 +; CHECK-AIX-32-P9-NEXT: stxv vs1, 0(r3) ; CHECK-AIX-32-P9-NEXT: blr entry: %0 = load <2 x i8>, ptr undef, align 1 @@ -786,20 +793,16 @@ ; CHECK-LE-P8-NEXT: lhz r4, 0(r3) ; CHECK-LE-P8-NEXT: lfdx f0, 0, r3 ; CHECK-LE-P8-NEXT: mtfprd f1, r4 -; CHECK-LE-P8-NEXT: xxswapd vs0, f0 -; CHECK-LE-P8-NEXT: xxswapd vs1, vs1 -; CHECK-LE-P8-NEXT: xxmrglw vs0, vs0, vs1 +; CHECK-LE-P8-NEXT: xxmrghw vs0, vs0, vs1 ; CHECK-LE-P8-NEXT: xxswapd vs0, vs0 ; CHECK-LE-P8-NEXT: stxvd2x vs0, 0, r3 ; CHECK-LE-P8-NEXT: blr ; ; CHECK-LE-P9-LABEL: test_v8i16_v2i64: ; CHECK-LE-P9: # %bb.0: # %entry -; CHECK-LE-P9-NEXT: lxsihzx v2, 0, r3 -; CHECK-LE-P9-NEXT: lfd f0, 0(r3) -; CHECK-LE-P9-NEXT: xxswapd vs0, f0 -; CHECK-LE-P9-NEXT: vsplth v2, v2, 3 -; CHECK-LE-P9-NEXT: xxmrglw vs0, vs0, v2 +; CHECK-LE-P9-NEXT: lxsihzx f0, 0, r3 +; CHECK-LE-P9-NEXT: lfd f1, 0(r3) +; CHECK-LE-P9-NEXT: xxmrghw vs0, vs1, vs0 ; CHECK-LE-P9-NEXT: stxv vs0, 0(r3) ; CHECK-LE-P9-NEXT: blr ; @@ -843,28 +846,23 @@ ; ; CHECK-AIX-32-P8-LABEL: test_v8i16_v2i64: ; CHECK-AIX-32-P8: # %bb.0: # %entry -; CHECK-AIX-32-P8-NEXT: lhz r4, 0(r3) -; CHECK-AIX-32-P8-NEXT: sth r4, -32(r1) -; CHECK-AIX-32-P8-NEXT: addi r4, r1, -32 -; CHECK-AIX-32-P8-NEXT: lwz r3, 0(r3) -; CHECK-AIX-32-P8-NEXT: lxvw4x vs0, 0, r4 -; CHECK-AIX-32-P8-NEXT: stw r3, -16(r1) -; CHECK-AIX-32-P8-NEXT: addi r3, r1, -16 -; CHECK-AIX-32-P8-NEXT: lxvw4x vs1, 0, r3 -; CHECK-AIX-32-P8-NEXT: xxmrghw vs0, vs0, vs1 -; CHECK-AIX-32-P8-NEXT: stxvw4x vs0, 0, r3 +; CHECK-AIX-32-P8-NEXT: lwz r4, L..C6(r2) # %const.0 +; CHECK-AIX-32-P8-NEXT: lhz r5, 0(r3) +; CHECK-AIX-32-P8-NEXT: lxsiwzx v2, 0, r3 +; CHECK-AIX-32-P8-NEXT: mtvsrwz v4, r5 +; CHECK-AIX-32-P8-NEXT: lxvw4x v3, 0, r4 +; CHECK-AIX-32-P8-NEXT: vperm v2, v4, v2, v3 +; CHECK-AIX-32-P8-NEXT: stxvw4x v2, 0, r3 ; CHECK-AIX-32-P8-NEXT: blr ; ; CHECK-AIX-32-P9-LABEL: test_v8i16_v2i64: ; CHECK-AIX-32-P9: # %bb.0: # %entry -; CHECK-AIX-32-P9-NEXT: lhz r4, 0(r3) -; CHECK-AIX-32-P9-NEXT: sth r4, -32(r1) -; CHECK-AIX-32-P9-NEXT: lwz r3, 0(r3) -; CHECK-AIX-32-P9-NEXT: lxv vs0, -32(r1) -; CHECK-AIX-32-P9-NEXT: stw r3, -16(r1) -; CHECK-AIX-32-P9-NEXT: lxv vs1, -16(r1) -; CHECK-AIX-32-P9-NEXT: xxmrghw vs0, vs0, vs1 -; CHECK-AIX-32-P9-NEXT: stxv vs0, 0(r3) +; CHECK-AIX-32-P9-NEXT: lxsihzx f0, 0, r3 +; CHECK-AIX-32-P9-NEXT: lfiwzx f1, 0, r3 +; CHECK-AIX-32-P9-NEXT: lwz r3, L..C5(r2) # %const.0 +; CHECK-AIX-32-P9-NEXT: lxv vs2, 0(r3) +; CHECK-AIX-32-P9-NEXT: xxperm vs1, vs0, vs2 +; CHECK-AIX-32-P9-NEXT: stxv vs1, 0(r3) ; CHECK-AIX-32-P9-NEXT: blr entry: %0 = load <2 x i8>, ptr undef, align 1 @@ -923,7 +921,7 @@ ; ; CHECK-AIX-64-P8-LABEL: test_v4i32_v4i32: ; CHECK-AIX-64-P8: # %bb.0: # %entry -; CHECK-AIX-64-P8-NEXT: ld r5, L..C4(r2) # %const.0 +; CHECK-AIX-64-P8-NEXT: ld r5, L..C6(r2) # %const.0 ; CHECK-AIX-64-P8-NEXT: lxsiwzx v2, 0, r3 ; CHECK-AIX-64-P8-NEXT: lxsiwzx v3, 0, r4 ; CHECK-AIX-64-P8-NEXT: lxvw4x v4, 0, r5 @@ -933,7 +931,7 @@ ; CHECK-AIX-64-P9-LABEL: test_v4i32_v4i32: ; CHECK-AIX-64-P9: # %bb.0: # %entry ; CHECK-AIX-64-P9-NEXT: lfiwzx f0, 0, r3 -; CHECK-AIX-64-P9-NEXT: ld r3, L..C3(r2) # %const.0 +; CHECK-AIX-64-P9-NEXT: ld r3, L..C5(r2) # %const.0 ; CHECK-AIX-64-P9-NEXT: lxsiwzx v2, 0, r4 ; CHECK-AIX-64-P9-NEXT: lxv vs1, 0(r3) ; CHECK-AIX-64-P9-NEXT: xxperm v2, vs0, vs1 @@ -941,7 +939,7 @@ ; ; CHECK-AIX-32-P8-LABEL: test_v4i32_v4i32: ; CHECK-AIX-32-P8: # %bb.0: # %entry -; CHECK-AIX-32-P8-NEXT: lwz r5, L..C4(r2) # %const.0 +; CHECK-AIX-32-P8-NEXT: lwz r5, L..C7(r2) # %const.0 ; CHECK-AIX-32-P8-NEXT: lxsiwzx v2, 0, r3 ; CHECK-AIX-32-P8-NEXT: lxsiwzx v3, 0, r4 ; CHECK-AIX-32-P8-NEXT: lxvw4x v4, 0, r5 @@ -951,7 +949,7 @@ ; CHECK-AIX-32-P9-LABEL: test_v4i32_v4i32: ; CHECK-AIX-32-P9: # %bb.0: # %entry ; CHECK-AIX-32-P9-NEXT: lfiwzx f0, 0, r3 -; CHECK-AIX-32-P9-NEXT: lwz r3, L..C3(r2) # %const.0 +; CHECK-AIX-32-P9-NEXT: lwz r3, L..C6(r2) # %const.0 ; CHECK-AIX-32-P9-NEXT: lxsiwzx v2, 0, r4 ; CHECK-AIX-32-P9-NEXT: lxv vs1, 0(r3) ; CHECK-AIX-32-P9-NEXT: xxperm v2, vs0, vs1 @@ -970,88 +968,81 @@ ; CHECK-LE-P8-NEXT: lhz r4, 0(r3) ; CHECK-LE-P8-NEXT: lfiwzx f0, 0, r3 ; CHECK-LE-P8-NEXT: mtfprd f1, r4 -; CHECK-LE-P8-NEXT: xxswapd vs0, f0 -; CHECK-LE-P8-NEXT: xxswapd vs1, vs1 -; CHECK-LE-P8-NEXT: xxmrglw vs0, vs1, vs0 +; CHECK-LE-P8-NEXT: xxmrghw vs0, vs1, vs0 ; CHECK-LE-P8-NEXT: xxswapd vs0, vs0 ; CHECK-LE-P8-NEXT: stxvd2x vs0, 0, r3 ; CHECK-LE-P8-NEXT: blr ; ; CHECK-LE-P9-LABEL: test_v4i32_v8i16: ; CHECK-LE-P9: # %bb.0: # %entry -; CHECK-LE-P9-NEXT: lxsihzx v2, 0, r3 -; CHECK-LE-P9-NEXT: lfiwzx f0, 0, r3 -; CHECK-LE-P9-NEXT: xxswapd vs0, f0 -; CHECK-LE-P9-NEXT: vsplth v2, v2, 3 -; CHECK-LE-P9-NEXT: xxmrglw vs0, v2, vs0 +; CHECK-LE-P9-NEXT: lxsihzx f0, 0, r3 +; CHECK-LE-P9-NEXT: lfiwzx f1, 0, r3 +; CHECK-LE-P9-NEXT: xxmrghw vs0, vs0, vs1 ; CHECK-LE-P9-NEXT: stxv vs0, 0(r3) ; CHECK-LE-P9-NEXT: blr ; ; CHECK-BE-P8-LABEL: test_v4i32_v8i16: ; CHECK-BE-P8: # %bb.0: # %entry -; CHECK-BE-P8-NEXT: lfiwzx f0, 0, r3 -; CHECK-BE-P8-NEXT: lhz r4, 0(r3) -; CHECK-BE-P8-NEXT: sldi r3, r4, 48 -; CHECK-BE-P8-NEXT: xxsldwi vs0, f0, f0, 1 -; CHECK-BE-P8-NEXT: mtfprd f1, r3 -; CHECK-BE-P8-NEXT: xxmrghw vs0, vs0, vs1 -; CHECK-BE-P8-NEXT: stxvw4x vs0, 0, r3 +; CHECK-BE-P8-NEXT: addis r4, r2, .LCPI10_0@toc@ha +; CHECK-BE-P8-NEXT: lhz r5, 0(r3) +; CHECK-BE-P8-NEXT: lxsiwzx v2, 0, r3 +; CHECK-BE-P8-NEXT: addi r4, r4, .LCPI10_0@toc@l +; CHECK-BE-P8-NEXT: lxvw4x v3, 0, r4 +; CHECK-BE-P8-NEXT: mtvsrwz v4, r5 +; CHECK-BE-P8-NEXT: vperm v2, v2, v4, v3 +; CHECK-BE-P8-NEXT: stxvw4x v2, 0, r3 ; CHECK-BE-P8-NEXT: blr ; ; CHECK-BE-P9-LABEL: test_v4i32_v8i16: ; CHECK-BE-P9: # %bb.0: # %entry -; CHECK-BE-P9-NEXT: lxsihzx v2, 0, r3 -; CHECK-BE-P9-NEXT: lfiwzx f0, 0, r3 -; CHECK-BE-P9-NEXT: xxsldwi vs0, f0, f0, 1 -; CHECK-BE-P9-NEXT: vsplth v2, v2, 3 -; CHECK-BE-P9-NEXT: xxmrghw vs0, vs0, v2 +; CHECK-BE-P9-NEXT: lxsihzx f0, 0, r3 +; CHECK-BE-P9-NEXT: lfiwzx f1, 0, r3 +; CHECK-BE-P9-NEXT: addis r3, r2, .LCPI10_0@toc@ha +; CHECK-BE-P9-NEXT: addi r3, r3, .LCPI10_0@toc@l +; CHECK-BE-P9-NEXT: lxv vs2, 0(r3) +; CHECK-BE-P9-NEXT: xxperm vs0, vs1, vs2 ; CHECK-BE-P9-NEXT: stxv vs0, 0(r3) ; CHECK-BE-P9-NEXT: blr ; ; CHECK-AIX-64-P8-LABEL: test_v4i32_v8i16: ; CHECK-AIX-64-P8: # %bb.0: # %entry -; CHECK-AIX-64-P8-NEXT: lfiwzx f0, 0, r3 -; CHECK-AIX-64-P8-NEXT: lhz r4, 0(r3) -; CHECK-AIX-64-P8-NEXT: sldi r3, r4, 48 -; CHECK-AIX-64-P8-NEXT: xxsldwi vs0, f0, f0, 1 -; CHECK-AIX-64-P8-NEXT: mtfprd f1, r3 -; CHECK-AIX-64-P8-NEXT: xxmrghw vs0, vs0, vs1 -; CHECK-AIX-64-P8-NEXT: stxvw4x vs0, 0, r3 +; CHECK-AIX-64-P8-NEXT: ld r4, L..C7(r2) # %const.0 +; CHECK-AIX-64-P8-NEXT: lhz r5, 0(r3) +; CHECK-AIX-64-P8-NEXT: lxsiwzx v2, 0, r3 +; CHECK-AIX-64-P8-NEXT: mtvsrwz v4, r5 +; CHECK-AIX-64-P8-NEXT: lxvw4x v3, 0, r4 +; CHECK-AIX-64-P8-NEXT: vperm v2, v2, v4, v3 +; CHECK-AIX-64-P8-NEXT: stxvw4x v2, 0, r3 ; CHECK-AIX-64-P8-NEXT: blr ; ; CHECK-AIX-64-P9-LABEL: test_v4i32_v8i16: ; CHECK-AIX-64-P9: # %bb.0: # %entry -; CHECK-AIX-64-P9-NEXT: lxsihzx v2, 0, r3 -; CHECK-AIX-64-P9-NEXT: lfiwzx f0, 0, r3 -; CHECK-AIX-64-P9-NEXT: xxsldwi vs0, f0, f0, 1 -; CHECK-AIX-64-P9-NEXT: vsplth v2, v2, 3 -; CHECK-AIX-64-P9-NEXT: xxmrghw vs0, vs0, v2 +; CHECK-AIX-64-P9-NEXT: lxsihzx f0, 0, r3 +; CHECK-AIX-64-P9-NEXT: lfiwzx f1, 0, r3 +; CHECK-AIX-64-P9-NEXT: ld r3, L..C6(r2) # %const.0 +; CHECK-AIX-64-P9-NEXT: lxv vs2, 0(r3) +; CHECK-AIX-64-P9-NEXT: xxperm vs0, vs1, vs2 ; CHECK-AIX-64-P9-NEXT: stxv vs0, 0(r3) ; CHECK-AIX-64-P9-NEXT: blr ; ; CHECK-AIX-32-P8-LABEL: test_v4i32_v8i16: ; CHECK-AIX-32-P8: # %bb.0: # %entry -; CHECK-AIX-32-P8-NEXT: lhz r4, 0(r3) -; CHECK-AIX-32-P8-NEXT: sth r4, -32(r1) -; CHECK-AIX-32-P8-NEXT: addi r4, r1, -32 -; CHECK-AIX-32-P8-NEXT: lwz r3, 0(r3) -; CHECK-AIX-32-P8-NEXT: lxvw4x vs0, 0, r4 -; CHECK-AIX-32-P8-NEXT: stw r3, -16(r1) -; CHECK-AIX-32-P8-NEXT: addi r3, r1, -16 -; CHECK-AIX-32-P8-NEXT: lxvw4x vs1, 0, r3 -; CHECK-AIX-32-P8-NEXT: xxmrghw vs0, vs1, vs0 -; CHECK-AIX-32-P8-NEXT: stxvw4x vs0, 0, r3 +; CHECK-AIX-32-P8-NEXT: lwz r4, L..C8(r2) # %const.0 +; CHECK-AIX-32-P8-NEXT: lhz r5, 0(r3) +; CHECK-AIX-32-P8-NEXT: lxsiwzx v2, 0, r3 +; CHECK-AIX-32-P8-NEXT: mtvsrwz v4, r5 +; CHECK-AIX-32-P8-NEXT: lxvw4x v3, 0, r4 +; CHECK-AIX-32-P8-NEXT: vperm v2, v2, v4, v3 +; CHECK-AIX-32-P8-NEXT: stxvw4x v2, 0, r3 ; CHECK-AIX-32-P8-NEXT: blr ; ; CHECK-AIX-32-P9-LABEL: test_v4i32_v8i16: ; CHECK-AIX-32-P9: # %bb.0: # %entry -; CHECK-AIX-32-P9-NEXT: lhz r4, 0(r3) -; CHECK-AIX-32-P9-NEXT: sth r4, -32(r1) -; CHECK-AIX-32-P9-NEXT: lwz r3, 0(r3) -; CHECK-AIX-32-P9-NEXT: lxv vs0, -32(r1) -; CHECK-AIX-32-P9-NEXT: stw r3, -16(r1) -; CHECK-AIX-32-P9-NEXT: lxv vs1, -16(r1) -; CHECK-AIX-32-P9-NEXT: xxmrghw vs0, vs1, vs0 +; CHECK-AIX-32-P9-NEXT: lxsihzx f0, 0, r3 +; CHECK-AIX-32-P9-NEXT: lfiwzx f1, 0, r3 +; CHECK-AIX-32-P9-NEXT: lwz r3, L..C7(r2) # %const.0 +; CHECK-AIX-32-P9-NEXT: lxv vs2, 0(r3) +; CHECK-AIX-32-P9-NEXT: xxperm vs0, vs1, vs2 ; CHECK-AIX-32-P9-NEXT: stxv vs0, 0(r3) ; CHECK-AIX-32-P9-NEXT: blr entry: @@ -1072,9 +1063,7 @@ ; CHECK-LE-P8: # %bb.0: # %entry ; CHECK-LE-P8-NEXT: lfdx f0, 0, r3 ; CHECK-LE-P8-NEXT: lfiwzx f1, 0, r3 -; CHECK-LE-P8-NEXT: xxswapd vs0, f0 -; CHECK-LE-P8-NEXT: xxswapd vs1, f1 -; CHECK-LE-P8-NEXT: xxmrglw vs0, vs0, vs1 +; CHECK-LE-P8-NEXT: xxmrghw vs0, vs0, vs1 ; CHECK-LE-P8-NEXT: xxswapd vs0, vs0 ; CHECK-LE-P8-NEXT: stxvd2x vs0, 0, r3 ; CHECK-LE-P8-NEXT: blr @@ -1083,9 +1072,7 @@ ; CHECK-LE-P9: # %bb.0: # %entry ; CHECK-LE-P9-NEXT: lfd f0, 0(r3) ; CHECK-LE-P9-NEXT: lfiwzx f1, 0, r3 -; CHECK-LE-P9-NEXT: xxswapd vs0, f0 -; CHECK-LE-P9-NEXT: xxswapd vs1, f1 -; CHECK-LE-P9-NEXT: xxmrglw vs0, vs0, vs1 +; CHECK-LE-P9-NEXT: xxmrghw vs0, vs0, vs1 ; CHECK-LE-P9-NEXT: stxv vs0, 0(r3) ; CHECK-LE-P9-NEXT: blr ; @@ -1255,9 +1242,7 @@ ; CHECK-LE-P8: # %bb.0: # %entry ; CHECK-LE-P8-NEXT: lfdx f0, 0, r3 ; CHECK-LE-P8-NEXT: lfiwzx f1, 0, r3 -; CHECK-LE-P8-NEXT: xxswapd vs0, f0 -; CHECK-LE-P8-NEXT: xxswapd vs1, f1 -; CHECK-LE-P8-NEXT: xxmrglw vs0, vs1, vs0 +; CHECK-LE-P8-NEXT: xxmrghw vs0, vs1, vs0 ; CHECK-LE-P8-NEXT: xxswapd vs0, vs0 ; CHECK-LE-P8-NEXT: stxvd2x vs0, 0, r3 ; CHECK-LE-P8-NEXT: blr @@ -1266,9 +1251,7 @@ ; CHECK-LE-P9: # %bb.0: # %entry ; CHECK-LE-P9-NEXT: lfd f0, 0(r3) ; CHECK-LE-P9-NEXT: lfiwzx f1, 0, r3 -; CHECK-LE-P9-NEXT: xxswapd vs0, f0 -; CHECK-LE-P9-NEXT: xxswapd vs1, f1 -; CHECK-LE-P9-NEXT: xxmrglw vs0, vs1, vs0 +; CHECK-LE-P9-NEXT: xxmrghw vs0, vs1, vs0 ; CHECK-LE-P9-NEXT: stxv vs0, 0(r3) ; CHECK-LE-P9-NEXT: blr ; @@ -1351,20 +1334,16 @@ ; CHECK-LE-P8-NEXT: lhz r4, 0(r3) ; CHECK-LE-P8-NEXT: lfdx f0, 0, r3 ; CHECK-LE-P8-NEXT: mtfprd f1, r4 -; CHECK-LE-P8-NEXT: xxswapd vs0, f0 -; CHECK-LE-P8-NEXT: xxswapd vs1, vs1 -; CHECK-LE-P8-NEXT: xxmrglw vs0, vs1, vs0 +; CHECK-LE-P8-NEXT: xxmrghw vs0, vs1, vs0 ; CHECK-LE-P8-NEXT: xxswapd vs0, vs0 ; CHECK-LE-P8-NEXT: stxvd2x vs0, 0, r3 ; CHECK-LE-P8-NEXT: blr ; ; CHECK-LE-P9-LABEL: test_v2i64_v8i16: ; CHECK-LE-P9: # %bb.0: # %entry -; CHECK-LE-P9-NEXT: lxsihzx v2, 0, r3 -; CHECK-LE-P9-NEXT: lfd f0, 0(r3) -; CHECK-LE-P9-NEXT: xxswapd vs0, f0 -; CHECK-LE-P9-NEXT: vsplth v2, v2, 3 -; CHECK-LE-P9-NEXT: xxmrglw vs0, v2, vs0 +; CHECK-LE-P9-NEXT: lxsihzx f0, 0, r3 +; CHECK-LE-P9-NEXT: lfd f1, 0(r3) +; CHECK-LE-P9-NEXT: xxmrghw vs0, vs0, vs1 ; CHECK-LE-P9-NEXT: stxv vs0, 0(r3) ; CHECK-LE-P9-NEXT: blr ; @@ -1408,27 +1387,22 @@ ; ; CHECK-AIX-32-P8-LABEL: test_v2i64_v8i16: ; CHECK-AIX-32-P8: # %bb.0: # %entry -; CHECK-AIX-32-P8-NEXT: lhz r4, 0(r3) -; CHECK-AIX-32-P8-NEXT: sth r4, -32(r1) -; CHECK-AIX-32-P8-NEXT: addi r4, r1, -32 -; CHECK-AIX-32-P8-NEXT: lwz r3, 0(r3) -; CHECK-AIX-32-P8-NEXT: lxvw4x vs0, 0, r4 -; CHECK-AIX-32-P8-NEXT: stw r3, -16(r1) -; CHECK-AIX-32-P8-NEXT: addi r3, r1, -16 -; CHECK-AIX-32-P8-NEXT: lxvw4x vs1, 0, r3 -; CHECK-AIX-32-P8-NEXT: xxmrghw vs0, vs1, vs0 -; CHECK-AIX-32-P8-NEXT: stxvw4x vs0, 0, r3 +; CHECK-AIX-32-P8-NEXT: lwz r4, L..C9(r2) # %const.0 +; CHECK-AIX-32-P8-NEXT: lhz r5, 0(r3) +; CHECK-AIX-32-P8-NEXT: lxsiwzx v2, 0, r3 +; CHECK-AIX-32-P8-NEXT: mtvsrwz v4, r5 +; CHECK-AIX-32-P8-NEXT: lxvw4x v3, 0, r4 +; CHECK-AIX-32-P8-NEXT: vperm v2, v2, v4, v3 +; CHECK-AIX-32-P8-NEXT: stxvw4x v2, 0, r3 ; CHECK-AIX-32-P8-NEXT: blr ; ; CHECK-AIX-32-P9-LABEL: test_v2i64_v8i16: ; CHECK-AIX-32-P9: # %bb.0: # %entry -; CHECK-AIX-32-P9-NEXT: lhz r4, 0(r3) -; CHECK-AIX-32-P9-NEXT: sth r4, -32(r1) -; CHECK-AIX-32-P9-NEXT: lwz r3, 0(r3) -; CHECK-AIX-32-P9-NEXT: lxv vs0, -32(r1) -; CHECK-AIX-32-P9-NEXT: stw r3, -16(r1) -; CHECK-AIX-32-P9-NEXT: lxv vs1, -16(r1) -; CHECK-AIX-32-P9-NEXT: xxmrghw vs0, vs1, vs0 +; CHECK-AIX-32-P9-NEXT: lxsihzx f0, 0, r3 +; CHECK-AIX-32-P9-NEXT: lfiwzx f1, 0, r3 +; CHECK-AIX-32-P9-NEXT: lwz r3, L..C8(r2) # %const.0 +; CHECK-AIX-32-P9-NEXT: lxv vs2, 0(r3) +; CHECK-AIX-32-P9-NEXT: xxperm vs0, vs1, vs2 ; CHECK-AIX-32-P9-NEXT: stxv vs0, 0(r3) ; CHECK-AIX-32-P9-NEXT: blr entry: diff --git a/llvm/test/CodeGen/PowerPC/v8i16_scalar_to_vector_shuffle.ll b/llvm/test/CodeGen/PowerPC/v8i16_scalar_to_vector_shuffle.ll --- a/llvm/test/CodeGen/PowerPC/v8i16_scalar_to_vector_shuffle.ll +++ b/llvm/test/CodeGen/PowerPC/v8i16_scalar_to_vector_shuffle.ll @@ -241,16 +241,13 @@ define void @test_none_v4i32(ptr %ptr, ptr %ptr2, i8 %v3) local_unnamed_addr #0 { ; CHECK-LE-P8-LABEL: test_none_v4i32: ; CHECK-LE-P8: # %bb.0: # %entry +; CHECK-LE-P8-NEXT: mtfprd f0, r5 ; CHECK-LE-P8-NEXT: addis r4, r2, .LCPI2_0@toc@ha -; CHECK-LE-P8-NEXT: mtvsrd v3, r5 +; CHECK-LE-P8-NEXT: lxsiwzx v3, 0, r3 ; CHECK-LE-P8-NEXT: addi r4, r4, .LCPI2_0@toc@l -; CHECK-LE-P8-NEXT: lxvd2x vs0, 0, r4 -; CHECK-LE-P8-NEXT: addis r4, r2, .LCPI2_1@toc@ha -; CHECK-LE-P8-NEXT: addi r4, r4, .LCPI2_1@toc@l ; CHECK-LE-P8-NEXT: xxswapd v2, vs0 ; CHECK-LE-P8-NEXT: lxvd2x vs0, 0, r4 -; CHECK-LE-P8-NEXT: vperm v2, v3, v3, v2 -; CHECK-LE-P8-NEXT: lxsiwzx v3, 0, r3 +; CHECK-LE-P8-NEXT: vmrglh v2, v2, v2 ; CHECK-LE-P8-NEXT: xxswapd v4, vs0 ; CHECK-LE-P8-NEXT: vperm v2, v2, v3, v4 ; CHECK-LE-P8-NEXT: xxswapd vs0, v2 @@ -261,13 +258,11 @@ ; CHECK-LE-P9: # %bb.0: # %entry ; CHECK-LE-P9-NEXT: lxsiwzx v2, 0, r3 ; CHECK-LE-P9-NEXT: addis r3, r2, .LCPI2_0@toc@ha -; CHECK-LE-P9-NEXT: mtvsrd v3, r5 +; CHECK-LE-P9-NEXT: mtfprd f0, r5 ; CHECK-LE-P9-NEXT: addi r3, r3, .LCPI2_0@toc@l -; CHECK-LE-P9-NEXT: lxv vs0, 0(r3) -; CHECK-LE-P9-NEXT: addis r3, r2, .LCPI2_1@toc@ha -; CHECK-LE-P9-NEXT: addi r3, r3, .LCPI2_1@toc@l +; CHECK-LE-P9-NEXT: xxswapd v3, vs0 ; CHECK-LE-P9-NEXT: lxv v4, 0(r3) -; CHECK-LE-P9-NEXT: xxperm v3, v3, vs0 +; CHECK-LE-P9-NEXT: vmrglh v3, v3, v3 ; CHECK-LE-P9-NEXT: vperm v2, v3, v2, v4 ; CHECK-LE-P9-NEXT: xxswapd vs0, v2 ; CHECK-LE-P9-NEXT: stfd f0, 0(r3) @@ -275,15 +270,13 @@ ; ; CHECK-BE-P8-LABEL: test_none_v4i32: ; CHECK-BE-P8: # %bb.0: # %entry +; CHECK-BE-P8-NEXT: sldi r5, r5, 56 ; CHECK-BE-P8-NEXT: addis r4, r2, .LCPI2_0@toc@ha -; CHECK-BE-P8-NEXT: mtvsrwz v3, r5 +; CHECK-BE-P8-NEXT: lxsiwzx v3, 0, r3 +; CHECK-BE-P8-NEXT: mtvsrd v2, r5 ; CHECK-BE-P8-NEXT: addi r4, r4, .LCPI2_0@toc@l -; CHECK-BE-P8-NEXT: lxvw4x v2, 0, r4 -; CHECK-BE-P8-NEXT: addis r4, r2, .LCPI2_1@toc@ha -; CHECK-BE-P8-NEXT: addi r4, r4, .LCPI2_1@toc@l ; CHECK-BE-P8-NEXT: lxvw4x v4, 0, r4 -; CHECK-BE-P8-NEXT: vperm v2, v3, v3, v2 -; CHECK-BE-P8-NEXT: lxsiwzx v3, 0, r3 +; CHECK-BE-P8-NEXT: vmrghh v2, v2, v2 ; CHECK-BE-P8-NEXT: vperm v2, v3, v2, v4 ; CHECK-BE-P8-NEXT: stxsdx v2, 0, r3 ; CHECK-BE-P8-NEXT: blr @@ -291,26 +284,23 @@ ; CHECK-BE-P9-LABEL: test_none_v4i32: ; CHECK-BE-P9: # %bb.0: # %entry ; CHECK-BE-P9-NEXT: lxsiwzx v2, 0, r3 +; CHECK-BE-P9-NEXT: sldi r3, r5, 56 +; CHECK-BE-P9-NEXT: mtvsrd v3, r3 ; CHECK-BE-P9-NEXT: addis r3, r2, .LCPI2_0@toc@ha -; CHECK-BE-P9-NEXT: mtvsrwz v3, r5 ; CHECK-BE-P9-NEXT: addi r3, r3, .LCPI2_0@toc@l -; CHECK-BE-P9-NEXT: lxv vs0, 0(r3) -; CHECK-BE-P9-NEXT: addis r3, r2, .LCPI2_1@toc@ha -; CHECK-BE-P9-NEXT: addi r3, r3, .LCPI2_1@toc@l +; CHECK-BE-P9-NEXT: vmrghh v3, v3, v3 ; CHECK-BE-P9-NEXT: lxv v4, 0(r3) -; CHECK-BE-P9-NEXT: xxperm v3, v3, vs0 ; CHECK-BE-P9-NEXT: vperm v2, v2, v3, v4 ; CHECK-BE-P9-NEXT: stxsd v2, 0(r3) ; CHECK-BE-P9-NEXT: blr ; ; CHECK-AIX-64-P8-LABEL: test_none_v4i32: ; CHECK-AIX-64-P8: # %bb.0: # %entry +; CHECK-AIX-64-P8-NEXT: sldi r5, r5, 56 ; CHECK-AIX-64-P8-NEXT: ld r4, L..C3(r2) # %const.0 -; CHECK-AIX-64-P8-NEXT: mtvsrwz v3, r5 -; CHECK-AIX-64-P8-NEXT: lxvw4x v2, 0, r4 -; CHECK-AIX-64-P8-NEXT: ld r4, L..C4(r2) # %const.1 -; CHECK-AIX-64-P8-NEXT: vperm v2, v3, v3, v2 ; CHECK-AIX-64-P8-NEXT: lxsiwzx v3, 0, r3 +; CHECK-AIX-64-P8-NEXT: mtvsrd v2, r5 +; CHECK-AIX-64-P8-NEXT: vmrghh v2, v2, v2 ; CHECK-AIX-64-P8-NEXT: lxvw4x v4, 0, r4 ; CHECK-AIX-64-P8-NEXT: vperm v2, v3, v2, v4 ; CHECK-AIX-64-P8-NEXT: stxsdx v2, 0, r3 @@ -319,12 +309,11 @@ ; CHECK-AIX-64-P9-LABEL: test_none_v4i32: ; CHECK-AIX-64-P9: # %bb.0: # %entry ; CHECK-AIX-64-P9-NEXT: lxsiwzx v2, 0, r3 +; CHECK-AIX-64-P9-NEXT: sldi r3, r5, 56 +; CHECK-AIX-64-P9-NEXT: mtvsrd v3, r3 ; CHECK-AIX-64-P9-NEXT: ld r3, L..C2(r2) # %const.0 -; CHECK-AIX-64-P9-NEXT: mtvsrwz v3, r5 -; CHECK-AIX-64-P9-NEXT: lxv vs0, 0(r3) -; CHECK-AIX-64-P9-NEXT: ld r3, L..C3(r2) # %const.1 +; CHECK-AIX-64-P9-NEXT: vmrghh v3, v3, v3 ; CHECK-AIX-64-P9-NEXT: lxv v4, 0(r3) -; CHECK-AIX-64-P9-NEXT: xxperm v3, v3, vs0 ; CHECK-AIX-64-P9-NEXT: vperm v2, v2, v3, v4 ; CHECK-AIX-64-P9-NEXT: stxsd v2, 0(r3) ; CHECK-AIX-64-P9-NEXT: blr @@ -420,7 +409,7 @@ ; ; CHECK-AIX-64-P8-LABEL: test_v4i32_none: ; CHECK-AIX-64-P8: # %bb.0: # %entry -; CHECK-AIX-64-P8-NEXT: ld r4, L..C5(r2) # %const.0 +; CHECK-AIX-64-P8-NEXT: ld r4, L..C4(r2) # %const.0 ; CHECK-AIX-64-P8-NEXT: lxsiwzx v2, 0, r3 ; CHECK-AIX-64-P8-NEXT: xxlxor v4, v4, v4 ; CHECK-AIX-64-P8-NEXT: lxvw4x v3, 0, r4 @@ -431,7 +420,7 @@ ; CHECK-AIX-64-P9-LABEL: test_v4i32_none: ; CHECK-AIX-64-P9: # %bb.0: # %entry ; CHECK-AIX-64-P9-NEXT: lfiwzx f0, 0, r3 -; CHECK-AIX-64-P9-NEXT: ld r3, L..C4(r2) # %const.0 +; CHECK-AIX-64-P9-NEXT: ld r3, L..C3(r2) # %const.0 ; CHECK-AIX-64-P9-NEXT: xxlxor vs2, vs2, vs2 ; CHECK-AIX-64-P9-NEXT: lxv vs1, 0(r3) ; CHECK-AIX-64-P9-NEXT: xxperm vs0, vs2, vs1 @@ -531,7 +520,7 @@ ; ; CHECK-AIX-64-P8-LABEL: test_none_v2i64: ; CHECK-AIX-64-P8: # %bb.0: # %entry -; CHECK-AIX-64-P8-NEXT: ld r5, L..C6(r2) # %const.0 +; CHECK-AIX-64-P8-NEXT: ld r5, L..C5(r2) # %const.0 ; CHECK-AIX-64-P8-NEXT: lxsdx v2, 0, r3 ; CHECK-AIX-64-P8-NEXT: lxvw4x v3, 0, r4 ; CHECK-AIX-64-P8-NEXT: lxvw4x v4, 0, r5 @@ -544,7 +533,7 @@ ; CHECK-AIX-64-P9-LABEL: test_none_v2i64: ; CHECK-AIX-64-P9: # %bb.0: # %entry ; CHECK-AIX-64-P9-NEXT: lxsd v2, 0(r3) -; CHECK-AIX-64-P9-NEXT: ld r3, L..C5(r2) # %const.0 +; CHECK-AIX-64-P9-NEXT: ld r3, L..C4(r2) # %const.0 ; CHECK-AIX-64-P9-NEXT: lxv vs0, 0(r4) ; CHECK-AIX-64-P9-NEXT: xxlxor v3, v3, v3 ; CHECK-AIX-64-P9-NEXT: lxv vs1, 0(r3) @@ -635,7 +624,7 @@ ; ; CHECK-AIX-64-P8-LABEL: test_v2i64_none: ; CHECK-AIX-64-P8: # %bb.0: # %entry -; CHECK-AIX-64-P8-NEXT: ld r4, L..C7(r2) # %const.0 +; CHECK-AIX-64-P8-NEXT: ld r4, L..C6(r2) # %const.0 ; CHECK-AIX-64-P8-NEXT: lxsdx v2, 0, r3 ; CHECK-AIX-64-P8-NEXT: xxlxor v4, v4, v4 ; CHECK-AIX-64-P8-NEXT: lxvw4x v3, 0, r4 @@ -646,7 +635,7 @@ ; CHECK-AIX-64-P9-LABEL: test_v2i64_none: ; CHECK-AIX-64-P9: # %bb.0: # %entry ; CHECK-AIX-64-P9-NEXT: lfd f0, 0(r3) -; CHECK-AIX-64-P9-NEXT: ld r3, L..C6(r2) # %const.0 +; CHECK-AIX-64-P9-NEXT: ld r3, L..C5(r2) # %const.0 ; CHECK-AIX-64-P9-NEXT: xxlxor vs2, vs2, vs2 ; CHECK-AIX-64-P9-NEXT: lxv vs1, 0(r3) ; CHECK-AIX-64-P9-NEXT: xxperm vs0, vs2, vs1 @@ -742,7 +731,7 @@ ; ; CHECK-AIX-64-P8-LABEL: test_v8i16_v8i16: ; CHECK-AIX-64-P8: # %bb.0: # %entry -; CHECK-AIX-64-P8-NEXT: ld r5, L..C8(r2) # %const.0 +; CHECK-AIX-64-P8-NEXT: ld r5, L..C7(r2) # %const.0 ; CHECK-AIX-64-P8-NEXT: lhz r3, 0(r3) ; CHECK-AIX-64-P8-NEXT: lhz r4, 0(r4) ; CHECK-AIX-64-P8-NEXT: mtvsrwz v2, r3 @@ -754,7 +743,7 @@ ; CHECK-AIX-64-P9-LABEL: test_v8i16_v8i16: ; CHECK-AIX-64-P9: # %bb.0: # %entry ; CHECK-AIX-64-P9-NEXT: lxsihzx f0, 0, r3 -; CHECK-AIX-64-P9-NEXT: ld r3, L..C7(r2) # %const.0 +; CHECK-AIX-64-P9-NEXT: ld r3, L..C6(r2) # %const.0 ; CHECK-AIX-64-P9-NEXT: lxsihzx v2, 0, r4 ; CHECK-AIX-64-P9-NEXT: lxv vs1, 0(r3) ; CHECK-AIX-64-P9-NEXT: xxperm v2, vs0, vs1 @@ -791,82 +780,75 @@ ; CHECK-LE-P8-LABEL: test_v8i16_v4i32: ; CHECK-LE-P8: # %bb.0: # %entry ; CHECK-LE-P8-NEXT: lhz r3, 0(r3) -; CHECK-LE-P8-NEXT: lfiwzx f0, 0, r4 -; CHECK-LE-P8-NEXT: mtfprd f1, r3 -; CHECK-LE-P8-NEXT: xxswapd v3, f0 -; CHECK-LE-P8-NEXT: xxswapd v2, vs1 -; CHECK-LE-P8-NEXT: vmrglh v2, v3, v2 +; CHECK-LE-P8-NEXT: lxsiwzx v2, 0, r4 +; CHECK-LE-P8-NEXT: mtvsrd v3, r3 +; CHECK-LE-P8-NEXT: vmrghh v2, v2, v3 ; CHECK-LE-P8-NEXT: blr ; ; CHECK-LE-P9-LABEL: test_v8i16_v4i32: ; CHECK-LE-P9: # %bb.0: # %entry ; CHECK-LE-P9-NEXT: lxsihzx v2, 0, r3 -; CHECK-LE-P9-NEXT: lfiwzx f0, 0, r4 -; CHECK-LE-P9-NEXT: xxswapd v3, f0 -; CHECK-LE-P9-NEXT: vsplth v2, v2, 3 -; CHECK-LE-P9-NEXT: vmrglh v2, v3, v2 +; CHECK-LE-P9-NEXT: lxsiwzx v3, 0, r4 +; CHECK-LE-P9-NEXT: vmrghh v2, v3, v2 ; CHECK-LE-P9-NEXT: blr ; ; CHECK-BE-P8-LABEL: test_v8i16_v4i32: ; CHECK-BE-P8: # %bb.0: # %entry -; CHECK-BE-P8-NEXT: lfiwzx f0, 0, r4 +; CHECK-BE-P8-NEXT: addis r5, r2, .LCPI7_0@toc@ha ; CHECK-BE-P8-NEXT: lhz r3, 0(r3) -; CHECK-BE-P8-NEXT: sldi r3, r3, 48 -; CHECK-BE-P8-NEXT: xxsldwi v2, f0, f0, 1 -; CHECK-BE-P8-NEXT: mtvsrd v3, r3 -; CHECK-BE-P8-NEXT: vmrghh v2, v3, v2 +; CHECK-BE-P8-NEXT: lxsiwzx v2, 0, r4 +; CHECK-BE-P8-NEXT: addi r5, r5, .LCPI7_0@toc@l +; CHECK-BE-P8-NEXT: lxvw4x v3, 0, r5 +; CHECK-BE-P8-NEXT: mtvsrwz v4, r3 +; CHECK-BE-P8-NEXT: vperm v2, v4, v2, v3 ; CHECK-BE-P8-NEXT: blr ; ; CHECK-BE-P9-LABEL: test_v8i16_v4i32: ; CHECK-BE-P9: # %bb.0: # %entry -; CHECK-BE-P9-NEXT: lxsihzx v2, 0, r3 -; CHECK-BE-P9-NEXT: lfiwzx f0, 0, r4 -; CHECK-BE-P9-NEXT: xxsldwi v3, f0, f0, 1 -; CHECK-BE-P9-NEXT: vsplth v2, v2, 3 -; CHECK-BE-P9-NEXT: vmrghh v2, v2, v3 +; CHECK-BE-P9-NEXT: lxsihzx f0, 0, r3 +; CHECK-BE-P9-NEXT: addis r3, r2, .LCPI7_0@toc@ha +; CHECK-BE-P9-NEXT: lxsiwzx v2, 0, r4 +; CHECK-BE-P9-NEXT: addi r3, r3, .LCPI7_0@toc@l +; CHECK-BE-P9-NEXT: lxv vs1, 0(r3) +; CHECK-BE-P9-NEXT: xxperm v2, vs0, vs1 ; CHECK-BE-P9-NEXT: blr ; ; CHECK-AIX-64-P8-LABEL: test_v8i16_v4i32: ; CHECK-AIX-64-P8: # %bb.0: # %entry -; CHECK-AIX-64-P8-NEXT: lfiwzx f0, 0, r4 +; CHECK-AIX-64-P8-NEXT: ld r5, L..C8(r2) # %const.0 ; CHECK-AIX-64-P8-NEXT: lhz r3, 0(r3) -; CHECK-AIX-64-P8-NEXT: sldi r3, r3, 48 -; CHECK-AIX-64-P8-NEXT: xxsldwi v2, f0, f0, 1 -; CHECK-AIX-64-P8-NEXT: mtvsrd v3, r3 -; CHECK-AIX-64-P8-NEXT: vmrghh v2, v3, v2 +; CHECK-AIX-64-P8-NEXT: lxsiwzx v2, 0, r4 +; CHECK-AIX-64-P8-NEXT: mtvsrwz v4, r3 +; CHECK-AIX-64-P8-NEXT: lxvw4x v3, 0, r5 +; CHECK-AIX-64-P8-NEXT: vperm v2, v4, v2, v3 ; CHECK-AIX-64-P8-NEXT: blr ; ; CHECK-AIX-64-P9-LABEL: test_v8i16_v4i32: ; CHECK-AIX-64-P9: # %bb.0: # %entry -; CHECK-AIX-64-P9-NEXT: lxsihzx v2, 0, r3 -; CHECK-AIX-64-P9-NEXT: lfiwzx f0, 0, r4 -; CHECK-AIX-64-P9-NEXT: xxsldwi v3, f0, f0, 1 -; CHECK-AIX-64-P9-NEXT: vsplth v2, v2, 3 -; CHECK-AIX-64-P9-NEXT: vmrghh v2, v2, v3 +; CHECK-AIX-64-P9-NEXT: lxsihzx f0, 0, r3 +; CHECK-AIX-64-P9-NEXT: ld r3, L..C7(r2) # %const.0 +; CHECK-AIX-64-P9-NEXT: lxsiwzx v2, 0, r4 +; CHECK-AIX-64-P9-NEXT: lxv vs1, 0(r3) +; CHECK-AIX-64-P9-NEXT: xxperm v2, vs0, vs1 ; CHECK-AIX-64-P9-NEXT: blr ; ; CHECK-AIX-32-P8-LABEL: test_v8i16_v4i32: ; CHECK-AIX-32-P8: # %bb.0: # %entry +; CHECK-AIX-32-P8-NEXT: lwz r5, L..C8(r2) # %const.0 ; CHECK-AIX-32-P8-NEXT: lhz r3, 0(r3) -; CHECK-AIX-32-P8-NEXT: sth r3, -32(r1) -; CHECK-AIX-32-P8-NEXT: lwz r3, 0(r4) -; CHECK-AIX-32-P8-NEXT: addi r4, r1, -32 -; CHECK-AIX-32-P8-NEXT: lxvw4x v2, 0, r4 -; CHECK-AIX-32-P8-NEXT: stw r3, -16(r1) -; CHECK-AIX-32-P8-NEXT: addi r3, r1, -16 -; CHECK-AIX-32-P8-NEXT: lxvw4x v3, 0, r3 -; CHECK-AIX-32-P8-NEXT: vmrghh v2, v2, v3 +; CHECK-AIX-32-P8-NEXT: lxsiwzx v2, 0, r4 +; CHECK-AIX-32-P8-NEXT: mtvsrwz v4, r3 +; CHECK-AIX-32-P8-NEXT: lxvw4x v3, 0, r5 +; CHECK-AIX-32-P8-NEXT: vperm v2, v4, v2, v3 ; CHECK-AIX-32-P8-NEXT: blr ; ; CHECK-AIX-32-P9-LABEL: test_v8i16_v4i32: ; CHECK-AIX-32-P9: # %bb.0: # %entry -; CHECK-AIX-32-P9-NEXT: lhz r3, 0(r3) -; CHECK-AIX-32-P9-NEXT: sth r3, -32(r1) -; CHECK-AIX-32-P9-NEXT: lwz r3, 0(r4) -; CHECK-AIX-32-P9-NEXT: lxv v2, -32(r1) -; CHECK-AIX-32-P9-NEXT: stw r3, -16(r1) -; CHECK-AIX-32-P9-NEXT: lxv v3, -16(r1) -; CHECK-AIX-32-P9-NEXT: vmrghh v2, v2, v3 +; CHECK-AIX-32-P9-NEXT: lxsihzx f0, 0, r3 +; CHECK-AIX-32-P9-NEXT: lwz r3, L..C7(r2) # %const.0 +; CHECK-AIX-32-P9-NEXT: lxsiwzx v2, 0, r4 +; CHECK-AIX-32-P9-NEXT: lxv vs1, 0(r3) +; CHECK-AIX-32-P9-NEXT: xxperm v2, vs0, vs1 ; CHECK-AIX-32-P9-NEXT: blr entry: %0 = load <2 x i8>, ptr %a @@ -885,20 +867,16 @@ ; CHECK-LE-P8-LABEL: test_v8i16_v2i64: ; CHECK-LE-P8: # %bb.0: # %entry ; CHECK-LE-P8-NEXT: lhz r3, 0(r3) -; CHECK-LE-P8-NEXT: lfdx f0, 0, r4 -; CHECK-LE-P8-NEXT: mtfprd f1, r3 -; CHECK-LE-P8-NEXT: xxswapd v3, f0 -; CHECK-LE-P8-NEXT: xxswapd v2, vs1 -; CHECK-LE-P8-NEXT: vmrglh v2, v3, v2 +; CHECK-LE-P8-NEXT: lxsdx v2, 0, r4 +; CHECK-LE-P8-NEXT: mtvsrd v3, r3 +; CHECK-LE-P8-NEXT: vmrghh v2, v2, v3 ; CHECK-LE-P8-NEXT: blr ; ; CHECK-LE-P9-LABEL: test_v8i16_v2i64: ; CHECK-LE-P9: # %bb.0: # %entry ; CHECK-LE-P9-NEXT: lxsihzx v2, 0, r3 -; CHECK-LE-P9-NEXT: lfd f0, 0(r4) -; CHECK-LE-P9-NEXT: xxswapd v3, f0 -; CHECK-LE-P9-NEXT: vsplth v2, v2, 3 -; CHECK-LE-P9-NEXT: vmrglh v2, v3, v2 +; CHECK-LE-P9-NEXT: lxsd v3, 0(r4) +; CHECK-LE-P9-NEXT: vmrghh v2, v3, v2 ; CHECK-LE-P9-NEXT: blr ; ; CHECK-BE-P8-LABEL: test_v8i16_v2i64: @@ -937,26 +915,21 @@ ; ; CHECK-AIX-32-P8-LABEL: test_v8i16_v2i64: ; CHECK-AIX-32-P8: # %bb.0: # %entry +; CHECK-AIX-32-P8-NEXT: lwz r5, L..C9(r2) # %const.0 ; CHECK-AIX-32-P8-NEXT: lhz r3, 0(r3) -; CHECK-AIX-32-P8-NEXT: sth r3, -32(r1) -; CHECK-AIX-32-P8-NEXT: lwz r3, 0(r4) -; CHECK-AIX-32-P8-NEXT: addi r4, r1, -32 -; CHECK-AIX-32-P8-NEXT: lxvw4x v2, 0, r4 -; CHECK-AIX-32-P8-NEXT: stw r3, -16(r1) -; CHECK-AIX-32-P8-NEXT: addi r3, r1, -16 -; CHECK-AIX-32-P8-NEXT: lxvw4x v3, 0, r3 -; CHECK-AIX-32-P8-NEXT: vmrghh v2, v2, v3 +; CHECK-AIX-32-P8-NEXT: lxsiwzx v2, 0, r4 +; CHECK-AIX-32-P8-NEXT: mtvsrwz v4, r3 +; CHECK-AIX-32-P8-NEXT: lxvw4x v3, 0, r5 +; CHECK-AIX-32-P8-NEXT: vperm v2, v4, v2, v3 ; CHECK-AIX-32-P8-NEXT: blr ; ; CHECK-AIX-32-P9-LABEL: test_v8i16_v2i64: ; CHECK-AIX-32-P9: # %bb.0: # %entry -; CHECK-AIX-32-P9-NEXT: lhz r3, 0(r3) -; CHECK-AIX-32-P9-NEXT: sth r3, -32(r1) -; CHECK-AIX-32-P9-NEXT: lwz r3, 0(r4) -; CHECK-AIX-32-P9-NEXT: lxv v2, -32(r1) -; CHECK-AIX-32-P9-NEXT: stw r3, -16(r1) -; CHECK-AIX-32-P9-NEXT: lxv v3, -16(r1) -; CHECK-AIX-32-P9-NEXT: vmrghh v2, v2, v3 +; CHECK-AIX-32-P9-NEXT: lxsihzx f0, 0, r3 +; CHECK-AIX-32-P9-NEXT: lwz r3, L..C8(r2) # %const.0 +; CHECK-AIX-32-P9-NEXT: lxsiwzx v2, 0, r4 +; CHECK-AIX-32-P9-NEXT: lxv vs1, 0(r3) +; CHECK-AIX-32-P9-NEXT: xxperm v2, vs0, vs1 ; CHECK-AIX-32-P9-NEXT: blr entry: %0 = load <2 x i8>, ptr %a @@ -1059,7 +1032,7 @@ ; ; CHECK-AIX-32-P8-LABEL: test_v4i32_v4i32: ; CHECK-AIX-32-P8: # %bb.0: # %entry -; CHECK-AIX-32-P8-NEXT: lwz r5, L..C8(r2) # %const.0 +; CHECK-AIX-32-P8-NEXT: lwz r5, L..C10(r2) # %const.0 ; CHECK-AIX-32-P8-NEXT: lxsiwzx v2, 0, r3 ; CHECK-AIX-32-P8-NEXT: lxsiwzx v3, 0, r4 ; CHECK-AIX-32-P8-NEXT: lxvw4x v4, 0, r5 @@ -1072,7 +1045,7 @@ ; CHECK-AIX-32-P9-LABEL: test_v4i32_v4i32: ; CHECK-AIX-32-P9: # %bb.0: # %entry ; CHECK-AIX-32-P9-NEXT: lxsiwzx v2, 0, r3 -; CHECK-AIX-32-P9-NEXT: lwz r3, L..C7(r2) # %const.0 +; CHECK-AIX-32-P9-NEXT: lwz r3, L..C9(r2) # %const.0 ; CHECK-AIX-32-P9-NEXT: lfiwzx f0, 0, r4 ; CHECK-AIX-32-P9-NEXT: xxlxor v3, v3, v3 ; CHECK-AIX-32-P9-NEXT: lxv vs1, 0(r3) @@ -1093,82 +1066,75 @@ ; CHECK-LE-P8-LABEL: test_v4i32_v8i16: ; CHECK-LE-P8: # %bb.0: # %entry ; CHECK-LE-P8-NEXT: lhz r3, 0(r3) -; CHECK-LE-P8-NEXT: lfiwzx f0, 0, r4 -; CHECK-LE-P8-NEXT: mtfprd f1, r3 -; CHECK-LE-P8-NEXT: xxswapd v3, f0 -; CHECK-LE-P8-NEXT: xxswapd v2, vs1 -; CHECK-LE-P8-NEXT: vmrglh v2, v2, v3 +; CHECK-LE-P8-NEXT: lxsiwzx v2, 0, r4 +; CHECK-LE-P8-NEXT: mtvsrd v3, r3 +; CHECK-LE-P8-NEXT: vmrghh v2, v3, v2 ; CHECK-LE-P8-NEXT: blr ; ; CHECK-LE-P9-LABEL: test_v4i32_v8i16: ; CHECK-LE-P9: # %bb.0: # %entry ; CHECK-LE-P9-NEXT: lxsihzx v2, 0, r3 -; CHECK-LE-P9-NEXT: lfiwzx f0, 0, r4 -; CHECK-LE-P9-NEXT: xxswapd v3, f0 -; CHECK-LE-P9-NEXT: vsplth v2, v2, 3 -; CHECK-LE-P9-NEXT: vmrglh v2, v2, v3 +; CHECK-LE-P9-NEXT: lxsiwzx v3, 0, r4 +; CHECK-LE-P9-NEXT: vmrghh v2, v2, v3 ; CHECK-LE-P9-NEXT: blr ; ; CHECK-BE-P8-LABEL: test_v4i32_v8i16: ; CHECK-BE-P8: # %bb.0: # %entry -; CHECK-BE-P8-NEXT: lfiwzx f0, 0, r4 +; CHECK-BE-P8-NEXT: addis r5, r2, .LCPI10_0@toc@ha ; CHECK-BE-P8-NEXT: lhz r3, 0(r3) -; CHECK-BE-P8-NEXT: sldi r3, r3, 48 -; CHECK-BE-P8-NEXT: xxsldwi v2, f0, f0, 1 -; CHECK-BE-P8-NEXT: mtvsrd v3, r3 -; CHECK-BE-P8-NEXT: vmrghh v2, v2, v3 +; CHECK-BE-P8-NEXT: lxsiwzx v2, 0, r4 +; CHECK-BE-P8-NEXT: addi r5, r5, .LCPI10_0@toc@l +; CHECK-BE-P8-NEXT: lxvw4x v3, 0, r5 +; CHECK-BE-P8-NEXT: mtvsrwz v4, r3 +; CHECK-BE-P8-NEXT: vperm v2, v2, v4, v3 ; CHECK-BE-P8-NEXT: blr ; ; CHECK-BE-P9-LABEL: test_v4i32_v8i16: ; CHECK-BE-P9: # %bb.0: # %entry ; CHECK-BE-P9-NEXT: lxsihzx v2, 0, r3 +; CHECK-BE-P9-NEXT: addis r3, r2, .LCPI10_0@toc@ha ; CHECK-BE-P9-NEXT: lfiwzx f0, 0, r4 -; CHECK-BE-P9-NEXT: xxsldwi v3, f0, f0, 1 -; CHECK-BE-P9-NEXT: vsplth v2, v2, 3 -; CHECK-BE-P9-NEXT: vmrghh v2, v3, v2 +; CHECK-BE-P9-NEXT: addi r3, r3, .LCPI10_0@toc@l +; CHECK-BE-P9-NEXT: lxv vs1, 0(r3) +; CHECK-BE-P9-NEXT: xxperm v2, vs0, vs1 ; CHECK-BE-P9-NEXT: blr ; ; CHECK-AIX-64-P8-LABEL: test_v4i32_v8i16: ; CHECK-AIX-64-P8: # %bb.0: # %entry -; CHECK-AIX-64-P8-NEXT: lfiwzx f0, 0, r4 +; CHECK-AIX-64-P8-NEXT: ld r5, L..C10(r2) # %const.0 ; CHECK-AIX-64-P8-NEXT: lhz r3, 0(r3) -; CHECK-AIX-64-P8-NEXT: sldi r3, r3, 48 -; CHECK-AIX-64-P8-NEXT: xxsldwi v2, f0, f0, 1 -; CHECK-AIX-64-P8-NEXT: mtvsrd v3, r3 -; CHECK-AIX-64-P8-NEXT: vmrghh v2, v2, v3 +; CHECK-AIX-64-P8-NEXT: lxsiwzx v2, 0, r4 +; CHECK-AIX-64-P8-NEXT: mtvsrwz v4, r3 +; CHECK-AIX-64-P8-NEXT: lxvw4x v3, 0, r5 +; CHECK-AIX-64-P8-NEXT: vperm v2, v2, v4, v3 ; CHECK-AIX-64-P8-NEXT: blr ; ; CHECK-AIX-64-P9-LABEL: test_v4i32_v8i16: ; CHECK-AIX-64-P9: # %bb.0: # %entry ; CHECK-AIX-64-P9-NEXT: lxsihzx v2, 0, r3 +; CHECK-AIX-64-P9-NEXT: ld r3, L..C9(r2) # %const.0 ; CHECK-AIX-64-P9-NEXT: lfiwzx f0, 0, r4 -; CHECK-AIX-64-P9-NEXT: xxsldwi v3, f0, f0, 1 -; CHECK-AIX-64-P9-NEXT: vsplth v2, v2, 3 -; CHECK-AIX-64-P9-NEXT: vmrghh v2, v3, v2 +; CHECK-AIX-64-P9-NEXT: lxv vs1, 0(r3) +; CHECK-AIX-64-P9-NEXT: xxperm v2, vs0, vs1 ; CHECK-AIX-64-P9-NEXT: blr ; ; CHECK-AIX-32-P8-LABEL: test_v4i32_v8i16: ; CHECK-AIX-32-P8: # %bb.0: # %entry +; CHECK-AIX-32-P8-NEXT: lwz r5, L..C11(r2) # %const.0 ; CHECK-AIX-32-P8-NEXT: lhz r3, 0(r3) -; CHECK-AIX-32-P8-NEXT: sth r3, -32(r1) -; CHECK-AIX-32-P8-NEXT: lwz r3, 0(r4) -; CHECK-AIX-32-P8-NEXT: addi r4, r1, -32 -; CHECK-AIX-32-P8-NEXT: lxvw4x v2, 0, r4 -; CHECK-AIX-32-P8-NEXT: stw r3, -16(r1) -; CHECK-AIX-32-P8-NEXT: addi r3, r1, -16 -; CHECK-AIX-32-P8-NEXT: lxvw4x v3, 0, r3 -; CHECK-AIX-32-P8-NEXT: vmrghh v2, v3, v2 +; CHECK-AIX-32-P8-NEXT: lxsiwzx v2, 0, r4 +; CHECK-AIX-32-P8-NEXT: mtvsrwz v4, r3 +; CHECK-AIX-32-P8-NEXT: lxvw4x v3, 0, r5 +; CHECK-AIX-32-P8-NEXT: vperm v2, v2, v4, v3 ; CHECK-AIX-32-P8-NEXT: blr ; ; CHECK-AIX-32-P9-LABEL: test_v4i32_v8i16: ; CHECK-AIX-32-P9: # %bb.0: # %entry -; CHECK-AIX-32-P9-NEXT: lhz r3, 0(r3) -; CHECK-AIX-32-P9-NEXT: sth r3, -32(r1) -; CHECK-AIX-32-P9-NEXT: lwz r3, 0(r4) -; CHECK-AIX-32-P9-NEXT: lxv v2, -32(r1) -; CHECK-AIX-32-P9-NEXT: stw r3, -16(r1) -; CHECK-AIX-32-P9-NEXT: lxv v3, -16(r1) -; CHECK-AIX-32-P9-NEXT: vmrghh v2, v3, v2 +; CHECK-AIX-32-P9-NEXT: lxsihzx v2, 0, r3 +; CHECK-AIX-32-P9-NEXT: lwz r3, L..C10(r2) # %const.0 +; CHECK-AIX-32-P9-NEXT: lfiwzx f0, 0, r4 +; CHECK-AIX-32-P9-NEXT: lxv vs1, 0(r3) +; CHECK-AIX-32-P9-NEXT: xxperm v2, vs0, vs1 ; CHECK-AIX-32-P9-NEXT: blr entry: %0 = load <2 x i8>, ptr %a @@ -1186,20 +1152,16 @@ define <16 x i8> @test_v4i32_v2i64(ptr %a, ptr %b) local_unnamed_addr { ; CHECK-LE-P8-LABEL: test_v4i32_v2i64: ; CHECK-LE-P8: # %bb.0: # %entry -; CHECK-LE-P8-NEXT: lfiwzx f0, 0, r3 -; CHECK-LE-P8-NEXT: lfdx f1, 0, r4 -; CHECK-LE-P8-NEXT: xxswapd v2, f0 -; CHECK-LE-P8-NEXT: xxswapd v3, f1 -; CHECK-LE-P8-NEXT: vmrglh v2, v3, v2 +; CHECK-LE-P8-NEXT: lxsiwzx v2, 0, r3 +; CHECK-LE-P8-NEXT: lxsdx v3, 0, r4 +; CHECK-LE-P8-NEXT: vmrghh v2, v3, v2 ; CHECK-LE-P8-NEXT: blr ; ; CHECK-LE-P9-LABEL: test_v4i32_v2i64: ; CHECK-LE-P9: # %bb.0: # %entry -; CHECK-LE-P9-NEXT: lfiwzx f0, 0, r3 -; CHECK-LE-P9-NEXT: xxswapd v2, f0 -; CHECK-LE-P9-NEXT: lfd f0, 0(r4) -; CHECK-LE-P9-NEXT: xxswapd v3, f0 -; CHECK-LE-P9-NEXT: vmrglh v2, v3, v2 +; CHECK-LE-P9-NEXT: lxsiwzx v2, 0, r3 +; CHECK-LE-P9-NEXT: lxsd v3, 0(r4) +; CHECK-LE-P9-NEXT: vmrghh v2, v3, v2 ; CHECK-LE-P9-NEXT: blr ; ; CHECK-BE-P8-LABEL: test_v4i32_v2i64: @@ -1236,7 +1198,7 @@ ; ; CHECK-AIX-32-P8-LABEL: test_v4i32_v2i64: ; CHECK-AIX-32-P8: # %bb.0: # %entry -; CHECK-AIX-32-P8-NEXT: lwz r5, L..C9(r2) # %const.0 +; CHECK-AIX-32-P8-NEXT: lwz r5, L..C12(r2) # %const.0 ; CHECK-AIX-32-P8-NEXT: lxsiwzx v2, 0, r3 ; CHECK-AIX-32-P8-NEXT: lxsiwzx v3, 0, r4 ; CHECK-AIX-32-P8-NEXT: lxvw4x v4, 0, r5 @@ -1246,7 +1208,7 @@ ; CHECK-AIX-32-P9-LABEL: test_v4i32_v2i64: ; CHECK-AIX-32-P9: # %bb.0: # %entry ; CHECK-AIX-32-P9-NEXT: lfiwzx f0, 0, r3 -; CHECK-AIX-32-P9-NEXT: lwz r3, L..C8(r2) # %const.0 +; CHECK-AIX-32-P9-NEXT: lwz r3, L..C11(r2) # %const.0 ; CHECK-AIX-32-P9-NEXT: lxsiwzx v2, 0, r4 ; CHECK-AIX-32-P9-NEXT: lxv vs1, 0(r3) ; CHECK-AIX-32-P9-NEXT: xxperm v2, vs0, vs1 @@ -1328,7 +1290,7 @@ ; ; CHECK-AIX-64-P8-LABEL: test_v2i64_v2i64: ; CHECK-AIX-64-P8: # %bb.0: # %entry -; CHECK-AIX-64-P8-NEXT: ld r5, L..C10(r2) # %const.0 +; CHECK-AIX-64-P8-NEXT: ld r5, L..C11(r2) # %const.0 ; CHECK-AIX-64-P8-NEXT: lxsdx v2, 0, r3 ; CHECK-AIX-64-P8-NEXT: lxsdx v3, 0, r4 ; CHECK-AIX-64-P8-NEXT: lxvw4x v4, 0, r5 @@ -1341,7 +1303,7 @@ ; CHECK-AIX-64-P9-LABEL: test_v2i64_v2i64: ; CHECK-AIX-64-P9: # %bb.0: # %entry ; CHECK-AIX-64-P9-NEXT: lxsd v2, 0(r3) -; CHECK-AIX-64-P9-NEXT: ld r3, L..C9(r2) # %const.0 +; CHECK-AIX-64-P9-NEXT: ld r3, L..C10(r2) # %const.0 ; CHECK-AIX-64-P9-NEXT: lfd f0, 0(r4) ; CHECK-AIX-64-P9-NEXT: xxlxor v3, v3, v3 ; CHECK-AIX-64-P9-NEXT: lxv vs1, 0(r3) @@ -1352,7 +1314,7 @@ ; ; CHECK-AIX-32-P8-LABEL: test_v2i64_v2i64: ; CHECK-AIX-32-P8: # %bb.0: # %entry -; CHECK-AIX-32-P8-NEXT: lwz r5, L..C10(r2) # %const.0 +; CHECK-AIX-32-P8-NEXT: lwz r5, L..C13(r2) # %const.0 ; CHECK-AIX-32-P8-NEXT: lxsiwzx v2, 0, r3 ; CHECK-AIX-32-P8-NEXT: lxsiwzx v3, 0, r4 ; CHECK-AIX-32-P8-NEXT: lxvw4x v4, 0, r5 @@ -1365,7 +1327,7 @@ ; CHECK-AIX-32-P9-LABEL: test_v2i64_v2i64: ; CHECK-AIX-32-P9: # %bb.0: # %entry ; CHECK-AIX-32-P9-NEXT: lxsiwzx v2, 0, r3 -; CHECK-AIX-32-P9-NEXT: lwz r3, L..C9(r2) # %const.0 +; CHECK-AIX-32-P9-NEXT: lwz r3, L..C12(r2) # %const.0 ; CHECK-AIX-32-P9-NEXT: lfiwzx f0, 0, r4 ; CHECK-AIX-32-P9-NEXT: xxlxor v3, v3, v3 ; CHECK-AIX-32-P9-NEXT: lxv vs1, 0(r3) @@ -1385,20 +1347,16 @@ define <16 x i8> @test_v2i64_v4i32(ptr %a, ptr %b) local_unnamed_addr { ; CHECK-LE-P8-LABEL: test_v2i64_v4i32: ; CHECK-LE-P8: # %bb.0: # %entry -; CHECK-LE-P8-NEXT: lfiwzx f0, 0, r3 -; CHECK-LE-P8-NEXT: lfdx f1, 0, r4 -; CHECK-LE-P8-NEXT: xxswapd v2, f0 -; CHECK-LE-P8-NEXT: xxswapd v3, f1 -; CHECK-LE-P8-NEXT: vmrglh v2, v2, v3 +; CHECK-LE-P8-NEXT: lxsiwzx v2, 0, r3 +; CHECK-LE-P8-NEXT: lxsdx v3, 0, r4 +; CHECK-LE-P8-NEXT: vmrghh v2, v2, v3 ; CHECK-LE-P8-NEXT: blr ; ; CHECK-LE-P9-LABEL: test_v2i64_v4i32: ; CHECK-LE-P9: # %bb.0: # %entry -; CHECK-LE-P9-NEXT: lfiwzx f0, 0, r3 -; CHECK-LE-P9-NEXT: xxswapd v2, f0 -; CHECK-LE-P9-NEXT: lfd f0, 0(r4) -; CHECK-LE-P9-NEXT: xxswapd v3, f0 -; CHECK-LE-P9-NEXT: vmrglh v2, v2, v3 +; CHECK-LE-P9-NEXT: lxsiwzx v2, 0, r3 +; CHECK-LE-P9-NEXT: lxsd v3, 0(r4) +; CHECK-LE-P9-NEXT: vmrghh v2, v2, v3 ; CHECK-LE-P9-NEXT: blr ; ; CHECK-BE-P8-LABEL: test_v2i64_v4i32: @@ -1435,7 +1393,7 @@ ; ; CHECK-AIX-32-P8-LABEL: test_v2i64_v4i32: ; CHECK-AIX-32-P8: # %bb.0: # %entry -; CHECK-AIX-32-P8-NEXT: lwz r5, L..C11(r2) # %const.0 +; CHECK-AIX-32-P8-NEXT: lwz r5, L..C14(r2) # %const.0 ; CHECK-AIX-32-P8-NEXT: lxsiwzx v2, 0, r3 ; CHECK-AIX-32-P8-NEXT: lxsiwzx v3, 0, r4 ; CHECK-AIX-32-P8-NEXT: lxvw4x v4, 0, r5 @@ -1445,7 +1403,7 @@ ; CHECK-AIX-32-P9-LABEL: test_v2i64_v4i32: ; CHECK-AIX-32-P9: # %bb.0: # %entry ; CHECK-AIX-32-P9-NEXT: lxsiwzx v2, 0, r3 -; CHECK-AIX-32-P9-NEXT: lwz r3, L..C10(r2) # %const.0 +; CHECK-AIX-32-P9-NEXT: lwz r3, L..C13(r2) # %const.0 ; CHECK-AIX-32-P9-NEXT: lfiwzx f0, 0, r4 ; CHECK-AIX-32-P9-NEXT: lxv vs1, 0(r3) ; CHECK-AIX-32-P9-NEXT: xxperm v2, vs0, vs1 @@ -1467,20 +1425,16 @@ ; CHECK-LE-P8-LABEL: test_v2i64_v8i16: ; CHECK-LE-P8: # %bb.0: # %entry ; CHECK-LE-P8-NEXT: lhz r3, 0(r3) -; CHECK-LE-P8-NEXT: lfdx f0, 0, r4 -; CHECK-LE-P8-NEXT: mtfprd f1, r3 -; CHECK-LE-P8-NEXT: xxswapd v3, f0 -; CHECK-LE-P8-NEXT: xxswapd v2, vs1 -; CHECK-LE-P8-NEXT: vmrglh v2, v2, v3 +; CHECK-LE-P8-NEXT: lxsdx v2, 0, r4 +; CHECK-LE-P8-NEXT: mtvsrd v3, r3 +; CHECK-LE-P8-NEXT: vmrghh v2, v3, v2 ; CHECK-LE-P8-NEXT: blr ; ; CHECK-LE-P9-LABEL: test_v2i64_v8i16: ; CHECK-LE-P9: # %bb.0: # %entry ; CHECK-LE-P9-NEXT: lxsihzx v2, 0, r3 -; CHECK-LE-P9-NEXT: lfd f0, 0(r4) -; CHECK-LE-P9-NEXT: xxswapd v3, f0 -; CHECK-LE-P9-NEXT: vsplth v2, v2, 3 -; CHECK-LE-P9-NEXT: vmrglh v2, v2, v3 +; CHECK-LE-P9-NEXT: lxsd v3, 0(r4) +; CHECK-LE-P9-NEXT: vmrghh v2, v2, v3 ; CHECK-LE-P9-NEXT: blr ; ; CHECK-BE-P8-LABEL: test_v2i64_v8i16: @@ -1519,26 +1473,21 @@ ; ; CHECK-AIX-32-P8-LABEL: test_v2i64_v8i16: ; CHECK-AIX-32-P8: # %bb.0: # %entry +; CHECK-AIX-32-P8-NEXT: lwz r5, L..C15(r2) # %const.0 ; CHECK-AIX-32-P8-NEXT: lhz r3, 0(r3) -; CHECK-AIX-32-P8-NEXT: sth r3, -32(r1) -; CHECK-AIX-32-P8-NEXT: lwz r3, 0(r4) -; CHECK-AIX-32-P8-NEXT: addi r4, r1, -32 -; CHECK-AIX-32-P8-NEXT: lxvw4x v2, 0, r4 -; CHECK-AIX-32-P8-NEXT: stw r3, -16(r1) -; CHECK-AIX-32-P8-NEXT: addi r3, r1, -16 -; CHECK-AIX-32-P8-NEXT: lxvw4x v3, 0, r3 -; CHECK-AIX-32-P8-NEXT: vmrghh v2, v3, v2 +; CHECK-AIX-32-P8-NEXT: lxsiwzx v2, 0, r4 +; CHECK-AIX-32-P8-NEXT: mtvsrwz v4, r3 +; CHECK-AIX-32-P8-NEXT: lxvw4x v3, 0, r5 +; CHECK-AIX-32-P8-NEXT: vperm v2, v2, v4, v3 ; CHECK-AIX-32-P8-NEXT: blr ; ; CHECK-AIX-32-P9-LABEL: test_v2i64_v8i16: ; CHECK-AIX-32-P9: # %bb.0: # %entry -; CHECK-AIX-32-P9-NEXT: lhz r3, 0(r3) -; CHECK-AIX-32-P9-NEXT: sth r3, -32(r1) -; CHECK-AIX-32-P9-NEXT: lwz r3, 0(r4) -; CHECK-AIX-32-P9-NEXT: lxv v2, -32(r1) -; CHECK-AIX-32-P9-NEXT: stw r3, -16(r1) -; CHECK-AIX-32-P9-NEXT: lxv v3, -16(r1) -; CHECK-AIX-32-P9-NEXT: vmrghh v2, v3, v2 +; CHECK-AIX-32-P9-NEXT: lxsihzx v2, 0, r3 +; CHECK-AIX-32-P9-NEXT: lwz r3, L..C14(r2) # %const.0 +; CHECK-AIX-32-P9-NEXT: lfiwzx f0, 0, r4 +; CHECK-AIX-32-P9-NEXT: lxv vs1, 0(r3) +; CHECK-AIX-32-P9-NEXT: xxperm v2, vs0, vs1 ; CHECK-AIX-32-P9-NEXT: blr entry: %0 = load <2 x i8>, ptr %a