[llvm] b820339 - [PowerPC] Support f128 under VSX
Qiu Chaofan via llvm-commits
llvm-commits at lists.llvm.org
Tue Apr 20 00:50:00 PDT 2021
Author: Qiu Chaofan
Date: 2021-04-20T15:49:52+08:00
New Revision: b8203397522fee82e5c79700b80837aed468dfad
URL: https://github.com/llvm/llvm-project/commit/b8203397522fee82e5c79700b80837aed468dfad
DIFF: https://github.com/llvm/llvm-project/commit/b8203397522fee82e5c79700b80837aed468dfad.diff
LOG: [PowerPC] Support f128 under VSX
This patch is the last one in backend to support fp128 type in
pre-POWER9 subtargets with VSX, removing temporary option and updating
remaining tests.
Reviewed By: steven.zhang
Differential Revision: https://reviews.llvm.org/D92374
Added:
Modified:
llvm/lib/Target/PowerPC/PPCISelLowering.cpp
llvm/test/CodeGen/PowerPC/f128-aggregates.ll
llvm/test/CodeGen/PowerPC/f128-arith.ll
llvm/test/CodeGen/PowerPC/f128-bitcast.ll
llvm/test/CodeGen/PowerPC/f128-compare.ll
llvm/test/CodeGen/PowerPC/f128-conv.ll
llvm/test/CodeGen/PowerPC/f128-fma.ll
llvm/test/CodeGen/PowerPC/f128-passByValue.ll
llvm/test/CodeGen/PowerPC/f128-rounding.ll
llvm/test/CodeGen/PowerPC/f128-truncateNconv.ll
llvm/test/CodeGen/PowerPC/fp-strict-conv-f128.ll
llvm/test/CodeGen/PowerPC/fp-strict-f128.ll
llvm/test/CodeGen/PowerPC/fp-strict-fcmp.ll
llvm/test/CodeGen/PowerPC/ppc64-P9-setb.ll
llvm/test/CodeGen/PowerPC/store_fptoi.ll
Removed:
################################################################################
diff --git a/llvm/lib/Target/PowerPC/PPCISelLowering.cpp b/llvm/lib/Target/PowerPC/PPCISelLowering.cpp
index d4efb2ba66517..c62fedf93fc99 100644
--- a/llvm/lib/Target/PowerPC/PPCISelLowering.cpp
+++ b/llvm/lib/Target/PowerPC/PPCISelLowering.cpp
@@ -121,11 +121,6 @@ cl::desc("don't always align innermost loop to 32 bytes on ppc"), cl::Hidden);
static cl::opt<bool> UseAbsoluteJumpTables("ppc-use-absolute-jumptables",
cl::desc("use absolute jump tables on ppc"), cl::Hidden);
-// TODO - Remove this option if soft fp128 has been fully supported .
-static cl::opt<bool>
- EnableSoftFP128("enable-soft-fp128",
- cl::desc("temp option to enable soft fp128"), cl::Hidden);
-
STATISTIC(NumTailCalls, "Number of tail calls");
STATISTIC(NumSiblingCalls, "Number of sibling calls");
STATISTIC(ShufflesHandledWithVPERM, "Number of shuffles lowered to a VPERM");
@@ -1102,6 +1097,23 @@ PPCTargetLowering::PPCTargetLowering(const PPCTargetMachine &TM,
setOperationAction(ISD::STRICT_FROUND, MVT::v2f64, Legal);
addRegisterClass(MVT::v2i64, &PPC::VSRCRegClass);
+ addRegisterClass(MVT::f128, &PPC::VRRCRegClass);
+
+ for (MVT FPT : MVT::fp_valuetypes())
+ setLoadExtAction(ISD::EXTLOAD, MVT::f128, FPT, Expand);
+
+ // Expand the SELECT to SELECT_CC
+ setOperationAction(ISD::SELECT, MVT::f128, Expand);
+
+ setTruncStoreAction(MVT::f128, MVT::f64, Expand);
+ setTruncStoreAction(MVT::f128, MVT::f32, Expand);
+
+ // No implementation for these ops for PowerPC.
+ setOperationAction(ISD::FSIN, MVT::f128, Expand);
+ setOperationAction(ISD::FCOS, MVT::f128, Expand);
+ setOperationAction(ISD::FPOW, MVT::f128, Expand);
+ setOperationAction(ISD::FPOWI, MVT::f128, Expand);
+ setOperationAction(ISD::FREM, MVT::f128, Expand);
}
if (Subtarget.hasP8Altivec()) {
@@ -1120,15 +1132,12 @@ PPCTargetLowering::PPCTargetLowering(const PPCTargetMachine &TM,
setOperationAction(ISD::SRL, MVT::v1i128, Legal);
setOperationAction(ISD::SRA, MVT::v1i128, Expand);
- addRegisterClass(MVT::f128, &PPC::VRRCRegClass);
setOperationAction(ISD::FADD, MVT::f128, Legal);
setOperationAction(ISD::FSUB, MVT::f128, Legal);
setOperationAction(ISD::FDIV, MVT::f128, Legal);
setOperationAction(ISD::FMUL, MVT::f128, Legal);
setOperationAction(ISD::FP_EXTEND, MVT::f128, Legal);
- // No extending loads to f128 on PPC.
- for (MVT FPT : MVT::fp_valuetypes())
- setLoadExtAction(ISD::EXTLOAD, MVT::f128, FPT, Expand);
+
setOperationAction(ISD::FMA, MVT::f128, Legal);
setCondCodeAction(ISD::SETULT, MVT::f128, Expand);
setCondCodeAction(ISD::SETUGT, MVT::f128, Expand);
@@ -1144,18 +1153,9 @@ PPCTargetLowering::PPCTargetLowering(const PPCTargetMachine &TM,
setOperationAction(ISD::FNEARBYINT, MVT::f128, Legal);
setOperationAction(ISD::FROUND, MVT::f128, Legal);
- setOperationAction(ISD::SELECT, MVT::f128, Expand);
setOperationAction(ISD::FP_ROUND, MVT::f64, Legal);
setOperationAction(ISD::FP_ROUND, MVT::f32, Legal);
- setTruncStoreAction(MVT::f128, MVT::f64, Expand);
- setTruncStoreAction(MVT::f128, MVT::f32, Expand);
setOperationAction(ISD::BITCAST, MVT::i128, Custom);
- // No implementation for these ops for PowerPC.
- setOperationAction(ISD::FSIN, MVT::f128, Expand);
- setOperationAction(ISD::FCOS, MVT::f128, Expand);
- setOperationAction(ISD::FPOW, MVT::f128, Expand);
- setOperationAction(ISD::FPOWI, MVT::f128, Expand);
- setOperationAction(ISD::FREM, MVT::f128, Expand);
// Handle constrained floating-point operations of fp128
setOperationAction(ISD::STRICT_FADD, MVT::f128, Legal);
@@ -1178,12 +1178,7 @@ PPCTargetLowering::PPCTargetLowering(const PPCTargetMachine &TM,
setOperationAction(ISD::BSWAP, MVT::v4i32, Legal);
setOperationAction(ISD::BSWAP, MVT::v2i64, Legal);
setOperationAction(ISD::BSWAP, MVT::v1i128, Legal);
- } else if (Subtarget.hasAltivec() && EnableSoftFP128) {
- addRegisterClass(MVT::f128, &PPC::VRRCRegClass);
-
- for (MVT FPT : MVT::fp_valuetypes())
- setLoadExtAction(ISD::EXTLOAD, MVT::f128, FPT, Expand);
-
+ } else if (Subtarget.hasVSX()) {
setOperationAction(ISD::LOAD, MVT::f128, Promote);
setOperationAction(ISD::STORE, MVT::f128, Promote);
@@ -1199,18 +1194,10 @@ PPCTargetLowering::PPCTargetLowering(const PPCTargetMachine &TM,
setOperationAction(ISD::FDIV, MVT::f128, Expand);
setOperationAction(ISD::FNEG, MVT::f128, Expand);
setOperationAction(ISD::FABS, MVT::f128, Expand);
- setOperationAction(ISD::FSIN, MVT::f128, Expand);
- setOperationAction(ISD::FCOS, MVT::f128, Expand);
- setOperationAction(ISD::FPOW, MVT::f128, Expand);
- setOperationAction(ISD::FPOWI, MVT::f128, Expand);
- setOperationAction(ISD::FREM, MVT::f128, Expand);
setOperationAction(ISD::FSQRT, MVT::f128, Expand);
setOperationAction(ISD::FMA, MVT::f128, Expand);
setOperationAction(ISD::FCOPYSIGN, MVT::f128, Expand);
- setTruncStoreAction(MVT::f128, MVT::f64, Expand);
- setTruncStoreAction(MVT::f128, MVT::f32, Expand);
-
// Expand the fp_extend if the target type is fp128.
setOperationAction(ISD::FP_EXTEND, MVT::f128, Expand);
setOperationAction(ISD::STRICT_FP_EXTEND, MVT::f128, Expand);
@@ -14132,6 +14119,9 @@ SDValue PPCTargetLowering::combineStoreFPToInt(SDNode *N,
(Op1VT == MVT::i32 || Op1VT == MVT::i64 ||
(Subtarget.hasP9Vector() && (Op1VT == MVT::i16 || Op1VT == MVT::i8)));
+ if (ResVT == MVT::f128 && !Subtarget.hasP9Vector())
+ return SDValue();
+
if (ResVT == MVT::ppcf128 || !Subtarget.hasP8Vector() ||
cast<StoreSDNode>(N)->isTruncatingStore() || !ValidTypeForStoreFltAsInt)
return SDValue();
diff --git a/llvm/test/CodeGen/PowerPC/f128-aggregates.ll b/llvm/test/CodeGen/PowerPC/f128-aggregates.ll
index 0a23f7ad460d6..0172042a044ce 100644
--- a/llvm/test/CodeGen/PowerPC/f128-aggregates.ll
+++ b/llvm/test/CodeGen/PowerPC/f128-aggregates.ll
@@ -30,9 +30,8 @@ define fp128 @testArray_01(fp128* nocapture readonly %sa) {
;
; CHECK-P8-LABEL: testArray_01:
; CHECK-P8: # %bb.0: # %entry
-; CHECK-P8-NEXT: ld r5, 32(r3)
-; CHECK-P8-NEXT: ld r4, 40(r3)
-; CHECK-P8-NEXT: mr r3, r5
+; CHECK-P8-NEXT: addi r3, r3, 32
+; CHECK-P8-NEXT: lvx v2, 0, r3
; CHECK-P8-NEXT: blr
entry:
@@ -60,9 +59,9 @@ define fp128 @testArray_02() {
; CHECK-P8-LABEL: testArray_02:
; CHECK-P8: # %bb.0: # %entry
; CHECK-P8-NEXT: addis r3, r2, .LC0 at toc@ha
-; CHECK-P8-NEXT: ld r4, .LC0 at toc@l(r3)
-; CHECK-P8-NEXT: ld r3, 32(r4)
-; CHECK-P8-NEXT: ld r4, 40(r4)
+; CHECK-P8-NEXT: ld r3, .LC0 at toc@l(r3)
+; CHECK-P8-NEXT: addi r3, r3, 32
+; CHECK-P8-NEXT: lvx v2, 0, r3
; CHECK-P8-NEXT: blr
entry:
@@ -103,8 +102,7 @@ define fp128 @testStruct_02([8 x fp128] %a.coerce) {
;
; CHECK-P8-LABEL: testStruct_02:
; CHECK-P8: # %bb.0: # %entry
-; CHECK-P8-NEXT: ld r3, 144(r1)
-; CHECK-P8-NEXT: ld r4, 152(r1)
+; CHECK-P8-NEXT: vmr v2, v9
; CHECK-P8-NEXT: blr
entry:
@@ -144,14 +142,13 @@ define fp128 @testStruct_03(%struct.With9fp128params* byval(%struct.With9fp128pa
;
; CHECK-P8-LABEL: testStruct_03:
; CHECK-P8: # %bb.0: # %entry
-; CHECK-P8-NEXT: ld r11, 128(r1)
-; CHECK-P8-NEXT: ld r12, 136(r1)
+; CHECK-P8-NEXT: li r11, 96
+; CHECK-P8-NEXT: addi r12, r1, 32
; CHECK-P8-NEXT: std r3, 32(r1)
; CHECK-P8-NEXT: std r4, 40(r1)
; CHECK-P8-NEXT: std r5, 48(r1)
; CHECK-P8-NEXT: std r6, 56(r1)
-; CHECK-P8-NEXT: mr r3, r11
-; CHECK-P8-NEXT: mr r4, r12
+; CHECK-P8-NEXT: lvx v2, r12, r11
; CHECK-P8-NEXT: std r7, 64(r1)
; CHECK-P8-NEXT: std r8, 72(r1)
; CHECK-P8-NEXT: std r9, 80(r1)
@@ -179,8 +176,7 @@ define fp128 @testStruct_04([8 x fp128] %a.coerce) {
;
; CHECK-P8-LABEL: testStruct_04:
; CHECK-P8: # %bb.0: # %entry
-; CHECK-P8-NEXT: mr r4, r10
-; CHECK-P8-NEXT: mr r3, r9
+; CHECK-P8-NEXT: vmr v2, v5
; CHECK-P8-NEXT: blr
entry:
@@ -240,8 +236,7 @@ define fp128 @testHUnion_03([3 x fp128] %a.coerce) {
;
; CHECK-P8-LABEL: testHUnion_03:
; CHECK-P8: # %bb.0: # %entry
-; CHECK-P8-NEXT: mr r4, r6
-; CHECK-P8-NEXT: mr r3, r5
+; CHECK-P8-NEXT: vmr v2, v3
; CHECK-P8-NEXT: blr
entry:
@@ -263,8 +258,7 @@ define fp128 @testHUnion_04([3 x fp128] %a.coerce) {
;
; CHECK-P8-LABEL: testHUnion_04:
; CHECK-P8: # %bb.0: # %entry
-; CHECK-P8-NEXT: mr r4, r8
-; CHECK-P8-NEXT: mr r3, r7
+; CHECK-P8-NEXT: vmr v2, v4
; CHECK-P8-NEXT: blr
entry:
@@ -291,8 +285,10 @@ define fp128 @testMixedAggregate([3 x i128] %a.coerce) {
;
; CHECK-P8-LABEL: testMixedAggregate:
; CHECK-P8: # %bb.0: # %entry
-; CHECK-P8-NEXT: mr r4, r8
-; CHECK-P8-NEXT: mr r3, r7
+; CHECK-P8-NEXT: addi r3, r1, -16
+; CHECK-P8-NEXT: std r8, -8(r1)
+; CHECK-P8-NEXT: std r7, -16(r1)
+; CHECK-P8-NEXT: lvx v2, 0, r3
; CHECK-P8-NEXT: blr
entry:
@@ -315,8 +311,10 @@ define fp128 @testMixedAggregate_02([4 x i128] %a.coerce) {
;
; CHECK-P8-LABEL: testMixedAggregate_02:
; CHECK-P8: # %bb.0: # %entry
-; CHECK-P8-NEXT: mr r4, r6
-; CHECK-P8-NEXT: mr r3, r5
+; CHECK-P8-NEXT: addi r3, r1, -16
+; CHECK-P8-NEXT: std r6, -8(r1)
+; CHECK-P8-NEXT: std r5, -16(r1)
+; CHECK-P8-NEXT: lvx v2, 0, r3
; CHECK-P8-NEXT: blr
entry:
@@ -352,44 +350,40 @@ define fp128 @testMixedAggregate_03([4 x i128] %sa.coerce) {
; CHECK-P8-LABEL: testMixedAggregate_03:
; CHECK-P8: # %bb.0: # %entry
; CHECK-P8-NEXT: mflr r0
-; CHECK-P8-NEXT: .cfi_def_cfa_offset 64
+; CHECK-P8-NEXT: std r0, 16(r1)
+; CHECK-P8-NEXT: stdu r1, -96(r1)
+; CHECK-P8-NEXT: .cfi_def_cfa_offset 96
; CHECK-P8-NEXT: .cfi_offset lr, 16
-; CHECK-P8-NEXT: .cfi_offset r28, -32
-; CHECK-P8-NEXT: .cfi_offset r29, -24
; CHECK-P8-NEXT: .cfi_offset r30, -16
-; CHECK-P8-NEXT: std r28, -32(r1) # 8-byte Folded Spill
-; CHECK-P8-NEXT: std r29, -24(r1) # 8-byte Folded Spill
-; CHECK-P8-NEXT: std r30, -16(r1) # 8-byte Folded Spill
-; CHECK-P8-NEXT: std r0, 16(r1)
-; CHECK-P8-NEXT: stdu r1, -64(r1)
+; CHECK-P8-NEXT: .cfi_offset v31, -32
+; CHECK-P8-NEXT: li r4, 64
+; CHECK-P8-NEXT: std r30, 80(r1) # 8-byte Folded Spill
; CHECK-P8-NEXT: extsw r3, r3
; CHECK-P8-NEXT: mr r30, r10
-; CHECK-P8-NEXT: mr r29, r6
-; CHECK-P8-NEXT: mr r28, r5
+; CHECK-P8-NEXT: stvx v31, r1, r4 # 16-byte Folded Spill
+; CHECK-P8-NEXT: addi r4, r1, 48
+; CHECK-P8-NEXT: std r6, 56(r1)
+; CHECK-P8-NEXT: std r5, 48(r1)
+; CHECK-P8-NEXT: lvx v31, 0, r4
; CHECK-P8-NEXT: bl __floatsikf
; CHECK-P8-NEXT: nop
-; CHECK-P8-NEXT: mr r5, r3
-; CHECK-P8-NEXT: mr r6, r4
-; CHECK-P8-NEXT: mr r3, r28
-; CHECK-P8-NEXT: mr r4, r29
+; CHECK-P8-NEXT: vmr v3, v2
+; CHECK-P8-NEXT: vmr v2, v31
; CHECK-P8-NEXT: bl __addkf3
; CHECK-P8-NEXT: nop
-; CHECK-P8-NEXT: mr r29, r3
; CHECK-P8-NEXT: mr r3, r30
-; CHECK-P8-NEXT: mr r28, r4
+; CHECK-P8-NEXT: vmr v31, v2
; CHECK-P8-NEXT: bl __floatdikf
; CHECK-P8-NEXT: nop
-; CHECK-P8-NEXT: mr r5, r3
-; CHECK-P8-NEXT: mr r6, r4
-; CHECK-P8-NEXT: mr r3, r29
-; CHECK-P8-NEXT: mr r4, r28
+; CHECK-P8-NEXT: vmr v3, v2
+; CHECK-P8-NEXT: vmr v2, v31
; CHECK-P8-NEXT: bl __addkf3
; CHECK-P8-NEXT: nop
-; CHECK-P8-NEXT: addi r1, r1, 64
+; CHECK-P8-NEXT: li r3, 64
+; CHECK-P8-NEXT: ld r30, 80(r1) # 8-byte Folded Reload
+; CHECK-P8-NEXT: lvx v31, r1, r3 # 16-byte Folded Reload
+; CHECK-P8-NEXT: addi r1, r1, 96
; CHECK-P8-NEXT: ld r0, 16(r1)
-; CHECK-P8-NEXT: ld r30, -16(r1) # 8-byte Folded Reload
-; CHECK-P8-NEXT: ld r29, -24(r1) # 8-byte Folded Reload
-; CHECK-P8-NEXT: ld r28, -32(r1) # 8-byte Folded Reload
; CHECK-P8-NEXT: mtlr r0
; CHECK-P8-NEXT: blr
entry:
@@ -438,16 +432,17 @@ define fp128 @testNestedAggregate(%struct.MixedC* byval(%struct.MixedC) nocaptur
;
; CHECK-P8-LABEL: testNestedAggregate:
; CHECK-P8: # %bb.0: # %entry
-; CHECK-P8-NEXT: std r3, 32(r1)
-; CHECK-P8-NEXT: std r4, 40(r1)
-; CHECK-P8-NEXT: mr r3, r7
-; CHECK-P8-NEXT: mr r4, r8
+; CHECK-P8-NEXT: li r11, 32
; CHECK-P8-NEXT: std r8, 72(r1)
; CHECK-P8-NEXT: std r7, 64(r1)
-; CHECK-P8-NEXT: std r5, 48(r1)
-; CHECK-P8-NEXT: std r6, 56(r1)
; CHECK-P8-NEXT: std r9, 80(r1)
; CHECK-P8-NEXT: std r10, 88(r1)
+; CHECK-P8-NEXT: addi r7, r1, 32
+; CHECK-P8-NEXT: lvx v2, r7, r11
+; CHECK-P8-NEXT: std r3, 32(r1)
+; CHECK-P8-NEXT: std r4, 40(r1)
+; CHECK-P8-NEXT: std r5, 48(r1)
+; CHECK-P8-NEXT: std r6, 56(r1)
; CHECK-P8-NEXT: blr
entry:
@@ -470,6 +465,10 @@ define fp128 @testUnion_01([1 x i128] %a.coerce) {
;
; CHECK-P8-LABEL: testUnion_01:
; CHECK-P8: # %bb.0: # %entry
+; CHECK-P8-NEXT: addi r5, r1, -16
+; CHECK-P8-NEXT: std r4, -8(r1)
+; CHECK-P8-NEXT: std r3, -16(r1)
+; CHECK-P8-NEXT: lvx v2, 0, r5
; CHECK-P8-NEXT: blr
entry:
@@ -492,6 +491,10 @@ define fp128 @testUnion_02([1 x i128] %a.coerce) {
;
; CHECK-P8-LABEL: testUnion_02:
; CHECK-P8: # %bb.0: # %entry
+; CHECK-P8-NEXT: addi r5, r1, -16
+; CHECK-P8-NEXT: std r4, -8(r1)
+; CHECK-P8-NEXT: std r3, -16(r1)
+; CHECK-P8-NEXT: lvx v2, 0, r5
; CHECK-P8-NEXT: blr
entry:
@@ -514,8 +517,10 @@ define fp128 @testUnion_03([4 x i128] %a.coerce) {
;
; CHECK-P8-LABEL: testUnion_03:
; CHECK-P8: # %bb.0: # %entry
-; CHECK-P8-NEXT: mr r4, r8
-; CHECK-P8-NEXT: mr r3, r7
+; CHECK-P8-NEXT: addi r3, r1, -16
+; CHECK-P8-NEXT: std r8, -8(r1)
+; CHECK-P8-NEXT: std r7, -16(r1)
+; CHECK-P8-NEXT: lvx v2, 0, r3
; CHECK-P8-NEXT: blr
entry:
@@ -577,39 +582,44 @@ define fp128 @sum_float128(i32 signext %count, ...) {
; CHECK-P8-LABEL: sum_float128:
; CHECK-P8: # %bb.0: # %entry
; CHECK-P8-NEXT: mflr r0
-; CHECK-P8-NEXT: std r0, 16(r1)
-; CHECK-P8-NEXT: stdu r1, -48(r1)
-; CHECK-P8-NEXT: .cfi_def_cfa_offset 48
+; CHECK-P8-NEXT: .cfi_def_cfa_offset 64
; CHECK-P8-NEXT: .cfi_offset lr, 16
+; CHECK-P8-NEXT: .cfi_offset r30, -16
+; CHECK-P8-NEXT: std r30, -16(r1) # 8-byte Folded Spill
+; CHECK-P8-NEXT: std r0, 16(r1)
+; CHECK-P8-NEXT: stdu r1, -64(r1)
+; CHECK-P8-NEXT: addis r11, r2, .LCPI17_0 at toc@ha
; CHECK-P8-NEXT: cmpwi r3, 1
-; CHECK-P8-NEXT: std r4, 88(r1)
-; CHECK-P8-NEXT: std r5, 96(r1)
-; CHECK-P8-NEXT: std r6, 104(r1)
-; CHECK-P8-NEXT: std r7, 112(r1)
-; CHECK-P8-NEXT: std r8, 120(r1)
-; CHECK-P8-NEXT: std r9, 128(r1)
-; CHECK-P8-NEXT: std r10, 136(r1)
+; CHECK-P8-NEXT: std r4, 104(r1)
+; CHECK-P8-NEXT: std r5, 112(r1)
+; CHECK-P8-NEXT: std r6, 120(r1)
+; CHECK-P8-NEXT: std r7, 128(r1)
+; CHECK-P8-NEXT: addi r3, r11, .LCPI17_0 at toc@l
+; CHECK-P8-NEXT: std r8, 136(r1)
+; CHECK-P8-NEXT: std r9, 144(r1)
+; CHECK-P8-NEXT: std r10, 152(r1)
; CHECK-P8-NEXT: blt cr0, .LBB17_2
; CHECK-P8-NEXT: # %bb.1: # %if.end
-; CHECK-P8-NEXT: ld r3, 88(r1)
-; CHECK-P8-NEXT: ld r4, 96(r1)
-; CHECK-P8-NEXT: li r5, 0
-; CHECK-P8-NEXT: li r6, 0
+; CHECK-P8-NEXT: addi r30, r1, 104
+; CHECK-P8-NEXT: lvx v3, 0, r3
+; CHECK-P8-NEXT: lxvd2x vs0, 0, r30
+; CHECK-P8-NEXT: xxswapd v2, vs0
; CHECK-P8-NEXT: bl __addkf3
; CHECK-P8-NEXT: nop
-; CHECK-P8-NEXT: ld r5, 104(r1)
-; CHECK-P8-NEXT: ld r6, 112(r1)
-; CHECK-P8-NEXT: addi r7, r1, 120
-; CHECK-P8-NEXT: std r7, 40(r1)
+; CHECK-P8-NEXT: li r3, 16
+; CHECK-P8-NEXT: lxvd2x vs0, r30, r3
+; CHECK-P8-NEXT: addi r3, r1, 136
+; CHECK-P8-NEXT: std r3, 40(r1)
+; CHECK-P8-NEXT: xxswapd v3, vs0
; CHECK-P8-NEXT: bl __addkf3
; CHECK-P8-NEXT: nop
; CHECK-P8-NEXT: b .LBB17_3
; CHECK-P8-NEXT: .LBB17_2:
-; CHECK-P8-NEXT: li r3, 0
-; CHECK-P8-NEXT: li r4, 0
+; CHECK-P8-NEXT: lvx v2, 0, r3
; CHECK-P8-NEXT: .LBB17_3: # %cleanup
-; CHECK-P8-NEXT: addi r1, r1, 48
+; CHECK-P8-NEXT: addi r1, r1, 64
; CHECK-P8-NEXT: ld r0, 16(r1)
+; CHECK-P8-NEXT: ld r30, -16(r1) # 8-byte Folded Reload
; CHECK-P8-NEXT: mtlr r0
; CHECK-P8-NEXT: blr
entry:
diff --git a/llvm/test/CodeGen/PowerPC/f128-arith.ll b/llvm/test/CodeGen/PowerPC/f128-arith.ll
index fa8463f5e1841..be6c1ea585d95 100644
--- a/llvm/test/CodeGen/PowerPC/f128-arith.ll
+++ b/llvm/test/CodeGen/PowerPC/f128-arith.ll
@@ -2,7 +2,7 @@
; RUN: llc -mcpu=pwr9 -mtriple=powerpc64le-unknown-unknown -verify-machineinstrs \
; RUN: -ppc-asm-full-reg-names -ppc-vsr-nums-as-vr < %s | FileCheck %s
; RUN: llc -mcpu=pwr8 -mtriple=powerpc64le-unknown-unknown -verify-machineinstrs \
-; RUN: -ppc-asm-full-reg-names -ppc-vsr-nums-as-vr < %s -enable-soft-fp128 | FileCheck %s \
+; RUN: -ppc-asm-full-reg-names -ppc-vsr-nums-as-vr < %s | FileCheck %s \
; RUN: -check-prefix=CHECK-P8
; Function Attrs: norecurse nounwind
diff --git a/llvm/test/CodeGen/PowerPC/f128-bitcast.ll b/llvm/test/CodeGen/PowerPC/f128-bitcast.ll
index 01cbd1a424190..f412fc36ecc9a 100644
--- a/llvm/test/CodeGen/PowerPC/f128-bitcast.ll
+++ b/llvm/test/CodeGen/PowerPC/f128-bitcast.ll
@@ -22,6 +22,8 @@ define i64 @getPart1(fp128 %in) local_unnamed_addr {
;
; CHECK-P8-LABEL: getPart1:
; CHECK-P8: # %bb.0: # %entry
+; CHECK-P8-NEXT: xxswapd vs0, v2
+; CHECK-P8-NEXT: mffprd r3, f0
; CHECK-P8-NEXT: blr
entry:
%0 = bitcast fp128 %in to i128
@@ -43,7 +45,7 @@ define i64 @getPart2(fp128 %in) local_unnamed_addr {
;
; CHECK-P8-LABEL: getPart2:
; CHECK-P8: # %bb.0: # %entry
-; CHECK-P8-NEXT: mr r3, r4
+; CHECK-P8-NEXT: mfvsrd r3, v2
; CHECK-P8-NEXT: blr
entry:
%0 = bitcast fp128 %in to i128
@@ -70,11 +72,8 @@ define i64 @checkBitcast(fp128 %in, <2 x i64> %in2, <2 x i64> *%out) local_unnam
;
; CHECK-P8-LABEL: checkBitcast:
; CHECK-P8: # %bb.0: # %entry
-; CHECK-P8-NEXT: mtfprd f0, r3
-; CHECK-P8-NEXT: mtfprd f1, r4
-; CHECK-P8-NEXT: xxmrghd v3, vs1, vs0
-; CHECK-P8-NEXT: xxswapd vs0, v3
-; CHECK-P8-NEXT: vaddudm v2, v3, v2
+; CHECK-P8-NEXT: xxswapd vs0, v2
+; CHECK-P8-NEXT: vaddudm v2, v2, v3
; CHECK-P8-NEXT: mffprd r3, f0
; CHECK-P8-NEXT: xxswapd vs0, v2
; CHECK-P8-NEXT: stxvd2x vs0, 0, r7
diff --git a/llvm/test/CodeGen/PowerPC/f128-compare.ll b/llvm/test/CodeGen/PowerPC/f128-compare.ll
index 869b5182b3a84..f27a4dacfdecc 100644
--- a/llvm/test/CodeGen/PowerPC/f128-compare.ll
+++ b/llvm/test/CodeGen/PowerPC/f128-compare.ll
@@ -2,7 +2,7 @@
; RUN: llc -mcpu=pwr9 -mtriple=powerpc64le-unknown-unknown -verify-machineinstrs \
; RUN: -ppc-asm-full-reg-names -ppc-vsr-nums-as-vr < %s | FileCheck %s
; RUN: llc -mcpu=pwr8 -mtriple=powerpc64le-unknown-unknown -verify-machineinstrs \
-; RUN: -enable-soft-fp128 -ppc-asm-full-reg-names -ppc-vsr-nums-as-vr < %s | FileCheck %s \
+; RUN: -ppc-asm-full-reg-names -ppc-vsr-nums-as-vr < %s | FileCheck %s \
; RUN: -check-prefix=CHECK-P8
@a_qp = common dso_local global fp128 0xL00000000000000000000000000000000, align 16
diff --git a/llvm/test/CodeGen/PowerPC/f128-conv.ll b/llvm/test/CodeGen/PowerPC/f128-conv.ll
index a6bc5d47987bc..2e34bb606dda3 100644
--- a/llvm/test/CodeGen/PowerPC/f128-conv.ll
+++ b/llvm/test/CodeGen/PowerPC/f128-conv.ll
@@ -4,7 +4,7 @@
; RUN: | FileCheck %s
; RUN: llc -relocation-model=pic -mcpu=pwr8 -mtriple=powerpc64le-unknown-unknown \
; RUN: -ppc-vsr-nums-as-vr -verify-machineinstrs -ppc-asm-full-reg-names < %s \
-; RUN: -enable-soft-fp128 | FileCheck %s -check-prefix=CHECK-P8
+; RUN: | FileCheck %s -check-prefix=CHECK-P8
@mem = global [5 x i64] [i64 56, i64 63, i64 3, i64 5, i64 6], align 8
@umem = global [5 x i64] [i64 560, i64 100, i64 34, i64 2, i64 5], align 8
diff --git a/llvm/test/CodeGen/PowerPC/f128-fma.ll b/llvm/test/CodeGen/PowerPC/f128-fma.ll
index 7f49bcc38157b..048711820c0fb 100644
--- a/llvm/test/CodeGen/PowerPC/f128-fma.ll
+++ b/llvm/test/CodeGen/PowerPC/f128-fma.ll
@@ -18,40 +18,30 @@ define void @qpFmadd(fp128* nocapture readonly %a, fp128* nocapture %b,
; CHECK-P8-LABEL: qpFmadd:
; CHECK-P8: # %bb.0: # %entry
; CHECK-P8-NEXT: mflr r0
-; CHECK-P8-NEXT: .cfi_def_cfa_offset 64
+; CHECK-P8-NEXT: std r0, 16(r1)
+; CHECK-P8-NEXT: stdu r1, -80(r1)
+; CHECK-P8-NEXT: .cfi_def_cfa_offset 80
; CHECK-P8-NEXT: .cfi_offset lr, 16
-; CHECK-P8-NEXT: .cfi_offset r28, -32
-; CHECK-P8-NEXT: .cfi_offset r29, -24
; CHECK-P8-NEXT: .cfi_offset r30, -16
-; CHECK-P8-NEXT: std r28, -32(r1) # 8-byte Folded Spill
-; CHECK-P8-NEXT: std r29, -24(r1) # 8-byte Folded Spill
-; CHECK-P8-NEXT: std r30, -16(r1) # 8-byte Folded Spill
-; CHECK-P8-NEXT: std r0, 16(r1)
-; CHECK-P8-NEXT: stdu r1, -64(r1)
-; CHECK-P8-NEXT: ld r7, 0(r3)
-; CHECK-P8-NEXT: ld r8, 8(r3)
-; CHECK-P8-NEXT: ld r9, 0(r4)
-; CHECK-P8-NEXT: ld r10, 8(r4)
-; CHECK-P8-NEXT: mr r28, r6
-; CHECK-P8-NEXT: ld r30, 0(r5)
-; CHECK-P8-NEXT: ld r29, 8(r5)
-; CHECK-P8-NEXT: mr r3, r7
-; CHECK-P8-NEXT: mr r4, r8
-; CHECK-P8-NEXT: mr r5, r9
-; CHECK-P8-NEXT: mr r6, r10
+; CHECK-P8-NEXT: .cfi_offset v31, -32
+; CHECK-P8-NEXT: li r7, 48
+; CHECK-P8-NEXT: lvx v2, 0, r3
+; CHECK-P8-NEXT: lvx v3, 0, r4
+; CHECK-P8-NEXT: std r30, 64(r1) # 8-byte Folded Spill
+; CHECK-P8-NEXT: mr r30, r6
+; CHECK-P8-NEXT: stvx v31, r1, r7 # 16-byte Folded Spill
+; CHECK-P8-NEXT: lvx v31, 0, r5
; CHECK-P8-NEXT: bl __mulkf3
; CHECK-P8-NEXT: nop
-; CHECK-P8-NEXT: mr r5, r30
-; CHECK-P8-NEXT: mr r6, r29
+; CHECK-P8-NEXT: vmr v3, v31
; CHECK-P8-NEXT: bl __addkf3
; CHECK-P8-NEXT: nop
-; CHECK-P8-NEXT: std r3, 0(r28)
-; CHECK-P8-NEXT: std r4, 8(r28)
-; CHECK-P8-NEXT: addi r1, r1, 64
+; CHECK-P8-NEXT: li r3, 48
+; CHECK-P8-NEXT: stvx v2, 0, r30
+; CHECK-P8-NEXT: ld r30, 64(r1) # 8-byte Folded Reload
+; CHECK-P8-NEXT: lvx v31, r1, r3 # 16-byte Folded Reload
+; CHECK-P8-NEXT: addi r1, r1, 80
; CHECK-P8-NEXT: ld r0, 16(r1)
-; CHECK-P8-NEXT: ld r30, -16(r1) # 8-byte Folded Reload
-; CHECK-P8-NEXT: ld r29, -24(r1) # 8-byte Folded Reload
-; CHECK-P8-NEXT: ld r28, -32(r1) # 8-byte Folded Reload
; CHECK-P8-NEXT: mtlr r0
; CHECK-P8-NEXT: blr
fp128* nocapture readonly %c, fp128* nocapture %res) {
@@ -79,40 +69,31 @@ define void @qpFmadd_02(fp128* nocapture readonly %a,
; CHECK-P8-LABEL: qpFmadd_02:
; CHECK-P8: # %bb.0: # %entry
; CHECK-P8-NEXT: mflr r0
-; CHECK-P8-NEXT: .cfi_def_cfa_offset 64
+; CHECK-P8-NEXT: std r0, 16(r1)
+; CHECK-P8-NEXT: stdu r1, -80(r1)
+; CHECK-P8-NEXT: .cfi_def_cfa_offset 80
; CHECK-P8-NEXT: .cfi_offset lr, 16
-; CHECK-P8-NEXT: .cfi_offset r28, -32
-; CHECK-P8-NEXT: .cfi_offset r29, -24
; CHECK-P8-NEXT: .cfi_offset r30, -16
-; CHECK-P8-NEXT: std r28, -32(r1) # 8-byte Folded Spill
-; CHECK-P8-NEXT: std r29, -24(r1) # 8-byte Folded Spill
-; CHECK-P8-NEXT: std r30, -16(r1) # 8-byte Folded Spill
-; CHECK-P8-NEXT: std r0, 16(r1)
-; CHECK-P8-NEXT: stdu r1, -64(r1)
-; CHECK-P8-NEXT: ld r7, 0(r5)
-; CHECK-P8-NEXT: ld r8, 8(r5)
-; CHECK-P8-NEXT: ld r30, 0(r3)
-; CHECK-P8-NEXT: ld r29, 8(r3)
-; CHECK-P8-NEXT: mr r28, r6
-; CHECK-P8-NEXT: ld r3, 0(r4)
-; CHECK-P8-NEXT: ld r4, 8(r4)
-; CHECK-P8-NEXT: mr r5, r7
-; CHECK-P8-NEXT: mr r6, r8
+; CHECK-P8-NEXT: .cfi_offset v31, -32
+; CHECK-P8-NEXT: li r7, 48
+; CHECK-P8-NEXT: lvx v2, 0, r4
+; CHECK-P8-NEXT: lvx v3, 0, r5
+; CHECK-P8-NEXT: std r30, 64(r1) # 8-byte Folded Spill
+; CHECK-P8-NEXT: mr r30, r6
+; CHECK-P8-NEXT: stvx v31, r1, r7 # 16-byte Folded Spill
+; CHECK-P8-NEXT: lvx v31, 0, r3
; CHECK-P8-NEXT: bl __mulkf3
; CHECK-P8-NEXT: nop
-; CHECK-P8-NEXT: mr r5, r3
-; CHECK-P8-NEXT: mr r6, r4
-; CHECK-P8-NEXT: mr r3, r30
-; CHECK-P8-NEXT: mr r4, r29
+; CHECK-P8-NEXT: vmr v3, v2
+; CHECK-P8-NEXT: vmr v2, v31
; CHECK-P8-NEXT: bl __addkf3
; CHECK-P8-NEXT: nop
-; CHECK-P8-NEXT: std r3, 0(r28)
-; CHECK-P8-NEXT: std r4, 8(r28)
-; CHECK-P8-NEXT: addi r1, r1, 64
+; CHECK-P8-NEXT: li r3, 48
+; CHECK-P8-NEXT: stvx v2, 0, r30
+; CHECK-P8-NEXT: ld r30, 64(r1) # 8-byte Folded Reload
+; CHECK-P8-NEXT: lvx v31, r1, r3 # 16-byte Folded Reload
+; CHECK-P8-NEXT: addi r1, r1, 80
; CHECK-P8-NEXT: ld r0, 16(r1)
-; CHECK-P8-NEXT: ld r30, -16(r1) # 8-byte Folded Reload
-; CHECK-P8-NEXT: ld r29, -24(r1) # 8-byte Folded Reload
-; CHECK-P8-NEXT: ld r28, -32(r1) # 8-byte Folded Reload
; CHECK-P8-NEXT: mtlr r0
; CHECK-P8-NEXT: blr
fp128* nocapture readonly %b,
@@ -149,23 +130,16 @@ define void @qpFmadd_03(fp128* nocapture readonly %a,
; CHECK-P8-NEXT: std r30, -16(r1) # 8-byte Folded Spill
; CHECK-P8-NEXT: std r0, 16(r1)
; CHECK-P8-NEXT: stdu r1, -64(r1)
-; CHECK-P8-NEXT: ld r9, 0(r3)
-; CHECK-P8-NEXT: ld r7, 8(r3)
-; CHECK-P8-NEXT: ld r8, 0(r4)
+; CHECK-P8-NEXT: lvx v2, 0, r3
+; CHECK-P8-NEXT: lvx v3, 0, r4
; CHECK-P8-NEXT: mr r30, r6
-; CHECK-P8-NEXT: ld r6, 8(r4)
; CHECK-P8-NEXT: mr r29, r5
-; CHECK-P8-NEXT: mr r3, r9
-; CHECK-P8-NEXT: mr r4, r7
-; CHECK-P8-NEXT: mr r5, r8
; CHECK-P8-NEXT: bl __mulkf3
; CHECK-P8-NEXT: nop
-; CHECK-P8-NEXT: ld r5, 0(r29)
-; CHECK-P8-NEXT: ld r6, 8(r29)
+; CHECK-P8-NEXT: lvx v3, 0, r29
; CHECK-P8-NEXT: bl __addkf3
; CHECK-P8-NEXT: nop
-; CHECK-P8-NEXT: std r3, 0(r30)
-; CHECK-P8-NEXT: std r4, 8(r30)
+; CHECK-P8-NEXT: stvx v2, 0, r30
; CHECK-P8-NEXT: addi r1, r1, 64
; CHECK-P8-NEXT: ld r0, 16(r1)
; CHECK-P8-NEXT: ld r30, -16(r1) # 8-byte Folded Reload
@@ -198,43 +172,37 @@ define void @qpFnmadd(fp128* nocapture readonly %a,
; CHECK-P8-LABEL: qpFnmadd:
; CHECK-P8: # %bb.0: # %entry
; CHECK-P8-NEXT: mflr r0
-; CHECK-P8-NEXT: .cfi_def_cfa_offset 64
+; CHECK-P8-NEXT: std r0, 16(r1)
+; CHECK-P8-NEXT: stdu r1, -96(r1)
+; CHECK-P8-NEXT: .cfi_def_cfa_offset 96
; CHECK-P8-NEXT: .cfi_offset lr, 16
-; CHECK-P8-NEXT: .cfi_offset r28, -32
-; CHECK-P8-NEXT: .cfi_offset r29, -24
; CHECK-P8-NEXT: .cfi_offset r30, -16
-; CHECK-P8-NEXT: std r28, -32(r1) # 8-byte Folded Spill
-; CHECK-P8-NEXT: std r29, -24(r1) # 8-byte Folded Spill
-; CHECK-P8-NEXT: std r30, -16(r1) # 8-byte Folded Spill
-; CHECK-P8-NEXT: std r0, 16(r1)
-; CHECK-P8-NEXT: stdu r1, -64(r1)
-; CHECK-P8-NEXT: ld r7, 0(r5)
-; CHECK-P8-NEXT: ld r8, 8(r5)
-; CHECK-P8-NEXT: ld r30, 0(r3)
-; CHECK-P8-NEXT: ld r29, 8(r3)
-; CHECK-P8-NEXT: mr r28, r6
-; CHECK-P8-NEXT: ld r3, 0(r4)
-; CHECK-P8-NEXT: ld r4, 8(r4)
-; CHECK-P8-NEXT: mr r5, r7
-; CHECK-P8-NEXT: mr r6, r8
+; CHECK-P8-NEXT: .cfi_offset v31, -32
+; CHECK-P8-NEXT: li r7, 64
+; CHECK-P8-NEXT: lvx v2, 0, r4
+; CHECK-P8-NEXT: lvx v3, 0, r5
+; CHECK-P8-NEXT: std r30, 80(r1) # 8-byte Folded Spill
+; CHECK-P8-NEXT: mr r30, r6
+; CHECK-P8-NEXT: stvx v31, r1, r7 # 16-byte Folded Spill
+; CHECK-P8-NEXT: lvx v31, 0, r3
; CHECK-P8-NEXT: bl __mulkf3
; CHECK-P8-NEXT: nop
-; CHECK-P8-NEXT: mr r5, r3
-; CHECK-P8-NEXT: mr r6, r4
-; CHECK-P8-NEXT: mr r3, r30
-; CHECK-P8-NEXT: mr r4, r29
+; CHECK-P8-NEXT: vmr v3, v2
+; CHECK-P8-NEXT: vmr v2, v31
; CHECK-P8-NEXT: bl __addkf3
; CHECK-P8-NEXT: nop
-; CHECK-P8-NEXT: li r5, 1
-; CHECK-P8-NEXT: std r3, 0(r28)
-; CHECK-P8-NEXT: rldic r5, r5, 63, 0
-; CHECK-P8-NEXT: xor r4, r4, r5
-; CHECK-P8-NEXT: std r4, 8(r28)
-; CHECK-P8-NEXT: addi r1, r1, 64
+; CHECK-P8-NEXT: addi r3, r1, 48
+; CHECK-P8-NEXT: stvx v2, 0, r3
+; CHECK-P8-NEXT: lbz r4, 63(r1)
+; CHECK-P8-NEXT: xori r4, r4, 128
+; CHECK-P8-NEXT: stb r4, 63(r1)
+; CHECK-P8-NEXT: lvx v2, 0, r3
+; CHECK-P8-NEXT: li r3, 64
+; CHECK-P8-NEXT: lvx v31, r1, r3 # 16-byte Folded Reload
+; CHECK-P8-NEXT: stvx v2, 0, r30
+; CHECK-P8-NEXT: ld r30, 80(r1) # 8-byte Folded Reload
+; CHECK-P8-NEXT: addi r1, r1, 96
; CHECK-P8-NEXT: ld r0, 16(r1)
-; CHECK-P8-NEXT: ld r30, -16(r1) # 8-byte Folded Reload
-; CHECK-P8-NEXT: ld r29, -24(r1) # 8-byte Folded Reload
-; CHECK-P8-NEXT: ld r28, -32(r1) # 8-byte Folded Reload
; CHECK-P8-NEXT: mtlr r0
; CHECK-P8-NEXT: blr
fp128* nocapture readonly %b,
@@ -264,35 +232,31 @@ define void @qpFnmadd_02(fp128* nocapture readonly %a,
; CHECK-P8-LABEL: qpFnmadd_02:
; CHECK-P8: # %bb.0: # %entry
; CHECK-P8-NEXT: mflr r0
-; CHECK-P8-NEXT: .cfi_def_cfa_offset 64
+; CHECK-P8-NEXT: .cfi_def_cfa_offset 80
; CHECK-P8-NEXT: .cfi_offset lr, 16
; CHECK-P8-NEXT: .cfi_offset r29, -24
; CHECK-P8-NEXT: .cfi_offset r30, -16
; CHECK-P8-NEXT: std r29, -24(r1) # 8-byte Folded Spill
; CHECK-P8-NEXT: std r30, -16(r1) # 8-byte Folded Spill
; CHECK-P8-NEXT: std r0, 16(r1)
-; CHECK-P8-NEXT: stdu r1, -64(r1)
-; CHECK-P8-NEXT: ld r9, 0(r3)
-; CHECK-P8-NEXT: ld r7, 8(r3)
-; CHECK-P8-NEXT: ld r8, 0(r4)
+; CHECK-P8-NEXT: stdu r1, -80(r1)
+; CHECK-P8-NEXT: lvx v2, 0, r3
+; CHECK-P8-NEXT: lvx v3, 0, r4
; CHECK-P8-NEXT: mr r30, r6
-; CHECK-P8-NEXT: ld r6, 8(r4)
; CHECK-P8-NEXT: mr r29, r5
-; CHECK-P8-NEXT: mr r3, r9
-; CHECK-P8-NEXT: mr r4, r7
-; CHECK-P8-NEXT: mr r5, r8
; CHECK-P8-NEXT: bl __mulkf3
; CHECK-P8-NEXT: nop
-; CHECK-P8-NEXT: ld r5, 0(r29)
-; CHECK-P8-NEXT: ld r6, 8(r29)
+; CHECK-P8-NEXT: lvx v3, 0, r29
; CHECK-P8-NEXT: bl __addkf3
; CHECK-P8-NEXT: nop
-; CHECK-P8-NEXT: li r5, 1
-; CHECK-P8-NEXT: std r3, 0(r30)
-; CHECK-P8-NEXT: rldic r5, r5, 63, 0
-; CHECK-P8-NEXT: xor r4, r4, r5
-; CHECK-P8-NEXT: std r4, 8(r30)
-; CHECK-P8-NEXT: addi r1, r1, 64
+; CHECK-P8-NEXT: addi r3, r1, 32
+; CHECK-P8-NEXT: stvx v2, 0, r3
+; CHECK-P8-NEXT: lbz r4, 47(r1)
+; CHECK-P8-NEXT: xori r4, r4, 128
+; CHECK-P8-NEXT: stb r4, 47(r1)
+; CHECK-P8-NEXT: lvx v2, 0, r3
+; CHECK-P8-NEXT: stvx v2, 0, r30
+; CHECK-P8-NEXT: addi r1, r1, 80
; CHECK-P8-NEXT: ld r0, 16(r1)
; CHECK-P8-NEXT: ld r30, -16(r1) # 8-byte Folded Reload
; CHECK-P8-NEXT: ld r29, -24(r1) # 8-byte Folded Reload
@@ -325,40 +289,31 @@ define void @qpFmsub(fp128* nocapture readonly %a,
; CHECK-P8-LABEL: qpFmsub:
; CHECK-P8: # %bb.0: # %entry
; CHECK-P8-NEXT: mflr r0
-; CHECK-P8-NEXT: .cfi_def_cfa_offset 64
+; CHECK-P8-NEXT: std r0, 16(r1)
+; CHECK-P8-NEXT: stdu r1, -80(r1)
+; CHECK-P8-NEXT: .cfi_def_cfa_offset 80
; CHECK-P8-NEXT: .cfi_offset lr, 16
-; CHECK-P8-NEXT: .cfi_offset r28, -32
-; CHECK-P8-NEXT: .cfi_offset r29, -24
; CHECK-P8-NEXT: .cfi_offset r30, -16
-; CHECK-P8-NEXT: std r28, -32(r1) # 8-byte Folded Spill
-; CHECK-P8-NEXT: std r29, -24(r1) # 8-byte Folded Spill
-; CHECK-P8-NEXT: std r30, -16(r1) # 8-byte Folded Spill
-; CHECK-P8-NEXT: std r0, 16(r1)
-; CHECK-P8-NEXT: stdu r1, -64(r1)
-; CHECK-P8-NEXT: ld r7, 0(r5)
-; CHECK-P8-NEXT: ld r8, 8(r5)
-; CHECK-P8-NEXT: ld r30, 0(r3)
-; CHECK-P8-NEXT: ld r29, 8(r3)
-; CHECK-P8-NEXT: mr r28, r6
-; CHECK-P8-NEXT: ld r3, 0(r4)
-; CHECK-P8-NEXT: ld r4, 8(r4)
-; CHECK-P8-NEXT: mr r5, r7
-; CHECK-P8-NEXT: mr r6, r8
+; CHECK-P8-NEXT: .cfi_offset v31, -32
+; CHECK-P8-NEXT: li r7, 48
+; CHECK-P8-NEXT: lvx v2, 0, r4
+; CHECK-P8-NEXT: lvx v3, 0, r5
+; CHECK-P8-NEXT: std r30, 64(r1) # 8-byte Folded Spill
+; CHECK-P8-NEXT: mr r30, r6
+; CHECK-P8-NEXT: stvx v31, r1, r7 # 16-byte Folded Spill
+; CHECK-P8-NEXT: lvx v31, 0, r3
; CHECK-P8-NEXT: bl __mulkf3
; CHECK-P8-NEXT: nop
-; CHECK-P8-NEXT: mr r5, r3
-; CHECK-P8-NEXT: mr r6, r4
-; CHECK-P8-NEXT: mr r3, r30
-; CHECK-P8-NEXT: mr r4, r29
+; CHECK-P8-NEXT: vmr v3, v2
+; CHECK-P8-NEXT: vmr v2, v31
; CHECK-P8-NEXT: bl __subkf3
; CHECK-P8-NEXT: nop
-; CHECK-P8-NEXT: std r3, 0(r28)
-; CHECK-P8-NEXT: std r4, 8(r28)
-; CHECK-P8-NEXT: addi r1, r1, 64
+; CHECK-P8-NEXT: li r3, 48
+; CHECK-P8-NEXT: stvx v2, 0, r30
+; CHECK-P8-NEXT: ld r30, 64(r1) # 8-byte Folded Reload
+; CHECK-P8-NEXT: lvx v31, r1, r3 # 16-byte Folded Reload
+; CHECK-P8-NEXT: addi r1, r1, 80
; CHECK-P8-NEXT: ld r0, 16(r1)
-; CHECK-P8-NEXT: ld r30, -16(r1) # 8-byte Folded Reload
-; CHECK-P8-NEXT: ld r29, -24(r1) # 8-byte Folded Reload
-; CHECK-P8-NEXT: ld r28, -32(r1) # 8-byte Folded Reload
; CHECK-P8-NEXT: mtlr r0
; CHECK-P8-NEXT: blr
fp128* nocapture readonly %b,
@@ -395,23 +350,16 @@ define void @qpFmsub_02(fp128* nocapture readonly %a,
; CHECK-P8-NEXT: std r30, -16(r1) # 8-byte Folded Spill
; CHECK-P8-NEXT: std r0, 16(r1)
; CHECK-P8-NEXT: stdu r1, -64(r1)
-; CHECK-P8-NEXT: ld r9, 0(r3)
-; CHECK-P8-NEXT: ld r7, 8(r3)
-; CHECK-P8-NEXT: ld r8, 0(r4)
+; CHECK-P8-NEXT: lvx v2, 0, r3
+; CHECK-P8-NEXT: lvx v3, 0, r4
; CHECK-P8-NEXT: mr r30, r6
-; CHECK-P8-NEXT: ld r6, 8(r4)
; CHECK-P8-NEXT: mr r29, r5
-; CHECK-P8-NEXT: mr r3, r9
-; CHECK-P8-NEXT: mr r4, r7
-; CHECK-P8-NEXT: mr r5, r8
; CHECK-P8-NEXT: bl __mulkf3
; CHECK-P8-NEXT: nop
-; CHECK-P8-NEXT: ld r5, 0(r29)
-; CHECK-P8-NEXT: ld r6, 8(r29)
+; CHECK-P8-NEXT: lvx v3, 0, r29
; CHECK-P8-NEXT: bl __subkf3
; CHECK-P8-NEXT: nop
-; CHECK-P8-NEXT: std r3, 0(r30)
-; CHECK-P8-NEXT: std r4, 8(r30)
+; CHECK-P8-NEXT: stvx v2, 0, r30
; CHECK-P8-NEXT: addi r1, r1, 64
; CHECK-P8-NEXT: ld r0, 16(r1)
; CHECK-P8-NEXT: ld r30, -16(r1) # 8-byte Folded Reload
@@ -445,43 +393,37 @@ define void @qpFnmsub(fp128* nocapture readonly %a,
; CHECK-P8-LABEL: qpFnmsub:
; CHECK-P8: # %bb.0: # %entry
; CHECK-P8-NEXT: mflr r0
-; CHECK-P8-NEXT: .cfi_def_cfa_offset 64
+; CHECK-P8-NEXT: std r0, 16(r1)
+; CHECK-P8-NEXT: stdu r1, -96(r1)
+; CHECK-P8-NEXT: .cfi_def_cfa_offset 96
; CHECK-P8-NEXT: .cfi_offset lr, 16
-; CHECK-P8-NEXT: .cfi_offset r28, -32
-; CHECK-P8-NEXT: .cfi_offset r29, -24
; CHECK-P8-NEXT: .cfi_offset r30, -16
-; CHECK-P8-NEXT: std r28, -32(r1) # 8-byte Folded Spill
-; CHECK-P8-NEXT: std r29, -24(r1) # 8-byte Folded Spill
-; CHECK-P8-NEXT: std r30, -16(r1) # 8-byte Folded Spill
-; CHECK-P8-NEXT: std r0, 16(r1)
-; CHECK-P8-NEXT: stdu r1, -64(r1)
-; CHECK-P8-NEXT: ld r7, 0(r5)
-; CHECK-P8-NEXT: ld r8, 8(r5)
-; CHECK-P8-NEXT: ld r30, 0(r3)
-; CHECK-P8-NEXT: ld r29, 8(r3)
-; CHECK-P8-NEXT: mr r28, r6
-; CHECK-P8-NEXT: ld r3, 0(r4)
-; CHECK-P8-NEXT: ld r4, 8(r4)
-; CHECK-P8-NEXT: mr r5, r7
-; CHECK-P8-NEXT: mr r6, r8
+; CHECK-P8-NEXT: .cfi_offset v31, -32
+; CHECK-P8-NEXT: li r7, 64
+; CHECK-P8-NEXT: lvx v2, 0, r4
+; CHECK-P8-NEXT: lvx v3, 0, r5
+; CHECK-P8-NEXT: std r30, 80(r1) # 8-byte Folded Spill
+; CHECK-P8-NEXT: mr r30, r6
+; CHECK-P8-NEXT: stvx v31, r1, r7 # 16-byte Folded Spill
+; CHECK-P8-NEXT: lvx v31, 0, r3
; CHECK-P8-NEXT: bl __mulkf3
; CHECK-P8-NEXT: nop
-; CHECK-P8-NEXT: mr r5, r3
-; CHECK-P8-NEXT: mr r6, r4
-; CHECK-P8-NEXT: mr r3, r30
-; CHECK-P8-NEXT: mr r4, r29
+; CHECK-P8-NEXT: vmr v3, v2
+; CHECK-P8-NEXT: vmr v2, v31
; CHECK-P8-NEXT: bl __subkf3
; CHECK-P8-NEXT: nop
-; CHECK-P8-NEXT: li r5, 1
-; CHECK-P8-NEXT: std r3, 0(r28)
-; CHECK-P8-NEXT: rldic r5, r5, 63, 0
-; CHECK-P8-NEXT: xor r4, r4, r5
-; CHECK-P8-NEXT: std r4, 8(r28)
-; CHECK-P8-NEXT: addi r1, r1, 64
+; CHECK-P8-NEXT: addi r3, r1, 48
+; CHECK-P8-NEXT: stvx v2, 0, r3
+; CHECK-P8-NEXT: lbz r4, 63(r1)
+; CHECK-P8-NEXT: xori r4, r4, 128
+; CHECK-P8-NEXT: stb r4, 63(r1)
+; CHECK-P8-NEXT: lvx v2, 0, r3
+; CHECK-P8-NEXT: li r3, 64
+; CHECK-P8-NEXT: lvx v31, r1, r3 # 16-byte Folded Reload
+; CHECK-P8-NEXT: stvx v2, 0, r30
+; CHECK-P8-NEXT: ld r30, 80(r1) # 8-byte Folded Reload
+; CHECK-P8-NEXT: addi r1, r1, 96
; CHECK-P8-NEXT: ld r0, 16(r1)
-; CHECK-P8-NEXT: ld r30, -16(r1) # 8-byte Folded Reload
-; CHECK-P8-NEXT: ld r29, -24(r1) # 8-byte Folded Reload
-; CHECK-P8-NEXT: ld r28, -32(r1) # 8-byte Folded Reload
; CHECK-P8-NEXT: mtlr r0
; CHECK-P8-NEXT: blr
fp128* nocapture readonly %b,
@@ -511,35 +453,31 @@ define void @qpFnmsub_02(fp128* nocapture readonly %a,
; CHECK-P8-LABEL: qpFnmsub_02:
; CHECK-P8: # %bb.0: # %entry
; CHECK-P8-NEXT: mflr r0
-; CHECK-P8-NEXT: .cfi_def_cfa_offset 64
+; CHECK-P8-NEXT: .cfi_def_cfa_offset 80
; CHECK-P8-NEXT: .cfi_offset lr, 16
; CHECK-P8-NEXT: .cfi_offset r29, -24
; CHECK-P8-NEXT: .cfi_offset r30, -16
; CHECK-P8-NEXT: std r29, -24(r1) # 8-byte Folded Spill
; CHECK-P8-NEXT: std r30, -16(r1) # 8-byte Folded Spill
; CHECK-P8-NEXT: std r0, 16(r1)
-; CHECK-P8-NEXT: stdu r1, -64(r1)
-; CHECK-P8-NEXT: ld r9, 0(r3)
-; CHECK-P8-NEXT: ld r7, 8(r3)
-; CHECK-P8-NEXT: ld r8, 0(r4)
+; CHECK-P8-NEXT: stdu r1, -80(r1)
+; CHECK-P8-NEXT: lvx v2, 0, r3
+; CHECK-P8-NEXT: lvx v3, 0, r4
; CHECK-P8-NEXT: mr r30, r6
-; CHECK-P8-NEXT: ld r6, 8(r4)
; CHECK-P8-NEXT: mr r29, r5
-; CHECK-P8-NEXT: mr r3, r9
-; CHECK-P8-NEXT: mr r4, r7
-; CHECK-P8-NEXT: mr r5, r8
; CHECK-P8-NEXT: bl __mulkf3
; CHECK-P8-NEXT: nop
-; CHECK-P8-NEXT: ld r5, 0(r29)
-; CHECK-P8-NEXT: ld r6, 8(r29)
+; CHECK-P8-NEXT: lvx v3, 0, r29
; CHECK-P8-NEXT: bl __subkf3
; CHECK-P8-NEXT: nop
-; CHECK-P8-NEXT: li r5, 1
-; CHECK-P8-NEXT: std r3, 0(r30)
-; CHECK-P8-NEXT: rldic r5, r5, 63, 0
-; CHECK-P8-NEXT: xor r4, r4, r5
-; CHECK-P8-NEXT: std r4, 8(r30)
-; CHECK-P8-NEXT: addi r1, r1, 64
+; CHECK-P8-NEXT: addi r3, r1, 32
+; CHECK-P8-NEXT: stvx v2, 0, r3
+; CHECK-P8-NEXT: lbz r4, 47(r1)
+; CHECK-P8-NEXT: xori r4, r4, 128
+; CHECK-P8-NEXT: stb r4, 47(r1)
+; CHECK-P8-NEXT: lvx v2, 0, r3
+; CHECK-P8-NEXT: stvx v2, 0, r30
+; CHECK-P8-NEXT: addi r1, r1, 80
; CHECK-P8-NEXT: ld r0, 16(r1)
; CHECK-P8-NEXT: ld r30, -16(r1) # 8-byte Folded Reload
; CHECK-P8-NEXT: ld r29, -24(r1) # 8-byte Folded Reload
diff --git a/llvm/test/CodeGen/PowerPC/f128-passByValue.ll b/llvm/test/CodeGen/PowerPC/f128-passByValue.ll
index 3acfc5bcf0c42..5c17dda209e9e 100644
--- a/llvm/test/CodeGen/PowerPC/f128-passByValue.ll
+++ b/llvm/test/CodeGen/PowerPC/f128-passByValue.ll
@@ -16,10 +16,9 @@ define fp128 @loadConstant() {
;
; CHECK-P8-LABEL: loadConstant:
; CHECK-P8: # %bb.0: # %entry
-; CHECK-P8-NEXT: lis r3, 1
-; CHECK-P8-NEXT: ori r3, r3, 5
-; CHECK-P8-NEXT: rldic r4, r3, 46, 1
-; CHECK-P8-NEXT: li r3, 0
+; CHECK-P8-NEXT: addis r3, r2, .LCPI0_0 at toc@ha
+; CHECK-P8-NEXT: addi r3, r3, .LCPI0_0 at toc@l
+; CHECK-P8-NEXT: lvx v2, 0, r3
; CHECK-P8-NEXT: blr
entry:
ret fp128 0xL00000000000000004001400000000000
@@ -45,10 +44,9 @@ define fp128 @loadConstant2(fp128 %a, fp128 %b) {
; CHECK-P8-NEXT: .cfi_offset lr, 16
; CHECK-P8-NEXT: bl __addkf3
; CHECK-P8-NEXT: nop
-; CHECK-P8-NEXT: lis r5, 1
-; CHECK-P8-NEXT: ori r5, r5, 5
-; CHECK-P8-NEXT: rldic r6, r5, 46, 1
-; CHECK-P8-NEXT: li r5, 0
+; CHECK-P8-NEXT: addis r3, r2, .LCPI1_0 at toc@ha
+; CHECK-P8-NEXT: addi r3, r3, .LCPI1_0 at toc@l
+; CHECK-P8-NEXT: lvx v3, 0, r3
; CHECK-P8-NEXT: bl __addkf3
; CHECK-P8-NEXT: nop
; CHECK-P8-NEXT: addi r1, r1, 32
@@ -136,12 +134,10 @@ define fp128 @fp128Array(fp128* nocapture readonly %farray,
; CHECK-P8-NEXT: .cfi_def_cfa_offset 32
; CHECK-P8-NEXT: .cfi_offset lr, 16
; CHECK-P8-NEXT: sldi r4, r4, 4
-; CHECK-P8-NEXT: ld r7, 0(r3)
-; CHECK-P8-NEXT: add r6, r3, r4
-; CHECK-P8-NEXT: ld r4, 8(r3)
-; CHECK-P8-NEXT: ld r5, -16(r6)
-; CHECK-P8-NEXT: ld r6, -8(r6)
-; CHECK-P8-NEXT: mr r3, r7
+; CHECK-P8-NEXT: lvx v2, 0, r3
+; CHECK-P8-NEXT: add r4, r3, r4
+; CHECK-P8-NEXT: addi r4, r4, -16
+; CHECK-P8-NEXT: lvx v3, 0, r4
; CHECK-P8-NEXT: bl __addkf3
; CHECK-P8-NEXT: nop
; CHECK-P8-NEXT: addi r1, r1, 32
@@ -183,139 +179,115 @@ define fp128 @maxVecParam(fp128 %p1, fp128 %p2, fp128 %p3, fp128 %p4, fp128 %p5,
; CHECK-P8-LABEL: maxVecParam:
; CHECK-P8: # %bb.0: # %entry
; CHECK-P8-NEXT: mflr r0
-; CHECK-P8-NEXT: .cfi_def_cfa_offset 208
-; CHECK-P8-NEXT: .cfi_offset lr, 16
-; CHECK-P8-NEXT: .cfi_offset r14, -144
-; CHECK-P8-NEXT: .cfi_offset r15, -136
-; CHECK-P8-NEXT: .cfi_offset r16, -128
-; CHECK-P8-NEXT: .cfi_offset r17, -120
-; CHECK-P8-NEXT: .cfi_offset r18, -112
-; CHECK-P8-NEXT: .cfi_offset r19, -104
-; CHECK-P8-NEXT: .cfi_offset r20, -96
-; CHECK-P8-NEXT: .cfi_offset r21, -88
-; CHECK-P8-NEXT: .cfi_offset r22, -80
-; CHECK-P8-NEXT: .cfi_offset r23, -72
-; CHECK-P8-NEXT: .cfi_offset r24, -64
-; CHECK-P8-NEXT: .cfi_offset r25, -56
-; CHECK-P8-NEXT: .cfi_offset r26, -48
-; CHECK-P8-NEXT: .cfi_offset r27, -40
-; CHECK-P8-NEXT: .cfi_offset r28, -32
-; CHECK-P8-NEXT: .cfi_offset r29, -24
-; CHECK-P8-NEXT: .cfi_offset r30, -16
-; CHECK-P8-NEXT: .cfi_offset r31, -8
-; CHECK-P8-NEXT: std r14, -144(r1) # 8-byte Folded Spill
-; CHECK-P8-NEXT: std r15, -136(r1) # 8-byte Folded Spill
-; CHECK-P8-NEXT: std r16, -128(r1) # 8-byte Folded Spill
-; CHECK-P8-NEXT: std r17, -120(r1) # 8-byte Folded Spill
-; CHECK-P8-NEXT: std r18, -112(r1) # 8-byte Folded Spill
-; CHECK-P8-NEXT: std r19, -104(r1) # 8-byte Folded Spill
-; CHECK-P8-NEXT: std r20, -96(r1) # 8-byte Folded Spill
-; CHECK-P8-NEXT: std r21, -88(r1) # 8-byte Folded Spill
-; CHECK-P8-NEXT: std r22, -80(r1) # 8-byte Folded Spill
-; CHECK-P8-NEXT: std r23, -72(r1) # 8-byte Folded Spill
-; CHECK-P8-NEXT: std r24, -64(r1) # 8-byte Folded Spill
-; CHECK-P8-NEXT: std r25, -56(r1) # 8-byte Folded Spill
-; CHECK-P8-NEXT: std r26, -48(r1) # 8-byte Folded Spill
-; CHECK-P8-NEXT: std r27, -40(r1) # 8-byte Folded Spill
-; CHECK-P8-NEXT: std r28, -32(r1) # 8-byte Folded Spill
-; CHECK-P8-NEXT: std r29, -24(r1) # 8-byte Folded Spill
-; CHECK-P8-NEXT: std r30, -16(r1) # 8-byte Folded Spill
-; CHECK-P8-NEXT: std r31, -8(r1) # 8-byte Folded Spill
; CHECK-P8-NEXT: std r0, 16(r1)
-; CHECK-P8-NEXT: stdu r1, -208(r1)
-; CHECK-P8-NEXT: mr r17, r7
-; CHECK-P8-NEXT: ld r7, 432(r1)
-; CHECK-P8-NEXT: ld r26, 400(r1)
-; CHECK-P8-NEXT: ld r25, 408(r1)
-; CHECK-P8-NEXT: ld r24, 384(r1)
-; CHECK-P8-NEXT: mr r20, r10
-; CHECK-P8-NEXT: ld r23, 392(r1)
-; CHECK-P8-NEXT: ld r22, 368(r1)
-; CHECK-P8-NEXT: ld r21, 376(r1)
-; CHECK-P8-NEXT: ld r16, 352(r1)
-; CHECK-P8-NEXT: mr r19, r9
-; CHECK-P8-NEXT: mr r18, r8
-; CHECK-P8-NEXT: ld r15, 360(r1)
-; CHECK-P8-NEXT: ld r14, 336(r1)
-; CHECK-P8-NEXT: ld r31, 344(r1)
-; CHECK-P8-NEXT: ld r30, 320(r1)
-; CHECK-P8-NEXT: std r7, 56(r1) # 8-byte Folded Spill
-; CHECK-P8-NEXT: ld r7, 440(r1)
-; CHECK-P8-NEXT: ld r29, 328(r1)
-; CHECK-P8-NEXT: ld r28, 304(r1)
-; CHECK-P8-NEXT: ld r27, 312(r1)
-; CHECK-P8-NEXT: std r7, 48(r1) # 8-byte Folded Spill
-; CHECK-P8-NEXT: ld r7, 416(r1)
-; CHECK-P8-NEXT: std r7, 40(r1) # 8-byte Folded Spill
-; CHECK-P8-NEXT: ld r7, 424(r1)
-; CHECK-P8-NEXT: std r7, 32(r1) # 8-byte Folded Spill
+; CHECK-P8-NEXT: stdu r1, -224(r1)
+; CHECK-P8-NEXT: .cfi_def_cfa_offset 224
+; CHECK-P8-NEXT: .cfi_offset lr, 16
+; CHECK-P8-NEXT: .cfi_offset v21, -176
+; CHECK-P8-NEXT: .cfi_offset v22, -160
+; CHECK-P8-NEXT: .cfi_offset v23, -144
+; CHECK-P8-NEXT: .cfi_offset v24, -128
+; CHECK-P8-NEXT: .cfi_offset v25, -112
+; CHECK-P8-NEXT: .cfi_offset v26, -96
+; CHECK-P8-NEXT: .cfi_offset v27, -80
+; CHECK-P8-NEXT: .cfi_offset v28, -64
+; CHECK-P8-NEXT: .cfi_offset v29, -48
+; CHECK-P8-NEXT: .cfi_offset v30, -32
+; CHECK-P8-NEXT: .cfi_offset v31, -16
+; CHECK-P8-NEXT: li r3, 48
+; CHECK-P8-NEXT: stvx v21, r1, r3 # 16-byte Folded Spill
+; CHECK-P8-NEXT: li r3, 64
+; CHECK-P8-NEXT: vmr v21, v4
+; CHECK-P8-NEXT: stvx v22, r1, r3 # 16-byte Folded Spill
+; CHECK-P8-NEXT: li r3, 80
+; CHECK-P8-NEXT: vmr v22, v5
+; CHECK-P8-NEXT: stvx v23, r1, r3 # 16-byte Folded Spill
+; CHECK-P8-NEXT: li r3, 96
+; CHECK-P8-NEXT: vmr v23, v6
+; CHECK-P8-NEXT: stvx v24, r1, r3 # 16-byte Folded Spill
+; CHECK-P8-NEXT: li r3, 112
+; CHECK-P8-NEXT: vmr v24, v7
+; CHECK-P8-NEXT: stvx v25, r1, r3 # 16-byte Folded Spill
+; CHECK-P8-NEXT: li r3, 128
+; CHECK-P8-NEXT: vmr v25, v8
+; CHECK-P8-NEXT: stvx v26, r1, r3 # 16-byte Folded Spill
+; CHECK-P8-NEXT: li r3, 144
+; CHECK-P8-NEXT: vmr v26, v9
+; CHECK-P8-NEXT: stvx v27, r1, r3 # 16-byte Folded Spill
+; CHECK-P8-NEXT: li r3, 160
+; CHECK-P8-NEXT: vmr v27, v10
+; CHECK-P8-NEXT: stvx v28, r1, r3 # 16-byte Folded Spill
+; CHECK-P8-NEXT: li r3, 176
+; CHECK-P8-NEXT: vmr v28, v11
+; CHECK-P8-NEXT: stvx v29, r1, r3 # 16-byte Folded Spill
+; CHECK-P8-NEXT: li r3, 192
+; CHECK-P8-NEXT: stvx v30, r1, r3 # 16-byte Folded Spill
+; CHECK-P8-NEXT: li r3, 208
+; CHECK-P8-NEXT: vmr v30, v12
+; CHECK-P8-NEXT: stvx v31, r1, r3 # 16-byte Folded Spill
+; CHECK-P8-NEXT: addi r3, r1, 448
+; CHECK-P8-NEXT: vmr v31, v13
+; CHECK-P8-NEXT: lvx v29, 0, r3
; CHECK-P8-NEXT: bl __addkf3
; CHECK-P8-NEXT: nop
-; CHECK-P8-NEXT: mr r5, r17
-; CHECK-P8-NEXT: mr r6, r18
+; CHECK-P8-NEXT: vmr v3, v21
; CHECK-P8-NEXT: bl __addkf3
; CHECK-P8-NEXT: nop
-; CHECK-P8-NEXT: mr r5, r19
-; CHECK-P8-NEXT: mr r6, r20
+; CHECK-P8-NEXT: vmr v3, v22
; CHECK-P8-NEXT: bl __addkf3
; CHECK-P8-NEXT: nop
-; CHECK-P8-NEXT: mr r5, r28
-; CHECK-P8-NEXT: mr r6, r27
+; CHECK-P8-NEXT: vmr v3, v23
; CHECK-P8-NEXT: bl __addkf3
; CHECK-P8-NEXT: nop
-; CHECK-P8-NEXT: mr r5, r30
-; CHECK-P8-NEXT: mr r6, r29
+; CHECK-P8-NEXT: vmr v3, v24
; CHECK-P8-NEXT: bl __addkf3
; CHECK-P8-NEXT: nop
-; CHECK-P8-NEXT: mr r5, r14
-; CHECK-P8-NEXT: mr r6, r31
+; CHECK-P8-NEXT: vmr v3, v25
; CHECK-P8-NEXT: bl __addkf3
; CHECK-P8-NEXT: nop
-; CHECK-P8-NEXT: mr r5, r16
-; CHECK-P8-NEXT: mr r6, r15
+; CHECK-P8-NEXT: vmr v3, v26
; CHECK-P8-NEXT: bl __addkf3
; CHECK-P8-NEXT: nop
-; CHECK-P8-NEXT: mr r5, r22
-; CHECK-P8-NEXT: mr r6, r21
+; CHECK-P8-NEXT: vmr v3, v27
; CHECK-P8-NEXT: bl __addkf3
; CHECK-P8-NEXT: nop
-; CHECK-P8-NEXT: mr r5, r24
-; CHECK-P8-NEXT: mr r6, r23
+; CHECK-P8-NEXT: vmr v3, v28
; CHECK-P8-NEXT: bl __addkf3
; CHECK-P8-NEXT: nop
-; CHECK-P8-NEXT: mr r5, r26
-; CHECK-P8-NEXT: mr r6, r25
+; CHECK-P8-NEXT: vmr v3, v30
; CHECK-P8-NEXT: bl __addkf3
; CHECK-P8-NEXT: nop
-; CHECK-P8-NEXT: ld r5, 40(r1) # 8-byte Folded Reload
-; CHECK-P8-NEXT: ld r6, 32(r1) # 8-byte Folded Reload
+; CHECK-P8-NEXT: vmr v3, v31
; CHECK-P8-NEXT: bl __addkf3
; CHECK-P8-NEXT: nop
-; CHECK-P8-NEXT: ld r5, 56(r1) # 8-byte Folded Reload
-; CHECK-P8-NEXT: ld r6, 48(r1) # 8-byte Folded Reload
+; CHECK-P8-NEXT: vmr v3, v29
; CHECK-P8-NEXT: bl __subkf3
; CHECK-P8-NEXT: nop
-; CHECK-P8-NEXT: addi r1, r1, 208
+; CHECK-P8-NEXT: li r3, 208
+; CHECK-P8-NEXT: lvx v31, r1, r3 # 16-byte Folded Reload
+; CHECK-P8-NEXT: li r3, 192
+; CHECK-P8-NEXT: lvx v30, r1, r3 # 16-byte Folded Reload
+; CHECK-P8-NEXT: li r3, 176
+; CHECK-P8-NEXT: lvx v29, r1, r3 # 16-byte Folded Reload
+; CHECK-P8-NEXT: li r3, 160
+; CHECK-P8-NEXT: lvx v28, r1, r3 # 16-byte Folded Reload
+; CHECK-P8-NEXT: li r3, 144
+; CHECK-P8-NEXT: lvx v27, r1, r3 # 16-byte Folded Reload
+; CHECK-P8-NEXT: li r3, 128
+; CHECK-P8-NEXT: lvx v26, r1, r3 # 16-byte Folded Reload
+; CHECK-P8-NEXT: li r3, 112
+; CHECK-P8-NEXT: lvx v25, r1, r3 # 16-byte Folded Reload
+; CHECK-P8-NEXT: li r3, 96
+; CHECK-P8-NEXT: lvx v24, r1, r3 # 16-byte Folded Reload
+; CHECK-P8-NEXT: li r3, 80
+; CHECK-P8-NEXT: lvx v23, r1, r3 # 16-byte Folded Reload
+; CHECK-P8-NEXT: li r3, 64
+; CHECK-P8-NEXT: lvx v22, r1, r3 # 16-byte Folded Reload
+; CHECK-P8-NEXT: li r3, 48
+; CHECK-P8-NEXT: lvx v21, r1, r3 # 16-byte Folded Reload
+; CHECK-P8-NEXT: addi r1, r1, 224
; CHECK-P8-NEXT: ld r0, 16(r1)
-; CHECK-P8-NEXT: ld r31, -8(r1) # 8-byte Folded Reload
-; CHECK-P8-NEXT: ld r30, -16(r1) # 8-byte Folded Reload
-; CHECK-P8-NEXT: ld r29, -24(r1) # 8-byte Folded Reload
-; CHECK-P8-NEXT: ld r28, -32(r1) # 8-byte Folded Reload
-; CHECK-P8-NEXT: ld r27, -40(r1) # 8-byte Folded Reload
-; CHECK-P8-NEXT: ld r26, -48(r1) # 8-byte Folded Reload
-; CHECK-P8-NEXT: ld r25, -56(r1) # 8-byte Folded Reload
-; CHECK-P8-NEXT: ld r24, -64(r1) # 8-byte Folded Reload
-; CHECK-P8-NEXT: ld r23, -72(r1) # 8-byte Folded Reload
-; CHECK-P8-NEXT: ld r22, -80(r1) # 8-byte Folded Reload
-; CHECK-P8-NEXT: ld r21, -88(r1) # 8-byte Folded Reload
; CHECK-P8-NEXT: mtlr r0
-; CHECK-P8-NEXT: ld r20, -96(r1) # 8-byte Folded Reload
-; CHECK-P8-NEXT: ld r19, -104(r1) # 8-byte Folded Reload
-; CHECK-P8-NEXT: ld r18, -112(r1) # 8-byte Folded Reload
-; CHECK-P8-NEXT: ld r17, -120(r1) # 8-byte Folded Reload
-; CHECK-P8-NEXT: ld r16, -128(r1) # 8-byte Folded Reload
-; CHECK-P8-NEXT: ld r15, -136(r1) # 8-byte Folded Reload
-; CHECK-P8-NEXT: ld r14, -144(r1) # 8-byte Folded Reload
; CHECK-P8-NEXT: blr
fp128 %p6, fp128 %p7, fp128 %p8, fp128 %p9, fp128 %p10,
fp128 %p11, fp128 %p12, fp128 %p13) {
@@ -349,37 +321,31 @@ define fp128 @mixParam_01(fp128 %a, i32 signext %i, fp128 %b) {
; CHECK-P8-LABEL: mixParam_01:
; CHECK-P8: # %bb.0: # %entry
; CHECK-P8-NEXT: mflr r0
-; CHECK-P8-NEXT: .cfi_def_cfa_offset 64
+; CHECK-P8-NEXT: std r0, 16(r1)
+; CHECK-P8-NEXT: stdu r1, -80(r1)
+; CHECK-P8-NEXT: .cfi_def_cfa_offset 80
; CHECK-P8-NEXT: .cfi_offset lr, 16
-; CHECK-P8-NEXT: .cfi_offset r28, -32
-; CHECK-P8-NEXT: .cfi_offset r29, -24
; CHECK-P8-NEXT: .cfi_offset r30, -16
-; CHECK-P8-NEXT: std r28, -32(r1) # 8-byte Folded Spill
-; CHECK-P8-NEXT: std r29, -24(r1) # 8-byte Folded Spill
-; CHECK-P8-NEXT: std r30, -16(r1) # 8-byte Folded Spill
-; CHECK-P8-NEXT: std r0, 16(r1)
-; CHECK-P8-NEXT: stdu r1, -64(r1)
+; CHECK-P8-NEXT: .cfi_offset v31, -32
+; CHECK-P8-NEXT: li r3, 48
+; CHECK-P8-NEXT: std r30, 64(r1) # 8-byte Folded Spill
; CHECK-P8-NEXT: mr r30, r5
-; CHECK-P8-NEXT: mr r5, r6
-; CHECK-P8-NEXT: mr r6, r7
+; CHECK-P8-NEXT: stvx v31, r1, r3 # 16-byte Folded Spill
; CHECK-P8-NEXT: bl __addkf3
; CHECK-P8-NEXT: nop
-; CHECK-P8-NEXT: mr r29, r3
; CHECK-P8-NEXT: mr r3, r30
-; CHECK-P8-NEXT: mr r28, r4
+; CHECK-P8-NEXT: vmr v31, v2
; CHECK-P8-NEXT: bl __floatsikf
; CHECK-P8-NEXT: nop
-; CHECK-P8-NEXT: mr r5, r3
-; CHECK-P8-NEXT: mr r6, r4
-; CHECK-P8-NEXT: mr r3, r29
-; CHECK-P8-NEXT: mr r4, r28
+; CHECK-P8-NEXT: vmr v3, v2
+; CHECK-P8-NEXT: vmr v2, v31
; CHECK-P8-NEXT: bl __addkf3
; CHECK-P8-NEXT: nop
-; CHECK-P8-NEXT: addi r1, r1, 64
+; CHECK-P8-NEXT: li r3, 48
+; CHECK-P8-NEXT: ld r30, 64(r1) # 8-byte Folded Reload
+; CHECK-P8-NEXT: lvx v31, r1, r3 # 16-byte Folded Reload
+; CHECK-P8-NEXT: addi r1, r1, 80
; CHECK-P8-NEXT: ld r0, 16(r1)
-; CHECK-P8-NEXT: ld r30, -16(r1) # 8-byte Folded Reload
-; CHECK-P8-NEXT: ld r29, -24(r1) # 8-byte Folded Reload
-; CHECK-P8-NEXT: ld r28, -32(r1) # 8-byte Folded Reload
; CHECK-P8-NEXT: mtlr r0
; CHECK-P8-NEXT: blr
entry:
@@ -401,37 +367,31 @@ define fastcc fp128 @mixParam_01f(fp128 %a, i32 signext %i, fp128 %b) {
; CHECK-P8-LABEL: mixParam_01f:
; CHECK-P8: # %bb.0: # %entry
; CHECK-P8-NEXT: mflr r0
-; CHECK-P8-NEXT: .cfi_def_cfa_offset 64
+; CHECK-P8-NEXT: std r0, 16(r1)
+; CHECK-P8-NEXT: stdu r1, -80(r1)
+; CHECK-P8-NEXT: .cfi_def_cfa_offset 80
; CHECK-P8-NEXT: .cfi_offset lr, 16
-; CHECK-P8-NEXT: .cfi_offset r28, -32
-; CHECK-P8-NEXT: .cfi_offset r29, -24
; CHECK-P8-NEXT: .cfi_offset r30, -16
-; CHECK-P8-NEXT: std r28, -32(r1) # 8-byte Folded Spill
-; CHECK-P8-NEXT: std r29, -24(r1) # 8-byte Folded Spill
-; CHECK-P8-NEXT: std r30, -16(r1) # 8-byte Folded Spill
-; CHECK-P8-NEXT: std r0, 16(r1)
-; CHECK-P8-NEXT: stdu r1, -64(r1)
-; CHECK-P8-NEXT: mr r30, r5
-; CHECK-P8-NEXT: mr r5, r6
-; CHECK-P8-NEXT: mr r6, r7
+; CHECK-P8-NEXT: .cfi_offset v31, -32
+; CHECK-P8-NEXT: li r4, 48
+; CHECK-P8-NEXT: std r30, 64(r1) # 8-byte Folded Spill
+; CHECK-P8-NEXT: mr r30, r3
+; CHECK-P8-NEXT: stvx v31, r1, r4 # 16-byte Folded Spill
; CHECK-P8-NEXT: bl __addkf3
; CHECK-P8-NEXT: nop
-; CHECK-P8-NEXT: mr r29, r3
; CHECK-P8-NEXT: mr r3, r30
-; CHECK-P8-NEXT: mr r28, r4
+; CHECK-P8-NEXT: vmr v31, v2
; CHECK-P8-NEXT: bl __floatsikf
; CHECK-P8-NEXT: nop
-; CHECK-P8-NEXT: mr r5, r3
-; CHECK-P8-NEXT: mr r6, r4
-; CHECK-P8-NEXT: mr r3, r29
-; CHECK-P8-NEXT: mr r4, r28
+; CHECK-P8-NEXT: vmr v3, v2
+; CHECK-P8-NEXT: vmr v2, v31
; CHECK-P8-NEXT: bl __addkf3
; CHECK-P8-NEXT: nop
-; CHECK-P8-NEXT: addi r1, r1, 64
+; CHECK-P8-NEXT: li r3, 48
+; CHECK-P8-NEXT: ld r30, 64(r1) # 8-byte Folded Reload
+; CHECK-P8-NEXT: lvx v31, r1, r3 # 16-byte Folded Reload
+; CHECK-P8-NEXT: addi r1, r1, 80
; CHECK-P8-NEXT: ld r0, 16(r1)
-; CHECK-P8-NEXT: ld r30, -16(r1) # 8-byte Folded Reload
-; CHECK-P8-NEXT: ld r29, -24(r1) # 8-byte Folded Reload
-; CHECK-P8-NEXT: ld r28, -32(r1) # 8-byte Folded Reload
; CHECK-P8-NEXT: mtlr r0
; CHECK-P8-NEXT: blr
entry:
@@ -461,48 +421,41 @@ define fp128 @mixParam_02(fp128 %p1, double %p2, i64* nocapture %p3,
; CHECK-P8-LABEL: mixParam_02:
; CHECK-P8: # %bb.0: # %entry
; CHECK-P8-NEXT: mflr r0
-; CHECK-P8-NEXT: .cfi_def_cfa_offset 64
+; CHECK-P8-NEXT: std r0, 16(r1)
+; CHECK-P8-NEXT: stdu r1, -80(r1)
+; CHECK-P8-NEXT: .cfi_def_cfa_offset 80
; CHECK-P8-NEXT: .cfi_offset lr, 16
-; CHECK-P8-NEXT: .cfi_offset r29, -32
-; CHECK-P8-NEXT: .cfi_offset r30, -24
; CHECK-P8-NEXT: .cfi_offset f31, -8
-; CHECK-P8-NEXT: std r29, -32(r1) # 8-byte Folded Spill
-; CHECK-P8-NEXT: std r30, -24(r1) # 8-byte Folded Spill
-; CHECK-P8-NEXT: stfd f31, -8(r1) # 8-byte Folded Spill
-; CHECK-P8-NEXT: std r0, 16(r1)
-; CHECK-P8-NEXT: stdu r1, -64(r1)
-; CHECK-P8-NEXT: mr r11, r4
-; CHECK-P8-NEXT: lwz r4, 160(r1)
-; CHECK-P8-NEXT: add r5, r7, r9
+; CHECK-P8-NEXT: .cfi_offset v31, -32
+; CHECK-P8-NEXT: li r3, 48
+; CHECK-P8-NEXT: add r4, r7, r9
+; CHECK-P8-NEXT: vmr v4, v2
+; CHECK-P8-NEXT: stfd f31, 72(r1) # 8-byte Folded Spill
+; CHECK-P8-NEXT: stvx v31, r1, r3 # 16-byte Folded Spill
+; CHECK-P8-NEXT: lwz r3, 176(r1)
+; CHECK-P8-NEXT: add r4, r4, r10
; CHECK-P8-NEXT: fmr f31, f1
-; CHECK-P8-NEXT: add r5, r5, r10
-; CHECK-P8-NEXT: add r4, r5, r4
-; CHECK-P8-NEXT: clrldi r4, r4, 32
-; CHECK-P8-NEXT: std r4, 0(r6)
-; CHECK-P8-NEXT: mr r6, r3
-; CHECK-P8-NEXT: ld r5, 0(r8)
-; CHECK-P8-NEXT: ld r4, 8(r8)
-; CHECK-P8-NEXT: mr r3, r5
-; CHECK-P8-NEXT: mr r5, r6
-; CHECK-P8-NEXT: mr r6, r11
+; CHECK-P8-NEXT: add r3, r4, r3
+; CHECK-P8-NEXT: clrldi r3, r3, 32
+; CHECK-P8-NEXT: std r3, 0(r6)
+; CHECK-P8-NEXT: lvx v3, 0, r8
+; CHECK-P8-NEXT: vmr v2, v3
+; CHECK-P8-NEXT: vmr v3, v4
; CHECK-P8-NEXT: bl __addkf3
; CHECK-P8-NEXT: nop
; CHECK-P8-NEXT: fmr f1, f31
-; CHECK-P8-NEXT: mr r30, r3
-; CHECK-P8-NEXT: mr r29, r4
+; CHECK-P8-NEXT: vmr v31, v2
; CHECK-P8-NEXT: bl __extenddfkf2
; CHECK-P8-NEXT: nop
-; CHECK-P8-NEXT: mr r5, r3
-; CHECK-P8-NEXT: mr r6, r4
-; CHECK-P8-NEXT: mr r3, r30
-; CHECK-P8-NEXT: mr r4, r29
+; CHECK-P8-NEXT: vmr v3, v2
+; CHECK-P8-NEXT: vmr v2, v31
; CHECK-P8-NEXT: bl __addkf3
; CHECK-P8-NEXT: nop
-; CHECK-P8-NEXT: addi r1, r1, 64
+; CHECK-P8-NEXT: li r3, 48
+; CHECK-P8-NEXT: lfd f31, 72(r1) # 8-byte Folded Reload
+; CHECK-P8-NEXT: lvx v31, r1, r3 # 16-byte Folded Reload
+; CHECK-P8-NEXT: addi r1, r1, 80
; CHECK-P8-NEXT: ld r0, 16(r1)
-; CHECK-P8-NEXT: lfd f31, -8(r1) # 8-byte Folded Reload
-; CHECK-P8-NEXT: ld r30, -24(r1) # 8-byte Folded Reload
-; CHECK-P8-NEXT: ld r29, -32(r1) # 8-byte Folded Reload
; CHECK-P8-NEXT: mtlr r0
; CHECK-P8-NEXT: blr
i16 signext %p4, fp128* nocapture readonly %p5,
@@ -541,47 +494,40 @@ define fastcc fp128 @mixParam_02f(fp128 %p1, double %p2, i64* nocapture %p3,
; CHECK-P8-LABEL: mixParam_02f:
; CHECK-P8: # %bb.0: # %entry
; CHECK-P8-NEXT: mflr r0
-; CHECK-P8-NEXT: .cfi_def_cfa_offset 64
+; CHECK-P8-NEXT: std r0, 16(r1)
+; CHECK-P8-NEXT: stdu r1, -80(r1)
+; CHECK-P8-NEXT: .cfi_def_cfa_offset 80
; CHECK-P8-NEXT: .cfi_offset lr, 16
-; CHECK-P8-NEXT: .cfi_offset r29, -32
-; CHECK-P8-NEXT: .cfi_offset r30, -24
; CHECK-P8-NEXT: .cfi_offset f31, -8
-; CHECK-P8-NEXT: std r29, -32(r1) # 8-byte Folded Spill
-; CHECK-P8-NEXT: std r30, -24(r1) # 8-byte Folded Spill
-; CHECK-P8-NEXT: stfd f31, -8(r1) # 8-byte Folded Spill
-; CHECK-P8-NEXT: std r0, 16(r1)
-; CHECK-P8-NEXT: stdu r1, -64(r1)
-; CHECK-P8-NEXT: mr r11, r4
-; CHECK-P8-NEXT: add r4, r6, r8
-; CHECK-P8-NEXT: mr r6, r3
+; CHECK-P8-NEXT: .cfi_offset v31, -32
+; CHECK-P8-NEXT: add r4, r4, r6
+; CHECK-P8-NEXT: vmr v4, v2
+; CHECK-P8-NEXT: li r9, 48
+; CHECK-P8-NEXT: stfd f31, 72(r1) # 8-byte Folded Spill
+; CHECK-P8-NEXT: add r4, r4, r7
+; CHECK-P8-NEXT: stvx v31, r1, r9 # 16-byte Folded Spill
; CHECK-P8-NEXT: fmr f31, f1
-; CHECK-P8-NEXT: add r4, r4, r9
-; CHECK-P8-NEXT: add r4, r4, r10
+; CHECK-P8-NEXT: add r4, r4, r8
; CHECK-P8-NEXT: clrldi r4, r4, 32
-; CHECK-P8-NEXT: std r4, 0(r5)
-; CHECK-P8-NEXT: ld r5, 0(r7)
-; CHECK-P8-NEXT: ld r4, 8(r7)
-; CHECK-P8-NEXT: mr r3, r5
-; CHECK-P8-NEXT: mr r5, r6
-; CHECK-P8-NEXT: mr r6, r11
+; CHECK-P8-NEXT: std r4, 0(r3)
+; CHECK-P8-NEXT: lvx v3, 0, r5
+; CHECK-P8-NEXT: vmr v2, v3
+; CHECK-P8-NEXT: vmr v3, v4
; CHECK-P8-NEXT: bl __addkf3
; CHECK-P8-NEXT: nop
; CHECK-P8-NEXT: fmr f1, f31
-; CHECK-P8-NEXT: mr r30, r3
-; CHECK-P8-NEXT: mr r29, r4
+; CHECK-P8-NEXT: vmr v31, v2
; CHECK-P8-NEXT: bl __extenddfkf2
; CHECK-P8-NEXT: nop
-; CHECK-P8-NEXT: mr r5, r3
-; CHECK-P8-NEXT: mr r6, r4
-; CHECK-P8-NEXT: mr r3, r30
-; CHECK-P8-NEXT: mr r4, r29
+; CHECK-P8-NEXT: vmr v3, v2
+; CHECK-P8-NEXT: vmr v2, v31
; CHECK-P8-NEXT: bl __addkf3
; CHECK-P8-NEXT: nop
-; CHECK-P8-NEXT: addi r1, r1, 64
+; CHECK-P8-NEXT: li r3, 48
+; CHECK-P8-NEXT: lfd f31, 72(r1) # 8-byte Folded Reload
+; CHECK-P8-NEXT: lvx v31, r1, r3 # 16-byte Folded Reload
+; CHECK-P8-NEXT: addi r1, r1, 80
; CHECK-P8-NEXT: ld r0, 16(r1)
-; CHECK-P8-NEXT: lfd f31, -8(r1) # 8-byte Folded Reload
-; CHECK-P8-NEXT: ld r30, -24(r1) # 8-byte Folded Reload
-; CHECK-P8-NEXT: ld r29, -32(r1) # 8-byte Folded Reload
; CHECK-P8-NEXT: mtlr r0
; CHECK-P8-NEXT: blr
i16 signext %p4, fp128* nocapture readonly %p5,
@@ -620,40 +566,35 @@ define void @mixParam_03(fp128 %f1, double* nocapture %d1, <4 x i32> %vec1,
; CHECK-P8-LABEL: mixParam_03:
; CHECK-P8: # %bb.0: # %entry
; CHECK-P8-NEXT: mflr r0
-; CHECK-P8-NEXT: .cfi_def_cfa_offset 64
+; CHECK-P8-NEXT: std r0, 16(r1)
+; CHECK-P8-NEXT: stdu r1, -80(r1)
+; CHECK-P8-NEXT: .cfi_def_cfa_offset 80
; CHECK-P8-NEXT: .cfi_offset lr, 16
-; CHECK-P8-NEXT: .cfi_offset r28, -32
-; CHECK-P8-NEXT: .cfi_offset r29, -24
; CHECK-P8-NEXT: .cfi_offset r30, -16
-; CHECK-P8-NEXT: std r28, -32(r1) # 8-byte Folded Spill
-; CHECK-P8-NEXT: std r29, -24(r1) # 8-byte Folded Spill
-; CHECK-P8-NEXT: std r30, -16(r1) # 8-byte Folded Spill
-; CHECK-P8-NEXT: std r0, 16(r1)
-; CHECK-P8-NEXT: stdu r1, -64(r1)
-; CHECK-P8-NEXT: ld r6, 168(r1)
-; CHECK-P8-NEXT: std r4, 8(r9)
-; CHECK-P8-NEXT: std r3, 0(r9)
+; CHECK-P8-NEXT: .cfi_offset v31, -32
+; CHECK-P8-NEXT: ld r4, 184(r1)
+; CHECK-P8-NEXT: li r3, 48
+; CHECK-P8-NEXT: stvx v2, 0, r9
+; CHECK-P8-NEXT: std r30, 64(r1) # 8-byte Folded Spill
+; CHECK-P8-NEXT: mr r30, r5
+; CHECK-P8-NEXT: stvx v31, r1, r3 # 16-byte Folded Spill
; CHECK-P8-NEXT: mr r3, r10
-; CHECK-P8-NEXT: mr r28, r5
-; CHECK-P8-NEXT: stvx v2, 0, r6
-; CHECK-P8-NEXT: ld r30, 0(r9)
-; CHECK-P8-NEXT: ld r29, 8(r9)
+; CHECK-P8-NEXT: stvx v3, 0, r4
+; CHECK-P8-NEXT: lvx v31, 0, r9
; CHECK-P8-NEXT: bl __floatsikf
; CHECK-P8-NEXT: nop
-; CHECK-P8-NEXT: mr r5, r3
-; CHECK-P8-NEXT: mr r6, r4
-; CHECK-P8-NEXT: mr r3, r30
-; CHECK-P8-NEXT: mr r4, r29
+; CHECK-P8-NEXT: vmr v3, v2
+; CHECK-P8-NEXT: vmr v2, v31
; CHECK-P8-NEXT: bl __addkf3
; CHECK-P8-NEXT: nop
; CHECK-P8-NEXT: bl __trunckfdf2
; CHECK-P8-NEXT: nop
-; CHECK-P8-NEXT: stfdx f1, 0, r28
-; CHECK-P8-NEXT: addi r1, r1, 64
+; CHECK-P8-NEXT: li r3, 48
+; CHECK-P8-NEXT: stfdx f1, 0, r30
+; CHECK-P8-NEXT: ld r30, 64(r1) # 8-byte Folded Reload
+; CHECK-P8-NEXT: lvx v31, r1, r3 # 16-byte Folded Reload
+; CHECK-P8-NEXT: addi r1, r1, 80
; CHECK-P8-NEXT: ld r0, 16(r1)
-; CHECK-P8-NEXT: ld r30, -16(r1) # 8-byte Folded Reload
-; CHECK-P8-NEXT: ld r29, -24(r1) # 8-byte Folded Reload
-; CHECK-P8-NEXT: ld r28, -32(r1) # 8-byte Folded Reload
; CHECK-P8-NEXT: mtlr r0
; CHECK-P8-NEXT: blr
fp128* nocapture %f2, i32 signext %i1, i8 zeroext %c1,
@@ -686,39 +627,34 @@ define fastcc void @mixParam_03f(fp128 %f1, double* nocapture %d1, <4 x i32> %ve
; CHECK-P8-LABEL: mixParam_03f:
; CHECK-P8: # %bb.0: # %entry
; CHECK-P8-NEXT: mflr r0
-; CHECK-P8-NEXT: .cfi_def_cfa_offset 64
+; CHECK-P8-NEXT: std r0, 16(r1)
+; CHECK-P8-NEXT: stdu r1, -80(r1)
+; CHECK-P8-NEXT: .cfi_def_cfa_offset 80
; CHECK-P8-NEXT: .cfi_offset lr, 16
-; CHECK-P8-NEXT: .cfi_offset r28, -32
-; CHECK-P8-NEXT: .cfi_offset r29, -24
; CHECK-P8-NEXT: .cfi_offset r30, -16
-; CHECK-P8-NEXT: std r28, -32(r1) # 8-byte Folded Spill
-; CHECK-P8-NEXT: std r29, -24(r1) # 8-byte Folded Spill
-; CHECK-P8-NEXT: std r30, -16(r1) # 8-byte Folded Spill
-; CHECK-P8-NEXT: std r0, 16(r1)
-; CHECK-P8-NEXT: stdu r1, -64(r1)
-; CHECK-P8-NEXT: std r4, 8(r6)
-; CHECK-P8-NEXT: std r3, 0(r6)
-; CHECK-P8-NEXT: mr r3, r7
-; CHECK-P8-NEXT: mr r28, r5
-; CHECK-P8-NEXT: stvx v2, 0, r9
-; CHECK-P8-NEXT: ld r30, 0(r6)
-; CHECK-P8-NEXT: ld r29, 8(r6)
+; CHECK-P8-NEXT: .cfi_offset v31, -32
+; CHECK-P8-NEXT: li r6, 48
+; CHECK-P8-NEXT: stvx v2, 0, r4
+; CHECK-P8-NEXT: stvx v3, 0, r7
+; CHECK-P8-NEXT: std r30, 64(r1) # 8-byte Folded Spill
+; CHECK-P8-NEXT: mr r30, r3
+; CHECK-P8-NEXT: mr r3, r5
+; CHECK-P8-NEXT: stvx v31, r1, r6 # 16-byte Folded Spill
+; CHECK-P8-NEXT: lvx v31, 0, r4
; CHECK-P8-NEXT: bl __floatsikf
; CHECK-P8-NEXT: nop
-; CHECK-P8-NEXT: mr r5, r3
-; CHECK-P8-NEXT: mr r6, r4
-; CHECK-P8-NEXT: mr r3, r30
-; CHECK-P8-NEXT: mr r4, r29
+; CHECK-P8-NEXT: vmr v3, v2
+; CHECK-P8-NEXT: vmr v2, v31
; CHECK-P8-NEXT: bl __addkf3
; CHECK-P8-NEXT: nop
; CHECK-P8-NEXT: bl __trunckfdf2
; CHECK-P8-NEXT: nop
-; CHECK-P8-NEXT: stfdx f1, 0, r28
-; CHECK-P8-NEXT: addi r1, r1, 64
+; CHECK-P8-NEXT: li r3, 48
+; CHECK-P8-NEXT: stfdx f1, 0, r30
+; CHECK-P8-NEXT: ld r30, 64(r1) # 8-byte Folded Reload
+; CHECK-P8-NEXT: lvx v31, r1, r3 # 16-byte Folded Reload
+; CHECK-P8-NEXT: addi r1, r1, 80
; CHECK-P8-NEXT: ld r0, 16(r1)
-; CHECK-P8-NEXT: ld r30, -16(r1) # 8-byte Folded Reload
-; CHECK-P8-NEXT: ld r29, -24(r1) # 8-byte Folded Reload
-; CHECK-P8-NEXT: ld r28, -32(r1) # 8-byte Folded Reload
; CHECK-P8-NEXT: mtlr r0
; CHECK-P8-NEXT: blr
fp128* nocapture %f2, i32 signext %i1, i8 zeroext %c1,
@@ -757,15 +693,15 @@ define signext i32 @noopt_call_crash() #0 {
; CHECK-P8: # %bb.0: # %entry
; CHECK-P8-NEXT: mflr r0
; CHECK-P8-NEXT: std r0, 16(r1)
-; CHECK-P8-NEXT: stdu r1, -32(r1)
-; CHECK-P8-NEXT: .cfi_def_cfa_offset 32
+; CHECK-P8-NEXT: stdu r1, -96(r1)
+; CHECK-P8-NEXT: .cfi_def_cfa_offset 96
; CHECK-P8-NEXT: .cfi_offset lr, 16
; CHECK-P8-NEXT: bl in
; CHECK-P8-NEXT: nop
; CHECK-P8-NEXT: bl out
; CHECK-P8-NEXT: nop
; CHECK-P8-NEXT: li r3, 0
-; CHECK-P8-NEXT: addi r1, r1, 32
+; CHECK-P8-NEXT: addi r1, r1, 96
; CHECK-P8-NEXT: ld r0, 16(r1)
; CHECK-P8-NEXT: mtlr r0
; CHECK-P8-NEXT: blr
diff --git a/llvm/test/CodeGen/PowerPC/f128-rounding.ll b/llvm/test/CodeGen/PowerPC/f128-rounding.ll
index d75bd15aa532a..2913635408b4a 100644
--- a/llvm/test/CodeGen/PowerPC/f128-rounding.ll
+++ b/llvm/test/CodeGen/PowerPC/f128-rounding.ll
@@ -2,7 +2,7 @@
; RUN: llc -mcpu=pwr9 -mtriple=powerpc64le-unknown-unknown -verify-machineinstrs \
; RUN: -ppc-vsr-nums-as-vr -ppc-asm-full-reg-names < %s | FileCheck %s
; RUN: llc -mcpu=pwr8 -mtriple=powerpc64le-unknown-unknown -verify-machineinstrs \
-; RUN: -ppc-vsr-nums-as-vr -ppc-asm-full-reg-names < %s -enable-soft-fp128 | FileCheck %s \
+; RUN: -ppc-vsr-nums-as-vr -ppc-asm-full-reg-names < %s | FileCheck %s \
; RUN: -check-prefix=CHECK-P8
define void @qp_trunc(fp128* nocapture readonly %a, fp128* nocapture %res) {
diff --git a/llvm/test/CodeGen/PowerPC/f128-truncateNconv.ll b/llvm/test/CodeGen/PowerPC/f128-truncateNconv.ll
index cf9f48f5b47b1..32b0f10def292 100644
--- a/llvm/test/CodeGen/PowerPC/f128-truncateNconv.ll
+++ b/llvm/test/CodeGen/PowerPC/f128-truncateNconv.ll
@@ -28,9 +28,7 @@ define i64 @qpConv2sdw(fp128* nocapture readonly %a) {
; CHECK-P8-NEXT: stdu r1, -32(r1)
; CHECK-P8-NEXT: .cfi_def_cfa_offset 32
; CHECK-P8-NEXT: .cfi_offset lr, 16
-; CHECK-P8-NEXT: ld r5, 0(r3)
-; CHECK-P8-NEXT: ld r4, 8(r3)
-; CHECK-P8-NEXT: mr r3, r5
+; CHECK-P8-NEXT: lvx v2, 0, r3
; CHECK-P8-NEXT: bl __fixkfdi
; CHECK-P8-NEXT: nop
; CHECK-P8-NEXT: addi r1, r1, 32
@@ -67,9 +65,8 @@ define void @qpConv2sdw_02(i64* nocapture %res) local_unnamed_addr #1 {
; CHECK-P8-NEXT: addis r4, r2, .LC0 at toc@ha
; CHECK-P8-NEXT: mr r30, r3
; CHECK-P8-NEXT: ld r4, .LC0 at toc@l(r4)
-; CHECK-P8-NEXT: ld r5, 32(r4)
-; CHECK-P8-NEXT: ld r4, 40(r4)
-; CHECK-P8-NEXT: mr r3, r5
+; CHECK-P8-NEXT: addi r4, r4, 32
+; CHECK-P8-NEXT: lvx v2, 0, r4
; CHECK-P8-NEXT: bl __fixkfdi
; CHECK-P8-NEXT: nop
; CHECK-P8-NEXT: std r3, 0(r30)
@@ -109,12 +106,10 @@ define i64 @qpConv2sdw_03(fp128* nocapture readonly %a) {
; CHECK-P8-NEXT: .cfi_def_cfa_offset 32
; CHECK-P8-NEXT: .cfi_offset lr, 16
; CHECK-P8-NEXT: addis r4, r2, .LC0 at toc@ha
-; CHECK-P8-NEXT: ld r7, 0(r3)
-; CHECK-P8-NEXT: ld r6, .LC0 at toc@l(r4)
-; CHECK-P8-NEXT: ld r4, 8(r3)
-; CHECK-P8-NEXT: mr r3, r7
-; CHECK-P8-NEXT: ld r5, 16(r6)
-; CHECK-P8-NEXT: ld r6, 24(r6)
+; CHECK-P8-NEXT: lvx v2, 0, r3
+; CHECK-P8-NEXT: ld r4, .LC0 at toc@l(r4)
+; CHECK-P8-NEXT: addi r4, r4, 16
+; CHECK-P8-NEXT: lvx v3, 0, r4
; CHECK-P8-NEXT: bl __addkf3
; CHECK-P8-NEXT: nop
; CHECK-P8-NEXT: bl __fixkfdi
@@ -154,14 +149,9 @@ define void @qpConv2sdw_04(fp128* nocapture readonly %a,
; CHECK-P8-NEXT: std r30, -16(r1) # 8-byte Folded Spill
; CHECK-P8-NEXT: std r0, 16(r1)
; CHECK-P8-NEXT: stdu r1, -48(r1)
-; CHECK-P8-NEXT: ld r9, 0(r3)
-; CHECK-P8-NEXT: ld r7, 8(r3)
-; CHECK-P8-NEXT: ld r8, 0(r4)
-; CHECK-P8-NEXT: ld r6, 8(r4)
+; CHECK-P8-NEXT: lvx v2, 0, r3
+; CHECK-P8-NEXT: lvx v3, 0, r4
; CHECK-P8-NEXT: mr r30, r5
-; CHECK-P8-NEXT: mr r3, r9
-; CHECK-P8-NEXT: mr r4, r7
-; CHECK-P8-NEXT: mr r5, r8
; CHECK-P8-NEXT: bl __addkf3
; CHECK-P8-NEXT: nop
; CHECK-P8-NEXT: bl __fixkfdi
@@ -210,9 +200,8 @@ define void @qpConv2sdw_testXForm(i64* nocapture %res, i32 signext %idx) {
; CHECK-P8-NEXT: addis r4, r2, .LC0 at toc@ha
; CHECK-P8-NEXT: mr r29, r3
; CHECK-P8-NEXT: ld r4, .LC0 at toc@l(r4)
-; CHECK-P8-NEXT: ld r5, 32(r4)
-; CHECK-P8-NEXT: ld r4, 40(r4)
-; CHECK-P8-NEXT: mr r3, r5
+; CHECK-P8-NEXT: addi r4, r4, 32
+; CHECK-P8-NEXT: lvx v2, 0, r4
; CHECK-P8-NEXT: bl __fixkfdi
; CHECK-P8-NEXT: nop
; CHECK-P8-NEXT: sldi r4, r30, 3
@@ -251,9 +240,7 @@ define i64 @qpConv2udw(fp128* nocapture readonly %a) {
; CHECK-P8-NEXT: stdu r1, -32(r1)
; CHECK-P8-NEXT: .cfi_def_cfa_offset 32
; CHECK-P8-NEXT: .cfi_offset lr, 16
-; CHECK-P8-NEXT: ld r5, 0(r3)
-; CHECK-P8-NEXT: ld r4, 8(r3)
-; CHECK-P8-NEXT: mr r3, r5
+; CHECK-P8-NEXT: lvx v2, 0, r3
; CHECK-P8-NEXT: bl __fixunskfdi
; CHECK-P8-NEXT: nop
; CHECK-P8-NEXT: addi r1, r1, 32
@@ -290,9 +277,8 @@ define void @qpConv2udw_02(i64* nocapture %res) {
; CHECK-P8-NEXT: addis r4, r2, .LC0 at toc@ha
; CHECK-P8-NEXT: mr r30, r3
; CHECK-P8-NEXT: ld r4, .LC0 at toc@l(r4)
-; CHECK-P8-NEXT: ld r5, 32(r4)
-; CHECK-P8-NEXT: ld r4, 40(r4)
-; CHECK-P8-NEXT: mr r3, r5
+; CHECK-P8-NEXT: addi r4, r4, 32
+; CHECK-P8-NEXT: lvx v2, 0, r4
; CHECK-P8-NEXT: bl __fixunskfdi
; CHECK-P8-NEXT: nop
; CHECK-P8-NEXT: std r3, 0(r30)
@@ -332,12 +318,10 @@ define i64 @qpConv2udw_03(fp128* nocapture readonly %a) {
; CHECK-P8-NEXT: .cfi_def_cfa_offset 32
; CHECK-P8-NEXT: .cfi_offset lr, 16
; CHECK-P8-NEXT: addis r4, r2, .LC0 at toc@ha
-; CHECK-P8-NEXT: ld r7, 0(r3)
-; CHECK-P8-NEXT: ld r6, .LC0 at toc@l(r4)
-; CHECK-P8-NEXT: ld r4, 8(r3)
-; CHECK-P8-NEXT: mr r3, r7
-; CHECK-P8-NEXT: ld r5, 16(r6)
-; CHECK-P8-NEXT: ld r6, 24(r6)
+; CHECK-P8-NEXT: lvx v2, 0, r3
+; CHECK-P8-NEXT: ld r4, .LC0 at toc@l(r4)
+; CHECK-P8-NEXT: addi r4, r4, 16
+; CHECK-P8-NEXT: lvx v3, 0, r4
; CHECK-P8-NEXT: bl __addkf3
; CHECK-P8-NEXT: nop
; CHECK-P8-NEXT: bl __fixunskfdi
@@ -377,14 +361,9 @@ define void @qpConv2udw_04(fp128* nocapture readonly %a,
; CHECK-P8-NEXT: std r30, -16(r1) # 8-byte Folded Spill
; CHECK-P8-NEXT: std r0, 16(r1)
; CHECK-P8-NEXT: stdu r1, -48(r1)
-; CHECK-P8-NEXT: ld r9, 0(r3)
-; CHECK-P8-NEXT: ld r7, 8(r3)
-; CHECK-P8-NEXT: ld r8, 0(r4)
-; CHECK-P8-NEXT: ld r6, 8(r4)
+; CHECK-P8-NEXT: lvx v2, 0, r3
+; CHECK-P8-NEXT: lvx v3, 0, r4
; CHECK-P8-NEXT: mr r30, r5
-; CHECK-P8-NEXT: mr r3, r9
-; CHECK-P8-NEXT: mr r4, r7
-; CHECK-P8-NEXT: mr r5, r8
; CHECK-P8-NEXT: bl __addkf3
; CHECK-P8-NEXT: nop
; CHECK-P8-NEXT: bl __fixunskfdi
@@ -433,9 +412,7 @@ define void @qpConv2udw_testXForm(i64* nocapture %res, i32 signext %idx) {
; CHECK-P8-NEXT: addis r4, r2, .LC0 at toc@ha
; CHECK-P8-NEXT: mr r29, r3
; CHECK-P8-NEXT: ld r4, .LC0 at toc@l(r4)
-; CHECK-P8-NEXT: ld r5, 0(r4)
-; CHECK-P8-NEXT: ld r4, 8(r4)
-; CHECK-P8-NEXT: mr r3, r5
+; CHECK-P8-NEXT: lvx v2, 0, r4
; CHECK-P8-NEXT: bl __fixunskfdi
; CHECK-P8-NEXT: nop
; CHECK-P8-NEXT: sldi r4, r30, 3
@@ -475,9 +452,7 @@ define signext i32 @qpConv2sw(fp128* nocapture readonly %a) {
; CHECK-P8-NEXT: stdu r1, -32(r1)
; CHECK-P8-NEXT: .cfi_def_cfa_offset 32
; CHECK-P8-NEXT: .cfi_offset lr, 16
-; CHECK-P8-NEXT: ld r5, 0(r3)
-; CHECK-P8-NEXT: ld r4, 8(r3)
-; CHECK-P8-NEXT: mr r3, r5
+; CHECK-P8-NEXT: lvx v2, 0, r3
; CHECK-P8-NEXT: bl __fixkfsi
; CHECK-P8-NEXT: nop
; CHECK-P8-NEXT: extsw r3, r3
@@ -515,9 +490,8 @@ define void @qpConv2sw_02(i32* nocapture %res) {
; CHECK-P8-NEXT: addis r4, r2, .LC0 at toc@ha
; CHECK-P8-NEXT: mr r30, r3
; CHECK-P8-NEXT: ld r4, .LC0 at toc@l(r4)
-; CHECK-P8-NEXT: ld r5, 32(r4)
-; CHECK-P8-NEXT: ld r4, 40(r4)
-; CHECK-P8-NEXT: mr r3, r5
+; CHECK-P8-NEXT: addi r4, r4, 32
+; CHECK-P8-NEXT: lvx v2, 0, r4
; CHECK-P8-NEXT: bl __fixkfsi
; CHECK-P8-NEXT: nop
; CHECK-P8-NEXT: stw r3, 0(r30)
@@ -558,12 +532,10 @@ define signext i32 @qpConv2sw_03(fp128* nocapture readonly %a) {
; CHECK-P8-NEXT: .cfi_def_cfa_offset 32
; CHECK-P8-NEXT: .cfi_offset lr, 16
; CHECK-P8-NEXT: addis r4, r2, .LC0 at toc@ha
-; CHECK-P8-NEXT: ld r7, 0(r3)
-; CHECK-P8-NEXT: ld r6, .LC0 at toc@l(r4)
-; CHECK-P8-NEXT: ld r4, 8(r3)
-; CHECK-P8-NEXT: mr r3, r7
-; CHECK-P8-NEXT: ld r5, 16(r6)
-; CHECK-P8-NEXT: ld r6, 24(r6)
+; CHECK-P8-NEXT: lvx v2, 0, r3
+; CHECK-P8-NEXT: ld r4, .LC0 at toc@l(r4)
+; CHECK-P8-NEXT: addi r4, r4, 16
+; CHECK-P8-NEXT: lvx v3, 0, r4
; CHECK-P8-NEXT: bl __addkf3
; CHECK-P8-NEXT: nop
; CHECK-P8-NEXT: bl __fixkfsi
@@ -604,14 +576,9 @@ define void @qpConv2sw_04(fp128* nocapture readonly %a,
; CHECK-P8-NEXT: std r30, -16(r1) # 8-byte Folded Spill
; CHECK-P8-NEXT: std r0, 16(r1)
; CHECK-P8-NEXT: stdu r1, -48(r1)
-; CHECK-P8-NEXT: ld r9, 0(r3)
-; CHECK-P8-NEXT: ld r7, 8(r3)
-; CHECK-P8-NEXT: ld r8, 0(r4)
-; CHECK-P8-NEXT: ld r6, 8(r4)
+; CHECK-P8-NEXT: lvx v2, 0, r3
+; CHECK-P8-NEXT: lvx v3, 0, r4
; CHECK-P8-NEXT: mr r30, r5
-; CHECK-P8-NEXT: mr r3, r9
-; CHECK-P8-NEXT: mr r4, r7
-; CHECK-P8-NEXT: mr r5, r8
; CHECK-P8-NEXT: bl __addkf3
; CHECK-P8-NEXT: nop
; CHECK-P8-NEXT: bl __fixkfsi
@@ -650,9 +617,7 @@ define zeroext i32 @qpConv2uw(fp128* nocapture readonly %a) {
; CHECK-P8-NEXT: stdu r1, -32(r1)
; CHECK-P8-NEXT: .cfi_def_cfa_offset 32
; CHECK-P8-NEXT: .cfi_offset lr, 16
-; CHECK-P8-NEXT: ld r5, 0(r3)
-; CHECK-P8-NEXT: ld r4, 8(r3)
-; CHECK-P8-NEXT: mr r3, r5
+; CHECK-P8-NEXT: lvx v2, 0, r3
; CHECK-P8-NEXT: bl __fixunskfsi
; CHECK-P8-NEXT: nop
; CHECK-P8-NEXT: addi r1, r1, 32
@@ -689,9 +654,8 @@ define void @qpConv2uw_02(i32* nocapture %res) {
; CHECK-P8-NEXT: addis r4, r2, .LC0 at toc@ha
; CHECK-P8-NEXT: mr r30, r3
; CHECK-P8-NEXT: ld r4, .LC0 at toc@l(r4)
-; CHECK-P8-NEXT: ld r5, 32(r4)
-; CHECK-P8-NEXT: ld r4, 40(r4)
-; CHECK-P8-NEXT: mr r3, r5
+; CHECK-P8-NEXT: addi r4, r4, 32
+; CHECK-P8-NEXT: lvx v2, 0, r4
; CHECK-P8-NEXT: bl __fixunskfsi
; CHECK-P8-NEXT: nop
; CHECK-P8-NEXT: stw r3, 0(r30)
@@ -732,12 +696,10 @@ define zeroext i32 @qpConv2uw_03(fp128* nocapture readonly %a) {
; CHECK-P8-NEXT: .cfi_def_cfa_offset 32
; CHECK-P8-NEXT: .cfi_offset lr, 16
; CHECK-P8-NEXT: addis r4, r2, .LC0 at toc@ha
-; CHECK-P8-NEXT: ld r7, 0(r3)
-; CHECK-P8-NEXT: ld r6, .LC0 at toc@l(r4)
-; CHECK-P8-NEXT: ld r4, 8(r3)
-; CHECK-P8-NEXT: mr r3, r7
-; CHECK-P8-NEXT: ld r5, 16(r6)
-; CHECK-P8-NEXT: ld r6, 24(r6)
+; CHECK-P8-NEXT: lvx v2, 0, r3
+; CHECK-P8-NEXT: ld r4, .LC0 at toc@l(r4)
+; CHECK-P8-NEXT: addi r4, r4, 16
+; CHECK-P8-NEXT: lvx v3, 0, r4
; CHECK-P8-NEXT: bl __addkf3
; CHECK-P8-NEXT: nop
; CHECK-P8-NEXT: bl __fixunskfsi
@@ -777,14 +739,9 @@ define void @qpConv2uw_04(fp128* nocapture readonly %a,
; CHECK-P8-NEXT: std r30, -16(r1) # 8-byte Folded Spill
; CHECK-P8-NEXT: std r0, 16(r1)
; CHECK-P8-NEXT: stdu r1, -48(r1)
-; CHECK-P8-NEXT: ld r9, 0(r3)
-; CHECK-P8-NEXT: ld r7, 8(r3)
-; CHECK-P8-NEXT: ld r8, 0(r4)
-; CHECK-P8-NEXT: ld r6, 8(r4)
+; CHECK-P8-NEXT: lvx v2, 0, r3
+; CHECK-P8-NEXT: lvx v3, 0, r4
; CHECK-P8-NEXT: mr r30, r5
-; CHECK-P8-NEXT: mr r3, r9
-; CHECK-P8-NEXT: mr r4, r7
-; CHECK-P8-NEXT: mr r5, r8
; CHECK-P8-NEXT: bl __addkf3
; CHECK-P8-NEXT: nop
; CHECK-P8-NEXT: bl __fixunskfsi
@@ -824,9 +781,7 @@ define signext i16 @qpConv2shw(fp128* nocapture readonly %a) {
; CHECK-P8-NEXT: stdu r1, -32(r1)
; CHECK-P8-NEXT: .cfi_def_cfa_offset 32
; CHECK-P8-NEXT: .cfi_offset lr, 16
-; CHECK-P8-NEXT: ld r5, 0(r3)
-; CHECK-P8-NEXT: ld r4, 8(r3)
-; CHECK-P8-NEXT: mr r3, r5
+; CHECK-P8-NEXT: lvx v2, 0, r3
; CHECK-P8-NEXT: bl __fixkfsi
; CHECK-P8-NEXT: nop
; CHECK-P8-NEXT: extsw r3, r3
@@ -863,9 +818,8 @@ define void @qpConv2shw_02(i16* nocapture %res) {
; CHECK-P8-NEXT: addis r4, r2, .LC0 at toc@ha
; CHECK-P8-NEXT: mr r30, r3
; CHECK-P8-NEXT: ld r4, .LC0 at toc@l(r4)
-; CHECK-P8-NEXT: ld r5, 32(r4)
-; CHECK-P8-NEXT: ld r4, 40(r4)
-; CHECK-P8-NEXT: mr r3, r5
+; CHECK-P8-NEXT: addi r4, r4, 32
+; CHECK-P8-NEXT: lvx v2, 0, r4
; CHECK-P8-NEXT: bl __fixkfsi
; CHECK-P8-NEXT: nop
; CHECK-P8-NEXT: sth r3, 0(r30)
@@ -905,12 +859,10 @@ define signext i16 @qpConv2shw_03(fp128* nocapture readonly %a) {
; CHECK-P8-NEXT: .cfi_def_cfa_offset 32
; CHECK-P8-NEXT: .cfi_offset lr, 16
; CHECK-P8-NEXT: addis r4, r2, .LC0 at toc@ha
-; CHECK-P8-NEXT: ld r7, 0(r3)
-; CHECK-P8-NEXT: ld r6, .LC0 at toc@l(r4)
-; CHECK-P8-NEXT: ld r4, 8(r3)
-; CHECK-P8-NEXT: mr r3, r7
-; CHECK-P8-NEXT: ld r5, 16(r6)
-; CHECK-P8-NEXT: ld r6, 24(r6)
+; CHECK-P8-NEXT: lvx v2, 0, r3
+; CHECK-P8-NEXT: ld r4, .LC0 at toc@l(r4)
+; CHECK-P8-NEXT: addi r4, r4, 16
+; CHECK-P8-NEXT: lvx v3, 0, r4
; CHECK-P8-NEXT: bl __addkf3
; CHECK-P8-NEXT: nop
; CHECK-P8-NEXT: bl __fixkfsi
@@ -950,14 +902,9 @@ define void @qpConv2shw_04(fp128* nocapture readonly %a,
; CHECK-P8-NEXT: std r30, -16(r1) # 8-byte Folded Spill
; CHECK-P8-NEXT: std r0, 16(r1)
; CHECK-P8-NEXT: stdu r1, -48(r1)
-; CHECK-P8-NEXT: ld r9, 0(r3)
-; CHECK-P8-NEXT: ld r7, 8(r3)
-; CHECK-P8-NEXT: ld r8, 0(r4)
-; CHECK-P8-NEXT: ld r6, 8(r4)
+; CHECK-P8-NEXT: lvx v2, 0, r3
+; CHECK-P8-NEXT: lvx v3, 0, r4
; CHECK-P8-NEXT: mr r30, r5
-; CHECK-P8-NEXT: mr r3, r9
-; CHECK-P8-NEXT: mr r4, r7
-; CHECK-P8-NEXT: mr r5, r8
; CHECK-P8-NEXT: bl __addkf3
; CHECK-P8-NEXT: nop
; CHECK-P8-NEXT: bl __fixkfsi
@@ -995,9 +942,7 @@ define zeroext i16 @qpConv2uhw(fp128* nocapture readonly %a) {
; CHECK-P8-NEXT: stdu r1, -32(r1)
; CHECK-P8-NEXT: .cfi_def_cfa_offset 32
; CHECK-P8-NEXT: .cfi_offset lr, 16
-; CHECK-P8-NEXT: ld r5, 0(r3)
-; CHECK-P8-NEXT: ld r4, 8(r3)
-; CHECK-P8-NEXT: mr r3, r5
+; CHECK-P8-NEXT: lvx v2, 0, r3
; CHECK-P8-NEXT: bl __fixkfsi
; CHECK-P8-NEXT: nop
; CHECK-P8-NEXT: addi r1, r1, 32
@@ -1033,9 +978,8 @@ define void @qpConv2uhw_02(i16* nocapture %res) {
; CHECK-P8-NEXT: addis r4, r2, .LC0 at toc@ha
; CHECK-P8-NEXT: mr r30, r3
; CHECK-P8-NEXT: ld r4, .LC0 at toc@l(r4)
-; CHECK-P8-NEXT: ld r5, 32(r4)
-; CHECK-P8-NEXT: ld r4, 40(r4)
-; CHECK-P8-NEXT: mr r3, r5
+; CHECK-P8-NEXT: addi r4, r4, 32
+; CHECK-P8-NEXT: lvx v2, 0, r4
; CHECK-P8-NEXT: bl __fixkfsi
; CHECK-P8-NEXT: nop
; CHECK-P8-NEXT: sth r3, 0(r30)
@@ -1075,12 +1019,10 @@ define zeroext i16 @qpConv2uhw_03(fp128* nocapture readonly %a) {
; CHECK-P8-NEXT: .cfi_def_cfa_offset 32
; CHECK-P8-NEXT: .cfi_offset lr, 16
; CHECK-P8-NEXT: addis r4, r2, .LC0 at toc@ha
-; CHECK-P8-NEXT: ld r7, 0(r3)
-; CHECK-P8-NEXT: ld r6, .LC0 at toc@l(r4)
-; CHECK-P8-NEXT: ld r4, 8(r3)
-; CHECK-P8-NEXT: mr r3, r7
-; CHECK-P8-NEXT: ld r5, 16(r6)
-; CHECK-P8-NEXT: ld r6, 24(r6)
+; CHECK-P8-NEXT: lvx v2, 0, r3
+; CHECK-P8-NEXT: ld r4, .LC0 at toc@l(r4)
+; CHECK-P8-NEXT: addi r4, r4, 16
+; CHECK-P8-NEXT: lvx v3, 0, r4
; CHECK-P8-NEXT: bl __addkf3
; CHECK-P8-NEXT: nop
; CHECK-P8-NEXT: bl __fixkfsi
@@ -1119,14 +1061,9 @@ define void @qpConv2uhw_04(fp128* nocapture readonly %a,
; CHECK-P8-NEXT: std r30, -16(r1) # 8-byte Folded Spill
; CHECK-P8-NEXT: std r0, 16(r1)
; CHECK-P8-NEXT: stdu r1, -48(r1)
-; CHECK-P8-NEXT: ld r9, 0(r3)
-; CHECK-P8-NEXT: ld r7, 8(r3)
-; CHECK-P8-NEXT: ld r8, 0(r4)
-; CHECK-P8-NEXT: ld r6, 8(r4)
+; CHECK-P8-NEXT: lvx v2, 0, r3
+; CHECK-P8-NEXT: lvx v3, 0, r4
; CHECK-P8-NEXT: mr r30, r5
-; CHECK-P8-NEXT: mr r3, r9
-; CHECK-P8-NEXT: mr r4, r7
-; CHECK-P8-NEXT: mr r5, r8
; CHECK-P8-NEXT: bl __addkf3
; CHECK-P8-NEXT: nop
; CHECK-P8-NEXT: bl __fixkfsi
@@ -1164,9 +1101,7 @@ define signext i8 @qpConv2sb(fp128* nocapture readonly %a) {
; CHECK-P8-NEXT: stdu r1, -32(r1)
; CHECK-P8-NEXT: .cfi_def_cfa_offset 32
; CHECK-P8-NEXT: .cfi_offset lr, 16
-; CHECK-P8-NEXT: ld r5, 0(r3)
-; CHECK-P8-NEXT: ld r4, 8(r3)
-; CHECK-P8-NEXT: mr r3, r5
+; CHECK-P8-NEXT: lvx v2, 0, r3
; CHECK-P8-NEXT: bl __fixkfsi
; CHECK-P8-NEXT: nop
; CHECK-P8-NEXT: extsw r3, r3
@@ -1203,9 +1138,8 @@ define void @qpConv2sb_02(i8* nocapture %res) {
; CHECK-P8-NEXT: addis r4, r2, .LC0 at toc@ha
; CHECK-P8-NEXT: mr r30, r3
; CHECK-P8-NEXT: ld r4, .LC0 at toc@l(r4)
-; CHECK-P8-NEXT: ld r5, 32(r4)
-; CHECK-P8-NEXT: ld r4, 40(r4)
-; CHECK-P8-NEXT: mr r3, r5
+; CHECK-P8-NEXT: addi r4, r4, 32
+; CHECK-P8-NEXT: lvx v2, 0, r4
; CHECK-P8-NEXT: bl __fixkfsi
; CHECK-P8-NEXT: nop
; CHECK-P8-NEXT: stb r3, 0(r30)
@@ -1245,12 +1179,10 @@ define signext i8 @qpConv2sb_03(fp128* nocapture readonly %a) {
; CHECK-P8-NEXT: .cfi_def_cfa_offset 32
; CHECK-P8-NEXT: .cfi_offset lr, 16
; CHECK-P8-NEXT: addis r4, r2, .LC0 at toc@ha
-; CHECK-P8-NEXT: ld r7, 0(r3)
-; CHECK-P8-NEXT: ld r6, .LC0 at toc@l(r4)
-; CHECK-P8-NEXT: ld r4, 8(r3)
-; CHECK-P8-NEXT: mr r3, r7
-; CHECK-P8-NEXT: ld r5, 16(r6)
-; CHECK-P8-NEXT: ld r6, 24(r6)
+; CHECK-P8-NEXT: lvx v2, 0, r3
+; CHECK-P8-NEXT: ld r4, .LC0 at toc@l(r4)
+; CHECK-P8-NEXT: addi r4, r4, 16
+; CHECK-P8-NEXT: lvx v3, 0, r4
; CHECK-P8-NEXT: bl __addkf3
; CHECK-P8-NEXT: nop
; CHECK-P8-NEXT: bl __fixkfsi
@@ -1290,14 +1222,9 @@ define void @qpConv2sb_04(fp128* nocapture readonly %a,
; CHECK-P8-NEXT: std r30, -16(r1) # 8-byte Folded Spill
; CHECK-P8-NEXT: std r0, 16(r1)
; CHECK-P8-NEXT: stdu r1, -48(r1)
-; CHECK-P8-NEXT: ld r9, 0(r3)
-; CHECK-P8-NEXT: ld r7, 8(r3)
-; CHECK-P8-NEXT: ld r8, 0(r4)
-; CHECK-P8-NEXT: ld r6, 8(r4)
+; CHECK-P8-NEXT: lvx v2, 0, r3
+; CHECK-P8-NEXT: lvx v3, 0, r4
; CHECK-P8-NEXT: mr r30, r5
-; CHECK-P8-NEXT: mr r3, r9
-; CHECK-P8-NEXT: mr r4, r7
-; CHECK-P8-NEXT: mr r5, r8
; CHECK-P8-NEXT: bl __addkf3
; CHECK-P8-NEXT: nop
; CHECK-P8-NEXT: bl __fixkfsi
@@ -1335,9 +1262,7 @@ define zeroext i8 @qpConv2ub(fp128* nocapture readonly %a) {
; CHECK-P8-NEXT: stdu r1, -32(r1)
; CHECK-P8-NEXT: .cfi_def_cfa_offset 32
; CHECK-P8-NEXT: .cfi_offset lr, 16
-; CHECK-P8-NEXT: ld r5, 0(r3)
-; CHECK-P8-NEXT: ld r4, 8(r3)
-; CHECK-P8-NEXT: mr r3, r5
+; CHECK-P8-NEXT: lvx v2, 0, r3
; CHECK-P8-NEXT: bl __fixkfsi
; CHECK-P8-NEXT: nop
; CHECK-P8-NEXT: addi r1, r1, 32
@@ -1373,9 +1298,8 @@ define void @qpConv2ub_02(i8* nocapture %res) {
; CHECK-P8-NEXT: addis r4, r2, .LC0 at toc@ha
; CHECK-P8-NEXT: mr r30, r3
; CHECK-P8-NEXT: ld r4, .LC0 at toc@l(r4)
-; CHECK-P8-NEXT: ld r5, 32(r4)
-; CHECK-P8-NEXT: ld r4, 40(r4)
-; CHECK-P8-NEXT: mr r3, r5
+; CHECK-P8-NEXT: addi r4, r4, 32
+; CHECK-P8-NEXT: lvx v2, 0, r4
; CHECK-P8-NEXT: bl __fixkfsi
; CHECK-P8-NEXT: nop
; CHECK-P8-NEXT: stb r3, 0(r30)
@@ -1415,12 +1339,10 @@ define zeroext i8 @qpConv2ub_03(fp128* nocapture readonly %a) {
; CHECK-P8-NEXT: .cfi_def_cfa_offset 32
; CHECK-P8-NEXT: .cfi_offset lr, 16
; CHECK-P8-NEXT: addis r4, r2, .LC0 at toc@ha
-; CHECK-P8-NEXT: ld r7, 0(r3)
-; CHECK-P8-NEXT: ld r6, .LC0 at toc@l(r4)
-; CHECK-P8-NEXT: ld r4, 8(r3)
-; CHECK-P8-NEXT: mr r3, r7
-; CHECK-P8-NEXT: ld r5, 16(r6)
-; CHECK-P8-NEXT: ld r6, 24(r6)
+; CHECK-P8-NEXT: lvx v2, 0, r3
+; CHECK-P8-NEXT: ld r4, .LC0 at toc@l(r4)
+; CHECK-P8-NEXT: addi r4, r4, 16
+; CHECK-P8-NEXT: lvx v3, 0, r4
; CHECK-P8-NEXT: bl __addkf3
; CHECK-P8-NEXT: nop
; CHECK-P8-NEXT: bl __fixkfsi
@@ -1459,14 +1381,9 @@ define void @qpConv2ub_04(fp128* nocapture readonly %a,
; CHECK-P8-NEXT: std r30, -16(r1) # 8-byte Folded Spill
; CHECK-P8-NEXT: std r0, 16(r1)
; CHECK-P8-NEXT: stdu r1, -48(r1)
-; CHECK-P8-NEXT: ld r9, 0(r3)
-; CHECK-P8-NEXT: ld r7, 8(r3)
-; CHECK-P8-NEXT: ld r8, 0(r4)
-; CHECK-P8-NEXT: ld r6, 8(r4)
+; CHECK-P8-NEXT: lvx v2, 0, r3
+; CHECK-P8-NEXT: lvx v3, 0, r4
; CHECK-P8-NEXT: mr r30, r5
-; CHECK-P8-NEXT: mr r3, r9
-; CHECK-P8-NEXT: mr r4, r7
-; CHECK-P8-NEXT: mr r5, r8
; CHECK-P8-NEXT: bl __addkf3
; CHECK-P8-NEXT: nop
; CHECK-P8-NEXT: bl __fixkfsi
diff --git a/llvm/test/CodeGen/PowerPC/fp-strict-conv-f128.ll b/llvm/test/CodeGen/PowerPC/fp-strict-conv-f128.ll
index e647ebdef2248..0e7ec05ffedb5 100644
--- a/llvm/test/CodeGen/PowerPC/fp-strict-conv-f128.ll
+++ b/llvm/test/CodeGen/PowerPC/fp-strict-conv-f128.ll
@@ -6,7 +6,7 @@
; RUN: < %s -mtriple=powerpc64le-unknown-linux -mcpu=pwr9 | FileCheck %s \
; RUN: -check-prefix=P9
; RUN: llc -verify-machineinstrs -ppc-asm-full-reg-names -ppc-vsr-nums-as-vr \
-; RUN: < %s -mtriple=powerpc64le-unknown-linux -mcpu=pwr8 -enable-soft-fp128 -mattr=-vsx \
+; RUN: < %s -mtriple=powerpc64le-unknown-linux -mcpu=pwr8 -mattr=-vsx \
; RUN: | FileCheck %s -check-prefix=NOVSX
declare i1 @llvm.experimental.constrained.fptosi.i1.f128(fp128, metadata)
@@ -183,7 +183,7 @@ define i1 @q_to_u1(fp128 %m) #0 {
; P8-NEXT: stdu r1, -112(r1)
; P8-NEXT: .cfi_def_cfa_offset 112
; P8-NEXT: .cfi_offset lr, 16
-; P8-NEXT: bl __fixunskfsi
+; P8-NEXT: bl __fixkfsi
; P8-NEXT: nop
; P8-NEXT: addi r1, r1, 112
; P8-NEXT: ld r0, 16(r1)
@@ -203,7 +203,7 @@ define i1 @q_to_u1(fp128 %m) #0 {
; NOVSX-NEXT: stdu r1, -32(r1)
; NOVSX-NEXT: .cfi_def_cfa_offset 32
; NOVSX-NEXT: .cfi_offset lr, 16
-; NOVSX-NEXT: bl __fixkfsi
+; NOVSX-NEXT: bl __fixunskfsi
; NOVSX-NEXT: nop
; NOVSX-NEXT: addi r1, r1, 32
; NOVSX-NEXT: ld r0, 16(r1)
@@ -786,7 +786,7 @@ define fp128 @u1_to_q(i1 zeroext %m) #0 {
; P8-NEXT: stdu r1, -112(r1)
; P8-NEXT: .cfi_def_cfa_offset 112
; P8-NEXT: .cfi_offset lr, 16
-; P8-NEXT: bl __floatunsikf
+; P8-NEXT: bl __floatsikf
; P8-NEXT: nop
; P8-NEXT: addi r1, r1, 112
; P8-NEXT: ld r0, 16(r1)
@@ -806,7 +806,7 @@ define fp128 @u1_to_q(i1 zeroext %m) #0 {
; NOVSX-NEXT: stdu r1, -32(r1)
; NOVSX-NEXT: .cfi_def_cfa_offset 32
; NOVSX-NEXT: .cfi_offset lr, 16
-; NOVSX-NEXT: bl __floatsikf
+; NOVSX-NEXT: bl __floatunsikf
; NOVSX-NEXT: nop
; NOVSX-NEXT: addi r1, r1, 32
; NOVSX-NEXT: ld r0, 16(r1)
diff --git a/llvm/test/CodeGen/PowerPC/fp-strict-f128.ll b/llvm/test/CodeGen/PowerPC/fp-strict-f128.ll
index ff165fd6ced6c..e2c29f30cd3d6 100644
--- a/llvm/test/CodeGen/PowerPC/fp-strict-f128.ll
+++ b/llvm/test/CodeGen/PowerPC/fp-strict-f128.ll
@@ -154,15 +154,18 @@ define fp128 @fmsub_f128(fp128 %f0, fp128 %f1, fp128 %f2) #0 {
; CHECK-P8: # %bb.0:
; CHECK-P8-NEXT: mflr r0
; CHECK-P8-NEXT: std r0, 16(r1)
-; CHECK-P8-NEXT: stdu r1, -32(r1)
-; CHECK-P8-NEXT: .cfi_def_cfa_offset 32
+; CHECK-P8-NEXT: stdu r1, -48(r1)
+; CHECK-P8-NEXT: .cfi_def_cfa_offset 48
; CHECK-P8-NEXT: .cfi_offset lr, 16
-; CHECK-P8-NEXT: li r9, 1
-; CHECK-P8-NEXT: rldic r9, r9, 63, 0
-; CHECK-P8-NEXT: xor r8, r8, r9
+; CHECK-P8-NEXT: addi r3, r1, 32
+; CHECK-P8-NEXT: stvx v4, 0, r3
+; CHECK-P8-NEXT: lbz r4, 47(r1)
+; CHECK-P8-NEXT: xori r4, r4, 128
+; CHECK-P8-NEXT: stb r4, 47(r1)
+; CHECK-P8-NEXT: lvx v4, 0, r3
; CHECK-P8-NEXT: bl fmaf128
; CHECK-P8-NEXT: nop
-; CHECK-P8-NEXT: addi r1, r1, 32
+; CHECK-P8-NEXT: addi r1, r1, 48
; CHECK-P8-NEXT: ld r0, 16(r1)
; CHECK-P8-NEXT: mtlr r0
; CHECK-P8-NEXT: blr
@@ -185,15 +188,18 @@ define fp128 @fnmadd_f128(fp128 %f0, fp128 %f1, fp128 %f2) #0 {
; CHECK-P8: # %bb.0:
; CHECK-P8-NEXT: mflr r0
; CHECK-P8-NEXT: std r0, 16(r1)
-; CHECK-P8-NEXT: stdu r1, -32(r1)
-; CHECK-P8-NEXT: .cfi_def_cfa_offset 32
+; CHECK-P8-NEXT: stdu r1, -48(r1)
+; CHECK-P8-NEXT: .cfi_def_cfa_offset 48
; CHECK-P8-NEXT: .cfi_offset lr, 16
; CHECK-P8-NEXT: bl fmaf128
; CHECK-P8-NEXT: nop
-; CHECK-P8-NEXT: li r5, 1
-; CHECK-P8-NEXT: rldic r5, r5, 63, 0
-; CHECK-P8-NEXT: xor r4, r4, r5
-; CHECK-P8-NEXT: addi r1, r1, 32
+; CHECK-P8-NEXT: addi r3, r1, 32
+; CHECK-P8-NEXT: stvx v2, 0, r3
+; CHECK-P8-NEXT: lbz r4, 47(r1)
+; CHECK-P8-NEXT: xori r4, r4, 128
+; CHECK-P8-NEXT: stb r4, 47(r1)
+; CHECK-P8-NEXT: lvx v2, 0, r3
+; CHECK-P8-NEXT: addi r1, r1, 48
; CHECK-P8-NEXT: ld r0, 16(r1)
; CHECK-P8-NEXT: mtlr r0
; CHECK-P8-NEXT: blr
@@ -215,21 +221,26 @@ define fp128 @fnmsub_f128(fp128 %f0, fp128 %f1, fp128 %f2) #0 {
; CHECK-P8-LABEL: fnmsub_f128:
; CHECK-P8: # %bb.0:
; CHECK-P8-NEXT: mflr r0
-; CHECK-P8-NEXT: .cfi_def_cfa_offset 48
-; CHECK-P8-NEXT: .cfi_offset lr, 16
-; CHECK-P8-NEXT: .cfi_offset r30, -16
-; CHECK-P8-NEXT: std r30, -16(r1) # 8-byte Folded Spill
; CHECK-P8-NEXT: std r0, 16(r1)
-; CHECK-P8-NEXT: stdu r1, -48(r1)
-; CHECK-P8-NEXT: li r9, 1
-; CHECK-P8-NEXT: rldic r30, r9, 63, 0
-; CHECK-P8-NEXT: xor r8, r8, r30
+; CHECK-P8-NEXT: stdu r1, -64(r1)
+; CHECK-P8-NEXT: .cfi_def_cfa_offset 64
+; CHECK-P8-NEXT: .cfi_offset lr, 16
+; CHECK-P8-NEXT: addi r3, r1, 32
+; CHECK-P8-NEXT: stvx v4, 0, r3
+; CHECK-P8-NEXT: lbz r4, 47(r1)
+; CHECK-P8-NEXT: xori r4, r4, 128
+; CHECK-P8-NEXT: stb r4, 47(r1)
+; CHECK-P8-NEXT: lvx v4, 0, r3
; CHECK-P8-NEXT: bl fmaf128
; CHECK-P8-NEXT: nop
-; CHECK-P8-NEXT: xor r4, r4, r30
-; CHECK-P8-NEXT: addi r1, r1, 48
+; CHECK-P8-NEXT: addi r3, r1, 48
+; CHECK-P8-NEXT: stvx v2, 0, r3
+; CHECK-P8-NEXT: lbz r4, 63(r1)
+; CHECK-P8-NEXT: xori r4, r4, 128
+; CHECK-P8-NEXT: stb r4, 63(r1)
+; CHECK-P8-NEXT: lvx v2, 0, r3
+; CHECK-P8-NEXT: addi r1, r1, 64
; CHECK-P8-NEXT: ld r0, 16(r1)
-; CHECK-P8-NEXT: ld r30, -16(r1) # 8-byte Folded Reload
; CHECK-P8-NEXT: mtlr r0
; CHECK-P8-NEXT: blr
%neg = fneg fp128 %f2
diff --git a/llvm/test/CodeGen/PowerPC/fp-strict-fcmp.ll b/llvm/test/CodeGen/PowerPC/fp-strict-fcmp.ll
index ad32202ba9053..438e1768beabf 100644
--- a/llvm/test/CodeGen/PowerPC/fp-strict-fcmp.ll
+++ b/llvm/test/CodeGen/PowerPC/fp-strict-fcmp.ll
@@ -1,6 +1,6 @@
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
; RUN: llc -verify-machineinstrs -ppc-asm-full-reg-names -ppc-vsr-nums-as-vr \
-; RUN: < %s -enable-soft-fp128 -mtriple=powerpc64-unknown-linux -mcpu=pwr8 | FileCheck %s \
+; RUN: < %s -mtriple=powerpc64-unknown-linux -mcpu=pwr8 | FileCheck %s \
; RUN: -check-prefix=P8
; RUN: llc -verify-machineinstrs -ppc-asm-full-reg-names -ppc-vsr-nums-as-vr \
; RUN: < %s -mtriple=powerpc64le-unknown-linux -mcpu=pwr9 \
diff --git a/llvm/test/CodeGen/PowerPC/ppc64-P9-setb.ll b/llvm/test/CodeGen/PowerPC/ppc64-P9-setb.ll
index 6f4b4a41c6041..6749d5f948dff 100644
--- a/llvm/test/CodeGen/PowerPC/ppc64-P9-setb.ll
+++ b/llvm/test/CodeGen/PowerPC/ppc64-P9-setb.ll
@@ -1,3 +1,4 @@
+; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
; RUN: llc -verify-machineinstrs -mcpu=pwr9 -mtriple=powerpc64le-unknown-unknown \
; RUN: -ppc-asm-full-reg-names < %s | FileCheck %s
; RUN: llc -verify-machineinstrs -mcpu=pwr8 -mtriple=powerpc64le-unknown-unknown \
@@ -8,642 +9,598 @@
; select_cc lhs, rhs, -1, (zext (setcc lhs, rhs, setne)), setlt
define i64 @setb1(i64 %a, i64 %b) {
+; CHECK-LABEL: setb1:
+; CHECK: # %bb.0:
+; CHECK-NEXT: cmpd r3, r4
+; CHECK-NEXT: setb r3, cr0
+; CHECK-NEXT: blr
+;
+; CHECK-PWR8-LABEL: setb1:
+; CHECK-PWR8: # %bb.0:
+; CHECK-PWR8-NEXT: xor r6, r3, r4
+; CHECK-PWR8-NEXT: li r5, -1
+; CHECK-PWR8-NEXT: addic r7, r6, -1
+; CHECK-PWR8-NEXT: cmpd r3, r4
+; CHECK-PWR8-NEXT: subfe r6, r7, r6
+; CHECK-PWR8-NEXT: isellt r3, r5, r6
+; CHECK-PWR8-NEXT: blr
%t1 = icmp slt i64 %a, %b
%t2 = icmp ne i64 %a, %b
%t3 = zext i1 %t2 to i64
%t4 = select i1 %t1, i64 -1, i64 %t3
ret i64 %t4
-; CHECK-LABEL: setb1:
-; CHECK-NOT: xor
-; CHECK-NOT: li
-; CHECK: cmpd {{c?r?(0, )?}}r3, r4
-; CHECK-NEXT: setb r3, cr0
-; CHECK-NOT: addic
-; CHECK-NOT: subfe
-; CHECK-NOT: isel
-; CHECK: blr
-; CHECK-PWR8-LABEL: setb1
-; CHECK-PWR8-DAG: xor
-; CHECK-PWR8-DAG: li
-; CHECK-PWR8-DAG: cmpd
-; CHECK-PWR8-DAG: addic
-; CHECK-PWR8-DAG: subfe
-; CHECK-PWR8: isel
-; CHECK-PWR8: blr
}
; select_cc lhs, rhs, -1, (zext (setcc rhs, lhs, setne)), setgt
define i64 @setb2(i64 %a, i64 %b) {
+; CHECK-LABEL: setb2:
+; CHECK: # %bb.0:
+; CHECK-NEXT: cmpd r3, r4
+; CHECK-NEXT: setb r3, cr0
+; CHECK-NEXT: blr
+;
+; CHECK-PWR8-LABEL: setb2:
+; CHECK-PWR8: # %bb.0:
+; CHECK-PWR8-NEXT: xor r6, r3, r4
+; CHECK-PWR8-NEXT: li r5, -1
+; CHECK-PWR8-NEXT: addic r7, r6, -1
+; CHECK-PWR8-NEXT: cmpd r4, r3
+; CHECK-PWR8-NEXT: subfe r6, r7, r6
+; CHECK-PWR8-NEXT: iselgt r3, r5, r6
+; CHECK-PWR8-NEXT: blr
%t1 = icmp sgt i64 %b, %a
%t2 = icmp ne i64 %a, %b
%t3 = zext i1 %t2 to i64
%t4 = select i1 %t1, i64 -1, i64 %t3
ret i64 %t4
-; CHECK-LABEL: setb2:
-; CHECK-NOT: xor
-; CHECK-NOT: li
-; CHECK: cmpd {{c?r?(0, )?}}r3, r4
-; CHECK-NEXT: setb r3, cr0
-; CHECK-NOT: addic
-; CHECK-NOT: subfe
-; CHECK-NOT: isel
-; CHECK: blr
-; CHECK-PWR8-LABEL: setb2
-; CHECK-PWR8-DAG: xor
-; CHECK-PWR8-DAG: li
-; CHECK-PWR8-DAG: cmpd
-; CHECK-PWR8-DAG: addic
-; CHECK-PWR8-DAG: subfe
-; CHECK-PWR8: isel
-; CHECK-PWR8: blr
}
; select_cc lhs, rhs, -1, (zext (setcc rhs, lhs, setne)), setlt
define i64 @setb3(i64 %a, i64 %b) {
+; CHECK-LABEL: setb3:
+; CHECK: # %bb.0:
+; CHECK-NEXT: cmpd r3, r4
+; CHECK-NEXT: setb r3, cr0
+; CHECK-NEXT: blr
+;
+; CHECK-PWR8-LABEL: setb3:
+; CHECK-PWR8: # %bb.0:
+; CHECK-PWR8-NEXT: xor r6, r4, r3
+; CHECK-PWR8-NEXT: li r5, -1
+; CHECK-PWR8-NEXT: addic r7, r6, -1
+; CHECK-PWR8-NEXT: cmpd r3, r4
+; CHECK-PWR8-NEXT: subfe r6, r7, r6
+; CHECK-PWR8-NEXT: isellt r3, r5, r6
+; CHECK-PWR8-NEXT: blr
%t1 = icmp slt i64 %a, %b
%t2 = icmp ne i64 %b, %a
%t3 = zext i1 %t2 to i64
%t4 = select i1 %t1, i64 -1, i64 %t3
ret i64 %t4
-; CHECK-LABEL: setb3:
-; CHECK-NOT: xor
-; CHECK-NOT: li
-; CHECK: cmpd {{c?r?(0, )?}}r3, r4
-; CHECK-NEXT: setb r3, cr0
-; CHECK-NOT: addic
-; CHECK-NOT: subfe
-; CHECK-NOT: isel
-; CHECK: blr
-; CHECK-PWR8-LABEL: setb3
-; CHECK-PWR8-DAG: xor
-; CHECK-PWR8-DAG: li
-; CHECK-PWR8-DAG: cmpd
-; CHECK-PWR8-DAG: addic
-; CHECK-PWR8-DAG: subfe
-; CHECK-PWR8: isel
-; CHECK-PWR8: blr
}
; select_cc lhs, rhs, -1, (zext (setcc lhs, rhs, setne)), setgt
define i64 @setb4(i64 %a, i64 %b) {
+; CHECK-LABEL: setb4:
+; CHECK: # %bb.0:
+; CHECK-NEXT: cmpd r3, r4
+; CHECK-NEXT: setb r3, cr0
+; CHECK-NEXT: blr
+;
+; CHECK-PWR8-LABEL: setb4:
+; CHECK-PWR8: # %bb.0:
+; CHECK-PWR8-NEXT: xor r6, r4, r3
+; CHECK-PWR8-NEXT: li r5, -1
+; CHECK-PWR8-NEXT: addic r7, r6, -1
+; CHECK-PWR8-NEXT: cmpd r4, r3
+; CHECK-PWR8-NEXT: subfe r6, r7, r6
+; CHECK-PWR8-NEXT: iselgt r3, r5, r6
+; CHECK-PWR8-NEXT: blr
%t1 = icmp sgt i64 %b, %a
%t2 = icmp ne i64 %b, %a
%t3 = zext i1 %t2 to i64
%t4 = select i1 %t1, i64 -1, i64 %t3
ret i64 %t4
-; CHECK-LABEL: setb4:
-; CHECK-NOT: xor
-; CHECK-NOT: li
-; CHECK: cmpd {{c?r?(0, )?}}r3, r4
-; CHECK-NEXT: setb r3, cr0
-; CHECK-NOT: addic
-; CHECK-NOT: subfe
-; CHECK-NOT: isel
-; CHECK: blr
-; CHECK-PWR8-LABEL: setb4
-; CHECK-PWR8-DAG: xor
-; CHECK-PWR8-DAG: li
-; CHECK-PWR8-DAG: cmpd
-; CHECK-PWR8-DAG: addic
-; CHECK-PWR8-DAG: subfe
-; CHECK-PWR8: isel
-; CHECK-PWR8: blr
}
; select_cc lhs, rhs, -1, (zext (setcc lhs, rhs, setgt)), setlt
define i64 @setb5(i64 %a, i64 %b) {
+; CHECK-LABEL: setb5:
+; CHECK: # %bb.0:
+; CHECK-NEXT: cmpd r3, r4
+; CHECK-NEXT: setb r3, cr0
+; CHECK-NEXT: blr
+;
+; CHECK-PWR8-LABEL: setb5:
+; CHECK-PWR8: # %bb.0:
+; CHECK-PWR8-NEXT: sradi r6, r4, 63
+; CHECK-PWR8-NEXT: rldicl r7, r3, 1, 63
+; CHECK-PWR8-NEXT: li r5, -1
+; CHECK-PWR8-NEXT: subc r8, r4, r3
+; CHECK-PWR8-NEXT: cmpd r3, r4
+; CHECK-PWR8-NEXT: adde r6, r7, r6
+; CHECK-PWR8-NEXT: xori r6, r6, 1
+; CHECK-PWR8-NEXT: isellt r3, r5, r6
+; CHECK-PWR8-NEXT: blr
%t1 = icmp slt i64 %a, %b
%t2 = icmp sgt i64 %a, %b
%t3 = zext i1 %t2 to i64
%t4 = select i1 %t1, i64 -1, i64 %t3
ret i64 %t4
-; CHECK-LABEL: setb5:
-; CHECK-NOT: sradi
-; CHECK-NOT: rldicl
-; CHECK-NOT: li
-; CHECK: cmpd {{c?r?(0, )?}}r3, r4
-; CHECK-NEXT: setb r3, cr0
-; CHECK-NOT: subc
-; CHECK-NOT: adde
-; CHECK-NOT: xori
-; CHECK-NOT: isel
-; CHECK: blr
-; CHECK-PWR8-LABEL: setb5
-; CHECK-PWR8-DAG: sradi
-; CHECK-PWR8-DAG: rldicl
-; CHECK-PWR8-DAG: li
-; CHECK-PWR8-DAG: cmpd
-; CHECK-PWR8-DAG: subc
-; CHECK-PWR8-DAG: adde
-; CHECK-PWR8-DAG: xori
-; CHECK-PWR8: isel
-; CHECK-PWR8: blr
}
; select_cc lhs, rhs, -1, (zext (setcc rhs, lhs, setgt)), setgt
define i64 @setb6(i64 %a, i64 %b) {
+; CHECK-LABEL: setb6:
+; CHECK: # %bb.0:
+; CHECK-NEXT: cmpd r3, r4
+; CHECK-NEXT: setb r3, cr0
+; CHECK-NEXT: blr
+;
+; CHECK-PWR8-LABEL: setb6:
+; CHECK-PWR8: # %bb.0:
+; CHECK-PWR8-NEXT: sradi r6, r4, 63
+; CHECK-PWR8-NEXT: rldicl r7, r3, 1, 63
+; CHECK-PWR8-NEXT: li r5, -1
+; CHECK-PWR8-NEXT: subc r8, r4, r3
+; CHECK-PWR8-NEXT: cmpd r4, r3
+; CHECK-PWR8-NEXT: adde r6, r7, r6
+; CHECK-PWR8-NEXT: xori r6, r6, 1
+; CHECK-PWR8-NEXT: iselgt r3, r5, r6
+; CHECK-PWR8-NEXT: blr
%t1 = icmp sgt i64 %b, %a
%t2 = icmp sgt i64 %a, %b
%t3 = zext i1 %t2 to i64
%t4 = select i1 %t1, i64 -1, i64 %t3
ret i64 %t4
-; CHECK-LABEL: setb6:
-; CHECK-NOT: sradi
-; CHECK-NOT: rldicl
-; CHECK-NOT: li
-; CHECK: cmpd {{c?r?(0, )?}}r3, r4
-; CHECK-NEXT: setb r3, cr0
-; CHECK-NOT: subc
-; CHECK-NOT: adde
-; CHECK-NOT: xori
-; CHECK-NOT: isel
-; CHECK: blr
-; CHECK-PWR8-LABEL: setb6
-; CHECK-PWR8-DAG: sradi
-; CHECK-PWR8-DAG: rldicl
-; CHECK-PWR8-DAG: li
-; CHECK-PWR8-DAG: cmpd
-; CHECK-PWR8-DAG: subc
-; CHECK-PWR8-DAG: adde
-; CHECK-PWR8-DAG: xori
-; CHECK-PWR8: isel
-; CHECK-PWR8: blr
}
; select_cc lhs, rhs, -1, (zext (setcc rhs, lhs, setlt)), setlt
define i64 @setb7(i64 %a, i64 %b) {
+; CHECK-LABEL: setb7:
+; CHECK: # %bb.0:
+; CHECK-NEXT: cmpd r3, r4
+; CHECK-NEXT: setb r3, cr0
+; CHECK-NEXT: blr
+;
+; CHECK-PWR8-LABEL: setb7:
+; CHECK-PWR8: # %bb.0:
+; CHECK-PWR8-NEXT: sradi r6, r4, 63
+; CHECK-PWR8-NEXT: rldicl r7, r3, 1, 63
+; CHECK-PWR8-NEXT: li r5, -1
+; CHECK-PWR8-NEXT: subc r8, r4, r3
+; CHECK-PWR8-NEXT: cmpd r3, r4
+; CHECK-PWR8-NEXT: adde r6, r7, r6
+; CHECK-PWR8-NEXT: xori r6, r6, 1
+; CHECK-PWR8-NEXT: isellt r3, r5, r6
+; CHECK-PWR8-NEXT: blr
%t1 = icmp slt i64 %a, %b
%t2 = icmp slt i64 %b, %a
%t3 = zext i1 %t2 to i64
%t4 = select i1 %t1, i64 -1, i64 %t3
ret i64 %t4
-; CHECK-LABEL: setb7:
-; CHECK-NOT: sradi
-; CHECK-NOT: rldicl
-; CHECK-NOT: li
-; CHECK: cmpd {{c?r?(0, )?}}r3, r4
-; CHECK-NEXT: setb r3, cr0
-; CHECK-NOT: subc
-; CHECK-NOT: adde
-; CHECK-NOT: xori
-; CHECK-NOT: isel
-; CHECK: blr
-; CHECK-PWR8-LABEL: setb7
-; CHECK-PWR8-DAG: sradi
-; CHECK-PWR8-DAG: rldicl
-; CHECK-PWR8-DAG: li
-; CHECK-PWR8-DAG: cmpd
-; CHECK-PWR8-DAG: subc
-; CHECK-PWR8-DAG: adde
-; CHECK-PWR8-DAG: xori
-; CHECK-PWR8: isel
-; CHECK-PWR8: blr
}
; select_cc lhs, rhs, -1, (zext (setcc lhs, rhs, setlt)), setgt
define i64 @setb8(i64 %a, i64 %b) {
+; CHECK-LABEL: setb8:
+; CHECK: # %bb.0:
+; CHECK-NEXT: cmpd r3, r4
+; CHECK-NEXT: setb r3, cr0
+; CHECK-NEXT: blr
+;
+; CHECK-PWR8-LABEL: setb8:
+; CHECK-PWR8: # %bb.0:
+; CHECK-PWR8-NEXT: sradi r6, r4, 63
+; CHECK-PWR8-NEXT: rldicl r7, r3, 1, 63
+; CHECK-PWR8-NEXT: li r5, -1
+; CHECK-PWR8-NEXT: subc r8, r4, r3
+; CHECK-PWR8-NEXT: cmpd r4, r3
+; CHECK-PWR8-NEXT: adde r6, r7, r6
+; CHECK-PWR8-NEXT: xori r6, r6, 1
+; CHECK-PWR8-NEXT: iselgt r3, r5, r6
+; CHECK-PWR8-NEXT: blr
%t1 = icmp sgt i64 %b, %a
%t2 = icmp slt i64 %b, %a
%t3 = zext i1 %t2 to i64
%t4 = select i1 %t1, i64 -1, i64 %t3
ret i64 %t4
-; CHECK-LABEL: setb8:
-; CHECK-NOT: sradi
-; CHECK-NOT: rldicl
-; CHECK-NOT: li
-; CHECK: cmpd {{c?r?(0, )?}}r3, r4
-; CHECK-NEXT: setb r3, cr0
-; CHECK-NOT: subc
-; CHECK-NOT: adde
-; CHECK-NOT: xori
-; CHECK-NOT: isel
-; CHECK: blr
-; CHECK-PWR8-LABEL: setb8
-; CHECK-PWR8-DAG: sradi
-; CHECK-PWR8-DAG: rldicl
-; CHECK-PWR8-DAG: li
-; CHECK-PWR8-DAG: cmpd
-; CHECK-PWR8-DAG: subc
-; CHECK-PWR8-DAG: adde
-; CHECK-PWR8-DAG: xori
-; CHECK-PWR8: isel
-; CHECK-PWR8: blr
}
; select_cc lhs, rhs, 1, (sext (setcc lhs, rhs, setne)), setgt
define i64 @setb9(i64 %a, i64 %b) {
+; CHECK-LABEL: setb9:
+; CHECK: # %bb.0:
+; CHECK-NEXT: cmpd r3, r4
+; CHECK-NEXT: setb r3, cr0
+; CHECK-NEXT: blr
+;
+; CHECK-PWR8-LABEL: setb9:
+; CHECK-PWR8: # %bb.0:
+; CHECK-PWR8-NEXT: xor r6, r3, r4
+; CHECK-PWR8-NEXT: li r5, 1
+; CHECK-PWR8-NEXT: subfic r6, r6, 0
+; CHECK-PWR8-NEXT: cmpd r3, r4
+; CHECK-PWR8-NEXT: subfe r3, r6, r6
+; CHECK-PWR8-NEXT: iselgt r3, r5, r3
+; CHECK-PWR8-NEXT: blr
%t1 = icmp sgt i64 %a, %b
%t2 = icmp ne i64 %a, %b
%t3 = sext i1 %t2 to i64
%t4 = select i1 %t1, i64 1, i64 %t3
ret i64 %t4
-; CHECK-LABEL: setb9:
-; CHECK-NOT: xor
-; CHECK-NOT: li
-; CHECK: cmpd {{c?r?(0, )?}}r3, r4
-; CHECK-NEXT: setb r3, cr0
-; CHECK-NOT: subfic
-; CHECK-NOT: subfe
-; CHECK-NOT: isel
-; CHECK: blr
-; CHECK-PWR8-LABEL: setb9
-; CHECK-PWR8-DAG: xor
-; CHECK-PWR8-DAG: li
-; CHECK-PWR8-DAG: cmpd
-; CHECK-PWR8-DAG: subfic
-; CHECK-PWR8-DAG: subfe
-; CHECK-PWR8: isel
-; CHECK-PWR8: blr
}
; select_cc lhs, rhs, 1, (sext (setcc rhs, lhs, setne)), setlt
define i64 @setb10(i64 %a, i64 %b) {
+; CHECK-LABEL: setb10:
+; CHECK: # %bb.0:
+; CHECK-NEXT: cmpd r3, r4
+; CHECK-NEXT: setb r3, cr0
+; CHECK-NEXT: blr
+;
+; CHECK-PWR8-LABEL: setb10:
+; CHECK-PWR8: # %bb.0:
+; CHECK-PWR8-NEXT: xor r6, r3, r4
+; CHECK-PWR8-NEXT: li r5, 1
+; CHECK-PWR8-NEXT: subfic r6, r6, 0
+; CHECK-PWR8-NEXT: cmpd r4, r3
+; CHECK-PWR8-NEXT: subfe r3, r6, r6
+; CHECK-PWR8-NEXT: isellt r3, r5, r3
+; CHECK-PWR8-NEXT: blr
%t1 = icmp slt i64 %b, %a
%t2 = icmp ne i64 %a, %b
%t3 = sext i1 %t2 to i64
%t4 = select i1 %t1, i64 1, i64 %t3
ret i64 %t4
-; CHECK-LABEL: setb10:
-; CHECK-NOT: xor
-; CHECK-NOT: li
-; CHECK: cmpd {{c?r?(0, )?}}r3, r4
-; CHECK-NEXT: setb r3, cr0
-; CHECK-NOT: subfic
-; CHECK-NOT: subfe
-; CHECK-NOT: isel
-; CHECK: blr
-; CHECK-PWR8-LABEL: setb10
-; CHECK-PWR8-DAG: xor
-; CHECK-PWR8-DAG: li
-; CHECK-PWR8-DAG: cmpd
-; CHECK-PWR8-DAG: subfic
-; CHECK-PWR8-DAG: subfe
-; CHECK-PWR8: isel
-; CHECK-PWR8: blr
}
; select_cc lhs, rhs, 1, (sext (setcc rhs, lhs, setne)), setgt
define i64 @setb11(i64 %a, i64 %b) {
+; CHECK-LABEL: setb11:
+; CHECK: # %bb.0:
+; CHECK-NEXT: cmpd r3, r4
+; CHECK-NEXT: setb r3, cr0
+; CHECK-NEXT: blr
+;
+; CHECK-PWR8-LABEL: setb11:
+; CHECK-PWR8: # %bb.0:
+; CHECK-PWR8-NEXT: xor r6, r4, r3
+; CHECK-PWR8-NEXT: li r5, 1
+; CHECK-PWR8-NEXT: subfic r6, r6, 0
+; CHECK-PWR8-NEXT: cmpd r3, r4
+; CHECK-PWR8-NEXT: subfe r3, r6, r6
+; CHECK-PWR8-NEXT: iselgt r3, r5, r3
+; CHECK-PWR8-NEXT: blr
%t1 = icmp sgt i64 %a, %b
%t2 = icmp ne i64 %b, %a
%t3 = sext i1 %t2 to i64
%t4 = select i1 %t1, i64 1, i64 %t3
ret i64 %t4
-; CHECK-LABEL: setb11:
-; CHECK-NOT: xor
-; CHECK-NOT: li
-; CHECK: cmpd {{c?r?(0, )?}}r3, r4
-; CHECK-NEXT: setb r3, cr0
-; CHECK-NOT: subfic
-; CHECK-NOT: subfe
-; CHECK-NOT: isel
-; CHECK: blr
-; CHECK-PWR8-LABEL: setb11
-; CHECK-PWR8-DAG: xor
-; CHECK-PWR8-DAG: li
-; CHECK-PWR8-DAG: cmpd
-; CHECK-PWR8-DAG: subfic
-; CHECK-PWR8-DAG: subfe
-; CHECK-PWR8: isel
-; CHECK-PWR8: blr
}
; select_cc lhs, rhs, 1, (sext (setcc lhs, rhs, setne)), setlt
define i64 @setb12(i64 %a, i64 %b) {
+; CHECK-LABEL: setb12:
+; CHECK: # %bb.0:
+; CHECK-NEXT: cmpd r3, r4
+; CHECK-NEXT: setb r3, cr0
+; CHECK-NEXT: blr
+;
+; CHECK-PWR8-LABEL: setb12:
+; CHECK-PWR8: # %bb.0:
+; CHECK-PWR8-NEXT: xor r6, r4, r3
+; CHECK-PWR8-NEXT: li r5, 1
+; CHECK-PWR8-NEXT: subfic r6, r6, 0
+; CHECK-PWR8-NEXT: cmpd r4, r3
+; CHECK-PWR8-NEXT: subfe r3, r6, r6
+; CHECK-PWR8-NEXT: isellt r3, r5, r3
+; CHECK-PWR8-NEXT: blr
%t1 = icmp slt i64 %b, %a
%t2 = icmp ne i64 %b, %a
%t3 = sext i1 %t2 to i64
%t4 = select i1 %t1, i64 1, i64 %t3
ret i64 %t4
-; CHECK-LABEL: setb12:
-; CHECK-NOT: xor
-; CHECK-NOT: li
-; CHECK: cmpd {{c?r?(0, )?}}r3, r4
-; CHECK-NEXT: setb r3, cr0
-; CHECK-NOT: subfic
-; CHECK-NOT: subfe
-; CHECK-NOT: isel
-; CHECK: blr
-; CHECK-PWR8-LABEL: setb12
-; CHECK-PWR8-DAG: xor
-; CHECK-PWR8-DAG: li
-; CHECK-PWR8-DAG: cmpd
-; CHECK-PWR8-DAG: subfic
-; CHECK-PWR8-DAG: subfe
-; CHECK-PWR8: isel
-; CHECK-PWR8: blr
}
; select_cc lhs, rhs, 1, (sext (setcc lhs, rhs, setlt)), setgt
define i64 @setb13(i64 %a, i64 %b) {
+; CHECK-LABEL: setb13:
+; CHECK: # %bb.0:
+; CHECK-NEXT: cmpd r3, r4
+; CHECK-NEXT: setb r3, cr0
+; CHECK-NEXT: blr
+;
+; CHECK-PWR8-LABEL: setb13:
+; CHECK-PWR8: # %bb.0:
+; CHECK-PWR8-NEXT: sradi r6, r3, 63
+; CHECK-PWR8-NEXT: rldicl r7, r4, 1, 63
+; CHECK-PWR8-NEXT: li r5, 1
+; CHECK-PWR8-NEXT: subc r8, r3, r4
+; CHECK-PWR8-NEXT: cmpd r3, r4
+; CHECK-PWR8-NEXT: adde r6, r7, r6
+; CHECK-PWR8-NEXT: xori r6, r6, 1
+; CHECK-PWR8-NEXT: neg r6, r6
+; CHECK-PWR8-NEXT: iselgt r3, r5, r6
+; CHECK-PWR8-NEXT: blr
%t1 = icmp sgt i64 %a, %b
%t2 = icmp slt i64 %a, %b
%t3 = sext i1 %t2 to i64
%t4 = select i1 %t1, i64 1, i64 %t3
ret i64 %t4
-; CHECK-LABEL: setb13:
-; CHECK-NOT: sradi
-; CHECK-NOT: rldicl
-; CHECK-NOT: li
-; CHECK: cmpd {{c?r?(0, )?}}r3, r4
-; CHECK-NEXT: setb r3, cr0
-; CHECK-NOT: subc
-; CHECK-NOT: adde
-; CHECK-NOT: xori
-; CHECK-NOT: neg
-; CHECK-NOT: isel
-; CHECK: blr
-; CHECK-PWR8-LABEL: setb13
-; CHECK-PWR8-DAG: sradi
-; CHECK-PWR8-DAG: rldicl
-; CHECK-PWR8-DAG: li
-; CHECK-PWR8-DAG: cmpd
-; CHECK-PWR8-DAG: subc
-; CHECK-PWR8-DAG: adde
-; CHECK-PWR8-DAG: xori
-; CHECK-PWR8-DAG: neg
-; CHECK-PWR8: isel
-; CHECK-PWR8: blr
}
; select_cc lhs, rhs, 1, (sext (setcc rhs, lhs, setlt)), setlt
define i64 @setb14(i64 %a, i64 %b) {
+; CHECK-LABEL: setb14:
+; CHECK: # %bb.0:
+; CHECK-NEXT: cmpd r3, r4
+; CHECK-NEXT: setb r3, cr0
+; CHECK-NEXT: blr
+;
+; CHECK-PWR8-LABEL: setb14:
+; CHECK-PWR8: # %bb.0:
+; CHECK-PWR8-NEXT: sradi r6, r3, 63
+; CHECK-PWR8-NEXT: rldicl r7, r4, 1, 63
+; CHECK-PWR8-NEXT: li r5, 1
+; CHECK-PWR8-NEXT: subc r8, r3, r4
+; CHECK-PWR8-NEXT: cmpd r4, r3
+; CHECK-PWR8-NEXT: adde r6, r7, r6
+; CHECK-PWR8-NEXT: xori r6, r6, 1
+; CHECK-PWR8-NEXT: neg r6, r6
+; CHECK-PWR8-NEXT: isellt r3, r5, r6
+; CHECK-PWR8-NEXT: blr
%t1 = icmp slt i64 %b, %a
%t2 = icmp slt i64 %a, %b
%t3 = sext i1 %t2 to i64
%t4 = select i1 %t1, i64 1, i64 %t3
ret i64 %t4
-; CHECK-LABEL: setb14:
-; CHECK-NOT: sradi
-; CHECK-NOT: rldicl
-; CHECK-NOT: li
-; CHECK: cmpd {{c?r?(0, )?}}r3, r4
-; CHECK-NEXT: setb r3, cr0
-; CHECK-NOT: subc
-; CHECK-NOT: adde
-; CHECK-NOT: xori
-; CHECK-NOT: neg
-; CHECK-NOT: isel
-; CHECK: blr
-; CHECK-PWR8-LABEL: setb14
-; CHECK-PWR8-DAG: sradi
-; CHECK-PWR8-DAG: rldicl
-; CHECK-PWR8-DAG: li
-; CHECK-PWR8-DAG: cmpd
-; CHECK-PWR8-DAG: subc
-; CHECK-PWR8-DAG: adde
-; CHECK-PWR8-DAG: xori
-; CHECK-PWR8-DAG: neg
-; CHECK-PWR8: isel
-; CHECK-PWR8: blr
}
; select_cc lhs, rhs, 1, (sext (setcc rhs, lhs, setgt)), setgt
define i64 @setb15(i64 %a, i64 %b) {
+; CHECK-LABEL: setb15:
+; CHECK: # %bb.0:
+; CHECK-NEXT: cmpd r3, r4
+; CHECK-NEXT: setb r3, cr0
+; CHECK-NEXT: blr
+;
+; CHECK-PWR8-LABEL: setb15:
+; CHECK-PWR8: # %bb.0:
+; CHECK-PWR8-NEXT: sradi r6, r3, 63
+; CHECK-PWR8-NEXT: rldicl r7, r4, 1, 63
+; CHECK-PWR8-NEXT: li r5, 1
+; CHECK-PWR8-NEXT: subc r8, r3, r4
+; CHECK-PWR8-NEXT: cmpd r3, r4
+; CHECK-PWR8-NEXT: adde r6, r7, r6
+; CHECK-PWR8-NEXT: xori r6, r6, 1
+; CHECK-PWR8-NEXT: neg r6, r6
+; CHECK-PWR8-NEXT: iselgt r3, r5, r6
+; CHECK-PWR8-NEXT: blr
%t1 = icmp sgt i64 %a, %b
%t2 = icmp sgt i64 %b, %a
%t3 = sext i1 %t2 to i64
%t4 = select i1 %t1, i64 1, i64 %t3
ret i64 %t4
-; CHECK-LABEL: setb15:
-; CHECK-NOT: sradi
-; CHECK-NOT: rldicl
-; CHECK-NOT: li
-; CHECK: cmpd {{c?r?(0, )?}}r3, r4
-; CHECK-NEXT: setb r3, cr0
-; CHECK-NOT: subc
-; CHECK-NOT: adde
-; CHECK-NOT: xori
-; CHECK-NOT: neg
-; CHECK-NOT: isel
-; CHECK: blr
-; CHECK-PWR8-LABEL: setb15
-; CHECK-PWR8-DAG: sradi
-; CHECK-PWR8-DAG: rldicl
-; CHECK-PWR8-DAG: li
-; CHECK-PWR8-DAG: cmpd
-; CHECK-PWR8-DAG: subc
-; CHECK-PWR8-DAG: adde
-; CHECK-PWR8-DAG: xori
-; CHECK-PWR8-DAG: neg
-; CHECK-PWR8: isel
-; CHECK-PWR8: blr
}
; select_cc lhs, rhs, 1, (sext (setcc lhs, rhs, setgt)), setlt
define i64 @setb16(i64 %a, i64 %b) {
+; CHECK-LABEL: setb16:
+; CHECK: # %bb.0:
+; CHECK-NEXT: cmpd r3, r4
+; CHECK-NEXT: setb r3, cr0
+; CHECK-NEXT: blr
+;
+; CHECK-PWR8-LABEL: setb16:
+; CHECK-PWR8: # %bb.0:
+; CHECK-PWR8-NEXT: sradi r6, r3, 63
+; CHECK-PWR8-NEXT: rldicl r7, r4, 1, 63
+; CHECK-PWR8-NEXT: li r5, 1
+; CHECK-PWR8-NEXT: subc r8, r3, r4
+; CHECK-PWR8-NEXT: cmpd r4, r3
+; CHECK-PWR8-NEXT: adde r6, r7, r6
+; CHECK-PWR8-NEXT: xori r6, r6, 1
+; CHECK-PWR8-NEXT: neg r6, r6
+; CHECK-PWR8-NEXT: isellt r3, r5, r6
+; CHECK-PWR8-NEXT: blr
%t1 = icmp slt i64 %b, %a
%t2 = icmp sgt i64 %b, %a
%t3 = sext i1 %t2 to i64
%t4 = select i1 %t1, i64 1, i64 %t3
ret i64 %t4
-; CHECK-LABEL: setb16:
-; CHECK-NOT: sradi
-; CHECK-NOT: rldicl
-; CHECK-NOT: li
-; CHECK: cmpd {{c?r?(0, )?}}r3, r4
-; CHECK-NEXT: setb r3, cr0
-; CHECK-NOT: subc
-; CHECK-NOT: adde
-; CHECK-NOT: xori
-; CHECK-NOT: neg
-; CHECK-NOT: isel
-; CHECK: blr
-; CHECK-PWR8-LABEL: setb16
-; CHECK-PWR8-DAG: sradi
-; CHECK-PWR8-DAG: rldicl
-; CHECK-PWR8-DAG: li
-; CHECK-PWR8-DAG: cmpd
-; CHECK-PWR8-DAG: subc
-; CHECK-PWR8-DAG: adde
-; CHECK-PWR8-DAG: xori
-; CHECK-PWR8-DAG: neg
-; CHECK-PWR8: isel
-; CHECK-PWR8: blr
}
; select_cc lhs, rhs, 0, (select_cc lhs, rhs, 1, -1, setgt), seteq
define i64 @setb17(i64 %a, i64 %b) {
+; CHECK-LABEL: setb17:
+; CHECK: # %bb.0:
+; CHECK-NEXT: cmpd r3, r4
+; CHECK-NEXT: setb r3, cr0
+; CHECK-NEXT: blr
+;
+; CHECK-PWR8-LABEL: setb17:
+; CHECK-PWR8: # %bb.0:
+; CHECK-PWR8-NEXT: li r5, -1
+; CHECK-PWR8-NEXT: cmpd r3, r4
+; CHECK-PWR8-NEXT: li r6, 1
+; CHECK-PWR8-NEXT: iselgt r5, r6, r5
+; CHECK-PWR8-NEXT: cmpld r3, r4
+; CHECK-PWR8-NEXT: iseleq r3, 0, r5
+; CHECK-PWR8-NEXT: blr
%t1 = icmp eq i64 %a, %b
%t2 = icmp sgt i64 %a, %b
%t3 = select i1 %t2, i64 1, i64 -1
%t4 = select i1 %t1, i64 0, i64 %t3
ret i64 %t4
-; CHECK-LABEL: setb17:
-; CHECK-NOT: li
-; CHECK-NOT: cmpld
-; CHECK-NOT: isel
-; CHECK: cmpd {{c?r?(0, )?}}r3, r4
-; CHECK-NEXT: setb r3, cr0
-; CHECK-NOT: isel
-; CHECK: blr
-; CHECK-PWR8-LABEL: setb17
-; CHECK-PWR8: cmpd
-; CHECK-PWR8: isel
-; CHECK-PWR8: cmpld
-; CHECK-PWR8: isel
-; CHECK-PWR8: blr
}
; select_cc lhs, rhs, 0, (select_cc rhs, lhs, 1, -1, setgt), seteq
define i64 @setb18(i64 %a, i64 %b) {
+; CHECK-LABEL: setb18:
+; CHECK: # %bb.0:
+; CHECK-NEXT: cmpd r3, r4
+; CHECK-NEXT: setb r3, cr0
+; CHECK-NEXT: blr
+;
+; CHECK-PWR8-LABEL: setb18:
+; CHECK-PWR8: # %bb.0:
+; CHECK-PWR8-NEXT: li r5, -1
+; CHECK-PWR8-NEXT: cmpd r3, r4
+; CHECK-PWR8-NEXT: li r6, 1
+; CHECK-PWR8-NEXT: iselgt r5, r6, r5
+; CHECK-PWR8-NEXT: cmpld r4, r3
+; CHECK-PWR8-NEXT: iseleq r3, 0, r5
+; CHECK-PWR8-NEXT: blr
%t1 = icmp eq i64 %b, %a
%t2 = icmp sgt i64 %a, %b
%t3 = select i1 %t2, i64 1, i64 -1
%t4 = select i1 %t1, i64 0, i64 %t3
ret i64 %t4
-; CHECK-LABEL: setb18:
-; CHECK-NOT: li
-; CHECK-NOT: cmpld
-; CHECK-NOT: isel
-; CHECK: cmpd {{c?r?(0, )?}}r3, r4
-; CHECK-NEXT: setb r3, cr0
-; CHECK-NOT: isel
-; CHECK: blr
-; CHECK-PWR8-LABEL: setb18
-; CHECK-PWR8: cmpd
-; CHECK-PWR8: isel
-; CHECK-PWR8: cmpld
-; CHECK-PWR8: isel
-; CHECK-PWR8: blr
}
; select_cc lhs, rhs, 0, (select_cc rhs, lhs, 1, -1, setlt), seteq
define i64 @setb19(i64 %a, i64 %b) {
+; CHECK-LABEL: setb19:
+; CHECK: # %bb.0:
+; CHECK-NEXT: cmpd r3, r4
+; CHECK-NEXT: setb r3, cr0
+; CHECK-NEXT: blr
+;
+; CHECK-PWR8-LABEL: setb19:
+; CHECK-PWR8: # %bb.0:
+; CHECK-PWR8-NEXT: li r5, -1
+; CHECK-PWR8-NEXT: cmpd r4, r3
+; CHECK-PWR8-NEXT: li r6, 1
+; CHECK-PWR8-NEXT: isellt r5, r6, r5
+; CHECK-PWR8-NEXT: cmpld r3, r4
+; CHECK-PWR8-NEXT: iseleq r3, 0, r5
+; CHECK-PWR8-NEXT: blr
%t1 = icmp eq i64 %a, %b
%t2 = icmp slt i64 %b, %a
%t3 = select i1 %t2, i64 1, i64 -1
%t4 = select i1 %t1, i64 0, i64 %t3
ret i64 %t4
-; CHECK-LABEL: setb19:
-; CHECK-NOT: li
-; CHECK-NOT: cmpld
-; CHECK-NOT: isel
-; CHECK: cmpd {{c?r?(0, )?}}r3, r4
-; CHECK-NEXT: setb r3, cr0
-; CHECK-NOT: isel
-; CHECK: blr
-; CHECK-PWR8-LABEL: setb19
-; CHECK-PWR8: cmpd
-; CHECK-PWR8: isel
-; CHECK-PWR8: cmpld
-; CHECK-PWR8: isel
-; CHECK-PWR8: blr
}
; select_cc lhs, rhs, 0, (select_cc lhs, rhs, 1, -1, setlt), seteq
define i64 @setb20(i64 %a, i64 %b) {
+; CHECK-LABEL: setb20:
+; CHECK: # %bb.0:
+; CHECK-NEXT: cmpd r3, r4
+; CHECK-NEXT: setb r3, cr0
+; CHECK-NEXT: blr
+;
+; CHECK-PWR8-LABEL: setb20:
+; CHECK-PWR8: # %bb.0:
+; CHECK-PWR8-NEXT: li r5, -1
+; CHECK-PWR8-NEXT: cmpd r4, r3
+; CHECK-PWR8-NEXT: li r6, 1
+; CHECK-PWR8-NEXT: isellt r5, r6, r5
+; CHECK-PWR8-NEXT: cmpld r4, r3
+; CHECK-PWR8-NEXT: iseleq r3, 0, r5
+; CHECK-PWR8-NEXT: blr
%t1 = icmp eq i64 %b, %a
%t2 = icmp slt i64 %b, %a
%t3 = select i1 %t2, i64 1, i64 -1
%t4 = select i1 %t1, i64 0, i64 %t3
ret i64 %t4
-; CHECK-LABEL: setb20:
-; CHECK-NOT: li
-; CHECK-NOT: cmpld
-; CHECK-NOT: isel
-; CHECK: cmpd {{c?r?(0, )?}}r3, r4
-; CHECK-NEXT: setb r3, cr0
-; CHECK-NOT: isel
-; CHECK: blr
-; CHECK-PWR8-LABEL: setb20
-; CHECK-PWR8: cmpd
-; CHECK-PWR8: isel
-; CHECK-PWR8: cmpld
-; CHECK-PWR8: isel
-; CHECK-PWR8: blr
}
; select_cc lhs, rhs, 0, (select_cc lhs, rhs, -1, 1, setlt), seteq
define i64 @setb21(i64 %a, i64 %b) {
+; CHECK-LABEL: setb21:
+; CHECK: # %bb.0:
+; CHECK-NEXT: cmpd r3, r4
+; CHECK-NEXT: setb r3, cr0
+; CHECK-NEXT: blr
+;
+; CHECK-PWR8-LABEL: setb21:
+; CHECK-PWR8: # %bb.0:
+; CHECK-PWR8-NEXT: li r5, 1
+; CHECK-PWR8-NEXT: cmpd r3, r4
+; CHECK-PWR8-NEXT: li r6, -1
+; CHECK-PWR8-NEXT: isellt r5, r6, r5
+; CHECK-PWR8-NEXT: cmpld r3, r4
+; CHECK-PWR8-NEXT: iseleq r3, 0, r5
+; CHECK-PWR8-NEXT: blr
%t1 = icmp eq i64 %a, %b
%t2 = icmp slt i64 %a, %b
%t3 = select i1 %t2, i64 -1, i64 1
%t4 = select i1 %t1, i64 0, i64 %t3
ret i64 %t4
-; CHECK-LABEL: setb21:
-; CHECK-NOT: li
-; CHECK-NOT: cmpld
-; CHECK-NOT: isel
-; CHECK: cmpd {{c?r?(0, )?}}r3, r4
-; CHECK-NEXT: setb r3, cr0
-; CHECK-NOT: isel
-; CHECK: blr
-; CHECK-PWR8-LABEL: setb21
-; CHECK-PWR8: cmpd
-; CHECK-PWR8: isel
-; CHECK-PWR8: cmpld
-; CHECK-PWR8: isel
-; CHECK-PWR8: blr
}
; select_cc lhs, rhs, 0, (select_cc rhs, lhs, -1, 1, setlt), seteq
define i64 @setb22(i64 %a, i64 %b) {
+; CHECK-LABEL: setb22:
+; CHECK: # %bb.0:
+; CHECK-NEXT: cmpd r3, r4
+; CHECK-NEXT: setb r3, cr0
+; CHECK-NEXT: blr
+;
+; CHECK-PWR8-LABEL: setb22:
+; CHECK-PWR8: # %bb.0:
+; CHECK-PWR8-NEXT: li r5, 1
+; CHECK-PWR8-NEXT: cmpd r3, r4
+; CHECK-PWR8-NEXT: li r6, -1
+; CHECK-PWR8-NEXT: isellt r5, r6, r5
+; CHECK-PWR8-NEXT: cmpld r4, r3
+; CHECK-PWR8-NEXT: iseleq r3, 0, r5
+; CHECK-PWR8-NEXT: blr
%t1 = icmp eq i64 %b, %a
%t2 = icmp slt i64 %a, %b
%t3 = select i1 %t2, i64 -1, i64 1
%t4 = select i1 %t1, i64 0, i64 %t3
ret i64 %t4
-; CHECK-LABEL: setb22:
-; CHECK-NOT: li
-; CHECK-NOT: cmpld
-; CHECK-NOT: isel
-; CHECK: cmpd {{c?r?(0, )?}}r3, r4
-; CHECK-NEXT: setb r3, cr0
-; CHECK-NOT: isel
-; CHECK: blr
-; CHECK-PWR8-LABEL: setb22
-; CHECK-PWR8: cmpd
-; CHECK-PWR8: isel
-; CHECK-PWR8: cmpld
-; CHECK-PWR8: isel
-; CHECK-PWR8: blr
}
; select_cc lhs, rhs, 0, (select_cc rhs, lhs, -1, 1, setgt), seteq
define i64 @setb23(i64 %a, i64 %b) {
+; CHECK-LABEL: setb23:
+; CHECK: # %bb.0:
+; CHECK-NEXT: cmpd r3, r4
+; CHECK-NEXT: setb r3, cr0
+; CHECK-NEXT: blr
+;
+; CHECK-PWR8-LABEL: setb23:
+; CHECK-PWR8: # %bb.0:
+; CHECK-PWR8-NEXT: li r5, 1
+; CHECK-PWR8-NEXT: cmpd r4, r3
+; CHECK-PWR8-NEXT: li r6, -1
+; CHECK-PWR8-NEXT: iselgt r5, r6, r5
+; CHECK-PWR8-NEXT: cmpld r3, r4
+; CHECK-PWR8-NEXT: iseleq r3, 0, r5
+; CHECK-PWR8-NEXT: blr
%t1 = icmp eq i64 %a, %b
%t2 = icmp sgt i64 %b, %a
%t3 = select i1 %t2, i64 -1, i64 1
%t4 = select i1 %t1, i64 0, i64 %t3
ret i64 %t4
-; CHECK-LABEL: setb23:
-; CHECK-NOT: li
-; CHECK-NOT: cmpld
-; CHECK-NOT: isel
-; CHECK: cmpd {{c?r?(0, )?}}r3, r4
-; CHECK-NEXT: setb r3, cr0
-; CHECK-NOT: isel
-; CHECK: blr
-; CHECK-PWR8-LABEL: setb23
-; CHECK-PWR8: cmpd
-; CHECK-PWR8: isel
-; CHECK-PWR8: cmpld
-; CHECK-PWR8: isel
-; CHECK-PWR8: blr
}
; select_cc lhs, rhs, 0, (select_cc lhs, rhs, -1, 1, setgt), seteq
define i64 @setb24(i64 %a, i64 %b) {
+; CHECK-LABEL: setb24:
+; CHECK: # %bb.0:
+; CHECK-NEXT: cmpd r3, r4
+; CHECK-NEXT: setb r3, cr0
+; CHECK-NEXT: blr
+;
+; CHECK-PWR8-LABEL: setb24:
+; CHECK-PWR8: # %bb.0:
+; CHECK-PWR8-NEXT: li r5, 1
+; CHECK-PWR8-NEXT: cmpd r4, r3
+; CHECK-PWR8-NEXT: li r6, -1
+; CHECK-PWR8-NEXT: iselgt r5, r6, r5
+; CHECK-PWR8-NEXT: cmpld r4, r3
+; CHECK-PWR8-NEXT: iseleq r3, 0, r5
+; CHECK-PWR8-NEXT: blr
%t1 = icmp eq i64 %b, %a
%t2 = icmp sgt i64 %b, %a
%t3 = select i1 %t2, i64 -1, i64 1
%t4 = select i1 %t1, i64 0, i64 %t3
ret i64 %t4
-; CHECK-LABEL: setb24:
-; CHECK-NOT: li
-; CHECK-NOT: cmpld
-; CHECK-NOT: isel
-; CHECK: cmpd {{c?r?(0, )?}}r3, r4
-; CHECK-NEXT: setb r3, cr0
-; CHECK-NOT: isel
-; CHECK: blr
-; CHECK-PWR8-LABEL: setb24
-; CHECK-PWR8: cmpd
-; CHECK-PWR8: isel
-; CHECK-PWR8: cmpld
-; CHECK-PWR8: isel
-; CHECK-PWR8: blr
}
; end all patterns testing for i64
@@ -651,51 +608,50 @@ define i64 @setb24(i64 %a, i64 %b) {
; select_cc lhs, rhs, -1, (zext (setcc lhs, rhs, setne)), setlt
define i64 @setb25(i64 %a, i64 %b) {
+; CHECK-LABEL: setb25:
+; CHECK: # %bb.0:
+; CHECK-NEXT: cmpd r4, r3
+; CHECK-NEXT: setb r3, cr0
+; CHECK-NEXT: blr
+;
+; CHECK-PWR8-LABEL: setb25:
+; CHECK-PWR8: # %bb.0:
+; CHECK-PWR8-NEXT: xor r6, r4, r3
+; CHECK-PWR8-NEXT: li r5, -1
+; CHECK-PWR8-NEXT: addic r7, r6, -1
+; CHECK-PWR8-NEXT: cmpd r4, r3
+; CHECK-PWR8-NEXT: subfe r6, r7, r6
+; CHECK-PWR8-NEXT: isellt r3, r5, r6
+; CHECK-PWR8-NEXT: blr
%t1 = icmp slt i64 %b, %a
%t2 = icmp ne i64 %b, %a
%t3 = zext i1 %t2 to i64
%t4 = select i1 %t1, i64 -1, i64 %t3
ret i64 %t4
-; CHECK-LABEL: setb25:
-; CHECK-NOT: xor
-; CHECK-NOT: li
-; CHECK-NOT: cmpd
-; CHECK: cmpd {{c?r?(0, )?}}r4, r3
-; CHECK-NEXT: setb r3, cr0
-; CHECK-NOT: addic
-; CHECK-NOT: subfe
-; CHECK-NOT: isel
-; CHECK: blr
-; CHECK-PWR8-LABEL: setb25
-; CHECK-PWR8-DAG: cmpd
-; CHECK-PWR8-DAG: addic
-; CHECK-PWR8-DAG: subfe
-; CHECK-PWR8: isel
-; CHECK-PWR8: blr
}
; select_cc lhs, rhs, -1, (zext (setcc rhs, lhs, setne)), setgt
define i64 @setb26(i64 %a, i64 %b) {
+; CHECK-LABEL: setb26:
+; CHECK: # %bb.0:
+; CHECK-NEXT: cmpd r4, r3
+; CHECK-NEXT: setb r3, cr0
+; CHECK-NEXT: blr
+;
+; CHECK-PWR8-LABEL: setb26:
+; CHECK-PWR8: # %bb.0:
+; CHECK-PWR8-NEXT: xor r6, r4, r3
+; CHECK-PWR8-NEXT: li r5, -1
+; CHECK-PWR8-NEXT: addic r7, r6, -1
+; CHECK-PWR8-NEXT: cmpd r3, r4
+; CHECK-PWR8-NEXT: subfe r6, r7, r6
+; CHECK-PWR8-NEXT: iselgt r3, r5, r6
+; CHECK-PWR8-NEXT: blr
%t1 = icmp sgt i64 %a, %b
%t2 = icmp ne i64 %b, %a
%t3 = zext i1 %t2 to i64
%t4 = select i1 %t1, i64 -1, i64 %t3
ret i64 %t4
-; CHECK-LABEL: setb26:
-; CHECK-NOT: xor
-; CHECK-NOT: li
-; CHECK: cmpd {{c?r?(0, )?}}r4, r3
-; CHECK-NEXT: setb r3, cr0
-; CHECK-NOT: addic
-; CHECK-NOT: subfe
-; CHECK-NOT: isel
-; CHECK: blr
-; CHECK-PWR8-LABEL: setb26
-; CHECK-PWR8-DAG: cmpd
-; CHECK-PWR8-DAG: addic
-; CHECK-PWR8-DAG: subfe
-; CHECK-PWR8: isel
-; CHECK-PWR8: blr
}
; Test with
diff erent scalar integer type for selected value
@@ -703,83 +659,85 @@ define i64 @setb26(i64 %a, i64 %b) {
; select_cc lhs, rhs, -1, (zext (setcc rhs, lhs, setne)), setlt
define i64 @setb27(i64 %a, i64 %b) {
+; CHECK-LABEL: setb27:
+; CHECK: # %bb.0:
+; CHECK-NEXT: cmpd r3, r4
+; CHECK-NEXT: setb r3, cr0
+; CHECK-NEXT: extsw r3, r3
+; CHECK-NEXT: blr
+;
+; CHECK-PWR8-LABEL: setb27:
+; CHECK-PWR8: # %bb.0:
+; CHECK-PWR8-NEXT: xor r6, r4, r3
+; CHECK-PWR8-NEXT: li r5, -1
+; CHECK-PWR8-NEXT: addic r7, r6, -1
+; CHECK-PWR8-NEXT: cmpd r3, r4
+; CHECK-PWR8-NEXT: subfe r6, r7, r6
+; CHECK-PWR8-NEXT: isellt r3, r5, r6
+; CHECK-PWR8-NEXT: extsw r3, r3
+; CHECK-PWR8-NEXT: blr
%t1 = icmp slt i64 %a, %b
%t2 = icmp ne i64 %b, %a
%t3 = zext i1 %t2 to i32
%t4 = select i1 %t1, i32 -1, i32 %t3
%t5 = sext i32 %t4 to i64
ret i64 %t5
-; CHECK-LABEL: setb27:
-; CHECK-NOT: xor
-; CHECK-NOT: li
-; CHECK: cmpd {{c?r?(0, )?}}r3, r4
-; CHECK-NEXT: setb r3, cr0
-; CHECK-NOT: addic
-; CHECK-NOT: subfe
-; CHECK-NOT: isel
-; CHECK: extsw
-; CHECK: blr
-; CHECK-PWR8-LABEL: setb27
-; CHECK-PWR8-DAG: cmpd
-; CHECK-PWR8-DAG: addic
-; CHECK-PWR8-DAG: subfe
-; CHECK-PWR8: isel
-; CHECK-PWR8: extsw
-; CHECK-PWR8: blr
}
; select_cc lhs, rhs, -1, (zext (setcc lhs, rhs, setne)), setgt
define i64 @setb28(i64 %a, i64 %b) {
+; CHECK-LABEL: setb28:
+; CHECK: # %bb.0:
+; CHECK-NEXT: cmpd r3, r4
+; CHECK-NEXT: setb r3, cr0
+; CHECK-NEXT: extsw r3, r3
+; CHECK-NEXT: blr
+;
+; CHECK-PWR8-LABEL: setb28:
+; CHECK-PWR8: # %bb.0:
+; CHECK-PWR8-NEXT: xor r6, r4, r3
+; CHECK-PWR8-NEXT: li r5, -1
+; CHECK-PWR8-NEXT: addic r7, r6, -1
+; CHECK-PWR8-NEXT: cmpd r4, r3
+; CHECK-PWR8-NEXT: subfe r6, r7, r6
+; CHECK-PWR8-NEXT: iselgt r3, r5, r6
+; CHECK-PWR8-NEXT: extsw r3, r3
+; CHECK-PWR8-NEXT: blr
%t1 = icmp sgt i64 %b, %a
%t2 = icmp ne i64 %b, %a
%t3 = zext i1 %t2 to i16
%t4 = select i1 %t1, i16 -1, i16 %t3
%t5 = sext i16 %t4 to i64
ret i64 %t5
-; CHECK-LABEL: setb28:
-; CHECK-NOT: xor
-; CHECK-NOT: li
-; CHECK: cmpd {{c?r?(0, )?}}r3, r4
-; CHECK-NEXT: setb r3, cr0
-; CHECK-NOT: addic
-; CHECK-NOT: subfe
-; CHECK-NOT: isel
-; CHECK: extsw
-; CHECK: blr
-; CHECK-PWR8-LABEL: setb28
-; CHECK-PWR8-DAG: cmpd
-; CHECK-PWR8-DAG: addic
-; CHECK-PWR8-DAG: subfe
-; CHECK-PWR8: isel
-; CHECK-PWR8: extsw
-; CHECK-PWR8: blr
}
; select_cc lhs, rhs, -1, (zext (setcc lhs, rhs, setgt)), setlt
define i64 @setb29(i64 %a, i64 %b) {
+; CHECK-LABEL: setb29:
+; CHECK: # %bb.0:
+; CHECK-NEXT: cmpd r3, r4
+; CHECK-NEXT: setb r3, cr0
+; CHECK-NEXT: clrldi r3, r3, 56
+; CHECK-NEXT: blr
+;
+; CHECK-PWR8-LABEL: setb29:
+; CHECK-PWR8: # %bb.0:
+; CHECK-PWR8-NEXT: sradi r6, r4, 63
+; CHECK-PWR8-NEXT: rldicl r7, r3, 1, 63
+; CHECK-PWR8-NEXT: li r5, -1
+; CHECK-PWR8-NEXT: subc r8, r4, r3
+; CHECK-PWR8-NEXT: cmpd r3, r4
+; CHECK-PWR8-NEXT: adde r6, r7, r6
+; CHECK-PWR8-NEXT: xori r6, r6, 1
+; CHECK-PWR8-NEXT: isellt r3, r5, r6
+; CHECK-PWR8-NEXT: clrldi r3, r3, 56
+; CHECK-PWR8-NEXT: blr
%t1 = icmp slt i64 %a, %b
%t2 = icmp sgt i64 %a, %b
%t3 = zext i1 %t2 to i8
%t4 = select i1 %t1, i8 -1, i8 %t3
%t5 = zext i8 %t4 to i64
ret i64 %t5
-; CHECK-LABEL: setb29:
-; CHECK-NOT: sradi
-; CHECK-NOT: rldicl
-; CHECK-NOT: li
-; CHECK: cmpd {{c?r?(0, )?}}r3, r4
-; CHECK-NEXT: setb r3, cr0
-; CHECK-NOT: subc
-; CHECK-NOT: adde
-; CHECK-NOT: xori
-; CHECK-NOT: isel
-; CHECK: blr
-; CHECK-PWR8-LABEL: setb29
-; CHECK-PWR8-DAG: cmpd
-; CHECK-PWR8-DAG: subc
-; CHECK-PWR8-DAG: adde
-; CHECK-PWR8: isel
-; CHECK-PWR8: blr
}
; Testings to cover
diff erent comparison opcodes
@@ -787,555 +745,673 @@ define i64 @setb29(i64 %a, i64 %b) {
; select_cc lhs, rhs, -1, (zext (setcc lhs, rhs, setne)), setlt
define i64 @setbsw1(i32 %a, i32 %b) {
+; CHECK-LABEL: setbsw1:
+; CHECK: # %bb.0:
+; CHECK-NEXT: cmpw r3, r4
+; CHECK-NEXT: setb r3, cr0
+; CHECK-NEXT: blr
+;
+; CHECK-PWR8-LABEL: setbsw1:
+; CHECK-PWR8: # %bb.0:
+; CHECK-PWR8-NEXT: xor r6, r3, r4
+; CHECK-PWR8-NEXT: li r5, -1
+; CHECK-PWR8-NEXT: cntlzw r6, r6
+; CHECK-PWR8-NEXT: cmpw r3, r4
+; CHECK-PWR8-NEXT: srwi r6, r6, 5
+; CHECK-PWR8-NEXT: xori r3, r6, 1
+; CHECK-PWR8-NEXT: isellt r3, r5, r3
+; CHECK-PWR8-NEXT: blr
%t1 = icmp slt i32 %a, %b
%t2 = icmp ne i32 %a, %b
%t3 = zext i1 %t2 to i64
%t4 = select i1 %t1, i64 -1, i64 %t3
ret i64 %t4
-; CHECK-LABEL: setbsw1:
-; CHECK-NOT: xor
-; CHECK-NOT: li
-; CHECK: cmpw {{c?r?(0, )?}}r3, r4
-; CHECK-NEXT: setb r3, cr0
-; CHECK-NOT: cntlzw
-; CHECK-NOT: srwi
-; CHECK-NOT: xori
-; CHECK-NOT: isel
-; CHECK: blr
-; CHECK-PWR8-LABEL: setbsw1
-; CHECK-PWR8-DAG: cntlzw
-; CHECK-PWR8-DAG: cmpw
-; CHECK-PWR8-DAG: srwi
-; CHECK-PWR8-DAG: xori
-; CHECK-PWR8: isel
-; CHECK-PWR8: blr
}
; select_cc lhs, rhs, -1, (zext (setcc rhs, lhs, setne)), setgt
define i64 @setbsw2(i32 %a, i32 %b) {
+; CHECK-LABEL: setbsw2:
+; CHECK: # %bb.0:
+; CHECK-NEXT: cmpw r3, r4
+; CHECK-NEXT: setb r3, cr0
+; CHECK-NEXT: blr
+;
+; CHECK-PWR8-LABEL: setbsw2:
+; CHECK-PWR8: # %bb.0:
+; CHECK-PWR8-NEXT: xor r6, r3, r4
+; CHECK-PWR8-NEXT: li r5, -1
+; CHECK-PWR8-NEXT: cntlzw r6, r6
+; CHECK-PWR8-NEXT: cmpw r4, r3
+; CHECK-PWR8-NEXT: srwi r6, r6, 5
+; CHECK-PWR8-NEXT: xori r3, r6, 1
+; CHECK-PWR8-NEXT: iselgt r3, r5, r3
+; CHECK-PWR8-NEXT: blr
%t1 = icmp sgt i32 %b, %a
%t2 = icmp ne i32 %a, %b
%t3 = zext i1 %t2 to i64
%t4 = select i1 %t1, i64 -1, i64 %t3
ret i64 %t4
-; CHECK-LABEL: setbsw2:
-; CHECK-NOT: xor
-; CHECK-NOT: li
-; CHECK: cmpw {{c?r?(0, )?}}r3, r4
-; CHECK-NEXT: setb r3, cr0
-; CHECK-NOT: cntlzw
-; CHECK-NOT: srwi
-; CHECK-NOT: xori
-; CHECK-NOT: isel
-; CHECK: blr
-; CHECK-PWR8-LABEL: setbsw2
-; CHECK-PWR8-DAG: cntlzw
-; CHECK-PWR8-DAG: cmpw
-; CHECK-PWR8-DAG: srwi
-; CHECK-PWR8-DAG: xori
-; CHECK-PWR8: isel
-; CHECK-PWR8: blr
}
; select_cc lhs, rhs, 0, (select_cc rhs, lhs, -1, 1, setgt), seteq
define i64 @setbsw3(i32 %a, i32 %b) {
+; CHECK-LABEL: setbsw3:
+; CHECK: # %bb.0:
+; CHECK-NEXT: cmpw r3, r4
+; CHECK-NEXT: setb r3, cr0
+; CHECK-NEXT: blr
+;
+; CHECK-PWR8-LABEL: setbsw3:
+; CHECK-PWR8: # %bb.0:
+; CHECK-PWR8-NEXT: li r5, 1
+; CHECK-PWR8-NEXT: cmpw r4, r3
+; CHECK-PWR8-NEXT: li r6, -1
+; CHECK-PWR8-NEXT: iselgt r5, r6, r5
+; CHECK-PWR8-NEXT: cmplw r3, r4
+; CHECK-PWR8-NEXT: iseleq r3, 0, r5
+; CHECK-PWR8-NEXT: blr
%t1 = icmp eq i32 %a, %b
%t2 = icmp sgt i32 %b, %a
%t3 = select i1 %t2, i64 -1, i64 1
%t4 = select i1 %t1, i64 0, i64 %t3
ret i64 %t4
-; CHECK-LABEL: setbsw3:
-; CHECK-NOT: li
-; CHECK: cmpw {{c?r?(0, )?}}r3, r4
-; CHECK-NEXT: setb r3, cr0
-; CHECK-NOT: isel
-; CHECK-NOT: cmplw
-; CHECK-NOT: isel
-; CHECK: blr
-; CHECK-PWR8-LABEL: setbsw3
-; CHECK-PWR8: cmpw
-; CHECK-PWR8: isel
-; CHECK-PWR8: cmplw
-; CHECK-PWR8: isel
-; CHECK-PWR8: blr
}
; select_cc lhs, rhs, -1, (zext (setcc rhs, lhs, setne)), setlt
define i64 @setbsh1(i16 signext %a, i16 signext %b) {
+; CHECK-LABEL: setbsh1:
+; CHECK: # %bb.0:
+; CHECK-NEXT: cmpw r3, r4
+; CHECK-NEXT: setb r3, cr0
+; CHECK-NEXT: blr
+;
+; CHECK-PWR8-LABEL: setbsh1:
+; CHECK-PWR8: # %bb.0:
+; CHECK-PWR8-NEXT: xor r6, r4, r3
+; CHECK-PWR8-NEXT: li r5, -1
+; CHECK-PWR8-NEXT: cntlzw r6, r6
+; CHECK-PWR8-NEXT: cmpw r3, r4
+; CHECK-PWR8-NEXT: srwi r6, r6, 5
+; CHECK-PWR8-NEXT: xori r3, r6, 1
+; CHECK-PWR8-NEXT: isellt r3, r5, r3
+; CHECK-PWR8-NEXT: blr
%t1 = icmp slt i16 %a, %b
%t2 = icmp ne i16 %b, %a
%t3 = zext i1 %t2 to i64
%t4 = select i1 %t1, i64 -1, i64 %t3
ret i64 %t4
-; CHECK-LABEL: setbsh1:
-; CHECK-NOT: xor
-; CHECK-NOT: li
-; CHECK: cmpw {{c?r?(0, )?}}r3, r4
-; CHECK-NEXT: setb r3, cr0
-; CHECK-NOT: cntlzw
-; CHECK-NOT: srwi
-; CHECK-NOT: xori
-; CHECK-NOT: isel
-; CHECK: blr
-; CHECK-PWR8-LABEL: setbsh1
-; CHECK-PWR8-DAG: cntlzw
-; CHECK-PWR8-DAG: cmpw
-; CHECK-PWR8-DAG: srwi
-; CHECK-PWR8-DAG: xori
-; CHECK-PWR8: isel
-; CHECK-PWR8: blr
}
; select_cc lhs, rhs, -1, (zext (setcc lhs, rhs, setne)), setgt
define i64 @setbsh2(i16 signext %a, i16 signext %b) {
+; CHECK-LABEL: setbsh2:
+; CHECK: # %bb.0:
+; CHECK-NEXT: cmpw r3, r4
+; CHECK-NEXT: setb r3, cr0
+; CHECK-NEXT: blr
+;
+; CHECK-PWR8-LABEL: setbsh2:
+; CHECK-PWR8: # %bb.0:
+; CHECK-PWR8-NEXT: xor r6, r4, r3
+; CHECK-PWR8-NEXT: li r5, -1
+; CHECK-PWR8-NEXT: cntlzw r6, r6
+; CHECK-PWR8-NEXT: cmpw r4, r3
+; CHECK-PWR8-NEXT: srwi r6, r6, 5
+; CHECK-PWR8-NEXT: xori r3, r6, 1
+; CHECK-PWR8-NEXT: iselgt r3, r5, r3
+; CHECK-PWR8-NEXT: blr
%t1 = icmp sgt i16 %b, %a
%t2 = icmp ne i16 %b, %a
%t3 = zext i1 %t2 to i64
%t4 = select i1 %t1, i64 -1, i64 %t3
ret i64 %t4
-; CHECK-LABEL: setbsh2:
-; CHECK-NOT: xor
-; CHECK-NOT: li
-; CHECK: cmpw {{c?r?(0, )?}}r3, r4
-; CHECK-NEXT: setb r3, cr0
-; CHECK-NOT: cntlzw
-; CHECK-NOT: srwi
-; CHECK-NOT: xori
-; CHECK-NOT: isel
-; CHECK: blr
-; CHECK-PWR8-LABEL: setbsh2
-; CHECK-PWR8-DAG: cmpw
-; CHECK-PWR8-DAG: cntlzw
-; CHECK-PWR8-DAG: srwi
-; CHECK-PWR8-DAG: xori
-; CHECK-PWR8: isel
-; CHECK-PWR8: blr
}
; select_cc lhs, rhs, -1, (zext (setcc lhs, rhs, setgt)), setlt
define i64 @setbsc1(i8 %a, i8 %b) {
+; CHECK-LABEL: setbsc1:
+; CHECK: # %bb.0:
+; CHECK-NEXT: extsb r4, r4
+; CHECK-NEXT: extsb r3, r3
+; CHECK-NEXT: cmpw r3, r4
+; CHECK-NEXT: setb r3, cr0
+; CHECK-NEXT: blr
+;
+; CHECK-PWR8-LABEL: setbsc1:
+; CHECK-PWR8: # %bb.0:
+; CHECK-PWR8-NEXT: extsb r4, r4
+; CHECK-PWR8-NEXT: extsb r3, r3
+; CHECK-PWR8-NEXT: li r5, -1
+; CHECK-PWR8-NEXT: extsw r4, r4
+; CHECK-PWR8-NEXT: extsw r3, r3
+; CHECK-PWR8-NEXT: sub r6, r4, r3
+; CHECK-PWR8-NEXT: cmpw r3, r4
+; CHECK-PWR8-NEXT: rldicl r3, r6, 1, 63
+; CHECK-PWR8-NEXT: isellt r3, r5, r3
+; CHECK-PWR8-NEXT: blr
%t1 = icmp slt i8 %a, %b
%t2 = icmp sgt i8 %a, %b
%t3 = zext i1 %t2 to i64
%t4 = select i1 %t1, i64 -1, i64 %t3
ret i64 %t4
-; CHECK-LABEL: setbsc1:
-; CHECK-DAG: extsb [[RA:r[0-9]+]], r3
-; CHECK-DAG: extsb [[RB:r[0-9]+]], r4
-; CHECK-NOT: li
-; CHECK-NOT: sub
-; CHECK: cmpw {{c?r?(0, )?}}[[RA]], [[RB]]
-; CHECK-NEXT: setb r3, cr0
-; CHECK-NOT: rldicl
-; CHECK-NOT: isel
-; CHECK: blr
-; CHECK-PWR8-LABEL: setbsc1
-; CHECK-PWR8-DAG: extsb
-; CHECK-PWR8-DAG: extsb
-; CHECK-PWR8-DAG: extsw
-; CHECK-PWR8-DAG: extsw
-; CHECK-PWR8-DAG: cmpw
-; CHECK-PWR8-DAG: rldicl
-; CHECK-PWR8: isel
-; CHECK-PWR8: blr
}
; select_cc lhs, rhs, -1, (zext (setcc rhs, lhs, setgt)), setgt
define i64 @setbsc2(i8 %a, i8 %b) {
+; CHECK-LABEL: setbsc2:
+; CHECK: # %bb.0:
+; CHECK-NEXT: extsb r4, r4
+; CHECK-NEXT: extsb r3, r3
+; CHECK-NEXT: cmpw r3, r4
+; CHECK-NEXT: setb r3, cr0
+; CHECK-NEXT: blr
+;
+; CHECK-PWR8-LABEL: setbsc2:
+; CHECK-PWR8: # %bb.0:
+; CHECK-PWR8-NEXT: extsb r4, r4
+; CHECK-PWR8-NEXT: extsb r3, r3
+; CHECK-PWR8-NEXT: li r5, -1
+; CHECK-PWR8-NEXT: extsw r4, r4
+; CHECK-PWR8-NEXT: extsw r3, r3
+; CHECK-PWR8-NEXT: sub r6, r4, r3
+; CHECK-PWR8-NEXT: cmpw r4, r3
+; CHECK-PWR8-NEXT: rldicl r3, r6, 1, 63
+; CHECK-PWR8-NEXT: iselgt r3, r5, r3
+; CHECK-PWR8-NEXT: blr
%t1 = icmp sgt i8 %b, %a
%t2 = icmp sgt i8 %a, %b
%t3 = zext i1 %t2 to i64
%t4 = select i1 %t1, i64 -1, i64 %t3
ret i64 %t4
-; CHECK-LABEL: setbsc2:
-; CHECK-DAG: extsb [[RA:r[0-9]+]], r3
-; CHECK-DAG: extsb [[RB:r[0-9]+]], r4
-; CHECK-NOT: li
-; CHECK-NOT: sub
-; CHECK: cmpw {{c?r?(0, )?}}[[RA]], [[RB]]
-; CHECK-NEXT: setb r3, cr0
-; CHECK-NOT: rldicl
-; CHECK-NOT: isel
-; CHECK: blr
-; CHECK-PWR8-LABEL: setbsc2
-; CHECK-PWR8-DAG: extsb
-; CHECK-PWR8-DAG: extsb
-; CHECK-PWR8-DAG: extsw
-; CHECK-PWR8-DAG: extsw
-; CHECK-PWR8-DAG: cmpw
-; CHECK-PWR8-DAG: rldicl
-; CHECK-PWR8: isel
-; CHECK-PWR8: blr
}
; select_cc lhs, rhs, -1, (zext (setcc rhs, lhs, setlt)), setlt
define i64 @setbsc3(i4 %a, i4 %b) {
+; CHECK-LABEL: setbsc3:
+; CHECK: # %bb.0:
+; CHECK-NEXT: slwi r4, r4, 28
+; CHECK-NEXT: slwi r3, r3, 28
+; CHECK-NEXT: srawi r4, r4, 28
+; CHECK-NEXT: srawi r3, r3, 28
+; CHECK-NEXT: cmpw r3, r4
+; CHECK-NEXT: setb r3, cr0
+; CHECK-NEXT: blr
+;
+; CHECK-PWR8-LABEL: setbsc3:
+; CHECK-PWR8: # %bb.0:
+; CHECK-PWR8-NEXT: slwi r4, r4, 28
+; CHECK-PWR8-NEXT: slwi r3, r3, 28
+; CHECK-PWR8-NEXT: li r5, -1
+; CHECK-PWR8-NEXT: srawi r4, r4, 28
+; CHECK-PWR8-NEXT: srawi r3, r3, 28
+; CHECK-PWR8-NEXT: extsw r4, r4
+; CHECK-PWR8-NEXT: extsw r3, r3
+; CHECK-PWR8-NEXT: sub r6, r4, r3
+; CHECK-PWR8-NEXT: cmpw r3, r4
+; CHECK-PWR8-NEXT: rldicl r3, r6, 1, 63
+; CHECK-PWR8-NEXT: isellt r3, r5, r3
+; CHECK-PWR8-NEXT: blr
%t1 = icmp slt i4 %a, %b
%t2 = icmp slt i4 %b, %a
%t3 = zext i1 %t2 to i64
%t4 = select i1 %t1, i64 -1, i64 %t3
ret i64 %t4
-; CHECK-LABEL: setbsc3:
-; CHECK-DAG: slwi [[RA:r[0-9]+]], r3, 28
-; CHECK-DAG: slwi [[RB:r[0-9]+]], r4, 28
-; CHECK-NOT: li
-; CHECK-DAG: srawi [[RA1:r[0-9]+]], [[RA]], 28
-; CHECK-DAG: srawi [[RB1:r[0-9]+]], [[RB]], 28
-; CHECK-NOT: sub
-; CHECK: cmpw {{c?r?(0, )?}}[[RA1]], [[RB1]]
-; CHECK-NEXT: setb r3, cr0
-; CHECK-NOT: rldicl
-; CHECK-NOT: isel
-; CHECK: blr
-; CHECK-PWR8-LABEL: setbsc3
-; CHECK-PWR8-DAG: slwi
-; CHECK-PWR8-DAG: slwi
-; CHECK-PWR8-DAG: srawi
-; CHECK-PWR8-DAG: srawi
-; CHECK-PWR8-DAG: extsw
-; CHECK-PWR8-DAG: extsw
-; CHECK-PWR8-DAG: cmpw
-; CHECK-PWR8-DAG: rldicl
-; CHECK-PWR8: isel
-; CHECK-PWR8: blr
}
; Test with unsigned integer type i64/i32/i16/i8 for input parameter
; select_cc lhs, rhs, -1, (zext (setcc lhs, rhs, setult)), setugt
define i64 @setbud1(i64 %a, i64 %b) {
+; CHECK-LABEL: setbud1:
+; CHECK: # %bb.0:
+; CHECK-NEXT: cmpld r3, r4
+; CHECK-NEXT: setb r3, cr0
+; CHECK-NEXT: blr
+;
+; CHECK-PWR8-LABEL: setbud1:
+; CHECK-PWR8: # %bb.0:
+; CHECK-PWR8-NEXT: subc r6, r4, r3
+; CHECK-PWR8-NEXT: li r5, -1
+; CHECK-PWR8-NEXT: subfe r6, r4, r4
+; CHECK-PWR8-NEXT: cmpld r4, r3
+; CHECK-PWR8-NEXT: neg r3, r6
+; CHECK-PWR8-NEXT: iselgt r3, r5, r3
+; CHECK-PWR8-NEXT: blr
%t1 = icmp ugt i64 %b, %a
%t2 = icmp ult i64 %b, %a
%t3 = zext i1 %t2 to i64
%t4 = select i1 %t1, i64 -1, i64 %t3
ret i64 %t4
-; CHECK-LABEL: setbud1:
-; CHECK-NOT: li
-; CHECK: cmpld {{c?r?(0, )?}}r3, r4
-; CHECK-NEXT: setb r3, cr0
-; CHECK-NOT: subc
-; CHECK-NOT: subfe
-; CHECK-NOT: neg
-; CHECK-NOT: isel
-; CHECK: blr
-; CHECK-PWR8-LABEL: setbud1
-; CHECK-PWR8-DAG: subc
-; CHECK-PWR8-DAG: subfe
-; CHECK-PWR8-DAG: cmpld
-; CHECK-PWR8-DAG: neg
-; CHECK-PWR8: isel
-; CHECK-PWR8: blr
}
; select_cc lhs, rhs, 1, (sext (setcc lhs, rhs, setne)), setugt
define i64 @setbud2(i64 %a, i64 %b) {
+; CHECK-LABEL: setbud2:
+; CHECK: # %bb.0:
+; CHECK-NEXT: cmpld r3, r4
+; CHECK-NEXT: setb r3, cr0
+; CHECK-NEXT: blr
+;
+; CHECK-PWR8-LABEL: setbud2:
+; CHECK-PWR8: # %bb.0:
+; CHECK-PWR8-NEXT: xor r6, r3, r4
+; CHECK-PWR8-NEXT: li r5, 1
+; CHECK-PWR8-NEXT: subfic r6, r6, 0
+; CHECK-PWR8-NEXT: cmpld r3, r4
+; CHECK-PWR8-NEXT: subfe r3, r6, r6
+; CHECK-PWR8-NEXT: iselgt r3, r5, r3
+; CHECK-PWR8-NEXT: blr
%t1 = icmp ugt i64 %a, %b
%t2 = icmp ne i64 %a, %b
%t3 = sext i1 %t2 to i64
%t4 = select i1 %t1, i64 1, i64 %t3
ret i64 %t4
-; CHECK-LABEL: setbud2:
-; CHECK-NOT: xor
-; CHECK-NOT: li
-; CHECK: cmpld {{c?r?(0, )?}}r3, r4
-; CHECK-NEXT: setb r3, cr0
-; CHECK-NOT: subfic
-; CHECK-NOT: subfe
-; CHECK-NOT: isel
-; CHECK: blr
-; CHECK-PWR8-LABEL: setbud2
-; CHECK-PWR8-DAG: cmpld
-; CHECK-PWR8-DAG: subfic
-; CHECK-PWR8-DAG: subfe
-; CHECK-PWR8: isel
-; CHECK-PWR8: blr
}
; select_cc lhs, rhs, 0, (select_cc lhs, rhs, -1, 1, setugt), seteq
define i64 @setbud3(i64 %a, i64 %b) {
+; CHECK-LABEL: setbud3:
+; CHECK: # %bb.0:
+; CHECK-NEXT: cmpld r3, r4
+; CHECK-NEXT: setb r3, cr0
+; CHECK-NEXT: blr
+;
+; CHECK-PWR8-LABEL: setbud3:
+; CHECK-PWR8: # %bb.0:
+; CHECK-PWR8-NEXT: li r5, 1
+; CHECK-PWR8-NEXT: cmpld r4, r3
+; CHECK-PWR8-NEXT: li r3, -1
+; CHECK-PWR8-NEXT: iselgt r3, r3, r5
+; CHECK-PWR8-NEXT: iseleq r3, 0, r3
+; CHECK-PWR8-NEXT: blr
%t1 = icmp eq i64 %b, %a
%t2 = icmp ugt i64 %b, %a
%t3 = select i1 %t2, i64 -1, i64 1
%t4 = select i1 %t1, i64 0, i64 %t3
ret i64 %t4
-; CHECK-LABEL: setbud3:
-; CHECK-NOT: li
-; CHECK: cmpld {{c?r?(0, )?}}r3, r4
-; CHECK-NEXT: setb r3, cr0
-; CHECK-NOT: li
-; CHECK-NOT: isel
-; CHECK: blr
-; CHECK-PWR8-LABEL: setbud3
-; CHECK-PWR8-DAG: cmpld
-; CHECK-PWR8-DAG: li
-; CHECK-PWR8-DAG: li
-; CHECK-PWR8: isel
-; CHECK-PWR8: isel
-; CHECK-PWR8: blr
}
; select_cc lhs, rhs, 1, (sext (setcc rhs, lhs, setne)), setult
define i64 @setbuw1(i32 %a, i32 %b) {
+; CHECK-LABEL: setbuw1:
+; CHECK: # %bb.0:
+; CHECK-NEXT: cmplw r3, r4
+; CHECK-NEXT: setb r3, cr0
+; CHECK-NEXT: blr
+;
+; CHECK-PWR8-LABEL: setbuw1:
+; CHECK-PWR8: # %bb.0:
+; CHECK-PWR8-NEXT: xor r6, r3, r4
+; CHECK-PWR8-NEXT: li r5, 1
+; CHECK-PWR8-NEXT: cntlzw r6, r6
+; CHECK-PWR8-NEXT: cmplw r4, r3
+; CHECK-PWR8-NEXT: srwi r6, r6, 5
+; CHECK-PWR8-NEXT: xori r6, r6, 1
+; CHECK-PWR8-NEXT: neg r3, r6
+; CHECK-PWR8-NEXT: isellt r3, r5, r3
+; CHECK-PWR8-NEXT: blr
%t1 = icmp ult i32 %b, %a
%t2 = icmp ne i32 %a, %b
%t3 = sext i1 %t2 to i64
%t4 = select i1 %t1, i64 1, i64 %t3
ret i64 %t4
-; CHECK-LABEL: setbuw1:
-; CHECK-NOT: xor
-; CHECK-NOT: li
-; CHECK: cmplw {{c?r?(0, )?}}r3, r4
-; CHECK-NEXT: setb r3, cr0
-; CHECK-NOT: cntlzw
-; CHECK-NOT: srwi
-; CHECK-NOT: xori
-; CHECK-NOT: neg
-; CHECK-NOT: isel
-; CHECK: blr
-; CHECK-PWR8-LABEL: setbuw1
-; CHECK-PWR8-DAG: cntlzw
-; CHECK-PWR8-DAG: cmplw
-; CHECK-PWR8-DAG: srwi
-; CHECK-PWR8-DAG: xori
-; CHECK-PWR8-DAG: neg
-; CHECK-PWR8: isel
-; CHECK-PWR8: blr
}
; select_cc lhs, rhs, 1, (sext (setcc rhs, lhs, setne)), setugt
define i64 @setbuw2(i32 %a, i32 %b) {
+; CHECK-LABEL: setbuw2:
+; CHECK: # %bb.0:
+; CHECK-NEXT: cmplw r3, r4
+; CHECK-NEXT: setb r3, cr0
+; CHECK-NEXT: blr
+;
+; CHECK-PWR8-LABEL: setbuw2:
+; CHECK-PWR8: # %bb.0:
+; CHECK-PWR8-NEXT: xor r6, r4, r3
+; CHECK-PWR8-NEXT: li r5, 1
+; CHECK-PWR8-NEXT: cntlzw r6, r6
+; CHECK-PWR8-NEXT: cmplw r3, r4
+; CHECK-PWR8-NEXT: srwi r6, r6, 5
+; CHECK-PWR8-NEXT: xori r6, r6, 1
+; CHECK-PWR8-NEXT: neg r3, r6
+; CHECK-PWR8-NEXT: iselgt r3, r5, r3
+; CHECK-PWR8-NEXT: blr
%t1 = icmp ugt i32 %a, %b
%t2 = icmp ne i32 %b, %a
%t3 = sext i1 %t2 to i64
%t4 = select i1 %t1, i64 1, i64 %t3
ret i64 %t4
-; CHECK-LABEL: setbuw2:
-; CHECK-NOT: xor
-; CHECK-NOT: li
-; CHECK: cmplw {{c?r?(0, )?}}r3, r4
-; CHECK-NEXT: setb r3, cr0
-; CHECK-NOT: cntlzw
-; CHECK-NOT: srwi
-; CHECK-NOT: xori
-; CHECK-NOT: neg
-; CHECK-NOT: isel
-; CHECK: blr
-; CHECK-PWR8-LABEL: setbuw2
-; CHECK-PWR8-DAG: cntlzw
-; CHECK-PWR8-DAG: cmplw
-; CHECK-PWR8-DAG: srwi
-; CHECK-PWR8-DAG: xori
-; CHECK-PWR8-DAG: neg
-; CHECK-PWR8: isel
-; CHECK-PWR8: blr
}
; select_cc lhs, rhs, 1, (sext (setcc lhs, rhs, setne)), setult
define i64 @setbuh(i16 %a, i16 %b) {
+; CHECK-LABEL: setbuh:
+; CHECK: # %bb.0:
+; CHECK-NEXT: clrlwi r4, r4, 16
+; CHECK-NEXT: clrlwi r3, r3, 16
+; CHECK-NEXT: cmplw r3, r4
+; CHECK-NEXT: setb r3, cr0
+; CHECK-NEXT: blr
+;
+; CHECK-PWR8-LABEL: setbuh:
+; CHECK-PWR8: # %bb.0:
+; CHECK-PWR8-NEXT: clrlwi r3, r3, 16
+; CHECK-PWR8-NEXT: clrlwi r4, r4, 16
+; CHECK-PWR8-NEXT: li r5, 1
+; CHECK-PWR8-NEXT: xor r6, r4, r3
+; CHECK-PWR8-NEXT: cmplw r4, r3
+; CHECK-PWR8-NEXT: cntlzw r6, r6
+; CHECK-PWR8-NEXT: srwi r6, r6, 5
+; CHECK-PWR8-NEXT: xori r6, r6, 1
+; CHECK-PWR8-NEXT: neg r3, r6
+; CHECK-PWR8-NEXT: isellt r3, r5, r3
+; CHECK-PWR8-NEXT: blr
%t1 = icmp ult i16 %b, %a
%t2 = icmp ne i16 %b, %a
%t3 = sext i1 %t2 to i64
%t4 = select i1 %t1, i64 1, i64 %t3
ret i64 %t4
-; CHECK-LABEL: setbuh:
-; CHECK-DAG: clrlwi [[RA:r[0-9]+]], r3, 16
-; CHECK-DAG: clrlwi [[RB:r[0-9]+]], r4, 16
-; CHECK-NOT: li
-; CHECK-NOT: xor
-; CHECK: cmplw {{c?r?(0, )?}}[[RA]], [[RB]]
-; CHECK-NEXT: setb r3, cr0
-; CHECK-NOT: cntlzw
-; CHECK-NOT: srwi
-; CHECK-NOT: xori
-; CHECK-NOT: neg
-; CHECK-NOT: isel
-; CHECK: blr
-; CHECK-PWR8-LABEL: setbuh
-; CHECK-PWR8: clrlwi
-; CHECK-PWR8: clrlwi
-; CHECK-PWR8-DAG: cmplw
-; CHECK-PWR8-DAG: cntlzw
-; CHECK-PWR8: srwi
-; CHECK-PWR8: xori
-; CHECK-PWR8: neg
-; CHECK-PWR8: isel
-; CHECK-PWR8: blr
}
; select_cc lhs, rhs, 1, (sext (setcc lhs, rhs, setult)), setugt
define i64 @setbuc(i8 %a, i8 %b) {
+; CHECK-LABEL: setbuc:
+; CHECK: # %bb.0:
+; CHECK-NEXT: clrlwi r4, r4, 24
+; CHECK-NEXT: clrlwi r3, r3, 24
+; CHECK-NEXT: cmplw r3, r4
+; CHECK-NEXT: setb r3, cr0
+; CHECK-NEXT: blr
+;
+; CHECK-PWR8-LABEL: setbuc:
+; CHECK-PWR8: # %bb.0:
+; CHECK-PWR8-NEXT: clrlwi r3, r3, 24
+; CHECK-PWR8-NEXT: clrlwi r4, r4, 24
+; CHECK-PWR8-NEXT: li r5, 1
+; CHECK-PWR8-NEXT: clrldi r6, r3, 32
+; CHECK-PWR8-NEXT: clrldi r7, r4, 32
+; CHECK-PWR8-NEXT: sub r6, r6, r7
+; CHECK-PWR8-NEXT: cmplw r3, r4
+; CHECK-PWR8-NEXT: sradi r6, r6, 63
+; CHECK-PWR8-NEXT: iselgt r3, r5, r6
+; CHECK-PWR8-NEXT: blr
%t1 = icmp ugt i8 %a, %b
%t2 = icmp ult i8 %a, %b
%t3 = sext i1 %t2 to i64
%t4 = select i1 %t1, i64 1, i64 %t3
ret i64 %t4
-; CHECK-LABEL: setbuc:
-; CHECK-DAG: clrlwi [[RA:r[0-9]+]], r3, 24
-; CHECK-DAG: clrlwi [[RB:r[0-9]+]], r4, 24
-; CHECK-NOT: li
-; CHECK-NOT: clrldi
-; CHECK: cmplw {{c?r?(0, )?}}[[RA]], [[RB]]
-; CHECK-NEXT: setb r3, cr0
-; CHECK-NOT: sub
-; CHECK-NOT: sradi
-; CHECK-NOT: isel
-; CHECK: blr
-; CHECK-PWR8-LABEL: setbuc
-; CHECK-PWR8: clrlwi
-; CHECK-PWR8: clrlwi
-; CHECK-PWR8-DAG: clrldi
-; CHECK-PWR8-DAG: clrldi
-; CHECK-PWR8-DAG: cmplw
-; CHECK-PWR8: sradi
-; CHECK-PWR8: isel
-; CHECK-PWR8: blr
}
; Test with float/double/float128 for input parameter
; select_cc lhs, rhs, -1, (zext (setcc rhs, lhs, setlt)), setlt
define i64 @setbf1(float %a, float %b) {
+; CHECK-LABEL: setbf1:
+; CHECK: # %bb.0:
+; CHECK-NEXT: fcmpu cr0, f1, f2
+; CHECK-NEXT: setb r3, cr0
+; CHECK-NEXT: blr
+;
+; CHECK-PWR8-LABEL: setbf1:
+; CHECK-PWR8: # %bb.0:
+; CHECK-PWR8-NEXT: fcmpu cr0, f2, f1
+; CHECK-PWR8-NEXT: fcmpu cr1, f1, f2
+; CHECK-PWR8-NEXT: li r3, 0
+; CHECK-PWR8-NEXT: li r4, 1
+; CHECK-PWR8-NEXT: isellt r3, r4, r3
+; CHECK-PWR8-NEXT: li r4, -1
+; CHECK-PWR8-NEXT: isel r3, r4, r3, 4*cr1+lt
+; CHECK-PWR8-NEXT: blr
%t1 = fcmp nnan olt float %a, %b
%t2 = fcmp nnan olt float %b, %a
%t3 = zext i1 %t2 to i64
%t4 = select i1 %t1, i64 -1, i64 %t3
ret i64 %t4
-; CHECK-LABEL: setbf1:
-; CHECK-NOT: li
-; CHECK: fcmpu cr0, f1, f2
-; CHECK-NEXT: setb r3, cr0
-; CHECK-NOT: isel
-; CHECK-NOT: li
-; CHECK: blr
-; CHECK-PWR8-LABEL: setbf1
-; CHECK-PWR8: isel
-; CHECK-PWR8: isel
-; CHECK-PWR8: blr
}
; select_cc lhs, rhs, -1, (zext (setcc lhs, rhs, setlt)), setgt
define i64 @setbf2(float %a, float %b) {
+; CHECK-LABEL: setbf2:
+; CHECK: # %bb.0:
+; CHECK-NEXT: fcmpu cr0, f1, f2
+; CHECK-NEXT: setb r3, cr0
+; CHECK-NEXT: blr
+;
+; CHECK-PWR8-LABEL: setbf2:
+; CHECK-PWR8: # %bb.0:
+; CHECK-PWR8-NEXT: fcmpu cr0, f2, f1
+; CHECK-PWR8-NEXT: li r3, 0
+; CHECK-PWR8-NEXT: li r4, 1
+; CHECK-PWR8-NEXT: isellt r3, r4, r3
+; CHECK-PWR8-NEXT: li r4, -1
+; CHECK-PWR8-NEXT: iselgt r3, r4, r3
+; CHECK-PWR8-NEXT: blr
%t1 = fcmp nnan ogt float %b, %a
%t2 = fcmp nnan olt float %b, %a
%t3 = zext i1 %t2 to i64
%t4 = select i1 %t1, i64 -1, i64 %t3
ret i64 %t4
-; CHECK-LABEL: setbf2:
-; CHECK-NOT: li
-; CHECK: fcmpu cr0, f1, f2
-; CHECK-NEXT: setb r3, cr0
-; CHECK-NOT: isel
-; CHECK-NOT: li
-; CHECK: blr
-; CHECK-PWR8-LABEL: setbf2
-; CHECK-PWR8: isel
-; CHECK-PWR8: isel
-; CHECK-PWR8: blr
}
; select_cc lhs, rhs, 0, (select_cc lhs, rhs, -1, 1, setgt), seteq
define i64 @setbdf1(double %a, double %b) {
+; CHECK-LABEL: setbdf1:
+; CHECK: # %bb.0:
+; CHECK-NEXT: xscmpudp cr0, f1, f2
+; CHECK-NEXT: setb r3, cr0
+; CHECK-NEXT: blr
+;
+; CHECK-PWR8-LABEL: setbdf1:
+; CHECK-PWR8: # %bb.0:
+; CHECK-PWR8-NEXT: xscmpudp cr0, f2, f1
+; CHECK-PWR8-NEXT: li r3, 1
+; CHECK-PWR8-NEXT: li r4, -1
+; CHECK-PWR8-NEXT: iselgt r3, r4, r3
+; CHECK-PWR8-NEXT: iseleq r3, 0, r3
+; CHECK-PWR8-NEXT: blr
%t1 = fcmp nnan oeq double %b, %a
%t2 = fcmp nnan ogt double %b, %a
%t3 = select i1 %t2, i64 -1, i64 1
%t4 = select i1 %t1, i64 0, i64 %t3
ret i64 %t4
-; CHECK-LABEL: setbdf1:
-; CHECK: xscmpudp cr0, f1, f2
-; CHECK-NEXT: setb r3, cr0
-; CHECK-NOT: li
-; CHECK-NOT: isel
-; CHECK: blr
-; CHECK-PWR8-LABEL: setbdf1
-; CHECK-PWR8: isel
-; CHECK-PWR8: isel
-; CHECK-PWR8: blr
}
; select_cc lhs, rhs, 1, (sext (setcc lhs, rhs, setgt)), setlt
define i64 @setbdf2(double %a, double %b) {
+; CHECK-LABEL: setbdf2:
+; CHECK: # %bb.0:
+; CHECK-NEXT: xscmpudp cr0, f1, f2
+; CHECK-NEXT: setb r3, cr0
+; CHECK-NEXT: blr
+;
+; CHECK-PWR8-LABEL: setbdf2:
+; CHECK-PWR8: # %bb.0:
+; CHECK-PWR8-NEXT: fcmpu cr0, f2, f1
+; CHECK-PWR8-NEXT: xscmpudp cr1, f2, f1
+; CHECK-PWR8-NEXT: li r3, 0
+; CHECK-PWR8-NEXT: li r4, -1
+; CHECK-PWR8-NEXT: iselgt r3, r4, r3
+; CHECK-PWR8-NEXT: li r4, 1
+; CHECK-PWR8-NEXT: isel r3, r4, r3, 4*cr1+lt
+; CHECK-PWR8-NEXT: blr
%t1 = fcmp nnan olt double %b, %a
%t2 = fcmp nnan ogt double %b, %a
%t3 = sext i1 %t2 to i64
%t4 = select i1 %t1, i64 1, i64 %t3
ret i64 %t4
-; CHECK-LABEL: setbdf2:
-; CHECK-NOT: fcmpu
-; CHECK-NOT: li
-; CHECK: xscmpudp cr0, f1, f2
-; CHECK-NEXT: setb r3, cr0
-; CHECK-NOT: li
-; CHECK-NOT: isel
-; CHECK: blr
-; CHECK-PWR8-LABEL: setbdf2
-; CHECK-PWR8: isel
-; CHECK-PWR8: isel
-; CHECK-PWR8: blr
}
define i64 @setbf128(fp128 %a, fp128 %b) {
+; CHECK-LABEL: setbf128:
+; CHECK: # %bb.0:
+; CHECK-NEXT: xscmpuqp cr0, v2, v3
+; CHECK-NEXT: setb r3, cr0
+; CHECK-NEXT: blr
+;
+; CHECK-PWR8-LABEL: setbf128:
+; CHECK-PWR8: # %bb.0:
+; CHECK-PWR8-NEXT: mflr r0
+; CHECK-PWR8-NEXT: std r0, 16(r1)
+; CHECK-PWR8-NEXT: stdu r1, -96(r1)
+; CHECK-PWR8-NEXT: .cfi_def_cfa_offset 96
+; CHECK-PWR8-NEXT: .cfi_offset lr, 16
+; CHECK-PWR8-NEXT: .cfi_offset r30, -16
+; CHECK-PWR8-NEXT: .cfi_offset v30, -48
+; CHECK-PWR8-NEXT: .cfi_offset v31, -32
+; CHECK-PWR8-NEXT: li r3, 48
+; CHECK-PWR8-NEXT: std r30, 80(r1) # 8-byte Folded Spill
+; CHECK-PWR8-NEXT: stvx v30, r1, r3 # 16-byte Folded Spill
+; CHECK-PWR8-NEXT: li r3, 64
+; CHECK-PWR8-NEXT: vmr v30, v2
+; CHECK-PWR8-NEXT: stvx v31, r1, r3 # 16-byte Folded Spill
+; CHECK-PWR8-NEXT: vmr v31, v3
+; CHECK-PWR8-NEXT: bl __ltkf2
+; CHECK-PWR8-NEXT: nop
+; CHECK-PWR8-NEXT: vmr v2, v30
+; CHECK-PWR8-NEXT: srawi r30, r3, 31
+; CHECK-PWR8-NEXT: vmr v3, v31
+; CHECK-PWR8-NEXT: bl __gtkf2
+; CHECK-PWR8-NEXT: nop
+; CHECK-PWR8-NEXT: li r4, 1
+; CHECK-PWR8-NEXT: cmpwi r3, 0
+; CHECK-PWR8-NEXT: iselgt r3, r4, r30
+; CHECK-PWR8-NEXT: li r4, 64
+; CHECK-PWR8-NEXT: ld r30, 80(r1) # 8-byte Folded Reload
+; CHECK-PWR8-NEXT: lvx v31, r1, r4 # 16-byte Folded Reload
+; CHECK-PWR8-NEXT: li r4, 48
+; CHECK-PWR8-NEXT: lvx v30, r1, r4 # 16-byte Folded Reload
+; CHECK-PWR8-NEXT: addi r1, r1, 96
+; CHECK-PWR8-NEXT: ld r0, 16(r1)
+; CHECK-PWR8-NEXT: mtlr r0
+; CHECK-PWR8-NEXT: blr
%t1 = fcmp nnan ogt fp128 %a, %b
%t2 = fcmp nnan olt fp128 %a, %b
%t3 = sext i1 %t2 to i64
%t4 = select i1 %t1, i64 1, i64 %t3
ret i64 %t4
-; CHECK-LABEL: setbf128:
-; CHECK-NOT: li
-; CHECK: xscmpuqp cr0, v2, v3
-; CHECK-NEXT: setb r3, cr0
-; CHECK-NOT: isel
-; CHECK-NOT: li
-; CHECK: blr
-; CHECK-PWR8-LABEL: setbf128
-; CHECK-PWR8: isel
-; CHECK-PWR8: blr
}
; Some cases we can't leverage setb
define i64 @setbn1(i64 %a, i64 %b) {
+; CHECK-LABEL: setbn1:
+; CHECK: # %bb.0:
+; CHECK-NEXT: xor r5, r3, r4
+; CHECK-NEXT: cmpd r3, r4
+; CHECK-NEXT: li r3, -1
+; CHECK-NEXT: cntlzd r5, r5
+; CHECK-NEXT: rldicl r5, r5, 58, 63
+; CHECK-NEXT: isellt r3, r3, r5
+; CHECK-NEXT: blr
+;
+; CHECK-PWR8-LABEL: setbn1:
+; CHECK-PWR8: # %bb.0:
+; CHECK-PWR8-NEXT: xor r6, r3, r4
+; CHECK-PWR8-NEXT: li r5, -1
+; CHECK-PWR8-NEXT: cntlzd r6, r6
+; CHECK-PWR8-NEXT: cmpd r3, r4
+; CHECK-PWR8-NEXT: rldicl r3, r6, 58, 63
+; CHECK-PWR8-NEXT: isellt r3, r5, r3
+; CHECK-PWR8-NEXT: blr
%t1 = icmp slt i64 %a, %b
%t2 = icmp eq i64 %a, %b
%t3 = zext i1 %t2 to i64
%t4 = select i1 %t1, i64 -1, i64 %t3
ret i64 %t4
-; CHECK-LABEL: setbn1:
-; CHECK-NOT: {{\<setb\>}}
-; CHECK: isel
-; CHECK: blr
}
define i64 @setbn2(double %a, double %b) {
+; CHECK-LABEL: setbn2:
+; CHECK: # %bb.0:
+; CHECK-NEXT: fcmpu cr0, f1, f2
+; CHECK-NEXT: li r3, 1
+; CHECK-NEXT: li r4, -1
+; CHECK-NEXT: cror 4*cr5+lt, un, eq
+; CHECK-NEXT: xscmpudp cr0, f1, f2
+; CHECK-NEXT: isel r3, 0, r3, 4*cr5+lt
+; CHECK-NEXT: isellt r3, r4, r3
+; CHECK-NEXT: blr
+;
+; CHECK-PWR8-LABEL: setbn2:
+; CHECK-PWR8: # %bb.0:
+; CHECK-PWR8-NEXT: fcmpu cr0, f1, f2
+; CHECK-PWR8-NEXT: xscmpudp cr1, f1, f2
+; CHECK-PWR8-NEXT: li r3, 1
+; CHECK-PWR8-NEXT: li r4, -1
+; CHECK-PWR8-NEXT: cror 4*cr5+lt, un, eq
+; CHECK-PWR8-NEXT: isel r3, 0, r3, 4*cr5+lt
+; CHECK-PWR8-NEXT: isel r3, r4, r3, 4*cr1+lt
+; CHECK-PWR8-NEXT: blr
%t1 = fcmp olt double %a, %b
%t2 = fcmp one double %a, %b
%t3 = zext i1 %t2 to i64
%t4 = select i1 %t1, i64 -1, i64 %t3
ret i64 %t4
-; CHECK-LABEL: setbn2:
-; CHECK-NOT: {{\<setb\>}}
-; CHECK: isel
-; CHECK: blr
}
define i64 @setbn3(float %a, float %b) {
+; CHECK-LABEL: setbn3:
+; CHECK: # %bb.0:
+; CHECK-NEXT: fcmpu cr0, f1, f2
+; CHECK-NEXT: li r3, 1
+; CHECK-NEXT: li r4, -1
+; CHECK-NEXT: iseleq r3, 0, r3
+; CHECK-NEXT: cror 4*cr5+lt, lt, un
+; CHECK-NEXT: isel r3, r4, r3, 4*cr5+lt
+; CHECK-NEXT: blr
+;
+; CHECK-PWR8-LABEL: setbn3:
+; CHECK-PWR8: # %bb.0:
+; CHECK-PWR8-NEXT: fcmpu cr0, f1, f2
+; CHECK-PWR8-NEXT: li r3, 1
+; CHECK-PWR8-NEXT: li r4, -1
+; CHECK-PWR8-NEXT: cror 4*cr5+lt, lt, un
+; CHECK-PWR8-NEXT: iseleq r3, 0, r3
+; CHECK-PWR8-NEXT: isel r3, r4, r3, 4*cr5+lt
+; CHECK-PWR8-NEXT: blr
%t1 = fcmp ult float %a, %b
%t2 = fcmp une float %a, %b
%t3 = zext i1 %t2 to i64
%t4 = select i1 %t1, i64 -1, i64 %t3
ret i64 %t4
-; CHECK-LABEL: setbn3:
-; CHECK-NOT: {{\<setb\>}}
-; CHECK: isel
-; CHECK: blr
}
; Verify this case doesn't crash
define void @setbn4(i128 %0, i32* %sel.out) {
-entry:
; CHECK-LABEL: setbn4:
-; CHECK-NOT: {{\<setb\>}}
-; CHECK: isel
-; CHECK: blr
+; CHECK: # %bb.0: # %entry
+; CHECK-NEXT: li r6, 1
+; CHECK-NEXT: cmpdi cr1, r3, 0
+; CHECK-NEXT: li r3, 1
+; CHECK-NEXT: rldic r6, r6, 48, 15
+; CHECK-NEXT: cmpld r4, r6
+; CHECK-NEXT: crandc 4*cr5+lt, gt, eq
+; CHECK-NEXT: crandc 4*cr5+gt, eq, 4*cr1+eq
+; CHECK-NEXT: crnor 4*cr5+lt, 4*cr5+gt, 4*cr5+lt
+; CHECK-NEXT: rldicl. r4, r4, 16, 48
+; CHECK-NEXT: li r4, -1
+; CHECK-NEXT: isel r3, 0, r3, 4*cr5+lt
+; CHECK-NEXT: iseleq r3, r4, r3
+; CHECK-NEXT: stw r3, 0(r5)
+; CHECK-NEXT: blr
+;
+; CHECK-PWR8-LABEL: setbn4:
+; CHECK-PWR8: # %bb.0: # %entry
+; CHECK-PWR8-NEXT: li r6, 1
+; CHECK-PWR8-NEXT: cmpdi cr1, r3, 0
+; CHECK-PWR8-NEXT: li r3, 1
+; CHECK-PWR8-NEXT: rldic r6, r6, 48, 15
+; CHECK-PWR8-NEXT: cmpld r4, r6
+; CHECK-PWR8-NEXT: crandc 4*cr5+lt, gt, eq
+; CHECK-PWR8-NEXT: crandc 4*cr5+gt, eq, 4*cr1+eq
+; CHECK-PWR8-NEXT: rldicl. r4, r4, 16, 48
+; CHECK-PWR8-NEXT: li r4, -1
+; CHECK-PWR8-NEXT: crnor 4*cr5+lt, 4*cr5+gt, 4*cr5+lt
+; CHECK-PWR8-NEXT: isel r3, 0, r3, 4*cr5+lt
+; CHECK-PWR8-NEXT: iseleq r3, r4, r3
+; CHECK-PWR8-NEXT: stw r3, 0(r5)
+; CHECK-PWR8-NEXT: blr
+entry:
%c1 = icmp ult i128 %0, 5192296858534827628530496329220096
%c2 = icmp ugt i128 %0, 5192296858534827628530496329220096
%ext = zext i1 %c2 to i32
diff --git a/llvm/test/CodeGen/PowerPC/store_fptoi.ll b/llvm/test/CodeGen/PowerPC/store_fptoi.ll
index 737ead9946f12..dc534c2af171c 100644
--- a/llvm/test/CodeGen/PowerPC/store_fptoi.ll
+++ b/llvm/test/CodeGen/PowerPC/store_fptoi.ll
@@ -26,11 +26,8 @@ define void @qpConv2sdw(fp128* nocapture readonly %a, i64* nocapture %b) {
; CHECK-PWR8-NEXT: std 30, -16(1) # 8-byte Folded Spill
; CHECK-PWR8-NEXT: std 0, 16(1)
; CHECK-PWR8-NEXT: stdu 1, -48(1)
-; CHECK-PWR8-NEXT: ld 5, 0(3)
-; CHECK-PWR8-NEXT: ld 6, 8(3)
+; CHECK-PWR8-NEXT: lvx 2, 0, 3
; CHECK-PWR8-NEXT: mr 30, 4
-; CHECK-PWR8-NEXT: mr 3, 5
-; CHECK-PWR8-NEXT: mr 4, 6
; CHECK-PWR8-NEXT: bl __fixkfdi
; CHECK-PWR8-NEXT: nop
; CHECK-PWR8-NEXT: std 3, 0(30)
@@ -66,11 +63,8 @@ define void @qpConv2sw(fp128* nocapture readonly %a, i32* nocapture %b) {
; CHECK-PWR8-NEXT: std 30, -16(1) # 8-byte Folded Spill
; CHECK-PWR8-NEXT: std 0, 16(1)
; CHECK-PWR8-NEXT: stdu 1, -48(1)
-; CHECK-PWR8-NEXT: ld 5, 0(3)
-; CHECK-PWR8-NEXT: ld 6, 8(3)
+; CHECK-PWR8-NEXT: lvx 2, 0, 3
; CHECK-PWR8-NEXT: mr 30, 4
-; CHECK-PWR8-NEXT: mr 3, 5
-; CHECK-PWR8-NEXT: mr 4, 6
; CHECK-PWR8-NEXT: bl __fixkfsi
; CHECK-PWR8-NEXT: nop
; CHECK-PWR8-NEXT: stw 3, 0(30)
@@ -106,11 +100,8 @@ define void @qpConv2udw(fp128* nocapture readonly %a, i64* nocapture %b) {
; CHECK-PWR8-NEXT: std 30, -16(1) # 8-byte Folded Spill
; CHECK-PWR8-NEXT: std 0, 16(1)
; CHECK-PWR8-NEXT: stdu 1, -48(1)
-; CHECK-PWR8-NEXT: ld 5, 0(3)
-; CHECK-PWR8-NEXT: ld 6, 8(3)
+; CHECK-PWR8-NEXT: lvx 2, 0, 3
; CHECK-PWR8-NEXT: mr 30, 4
-; CHECK-PWR8-NEXT: mr 3, 5
-; CHECK-PWR8-NEXT: mr 4, 6
; CHECK-PWR8-NEXT: bl __fixunskfdi
; CHECK-PWR8-NEXT: nop
; CHECK-PWR8-NEXT: std 3, 0(30)
@@ -146,11 +137,8 @@ define void @qpConv2uw(fp128* nocapture readonly %a, i32* nocapture %b) {
; CHECK-PWR8-NEXT: std 30, -16(1) # 8-byte Folded Spill
; CHECK-PWR8-NEXT: std 0, 16(1)
; CHECK-PWR8-NEXT: stdu 1, -48(1)
-; CHECK-PWR8-NEXT: ld 5, 0(3)
-; CHECK-PWR8-NEXT: ld 6, 8(3)
+; CHECK-PWR8-NEXT: lvx 2, 0, 3
; CHECK-PWR8-NEXT: mr 30, 4
-; CHECK-PWR8-NEXT: mr 3, 5
-; CHECK-PWR8-NEXT: mr 4, 6
; CHECK-PWR8-NEXT: bl __fixunskfsi
; CHECK-PWR8-NEXT: nop
; CHECK-PWR8-NEXT: stw 3, 0(30)
More information about the llvm-commits
mailing list