summaryrefslogtreecommitdiffstats
path: root/llvm/test/CodeGen/PowerPC
diff options
context:
space:
mode:
authorLei Huang <lei@ca.ibm.com>2018-07-04 21:59:16 +0000
committerLei Huang <lei@ca.ibm.com>2018-07-04 21:59:16 +0000
commit6270ab6ce4e38b3d2f5a4a29c49e2f9515a5540e (patch)
treef48e2a989350639f2395c6438ea0e9db33482e9a /llvm/test/CodeGen/PowerPC
parentea9c3f25a7c1726158da197f7f8514f7271aa8b3 (diff)
downloadbcm5719-llvm-6270ab6ce4e38b3d2f5a4a29c49e2f9515a5540e.tar.gz
bcm5719-llvm-6270ab6ce4e38b3d2f5a4a29c49e2f9515a5540e.zip
[Power9]Legalize and emit code for round & convert quad-precision values
Legalize and emit code for round & convert float128 to double precision and single precision. Differential Revision: https://reviews.llvm.org/D46997 llvm-svn: 336299
Diffstat (limited to 'llvm/test/CodeGen/PowerPC')
-rw-r--r--llvm/test/CodeGen/PowerPC/f128-conv.ll154
1 files changed, 154 insertions, 0 deletions
diff --git a/llvm/test/CodeGen/PowerPC/f128-conv.ll b/llvm/test/CodeGen/PowerPC/f128-conv.ll
index 70a1e5926a4..a91f96cb1c7 100644
--- a/llvm/test/CodeGen/PowerPC/f128-conv.ll
+++ b/llvm/test/CodeGen/PowerPC/f128-conv.ll
@@ -398,3 +398,157 @@ entry:
; CHECK-NEXT: stxv [[CONV]], 0(3)
; CHECK-NEXT: blr
}
+
+; Convert QP to DP
+
+@f128Array = global [4 x fp128]
+ [fp128 0xL00000000000000004004C00000000000,
+ fp128 0xLF000000000000000400808AB851EB851,
+ fp128 0xL5000000000000000400E0C26324C8366,
+ fp128 0xL8000000000000000400A24E2E147AE14], align 16
+@f128global = global fp128 0xL300000000000000040089CA8F5C28F5C, align 16
+
+; Function Attrs: norecurse nounwind readonly
+define double @qpConv2dp(fp128* nocapture readonly %a) {
+; CHECK-LABEL: qpConv2dp:
+; CHECK: # %bb.0: # %entry
+; CHECK-NEXT: lxv 2, 0(3)
+; CHECK-NEXT: xscvqpdp 2, 2
+; CHECK-NEXT: xxlor 1, 2, 2
+; CHECK-NEXT: blr
+entry:
+ %0 = load fp128, fp128* %a, align 16
+ %conv = fptrunc fp128 %0 to double
+ ret double %conv
+}
+
+; Function Attrs: norecurse nounwind
+define void @qpConv2dp_02(double* nocapture %res) {
+; CHECK-LABEL: qpConv2dp_02:
+; CHECK: # %bb.0: # %entry
+; CHECK-NEXT: addis 4, 2, .LC6@toc@ha
+; CHECK-NEXT: ld 4, .LC6@toc@l(4)
+; CHECK-NEXT: lxvx 2, 0, 4
+; CHECK-NEXT: xscvqpdp 2, 2
+; CHECK-NEXT: stxsd 2, 0(3)
+; CHECK-NEXT: blr
+entry:
+ %0 = load fp128, fp128* @f128global, align 16
+ %conv = fptrunc fp128 %0 to double
+ store double %conv, double* %res, align 8
+ ret void
+}
+
+; Function Attrs: norecurse nounwind
+define void @qpConv2dp_03(double* nocapture %res, i32 signext %idx) {
+; CHECK-LABEL: qpConv2dp_03:
+; CHECK: # %bb.0: # %entry
+; CHECK-NEXT: addis 5, 2, .LC7@toc@ha
+; CHECK-NEXT: sldi 4, 4, 3
+; CHECK-NEXT: ld 5, .LC7@toc@l(5)
+; CHECK-NEXT: lxvx 2, 0, 5
+; CHECK-NEXT: xscvqpdp 2, 2
+; CHECK-NEXT: stxsdx 2, 3, 4
+; CHECK-NEXT: blr
+entry:
+ %0 = load fp128, fp128* getelementptr inbounds ([4 x fp128], [4 x fp128]* @f128Array, i64 0, i64 0), align 16
+ %conv = fptrunc fp128 %0 to double
+ %idxprom = sext i32 %idx to i64
+ %arrayidx = getelementptr inbounds double, double* %res, i64 %idxprom
+ store double %conv, double* %arrayidx, align 8
+ ret void
+}
+
+; Function Attrs: norecurse nounwind
+define void @qpConv2dp_04(fp128* nocapture readonly %a, fp128* nocapture readonly %b, double* nocapture %res) {
+; CHECK-LABEL: qpConv2dp_04:
+; CHECK: # %bb.0: # %entry
+; CHECK-NEXT: lxv 2, 0(3)
+; CHECK-NEXT: lxv 3, 0(4)
+; CHECK-NEXT: xsaddqp 2, 2, 3
+; CHECK-NEXT: xscvqpdp 2, 2
+; CHECK-NEXT: stxsd 2, 0(5)
+; CHECK-NEXT: blr
+entry:
+ %0 = load fp128, fp128* %a, align 16
+ %1 = load fp128, fp128* %b, align 16
+ %add = fadd fp128 %0, %1
+ %conv = fptrunc fp128 %add to double
+ store double %conv, double* %res, align 8
+ ret void
+}
+
+; Convert QP to SP
+
+; Function Attrs: norecurse nounwind readonly
+define float @qpConv2sp(fp128* nocapture readonly %a) {
+; CHECK-LABEL: qpConv2sp:
+; CHECK: # %bb.0: # %entry
+; CHECK-NEXT: lxv 2, 0(3)
+; CHECK-NEXT: xscvqpdpo 2, 2
+; CHECK-NEXT: xsrsp 1, 2
+; CHECK-NEXT: blr
+entry:
+ %0 = load fp128, fp128* %a, align 16
+ %conv = fptrunc fp128 %0 to float
+ ret float %conv
+}
+
+; Function Attrs: norecurse nounwind
+define void @qpConv2sp_02(float* nocapture %res) {
+; CHECK-LABEL: qpConv2sp_02:
+; CHECK: # %bb.0: # %entry
+; CHECK-NEXT: addis 4, 2, .LC6@toc@ha
+; CHECK-NEXT: ld 4, .LC6@toc@l(4)
+; CHECK-NEXT: lxvx 2, 0, 4
+; CHECK-NEXT: xscvqpdpo 2, 2
+; CHECK-NEXT: xsrsp 0, 2
+; CHECK-NEXT: stfs 0, 0(3)
+; CHECK-NEXT: blr
+entry:
+ %0 = load fp128, fp128* @f128global, align 16
+ %conv = fptrunc fp128 %0 to float
+ store float %conv, float* %res, align 4
+ ret void
+}
+
+; Function Attrs: norecurse nounwind
+define void @qpConv2sp_03(float* nocapture %res, i32 signext %idx) {
+; CHECK-LABEL: qpConv2sp_03:
+; CHECK: # %bb.0: # %entry
+; CHECK-NEXT: addis 5, 2, .LC7@toc@ha
+; CHECK-NEXT: sldi 4, 4, 2
+; CHECK-NEXT: ld 5, .LC7@toc@l(5)
+; CHECK-NEXT: lxv 2, 48(5)
+; CHECK-NEXT: xscvqpdpo 2, 2
+; CHECK-NEXT: xsrsp 0, 2
+; CHECK-NEXT: stfsx 0, 3, 4
+; CHECK-NEXT: blr
+entry:
+ %0 = load fp128, fp128* getelementptr inbounds ([4 x fp128], [4 x fp128]* @f128Array, i64 0, i64 3), align 16
+ %conv = fptrunc fp128 %0 to float
+ %idxprom = sext i32 %idx to i64
+ %arrayidx = getelementptr inbounds float, float* %res, i64 %idxprom
+ store float %conv, float* %arrayidx, align 4
+ ret void
+}
+
+; Function Attrs: norecurse nounwind
+define void @qpConv2sp_04(fp128* nocapture readonly %a, fp128* nocapture readonly %b, float* nocapture %res) {
+; CHECK-LABEL: qpConv2sp_04:
+; CHECK: # %bb.0: # %entry
+; CHECK-NEXT: lxv 2, 0(3)
+; CHECK-NEXT: lxv 3, 0(4)
+; CHECK-NEXT: xsaddqp 2, 2, 3
+; CHECK-NEXT: xscvqpdpo 2, 2
+; CHECK-NEXT: xsrsp 0, 2
+; CHECK-NEXT: stfs 0, 0(5)
+; CHECK-NEXT: blr
+entry:
+ %0 = load fp128, fp128* %a, align 16
+ %1 = load fp128, fp128* %b, align 16
+ %add = fadd fp128 %0, %1
+ %conv = fptrunc fp128 %add to float
+ store float %conv, float* %res, align 4
+ ret void
+}
OpenPOWER on IntegriCloud