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