aboutsummaryrefslogtreecommitdiff
path: root/test/CodeGen/SystemZ/fp-mul-04.ll
diff options
context:
space:
mode:
Diffstat (limited to 'test/CodeGen/SystemZ/fp-mul-04.ll')
-rw-r--r--test/CodeGen/SystemZ/fp-mul-04.ll233
1 files changed, 0 insertions, 233 deletions
diff --git a/test/CodeGen/SystemZ/fp-mul-04.ll b/test/CodeGen/SystemZ/fp-mul-04.ll
deleted file mode 100644
index 4226a3f61dff..000000000000
--- a/test/CodeGen/SystemZ/fp-mul-04.ll
+++ /dev/null
@@ -1,233 +0,0 @@
-; Test multiplication of two f64s, producing an f128 result.
-;
-; RUN: llc < %s -mtriple=s390x-linux-gnu | FileCheck %s
-
-declare double @foo()
-
-; Check register multiplication. "mxdbr %f0, %f2" is not valid from LLVM's
-; point of view, because %f2 is the low register of the FP128 %f0. Pass the
-; multiplier in %f4 instead.
-define void @f1(double %f1, double %dummy, double %f2, fp128 *%dst) {
-; CHECK-LABEL: f1:
-; CHECK: mxdbr %f0, %f4
-; CHECK: std %f0, 0(%r2)
-; CHECK: std %f2, 8(%r2)
-; CHECK: br %r14
- %f1x = fpext double %f1 to fp128
- %f2x = fpext double %f2 to fp128
- %res = fmul fp128 %f1x, %f2x
- store fp128 %res, fp128 *%dst
- ret void
-}
-
-; Check the low end of the MXDB range.
-define void @f2(double %f1, double *%ptr, fp128 *%dst) {
-; CHECK-LABEL: f2:
-; CHECK: mxdb %f0, 0(%r2)
-; CHECK: std %f0, 0(%r3)
-; CHECK: std %f2, 8(%r3)
-; CHECK: br %r14
- %f2 = load double , double *%ptr
- %f1x = fpext double %f1 to fp128
- %f2x = fpext double %f2 to fp128
- %res = fmul fp128 %f1x, %f2x
- store fp128 %res, fp128 *%dst
- ret void
-}
-
-; Check the high end of the aligned MXDB range.
-define void @f3(double %f1, double *%base, fp128 *%dst) {
-; CHECK-LABEL: f3:
-; CHECK: mxdb %f0, 4088(%r2)
-; CHECK: std %f0, 0(%r3)
-; CHECK: std %f2, 8(%r3)
-; CHECK: br %r14
- %ptr = getelementptr double, double *%base, i64 511
- %f2 = load double , double *%ptr
- %f1x = fpext double %f1 to fp128
- %f2x = fpext double %f2 to fp128
- %res = fmul fp128 %f1x, %f2x
- store fp128 %res, fp128 *%dst
- ret void
-}
-
-; Check the next doubleword up, which needs separate address logic.
-; Other sequences besides this one would be OK.
-define void @f4(double %f1, double *%base, fp128 *%dst) {
-; CHECK-LABEL: f4:
-; CHECK: aghi %r2, 4096
-; CHECK: mxdb %f0, 0(%r2)
-; CHECK: std %f0, 0(%r3)
-; CHECK: std %f2, 8(%r3)
-; CHECK: br %r14
- %ptr = getelementptr double, double *%base, i64 512
- %f2 = load double , double *%ptr
- %f1x = fpext double %f1 to fp128
- %f2x = fpext double %f2 to fp128
- %res = fmul fp128 %f1x, %f2x
- store fp128 %res, fp128 *%dst
- ret void
-}
-
-; Check negative displacements, which also need separate address logic.
-define void @f5(double %f1, double *%base, fp128 *%dst) {
-; CHECK-LABEL: f5:
-; CHECK: aghi %r2, -8
-; CHECK: mxdb %f0, 0(%r2)
-; CHECK: std %f0, 0(%r3)
-; CHECK: std %f2, 8(%r3)
-; CHECK: br %r14
- %ptr = getelementptr double, double *%base, i64 -1
- %f2 = load double , double *%ptr
- %f1x = fpext double %f1 to fp128
- %f2x = fpext double %f2 to fp128
- %res = fmul fp128 %f1x, %f2x
- store fp128 %res, fp128 *%dst
- ret void
-}
-
-; Check that MXDB allows indices.
-define void @f6(double %f1, double *%base, i64 %index, fp128 *%dst) {
-; CHECK-LABEL: f6:
-; CHECK: sllg %r1, %r3, 3
-; CHECK: mxdb %f0, 800(%r1,%r2)
-; CHECK: std %f0, 0(%r4)
-; CHECK: std %f2, 8(%r4)
-; CHECK: br %r14
- %ptr1 = getelementptr double, double *%base, i64 %index
- %ptr2 = getelementptr double, double *%ptr1, i64 100
- %f2 = load double , double *%ptr2
- %f1x = fpext double %f1 to fp128
- %f2x = fpext double %f2 to fp128
- %res = fmul fp128 %f1x, %f2x
- store fp128 %res, fp128 *%dst
- ret void
-}
-
-; Check that multiplications of spilled values can use MXDB rather than MXDBR.
-define double @f7(double *%ptr0) {
-; CHECK-LABEL: f7:
-; CHECK: brasl %r14, foo@PLT
-; CHECK: mxdb %f0, 160(%r15)
-; CHECK: br %r14
- %ptr1 = getelementptr double, double *%ptr0, i64 2
- %ptr2 = getelementptr double, double *%ptr0, i64 4
- %ptr3 = getelementptr double, double *%ptr0, i64 6
- %ptr4 = getelementptr double, double *%ptr0, i64 8
- %ptr5 = getelementptr double, double *%ptr0, i64 10
- %ptr6 = getelementptr double, double *%ptr0, i64 12
- %ptr7 = getelementptr double, double *%ptr0, i64 14
- %ptr8 = getelementptr double, double *%ptr0, i64 16
- %ptr9 = getelementptr double, double *%ptr0, i64 18
- %ptr10 = getelementptr double, double *%ptr0, i64 20
-
- %val0 = load double , double *%ptr0
- %val1 = load double , double *%ptr1
- %val2 = load double , double *%ptr2
- %val3 = load double , double *%ptr3
- %val4 = load double , double *%ptr4
- %val5 = load double , double *%ptr5
- %val6 = load double , double *%ptr6
- %val7 = load double , double *%ptr7
- %val8 = load double , double *%ptr8
- %val9 = load double , double *%ptr9
- %val10 = load double , double *%ptr10
-
- %frob0 = fadd double %val0, %val0
- %frob1 = fadd double %val1, %val1
- %frob2 = fadd double %val2, %val2
- %frob3 = fadd double %val3, %val3
- %frob4 = fadd double %val4, %val4
- %frob5 = fadd double %val5, %val5
- %frob6 = fadd double %val6, %val6
- %frob7 = fadd double %val7, %val7
- %frob8 = fadd double %val8, %val8
- %frob9 = fadd double %val9, %val9
- %frob10 = fadd double %val9, %val10
-
- store double %frob0, double *%ptr0
- store double %frob1, double *%ptr1
- store double %frob2, double *%ptr2
- store double %frob3, double *%ptr3
- store double %frob4, double *%ptr4
- store double %frob5, double *%ptr5
- store double %frob6, double *%ptr6
- store double %frob7, double *%ptr7
- store double %frob8, double *%ptr8
- store double %frob9, double *%ptr9
- store double %frob10, double *%ptr10
-
- %ret = call double @foo()
-
- %accext0 = fpext double %ret to fp128
- %ext0 = fpext double %frob0 to fp128
- %mul0 = fmul fp128 %accext0, %ext0
- %const0 = fpext double 1.01 to fp128
- %extra0 = fmul fp128 %mul0, %const0
- %trunc0 = fptrunc fp128 %extra0 to double
-
- %accext1 = fpext double %trunc0 to fp128
- %ext1 = fpext double %frob1 to fp128
- %mul1 = fmul fp128 %accext1, %ext1
- %const1 = fpext double 1.11 to fp128
- %extra1 = fmul fp128 %mul1, %const1
- %trunc1 = fptrunc fp128 %extra1 to double
-
- %accext2 = fpext double %trunc1 to fp128
- %ext2 = fpext double %frob2 to fp128
- %mul2 = fmul fp128 %accext2, %ext2
- %const2 = fpext double 1.21 to fp128
- %extra2 = fmul fp128 %mul2, %const2
- %trunc2 = fptrunc fp128 %extra2 to double
-
- %accext3 = fpext double %trunc2 to fp128
- %ext3 = fpext double %frob3 to fp128
- %mul3 = fmul fp128 %accext3, %ext3
- %const3 = fpext double 1.31 to fp128
- %extra3 = fmul fp128 %mul3, %const3
- %trunc3 = fptrunc fp128 %extra3 to double
-
- %accext4 = fpext double %trunc3 to fp128
- %ext4 = fpext double %frob4 to fp128
- %mul4 = fmul fp128 %accext4, %ext4
- %const4 = fpext double 1.41 to fp128
- %extra4 = fmul fp128 %mul4, %const4
- %trunc4 = fptrunc fp128 %extra4 to double
-
- %accext5 = fpext double %trunc4 to fp128
- %ext5 = fpext double %frob5 to fp128
- %mul5 = fmul fp128 %accext5, %ext5
- %const5 = fpext double 1.51 to fp128
- %extra5 = fmul fp128 %mul5, %const5
- %trunc5 = fptrunc fp128 %extra5 to double
-
- %accext6 = fpext double %trunc5 to fp128
- %ext6 = fpext double %frob6 to fp128
- %mul6 = fmul fp128 %accext6, %ext6
- %const6 = fpext double 1.61 to fp128
- %extra6 = fmul fp128 %mul6, %const6
- %trunc6 = fptrunc fp128 %extra6 to double
-
- %accext7 = fpext double %trunc6 to fp128
- %ext7 = fpext double %frob7 to fp128
- %mul7 = fmul fp128 %accext7, %ext7
- %const7 = fpext double 1.71 to fp128
- %extra7 = fmul fp128 %mul7, %const7
- %trunc7 = fptrunc fp128 %extra7 to double
-
- %accext8 = fpext double %trunc7 to fp128
- %ext8 = fpext double %frob8 to fp128
- %mul8 = fmul fp128 %accext8, %ext8
- %const8 = fpext double 1.81 to fp128
- %extra8 = fmul fp128 %mul8, %const8
- %trunc8 = fptrunc fp128 %extra8 to double
-
- %accext9 = fpext double %trunc8 to fp128
- %ext9 = fpext double %frob9 to fp128
- %mul9 = fmul fp128 %accext9, %ext9
- %const9 = fpext double 1.91 to fp128
- %extra9 = fmul fp128 %mul9, %const9
- %trunc9 = fptrunc fp128 %extra9 to double
-
- ret double %trunc9
-}