brintos

brintos / llvm-project-archived public Read only

0
0
Text · 7.1 KiB · 8b9dbbe Raw
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