diff options
| author | Lei Huang <lei@ca.ibm.com> | 2018-07-05 04:10:15 +0000 |
|---|---|---|
| committer | Lei Huang <lei@ca.ibm.com> | 2018-07-05 04:10:15 +0000 |
| commit | a26f3be4546ae8cd3dae4fe945a36dca67d53329 (patch) | |
| tree | bdf74cb51d161e1a4f9968a2cfa9681b97995a5a /llvm/test/CodeGen/PowerPC | |
| parent | 2db909cfae13f8cab5b02bce5490760e01da96e9 (diff) | |
| download | bcm5719-llvm-a26f3be4546ae8cd3dae4fe945a36dca67d53329.tar.gz bcm5719-llvm-a26f3be4546ae8cd3dae4fe945a36dca67d53329.zip | |
[Power9] Implement float128 parameter passing and return values
This patch enable parameter passing and return by value for float128 types.
Passing aggregate/union which contain float128 members will be submitted in
subsequent patches.
Differential Revision: https://reviews.llvm.org/D47552
llvm-svn: 336306
Diffstat (limited to 'llvm/test/CodeGen/PowerPC')
| -rw-r--r-- | llvm/test/CodeGen/PowerPC/f128-passByValue.ll | 268 |
1 files changed, 268 insertions, 0 deletions
diff --git a/llvm/test/CodeGen/PowerPC/f128-passByValue.ll b/llvm/test/CodeGen/PowerPC/f128-passByValue.ll new file mode 100644 index 00000000000..a495b5b48a9 --- /dev/null +++ b/llvm/test/CodeGen/PowerPC/f128-passByValue.ll @@ -0,0 +1,268 @@ +; RUN: llc -mcpu=pwr9 -mtriple=powerpc64le-unknown-unknown \ +; RUN: -enable-ppc-quad-precision -ppc-vsr-nums-as-vr \ +; RUN: -verify-machineinstrs < %s | FileCheck %s + +; Function Attrs: norecurse nounwind readnone +define fp128 @loadConstant() { +; CHECK-LABEL: loadConstant: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: addis [[REG0:[0-9]+]], 2, .LCPI0_0@toc@ha +; CHECK-NEXT: addi [[REG0]], [[REG0]], .LCPI0_0@toc@l +; CHECK-NEXT: lxvx 2, 0, [[REG0]] +; CHECK-NEXT: blr + entry: + ret fp128 0xL00000000000000004001400000000000 +} + +; Function Attrs: norecurse nounwind readnone +define fp128 @loadConstant2(fp128 %a, fp128 %b) { +; CHECK-LABEL: loadConstant2: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: xsaddqp 2, 2, 3 +; CHECK-NEXT: addis [[REG0:[0-9]+]], 2, .LCPI1_0@toc@ha +; CHECK-NEXT: addi [[REG0]], [[REG0]], .LCPI1_0@toc@l +; CHECK-NEXT: lxvx [[REG0]], 0, [[REG0]] +; CHECK-NEXT: xsaddqp 2, 2, [[REG0]] +; CHECK-NEXT: blr + entry: + %add = fadd fp128 %a, %b + %add1 = fadd fp128 %add, 0xL00000000000000004001400000000000 + ret fp128 %add1 +} + +; Test passing float128 by value. +; Function Attrs: norecurse nounwind readnone +define signext i32 @fp128Param(fp128 %a) { +; CHECK-LABEL: fp128Param: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: xscvqpswz 2, 2 +; CHECK-NEXT: mfvsrwz 3, 2 +; CHECK-NEXT: extsw 3, 3 +; CHECK-NEXT: blr +entry: + %conv = fptosi fp128 %a to i32 + ret i32 %conv +} + +; Test float128 as return value. +; Function Attrs: norecurse nounwind readnone +define fp128 @fp128Return(fp128 %a, fp128 %b) { +; CHECK-LABEL: fp128Return: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: xsaddqp 2, 2, 3 +; CHECK-NEXT: blr +entry: + %add = fadd fp128 %a, %b + ret fp128 %add +} + +; array of float128 types +; Function Attrs: norecurse nounwind readonly +define fp128 @fp128Array(fp128* nocapture readonly %farray, +; CHECK-LABEL: fp128Array: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: sldi 4, 4, 4 +; CHECK-NEXT: lxv 2, 0(3) +; CHECK-NEXT: add 4, 3, 4 +; CHECK-NEXT: lxv 3, -16(4) +; CHECK-NEXT: xsaddqp 2, 2, 3 +; CHECK-NEXT: blr + i32 signext %loopcnt, fp128* nocapture readnone %sum) { +entry: + %0 = load fp128, fp128* %farray, align 16 + %sub = add nsw i32 %loopcnt, -1 + %idxprom = sext i32 %sub to i64 + %arrayidx1 = getelementptr inbounds fp128, fp128* %farray, i64 %idxprom + %1 = load fp128, fp128* %arrayidx1, align 16 + %add = fadd fp128 %0, %1 + ret fp128 %add +} + +; Up to 12 qualified floating-point arguments can be passed in v2-v13. +; Function to test passing 13 float128 parameters. +; Function Attrs: norecurse nounwind readnone +define fp128 @maxVecParam(fp128 %p1, fp128 %p2, fp128 %p3, fp128 %p4, fp128 %p5, +; CHECK-LABEL: maxVecParam: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: xsaddqp 2, 2, 3 +; CHECK-NEXT: lxv [[REG0:[0-9]+]], 224(1) +; CHECK-NEXT: xsaddqp 2, 2, 4 +; CHECK-NEXT: xsaddqp 2, 2, 5 +; CHECK-NEXT: xsaddqp 2, 2, 6 +; CHECK-NEXT: xsaddqp 2, 2, 7 +; CHECK-NEXT: xsaddqp 2, 2, 8 +; CHECK-NEXT: xsaddqp 2, 2, 9 +; CHECK-NEXT: xsaddqp 2, 2, 10 +; CHECK-NEXT: xsaddqp 2, 2, 11 +; CHECK-NEXT: xsaddqp 2, 2, 12 +; CHECK-NEXT: xsaddqp 2, 2, 13 +; CHECK-NEXT: xssubqp 2, 2, [[REG0]] +; CHECK-NEXT: blr + fp128 %p6, fp128 %p7, fp128 %p8, fp128 %p9, fp128 %p10, + fp128 %p11, fp128 %p12, fp128 %p13) { +entry: + %add = fadd fp128 %p1, %p2 + %add1 = fadd fp128 %add, %p3 + %add2 = fadd fp128 %add1, %p4 + %add3 = fadd fp128 %add2, %p5 + %add4 = fadd fp128 %add3, %p6 + %add5 = fadd fp128 %add4, %p7 + %add6 = fadd fp128 %add5, %p8 + %add7 = fadd fp128 %add6, %p9 + %add8 = fadd fp128 %add7, %p10 + %add9 = fadd fp128 %add8, %p11 + %add10 = fadd fp128 %add9, %p12 + %sub = fsub fp128 %add10, %p13 + ret fp128 %sub +} + +; Passing a mix of float128 and other type parameters. +; Function Attrs: norecurse nounwind readnone +define fp128 @mixParam_01(fp128 %a, i32 signext %i, fp128 %b) { +; CHECK-LABEL: mixParam_01: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: mtvsrwa 4, 5 +; CHECK-NEXT: xsaddqp 2, 2, 3 +; CHECK-NEXT: xscvsdqp [[REG0:[0-9]+]], 4 +; CHECK-NEXT: xsaddqp 2, 2, [[REG0]] +; CHECK-NEXT: blr +entry: + %add = fadd fp128 %a, %b + %conv = sitofp i32 %i to fp128 + %add1 = fadd fp128 %add, %conv + ret fp128 %add1 +} +; Function Attrs: norecurse nounwind readnone +define fastcc fp128 @mixParam_01f(fp128 %a, i32 signext %i, fp128 %b) { +; CHECK-LABEL: mixParam_01f: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: mtvsrwa [[REG0:[0-9]+]], 3 +; CHECK-NEXT: xsaddqp 2, 2, 3 +; CHECK-NEXT: xscvsdqp [[REG1:[0-9]+]], [[REG0]] +; CHECK-NEXT: xsaddqp 2, 2, [[REG1]] +; CHECK-NEXT: blr +entry: + %add = fadd fp128 %a, %b + %conv = sitofp i32 %i to fp128 + %add1 = fadd fp128 %add, %conv + ret fp128 %add1 +} + +; Function Attrs: norecurse nounwind +define fp128 @mixParam_02(fp128 %p1, double %p2, i64* nocapture %p3, +; CHECK-LABEL: mixParam_02: +; CHECK: # %bb.0: # %entry +; CHECK-DAG: lwz 3, 96(1) +; CHECK: add 4, 7, 9 +; CHECK-NEXT: xxlor [[REG0:[0-9]+]], 1, 1 +; CHECK-DAG: add 4, 4, 10 +; CHECK: xscvdpqp [[REG0]], [[REG0]] +; CHECK-NEXT: add 3, 4, 3 +; CHECK-NEXT: clrldi 3, 3, 32 +; CHECK-NEXT: std 3, 0(6) +; CHECK-NEXT: lxv [[REG1:[0-9]+]], 0(8) +; CHECK-NEXT: xsaddqp 2, [[REG1]], 2 +; CHECK-NEXT: xsaddqp 2, 2, 3 +; CHECK-NEXT: blr + i16 signext %p4, fp128* nocapture readonly %p5, + i32 signext %p6, i8 zeroext %p7, i32 zeroext %p8) { +entry: + %conv = sext i16 %p4 to i32 + %add = add nsw i32 %conv, %p6 + %conv1 = zext i8 %p7 to i32 + %add2 = add nsw i32 %add, %conv1 + %add3 = add i32 %add2, %p8 + %conv4 = zext i32 %add3 to i64 + store i64 %conv4, i64* %p3, align 8 + %0 = load fp128, fp128* %p5, align 16 + %add5 = fadd fp128 %0, %p1 + %conv6 = fpext double %p2 to fp128 + %add7 = fadd fp128 %add5, %conv6 + ret fp128 %add7 +} + +; Function Attrs: norecurse nounwind +define fastcc fp128 @mixParam_02f(fp128 %p1, double %p2, i64* nocapture %p3, +; CHECK-LABEL: mixParam_02f: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: add 4, 4, 6 +; CHECK-NEXT: xxlor [[REG0:[0-9]+]], 1, 1 +; CHECK-NEXT: add 4, 4, 7 +; CHECK-NEXT: xscvdpqp [[REG0]], [[REG0]] +; CHECK-NEXT: add 4, 4, 8 +; CHECK-NEXT: clrldi 4, 4, 32 +; CHECK-NEXT: std 4, 0(3) +; CHECK-NEXT: lxv [[REG1:[0-9]+]], 0(5) +; CHECK-NEXT: xsaddqp 2, [[REG1]], 2 +; CHECK-NEXT: xsaddqp 2, 2, [[REG0]] +; CHECK-NEXT: blr + i16 signext %p4, fp128* nocapture readonly %p5, + i32 signext %p6, i8 zeroext %p7, i32 zeroext %p8) { +entry: + %conv = sext i16 %p4 to i32 + %add = add nsw i32 %conv, %p6 + %conv1 = zext i8 %p7 to i32 + %add2 = add nsw i32 %add, %conv1 + %add3 = add i32 %add2, %p8 + %conv4 = zext i32 %add3 to i64 + store i64 %conv4, i64* %p3, align 8 + %0 = load fp128, fp128* %p5, align 16 + %add5 = fadd fp128 %0, %p1 + %conv6 = fpext double %p2 to fp128 + %add7 = fadd fp128 %add5, %conv6 + ret fp128 %add7 +} + +; Passing a mix of float128 and vector parameters. +; Function Attrs: norecurse nounwind +define void @mixParam_03(fp128 %f1, double* nocapture %d1, <4 x i32> %vec1, +; CHECK-LABEL: mixParam_03: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: ld 3, 104(1) +; CHECK-NEXT: mtvsrwa [[REG2:[0-9]+]], 10 +; CHECK-NEXT: stxv [[REG0:[0-9]+]], 0(9) +; CHECK-NEXT: stxvx [[REG1:[0-9]+]], 0, 3 +; CHECK-NEXT: lxv [[REG0]], 0(9) +; CHECK-NEXT: xscvsdqp [[REG1]], [[REG2]] +; CHECK-NEXT: xsaddqp 2, 2, [[REG1]] +; CHECK-NEXT: xscvqpdp 2, 2 +; CHECK-NEXT: stxsd 2, 0(5) +; CHECK-NEXT: blr + fp128* nocapture %f2, i32 signext %i1, i8 zeroext %c1, + <4 x i32>* nocapture %vec2) { +entry: + store fp128 %f1, fp128* %f2, align 16 + store <4 x i32> %vec1, <4 x i32>* %vec2, align 16 + %0 = load fp128, fp128* %f2, align 16 + %conv = sitofp i32 %i1 to fp128 + %add = fadd fp128 %0, %conv + %conv1 = fptrunc fp128 %add to double + store double %conv1, double* %d1, align 8 + ret void +} + +; Function Attrs: norecurse nounwind +define fastcc void @mixParam_03f(fp128 %f1, double* nocapture %d1, <4 x i32> %vec1, +; CHECK-LABEL: mixParam_03f: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: mtvsrwa [[REG0:[0-9]+]], 5 +; CHECK-NEXT: stxv [[REG1:[0-9]+]], 0(4) +; CHECK-NEXT: stxv [[REG2:[0-9]+]], 0(7) +; CHECK-NEXT: lxv [[REG1]], 0(4) +; CHECK-NEXT: xscvsdqp [[REG2]], [[REG0]] +; CHECK-NEXT: xsaddqp [[REG1]], [[REG1]], [[REG2]] +; CHECK-NEXT: xscvqpdp [[REG1]], [[REG1]] +; CHECK-NEXT: stxsd [[REG1]], 0(3) +; CHECK-NEXT: blr + fp128* nocapture %f2, i32 signext %i1, i8 zeroext %c1, + <4 x i32>* nocapture %vec2) { +entry: + store fp128 %f1, fp128* %f2, align 16 + store <4 x i32> %vec1, <4 x i32>* %vec2, align 16 + %0 = load fp128, fp128* %f2, align 16 + %conv = sitofp i32 %i1 to fp128 + %add = fadd fp128 %0, %conv + %conv1 = fptrunc fp128 %add to double + store double %conv1, double* %d1, align 8 + ret void +} |

