brintos

brintos / llvm-project-archived public Read only

0
0
Text · 3.5 KiB · 35684f9 Raw
115 lines · plain
1; RUN: llc < %s -mtriple=s390x-linux-gnu -mcpu=z10 \2; RUN:   | FileCheck -check-prefix=CHECK -check-prefix=CHECK-SCALAR %s3; RUN: llc < %s -mtriple=s390x-linux-gnu -mcpu=z13 \4; RUN:   | FileCheck -check-prefix=CHECK -check-prefix=CHECK-VECTOR %s5 6declare double @llvm.fma.f64(double %f1, double %f2, double %f3)7 8define double @f1(double %f1, double %f2, double %acc) {9; CHECK-LABEL: f1:10; CHECK-SCALAR: msdbr %f4, %f0, %f211; CHECK-SCALAR: ldr %f0, %f412; CHECK-VECTOR: wfmsdb %f0, %f0, %f2, %f413; CHECK: br %r1414  %negacc = fneg double %acc15  %res = call double @llvm.fma.f64 (double %f1, double %f2, double %negacc)16  ret double %res17}18 19define double @f2(double %f1, ptr %ptr, double %acc) {20; CHECK-LABEL: f2:21; CHECK: msdb %f2, %f0, 0(%r2)22; CHECK: ldr %f0, %f223; CHECK: br %r1424  %f2 = load double, ptr %ptr25  %negacc = fneg double %acc26  %res = call double @llvm.fma.f64 (double %f1, double %f2, double %negacc)27  ret double %res28}29 30define double @f3(double %f1, ptr %base, double %acc) {31; CHECK-LABEL: f3:32; CHECK: msdb %f2, %f0, 4088(%r2)33; CHECK: ldr %f0, %f234; CHECK: br %r1435  %ptr = getelementptr double, ptr %base, i64 51136  %f2 = load double, ptr %ptr37  %negacc = fneg double %acc38  %res = call double @llvm.fma.f64 (double %f1, double %f2, double %negacc)39  ret double %res40}41 42define double @f4(double %f1, ptr %base, double %acc) {43; The important thing here is that we don't generate an out-of-range44; displacement.  Other sequences besides this one would be OK.45;46; CHECK-LABEL: f4:47; CHECK: aghi %r2, 409648; CHECK: msdb %f2, %f0, 0(%r2)49; CHECK: ldr %f0, %f250; CHECK: br %r1451  %ptr = getelementptr double, ptr %base, i64 51252  %f2 = load double, ptr %ptr53  %negacc = fneg double %acc54  %res = call double @llvm.fma.f64 (double %f1, double %f2, double %negacc)55  ret double %res56}57 58define double @f5(double %f1, ptr %base, double %acc) {59; Here too the important thing is that we don't generate an out-of-range60; displacement.  Other sequences besides this one would be OK.61;62; CHECK-LABEL: f5:63; CHECK: aghi %r2, -864; CHECK: msdb %f2, %f0, 0(%r2)65; CHECK: ldr %f0, %f266; CHECK: br %r1467  %ptr = getelementptr double, ptr %base, i64 -168  %f2 = load double, ptr %ptr69  %negacc = fneg double %acc70  %res = call double @llvm.fma.f64 (double %f1, double %f2, double %negacc)71  ret double %res72}73 74define double @f6(double %f1, ptr %base, i64 %index, double %acc) {75; CHECK-LABEL: f6:76; CHECK: sllg %r1, %r3, 377; CHECK: msdb %f2, %f0, 0(%r1,%r2)78; CHECK: ldr %f0, %f279; CHECK: br %r1480  %ptr = getelementptr double, ptr %base, i64 %index81  %f2 = load double, ptr %ptr82  %negacc = fneg double %acc83  %res = call double @llvm.fma.f64 (double %f1, double %f2, double %negacc)84  ret double %res85}86 87define double @f7(double %f1, ptr %base, i64 %index, double %acc) {88; CHECK-LABEL: f7:89; CHECK: sllg %r1, %r3, 390; CHECK: msdb %f2, %f0, 4088({{%r1,%r2|%r2,%r1}})91; CHECK: ldr %f0, %f292; CHECK: br %r1493  %index2 = add i64 %index, 51194  %ptr = getelementptr double, ptr %base, i64 %index295  %f2 = load double, ptr %ptr96  %negacc = fneg double %acc97  %res = call double @llvm.fma.f64 (double %f1, double %f2, double %negacc)98  ret double %res99}100 101define double @f8(double %f1, ptr %base, i64 %index, double %acc) {102; CHECK-LABEL: f8:103; CHECK: sllg %r1, %r3, 3104; CHECK: lay %r1, 4096({{%r1,%r2|%r2,%r1}})105; CHECK: msdb %f2, %f0, 0(%r1)106; CHECK: ldr %f0, %f2107; CHECK: br %r14108  %index2 = add i64 %index, 512109  %ptr = getelementptr double, ptr %base, i64 %index2110  %f2 = load double, ptr %ptr111  %negacc = fneg double %acc112  %res = call double @llvm.fma.f64 (double %f1, double %f2, double %negacc)113  ret double %res114}115