141 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: 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.experimental.constrained.fma.f64 (16 double %f1, double %f2, double %negacc,17 metadata !"round.dynamic",18 metadata !"fpexcept.strict") #019 ret double %res20}21 22define double @f2(double %f1, ptr %ptr, double %acc) #0 {23; CHECK-LABEL: f2:24; CHECK: msdb %f2, %f0, 0(%r2)25; CHECK: ldr %f0, %f226; CHECK: br %r1427 %f2 = load double, ptr %ptr28 %negacc = fneg double %acc29 %res = call double @llvm.experimental.constrained.fma.f64 (30 double %f1, double %f2, double %negacc,31 metadata !"round.dynamic",32 metadata !"fpexcept.strict") #033 ret double %res34}35 36define double @f3(double %f1, ptr %base, double %acc) #0 {37; CHECK-LABEL: f3:38; CHECK: msdb %f2, %f0, 4088(%r2)39; CHECK: ldr %f0, %f240; CHECK: br %r1441 %ptr = getelementptr double, ptr %base, i64 51142 %f2 = load double, ptr %ptr43 %negacc = fneg double %acc44 %res = call double @llvm.experimental.constrained.fma.f64 (45 double %f1, double %f2, double %negacc,46 metadata !"round.dynamic",47 metadata !"fpexcept.strict") #048 ret double %res49}50 51define double @f4(double %f1, ptr %base, double %acc) #0 {52; The important thing here is that we don't generate an out-of-range53; displacement. Other sequences besides this one would be OK.54;55; CHECK-LABEL: f4:56; CHECK: aghi %r2, 409657; CHECK: msdb %f2, %f0, 0(%r2)58; CHECK: ldr %f0, %f259; CHECK: br %r1460 %ptr = getelementptr double, ptr %base, i64 51261 %f2 = load double, ptr %ptr62 %negacc = fneg double %acc63 %res = call double @llvm.experimental.constrained.fma.f64 (64 double %f1, double %f2, double %negacc,65 metadata !"round.dynamic",66 metadata !"fpexcept.strict") #067 ret double %res68}69 70define double @f5(double %f1, ptr %base, double %acc) #0 {71; Here too the important thing is that we don't generate an out-of-range72; displacement. Other sequences besides this one would be OK.73;74; CHECK-LABEL: f5:75; CHECK: aghi %r2, -876; CHECK: msdb %f2, %f0, 0(%r2)77; CHECK: ldr %f0, %f278; CHECK: br %r1479 %ptr = getelementptr double, ptr %base, i64 -180 %f2 = load double, ptr %ptr81 %negacc = fneg double %acc82 %res = call double @llvm.experimental.constrained.fma.f64 (83 double %f1, double %f2, double %negacc,84 metadata !"round.dynamic",85 metadata !"fpexcept.strict") #086 ret double %res87}88 89define double @f6(double %f1, ptr %base, i64 %index, double %acc) #0 {90; CHECK-LABEL: f6:91; CHECK: sllg %r1, %r3, 392; CHECK: msdb %f2, %f0, 0(%r1,%r2)93; CHECK: ldr %f0, %f294; CHECK: br %r1495 %ptr = getelementptr double, ptr %base, i64 %index96 %f2 = load double, ptr %ptr97 %negacc = fneg double %acc98 %res = call double @llvm.experimental.constrained.fma.f64 (99 double %f1, double %f2, double %negacc,100 metadata !"round.dynamic",101 metadata !"fpexcept.strict") #0102 ret double %res103}104 105define double @f7(double %f1, ptr %base, i64 %index, double %acc) #0 {106; CHECK-LABEL: f7:107; CHECK: sllg %r1, %r3, 3108; CHECK: msdb %f2, %f0, 4088({{%r1,%r2|%r2,%r1}})109; CHECK: ldr %f0, %f2110; CHECK: br %r14111 %index2 = add i64 %index, 511112 %ptr = getelementptr double, ptr %base, i64 %index2113 %f2 = load double, ptr %ptr114 %negacc = fneg double %acc115 %res = call double @llvm.experimental.constrained.fma.f64 (116 double %f1, double %f2, double %negacc,117 metadata !"round.dynamic",118 metadata !"fpexcept.strict") #0119 ret double %res120}121 122define double @f8(double %f1, ptr %base, i64 %index, double %acc) #0 {123; CHECK-LABEL: f8:124; CHECK: sllg %r1, %r3, 3125; CHECK: lay %r1, 4096({{%r1,%r2|%r2,%r1}})126; CHECK: msdb %f2, %f0, 0(%r1)127; CHECK: ldr %f0, %f2128; CHECK: br %r14129 %index2 = add i64 %index, 512130 %ptr = getelementptr double, ptr %base, i64 %index2131 %f2 = load double, ptr %ptr132 %negacc = fneg double %acc133 %res = call double @llvm.experimental.constrained.fma.f64 (134 double %f1, double %f2, double %negacc,135 metadata !"round.dynamic",136 metadata !"fpexcept.strict") #0137 ret double %res138}139 140attributes #0 = { strictfp }141