brintos

brintos / llvm-project-archived public Read only

0
0
Text · 3.3 KiB · 5f196e7 Raw
107 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: madbr %f4, %f0, %f211; CHECK-SCALAR: ldr %f0, %f412; CHECK-VECTOR: wfmadb %f0, %f0, %f2, %f413; CHECK: br %r1414  %res = call double @llvm.fma.f64 (double %f1, double %f2, double %acc)15  ret double %res16}17 18define double @f2(double %f1, ptr %ptr, double %acc) {19; CHECK-LABEL: f2:20; CHECK: madb %f2, %f0, 0(%r2)21; CHECK: ldr %f0, %f222; CHECK: br %r1423  %f2 = load double, ptr %ptr24  %res = call double @llvm.fma.f64 (double %f1, double %f2, double %acc)25  ret double %res26}27 28define double @f3(double %f1, ptr %base, double %acc) {29; CHECK-LABEL: f3:30; CHECK: madb %f2, %f0, 4088(%r2)31; CHECK: ldr %f0, %f232; CHECK: br %r1433  %ptr = getelementptr double, ptr %base, i64 51134  %f2 = load double, ptr %ptr35  %res = call double @llvm.fma.f64 (double %f1, double %f2, double %acc)36  ret double %res37}38 39define double @f4(double %f1, ptr %base, double %acc) {40; The important thing here is that we don't generate an out-of-range41; displacement.  Other sequences besides this one would be OK.42;43; CHECK-LABEL: f4:44; CHECK: aghi %r2, 409645; CHECK: madb %f2, %f0, 0(%r2)46; CHECK: ldr %f0, %f247; CHECK: br %r1448  %ptr = getelementptr double, ptr %base, i64 51249  %f2 = load double, ptr %ptr50  %res = call double @llvm.fma.f64 (double %f1, double %f2, double %acc)51  ret double %res52}53 54define double @f5(double %f1, ptr %base, double %acc) {55; Here too the important thing is that we don't generate an out-of-range56; displacement.  Other sequences besides this one would be OK.57;58; CHECK-LABEL: f5:59; CHECK: aghi %r2, -860; CHECK: madb %f2, %f0, 0(%r2)61; CHECK: ldr %f0, %f262; CHECK: br %r1463  %ptr = getelementptr double, ptr %base, i64 -164  %f2 = load double, ptr %ptr65  %res = call double @llvm.fma.f64 (double %f1, double %f2, double %acc)66  ret double %res67}68 69define double @f6(double %f1, ptr %base, i64 %index, double %acc) {70; CHECK-LABEL: f6:71; CHECK: sllg %r1, %r3, 372; CHECK: madb %f2, %f0, 0(%r1,%r2)73; CHECK: ldr %f0, %f274; CHECK: br %r1475  %ptr = getelementptr double, ptr %base, i64 %index76  %f2 = load double, ptr %ptr77  %res = call double @llvm.fma.f64 (double %f1, double %f2, double %acc)78  ret double %res79}80 81define double @f7(double %f1, ptr %base, i64 %index, double %acc) {82; CHECK-LABEL: f7:83; CHECK: sllg %r1, %r3, 384; CHECK: madb %f2, %f0, 4088({{%r1,%r2|%r2,%r1}})85; CHECK: ldr %f0, %f286; CHECK: br %r1487  %index2 = add i64 %index, 51188  %ptr = getelementptr double, ptr %base, i64 %index289  %f2 = load double, ptr %ptr90  %res = call double @llvm.fma.f64 (double %f1, double %f2, double %acc)91  ret double %res92}93 94define double @f8(double %f1, ptr %base, i64 %index, double %acc) {95; CHECK-LABEL: f8:96; CHECK: sllg %r1, %r3, 397; CHECK: lay %r1, 4096({{%r1,%r2|%r2,%r1}})98; CHECK: madb %f2, %f0, 0(%r1)99; CHECK: ldr %f0, %f2100; CHECK: br %r14101  %index2 = add i64 %index, 512102  %ptr = getelementptr double, ptr %base, i64 %index2103  %f2 = load double, ptr %ptr104  %res = call double @llvm.fma.f64 (double %f1, double %f2, double %acc)105  ret double %res106}107