192 lines · plain
1; Test strict 32-bit floating-point division.2;3; RUN: llc < %s -mtriple=s390x-linux-gnu -mcpu=z10 \4; RUN: | FileCheck -check-prefix=CHECK -check-prefix=CHECK-SCALAR %s5; RUN: llc < %s -mtriple=s390x-linux-gnu -mcpu=z14 | FileCheck %s6 7declare float @foo()8declare half @llvm.experimental.constrained.fdiv.f16(half, half, metadata, metadata)9declare float @llvm.experimental.constrained.fdiv.f32(float, float, metadata, metadata)10 11; Check register division.12define half @f0(half %f1, half %f2) #0 {13; CHECK-LABEL: f0:14; CHECK: brasl %r14, __extendhfsf2@PLT15; CHECK: brasl %r14, __extendhfsf2@PLT16; CHECK: debr %f0, %f917; CHECK: brasl %r14, __truncsfhf2@PLT18; CHECK: br %r1419 %res = call half @llvm.experimental.constrained.fdiv.f16(20 half %f1, half %f2,21 metadata !"round.dynamic",22 metadata !"fpexcept.strict") #023 ret half %res24}25 26; Check register division.27define float @f1(float %f1, float %f2) #0 {28; CHECK-LABEL: f1:29; CHECK: debr %f0, %f230; CHECK: br %r1431 %res = call float @llvm.experimental.constrained.fdiv.f32(32 float %f1, float %f2,33 metadata !"round.dynamic",34 metadata !"fpexcept.strict") #035 ret float %res36}37 38; Check the low end of the DEB range.39define float @f2(float %f1, ptr %ptr) #0 {40; CHECK-LABEL: f2:41; CHECK: deb %f0, 0(%r2)42; CHECK: br %r1443 %f2 = load float, ptr %ptr44 %res = call float @llvm.experimental.constrained.fdiv.f32(45 float %f1, float %f2,46 metadata !"round.dynamic",47 metadata !"fpexcept.strict") #048 ret float %res49}50 51; Check the high end of the aligned DEB range.52define float @f3(float %f1, ptr %base) #0 {53; CHECK-LABEL: f3:54; CHECK: deb %f0, 4092(%r2)55; CHECK: br %r1456 %ptr = getelementptr float, ptr %base, i64 102357 %f2 = load float, ptr %ptr58 %res = call float @llvm.experimental.constrained.fdiv.f32(59 float %f1, float %f2,60 metadata !"round.dynamic",61 metadata !"fpexcept.strict") #062 ret float %res63}64 65; Check the next word up, which needs separate address logic.66; Other sequences besides this one would be OK.67define float @f4(float %f1, ptr %base) #0 {68; CHECK-LABEL: f4:69; CHECK: aghi %r2, 409670; CHECK: deb %f0, 0(%r2)71; CHECK: br %r1472 %ptr = getelementptr float, ptr %base, i64 102473 %f2 = load float, ptr %ptr74 %res = call float @llvm.experimental.constrained.fdiv.f32(75 float %f1, float %f2,76 metadata !"round.dynamic",77 metadata !"fpexcept.strict") #078 ret float %res79}80 81; Check negative displacements, which also need separate address logic.82define float @f5(float %f1, ptr %base) #0 {83; CHECK-LABEL: f5:84; CHECK: aghi %r2, -485; CHECK: deb %f0, 0(%r2)86; CHECK: br %r1487 %ptr = getelementptr float, ptr %base, i64 -188 %f2 = load float, ptr %ptr89 %res = call float @llvm.experimental.constrained.fdiv.f32(90 float %f1, float %f2,91 metadata !"round.dynamic",92 metadata !"fpexcept.strict") #093 ret float %res94}95 96; Check that DEB allows indices.97define float @f6(float %f1, ptr %base, i64 %index) #0 {98; CHECK-LABEL: f6:99; CHECK: sllg %r1, %r3, 2100; CHECK: deb %f0, 400(%r1,%r2)101; CHECK: br %r14102 %ptr1 = getelementptr float, ptr %base, i64 %index103 %ptr2 = getelementptr float, ptr %ptr1, i64 100104 %f2 = load float, ptr %ptr2105 %res = call float @llvm.experimental.constrained.fdiv.f32(106 float %f1, float %f2,107 metadata !"round.dynamic",108 metadata !"fpexcept.strict") #0109 ret float %res110}111 112; Check that divisions of spilled values can use DEB rather than DEBR.113define float @f7(ptr %ptr0) #0 {114; CHECK-LABEL: f7:115; CHECK: brasl %r14, foo@PLT116; CHECK-SCALAR: deb %f0, 16{{[04]}}(%r15)117; CHECK: br %r14118 %ptr1 = getelementptr float, ptr %ptr0, i64 2119 %ptr2 = getelementptr float, ptr %ptr0, i64 4120 %ptr3 = getelementptr float, ptr %ptr0, i64 6121 %ptr4 = getelementptr float, ptr %ptr0, i64 8122 %ptr5 = getelementptr float, ptr %ptr0, i64 10123 %ptr6 = getelementptr float, ptr %ptr0, i64 12124 %ptr7 = getelementptr float, ptr %ptr0, i64 14125 %ptr8 = getelementptr float, ptr %ptr0, i64 16126 %ptr9 = getelementptr float, ptr %ptr0, i64 18127 %ptr10 = getelementptr float, ptr %ptr0, i64 20128 129 %val0 = load float, ptr %ptr0130 %val1 = load float, ptr %ptr1131 %val2 = load float, ptr %ptr2132 %val3 = load float, ptr %ptr3133 %val4 = load float, ptr %ptr4134 %val5 = load float, ptr %ptr5135 %val6 = load float, ptr %ptr6136 %val7 = load float, ptr %ptr7137 %val8 = load float, ptr %ptr8138 %val9 = load float, ptr %ptr9139 %val10 = load float, ptr %ptr10140 141 %ret = call float @foo() #0142 143 %div0 = call float @llvm.experimental.constrained.fdiv.f32(144 float %ret, float %val0,145 metadata !"round.dynamic",146 metadata !"fpexcept.strict") #0147 %div1 = call float @llvm.experimental.constrained.fdiv.f32(148 float %div0, float %val1,149 metadata !"round.dynamic",150 metadata !"fpexcept.strict") #0151 %div2 = call float @llvm.experimental.constrained.fdiv.f32(152 float %div1, float %val2,153 metadata !"round.dynamic",154 metadata !"fpexcept.strict") #0155 %div3 = call float @llvm.experimental.constrained.fdiv.f32(156 float %div2, float %val3,157 metadata !"round.dynamic",158 metadata !"fpexcept.strict") #0159 %div4 = call float @llvm.experimental.constrained.fdiv.f32(160 float %div3, float %val4,161 metadata !"round.dynamic",162 metadata !"fpexcept.strict") #0163 %div5 = call float @llvm.experimental.constrained.fdiv.f32(164 float %div4, float %val5,165 metadata !"round.dynamic",166 metadata !"fpexcept.strict") #0167 %div6 = call float @llvm.experimental.constrained.fdiv.f32(168 float %div5, float %val6,169 metadata !"round.dynamic",170 metadata !"fpexcept.strict") #0171 %div7 = call float @llvm.experimental.constrained.fdiv.f32(172 float %div6, float %val7,173 metadata !"round.dynamic",174 metadata !"fpexcept.strict") #0175 %div8 = call float @llvm.experimental.constrained.fdiv.f32(176 float %div7, float %val8,177 metadata !"round.dynamic",178 metadata !"fpexcept.strict") #0179 %div9 = call float @llvm.experimental.constrained.fdiv.f32(180 float %div8, float %val9,181 metadata !"round.dynamic",182 metadata !"fpexcept.strict") #0183 %div10 = call float @llvm.experimental.constrained.fdiv.f32(184 float %div9, float %val10,185 metadata !"round.dynamic",186 metadata !"fpexcept.strict") #0187 188 ret float %div10189}190 191attributes #0 = { strictfp }192