133 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.experimental.constrained.fma.f64(double %f1, double %f2, double %f3, metadata, metadata)7 8define double @f1(double %f1, double %f2, double %acc) #0 {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.experimental.constrained.fma.f64 (15 double %f1, double %f2, double %acc,16 metadata !"round.dynamic",17 metadata !"fpexcept.strict") #018 ret double %res19}20 21define double @f2(double %f1, ptr %ptr, double %acc) #0 {22; CHECK-LABEL: f2:23; CHECK: madb %f2, %f0, 0(%r2)24; CHECK: ldr %f0, %f225; CHECK: br %r1426 %f2 = load double, ptr %ptr27 %res = call double @llvm.experimental.constrained.fma.f64 (28 double %f1, double %f2, double %acc,29 metadata !"round.dynamic",30 metadata !"fpexcept.strict") #031 ret double %res32}33 34define double @f3(double %f1, ptr %base, double %acc) #0 {35; CHECK-LABEL: f3:36; CHECK: madb %f2, %f0, 4088(%r2)37; CHECK: ldr %f0, %f238; CHECK: br %r1439 %ptr = getelementptr double, ptr %base, i64 51140 %f2 = load double, ptr %ptr41 %res = call double @llvm.experimental.constrained.fma.f64 (42 double %f1, double %f2, double %acc,43 metadata !"round.dynamic",44 metadata !"fpexcept.strict") #045 ret double %res46}47 48define double @f4(double %f1, ptr %base, double %acc) #0 {49; The important thing here is that we don't generate an out-of-range50; displacement. Other sequences besides this one would be OK.51;52; CHECK-LABEL: f4:53; CHECK: aghi %r2, 409654; CHECK: madb %f2, %f0, 0(%r2)55; CHECK: ldr %f0, %f256; CHECK: br %r1457 %ptr = getelementptr double, ptr %base, i64 51258 %f2 = load double, ptr %ptr59 %res = call double @llvm.experimental.constrained.fma.f64 (60 double %f1, double %f2, double %acc,61 metadata !"round.dynamic",62 metadata !"fpexcept.strict") #063 ret double %res64}65 66define double @f5(double %f1, ptr %base, double %acc) #0 {67; Here too the important thing is that we don't generate an out-of-range68; displacement. Other sequences besides this one would be OK.69;70; CHECK-LABEL: f5:71; CHECK: aghi %r2, -872; CHECK: madb %f2, %f0, 0(%r2)73; CHECK: ldr %f0, %f274; CHECK: br %r1475 %ptr = getelementptr double, ptr %base, i64 -176 %f2 = load double, ptr %ptr77 %res = call double @llvm.experimental.constrained.fma.f64 (78 double %f1, double %f2, double %acc,79 metadata !"round.dynamic",80 metadata !"fpexcept.strict") #081 ret double %res82}83 84define double @f6(double %f1, ptr %base, i64 %index, double %acc) #0 {85; CHECK-LABEL: f6:86; CHECK: sllg %r1, %r3, 387; CHECK: madb %f2, %f0, 0(%r1,%r2)88; CHECK: ldr %f0, %f289; CHECK: br %r1490 %ptr = getelementptr double, ptr %base, i64 %index91 %f2 = load double, ptr %ptr92 %res = call double @llvm.experimental.constrained.fma.f64 (93 double %f1, double %f2, double %acc,94 metadata !"round.dynamic",95 metadata !"fpexcept.strict") #096 ret double %res97}98 99define double @f7(double %f1, ptr %base, i64 %index, double %acc) #0 {100; CHECK-LABEL: f7:101; CHECK: sllg %r1, %r3, 3102; CHECK: madb %f2, %f0, 4088({{%r1,%r2|%r2,%r1}})103; CHECK: ldr %f0, %f2104; CHECK: br %r14105 %index2 = add i64 %index, 511106 %ptr = getelementptr double, ptr %base, i64 %index2107 %f2 = load double, ptr %ptr108 %res = call double @llvm.experimental.constrained.fma.f64 (109 double %f1, double %f2, double %acc,110 metadata !"round.dynamic",111 metadata !"fpexcept.strict") #0112 ret double %res113}114 115define double @f8(double %f1, ptr %base, i64 %index, double %acc) #0 {116; CHECK-LABEL: f8:117; CHECK: sllg %r1, %r3, 3118; CHECK: lay %r1, 4096({{%r1,%r2|%r2,%r1}})119; CHECK: madb %f2, %f0, 0(%r1)120; CHECK: ldr %f0, %f2121; CHECK: br %r14122 %index2 = add i64 %index, 512123 %ptr = getelementptr double, ptr %base, i64 %index2124 %f2 = load double, ptr %ptr125 %res = call double @llvm.experimental.constrained.fma.f64 (126 double %f1, double %f2, double %acc,127 metadata !"round.dynamic",128 metadata !"fpexcept.strict") #0129 ret double %res130}131 132attributes #0 = { strictfp }133