brintos

brintos / llvm-project-archived public Read only

0
0
Text · 7.1 KiB · eed698e Raw
234 lines · plain
1; Test multiplication of two f64s, producing an f128 result.2;3; RUN: llc < %s -mtriple=s390x-linux-gnu | FileCheck %s4 5declare double @foo()6 7; Check register multiplication.  "mxdbr %f0, %f2" is not valid from LLVM's8; point of view, because %f2 is the low register of the FP128 %f0.  Pass the9; multiplier in %f4 instead.10define void @f1(double %f1, double %dummy, double %f2, ptr %dst) {11; CHECK-LABEL: f1:12; CHECK: mxdbr %f0, %f413; CHECK: std %f0, 0(%r2)14; CHECK: std %f2, 8(%r2)15; CHECK: br %r1416  %f1x = fpext double %f1 to fp12817  %f2x = fpext double %f2 to fp12818  %res = fmul fp128 %f1x, %f2x19  store fp128 %res, ptr %dst20  ret void21}22 23; Check the low end of the MXDB range.24define void @f2(double %f1, ptr %ptr, ptr %dst) {25; CHECK-LABEL: f2:26; CHECK: mxdb %f0, 0(%r2)27; CHECK: std %f0, 0(%r3)28; CHECK: std %f2, 8(%r3)29; CHECK: br %r1430  %f2 = load double, ptr %ptr31  %f1x = fpext double %f1 to fp12832  %f2x = fpext double %f2 to fp12833  %res = fmul fp128 %f1x, %f2x34  store fp128 %res, ptr %dst35  ret void36}37 38; Check the high end of the aligned MXDB range.39define void @f3(double %f1, ptr %base, ptr %dst) {40; CHECK-LABEL: f3:41; CHECK: mxdb %f0, 4088(%r2)42; CHECK: std %f0, 0(%r3)43; CHECK: std %f2, 8(%r3)44; CHECK: br %r1445  %ptr = getelementptr double, ptr %base, i64 51146  %f2 = load double, ptr %ptr47  %f1x = fpext double %f1 to fp12848  %f2x = fpext double %f2 to fp12849  %res = fmul fp128 %f1x, %f2x50  store fp128 %res, ptr %dst51  ret void52}53 54; Check the next doubleword up, which needs separate address logic.55; Other sequences besides this one would be OK.56define void @f4(double %f1, ptr %base, ptr %dst) {57; CHECK-LABEL: f4:58; CHECK: aghi %r2, 409659; CHECK: mxdb %f0, 0(%r2)60; CHECK: std %f0, 0(%r3)61; CHECK: std %f2, 8(%r3)62; CHECK: br %r1463  %ptr = getelementptr double, ptr %base, i64 51264  %f2 = load double, ptr %ptr65  %f1x = fpext double %f1 to fp12866  %f2x = fpext double %f2 to fp12867  %res = fmul fp128 %f1x, %f2x68  store fp128 %res, ptr %dst69  ret void70}71 72; Check negative displacements, which also need separate address logic.73define void @f5(double %f1, ptr %base, ptr %dst) {74; CHECK-LABEL: f5:75; CHECK: aghi %r2, -876; CHECK: mxdb %f0, 0(%r2)77; CHECK: std %f0, 0(%r3)78; CHECK: std %f2, 8(%r3)79; CHECK: br %r1480  %ptr = getelementptr double, ptr %base, i64 -181  %f2 = load double, ptr %ptr82  %f1x = fpext double %f1 to fp12883  %f2x = fpext double %f2 to fp12884  %res = fmul fp128 %f1x, %f2x85  store fp128 %res, ptr %dst86  ret void87}88 89; Check that MXDB allows indices.90define void @f6(double %f1, ptr %base, i64 %index, ptr %dst) {91; CHECK-LABEL: f6:92; CHECK: sllg %r1, %r3, 393; CHECK: mxdb %f0, 800(%r1,%r2)94; CHECK: std %f0, 0(%r4)95; CHECK: std %f2, 8(%r4)96; CHECK: br %r1497  %ptr1 = getelementptr double, ptr %base, i64 %index98  %ptr2 = getelementptr double, ptr %ptr1, i64 10099  %f2 = load double, ptr %ptr2100  %f1x = fpext double %f1 to fp128101  %f2x = fpext double %f2 to fp128102  %res = fmul fp128 %f1x, %f2x103  store fp128 %res, ptr %dst104  ret void105}106 107; Check that multiplications of spilled values can use MXDB rather than MXDBR.108define double @f7(ptr %ptr0) {109; CHECK-LABEL: f7:110; CHECK: brasl %r14, foo@PLT111; CHECK: mxdb %f0, 160(%r15)112; CHECK: br %r14113  %ptr1 = getelementptr double, ptr %ptr0, i64 2114  %ptr2 = getelementptr double, ptr %ptr0, i64 4115  %ptr3 = getelementptr double, ptr %ptr0, i64 6116  %ptr4 = getelementptr double, ptr %ptr0, i64 8117  %ptr5 = getelementptr double, ptr %ptr0, i64 10118  %ptr6 = getelementptr double, ptr %ptr0, i64 12119  %ptr7 = getelementptr double, ptr %ptr0, i64 14120  %ptr8 = getelementptr double, ptr %ptr0, i64 16121  %ptr9 = getelementptr double, ptr %ptr0, i64 18122  %ptr10 = getelementptr double, ptr %ptr0, i64 20123 124  %val0 = load double, ptr %ptr0125  %val1 = load double, ptr %ptr1126  %val2 = load double, ptr %ptr2127  %val3 = load double, ptr %ptr3128  %val4 = load double, ptr %ptr4129  %val5 = load double, ptr %ptr5130  %val6 = load double, ptr %ptr6131  %val7 = load double, ptr %ptr7132  %val8 = load double, ptr %ptr8133  %val9 = load double, ptr %ptr9134  %val10 = load double, ptr %ptr10135 136  %frob0 = fadd double %val0, %val0137  %frob1 = fadd double %val1, %val1138  %frob2 = fadd double %val2, %val2139  %frob3 = fadd double %val3, %val3140  %frob4 = fadd double %val4, %val4141  %frob5 = fadd double %val5, %val5142  %frob6 = fadd double %val6, %val6143  %frob7 = fadd double %val7, %val7144  %frob8 = fadd double %val8, %val8145  %frob9 = fadd double %val9, %val9146  %frob10 = fadd double %val9, %val10147 148  store double %frob0, ptr %ptr0149  store double %frob1, ptr %ptr1150  store double %frob2, ptr %ptr2151  store double %frob3, ptr %ptr3152  store double %frob4, ptr %ptr4153  store double %frob5, ptr %ptr5154  store double %frob6, ptr %ptr6155  store double %frob7, ptr %ptr7156  store double %frob8, ptr %ptr8157  store double %frob9, ptr %ptr9158  store double %frob10, ptr %ptr10159 160  %ret = call double @foo()161 162  %accext0 = fpext double %ret to fp128163  %ext0 = fpext double %frob0 to fp128164  %mul0 = fmul fp128 %accext0, %ext0165  %const0 = fpext double 1.01 to fp128166  %extra0 = fmul fp128 %mul0, %const0167  %trunc0 = fptrunc fp128 %extra0 to double168 169  %accext1 = fpext double %trunc0 to fp128170  %ext1 = fpext double %frob1 to fp128171  %mul1 = fmul fp128 %accext1, %ext1172  %const1 = fpext double 1.11 to fp128173  %extra1 = fmul fp128 %mul1, %const1174  %trunc1 = fptrunc fp128 %extra1 to double175 176  %accext2 = fpext double %trunc1 to fp128177  %ext2 = fpext double %frob2 to fp128178  %mul2 = fmul fp128 %accext2, %ext2179  %const2 = fpext double 1.21 to fp128180  %extra2 = fmul fp128 %mul2, %const2181  %trunc2 = fptrunc fp128 %extra2 to double182 183  %accext3 = fpext double %trunc2 to fp128184  %ext3 = fpext double %frob3 to fp128185  %mul3 = fmul fp128 %accext3, %ext3186  %const3 = fpext double 1.31 to fp128187  %extra3 = fmul fp128 %mul3, %const3188  %trunc3 = fptrunc fp128 %extra3 to double189 190  %accext4 = fpext double %trunc3 to fp128191  %ext4 = fpext double %frob4 to fp128192  %mul4 = fmul fp128 %accext4, %ext4193  %const4 = fpext double 1.41 to fp128194  %extra4 = fmul fp128 %mul4, %const4195  %trunc4 = fptrunc fp128 %extra4 to double196 197  %accext5 = fpext double %trunc4 to fp128198  %ext5 = fpext double %frob5 to fp128199  %mul5 = fmul fp128 %accext5, %ext5200  %const5 = fpext double 1.51 to fp128201  %extra5 = fmul fp128 %mul5, %const5202  %trunc5 = fptrunc fp128 %extra5 to double203 204  %accext6 = fpext double %trunc5 to fp128205  %ext6 = fpext double %frob6 to fp128206  %mul6 = fmul fp128 %accext6, %ext6207  %const6 = fpext double 1.61 to fp128208  %extra6 = fmul fp128 %mul6, %const6209  %trunc6 = fptrunc fp128 %extra6 to double210 211  %accext7 = fpext double %trunc6 to fp128212  %ext7 = fpext double %frob7 to fp128213  %mul7 = fmul fp128 %accext7, %ext7214  %const7 = fpext double 1.71 to fp128215  %extra7 = fmul fp128 %mul7, %const7216  %trunc7 = fptrunc fp128 %extra7 to double217 218  %accext8 = fpext double %trunc7 to fp128219  %ext8 = fpext double %frob8 to fp128220  %mul8 = fmul fp128 %accext8, %ext8221  %const8 = fpext double 1.81 to fp128222  %extra8 = fmul fp128 %mul8, %const8223  %trunc8 = fptrunc fp128 %extra8 to double224 225  %accext9 = fpext double %trunc8 to fp128226  %ext9 = fpext double %frob9 to fp128227  %mul9 = fmul fp128 %accext9, %ext9228  %const9 = fpext double 1.91 to fp128229  %extra9 = fmul fp128 %mul9, %const9230  %trunc9 = fptrunc fp128 %extra9 to double231 232  ret double %trunc9233}234