182 lines · plain
1; Test 32-bit square root.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 half @llvm.sqrt.f16(half)8declare float @llvm.sqrt.f32(float)9declare float @sqrtf(float)10 11; Check register square root.12define half @f0(half %val) {13; CHECK-LABEL: f0:14; CHECK: brasl %r14, __extendhfsf2@PLT15; CHECK: sqebr %f0, %f016; CHECK: brasl %r14, __truncsfhf2@PLT17; CHECK: br %r1418 %res = call half @llvm.sqrt.f16(half %val)19 ret half %res20}21 22; Check register square root.23define float @f1(float %val) {24; CHECK-LABEL: f1:25; CHECK: sqebr %f0, %f026; CHECK: br %r1427 %res = call float @llvm.sqrt.f32(float %val)28 ret float %res29}30 31; Check the low end of the SQEB range.32define float @f2(ptr %ptr) {33; CHECK-LABEL: f2:34; CHECK: sqeb %f0, 0(%r2)35; CHECK: br %r1436 %val = load float, ptr %ptr37 %res = call float @llvm.sqrt.f32(float %val)38 ret float %res39}40 41; Check the high end of the aligned SQEB range.42define float @f3(ptr %base) {43; CHECK-LABEL: f3:44; CHECK: sqeb %f0, 4092(%r2)45; CHECK: br %r1446 %ptr = getelementptr float, ptr %base, i64 102347 %val = load float, ptr %ptr48 %res = call float @llvm.sqrt.f32(float %val)49 ret float %res50}51 52; Check the next word up, which needs separate address logic.53; Other sequences besides this one would be OK.54define float @f4(ptr %base) {55; CHECK-LABEL: f4:56; CHECK: aghi %r2, 409657; CHECK: sqeb %f0, 0(%r2)58; CHECK: br %r1459 %ptr = getelementptr float, ptr %base, i64 102460 %val = load float, ptr %ptr61 %res = call float @llvm.sqrt.f32(float %val)62 ret float %res63}64 65; Check negative displacements, which also need separate address logic.66define float @f5(ptr %base) {67; CHECK-LABEL: f5:68; CHECK: aghi %r2, -469; CHECK: sqeb %f0, 0(%r2)70; CHECK: br %r1471 %ptr = getelementptr float, ptr %base, i64 -172 %val = load float, ptr %ptr73 %res = call float @llvm.sqrt.f32(float %val)74 ret float %res75}76 77; Check that SQEB allows indices.78define float @f6(ptr %base, i64 %index) {79; CHECK-LABEL: f6:80; CHECK: sllg %r1, %r3, 281; CHECK: sqeb %f0, 400(%r1,%r2)82; CHECK: br %r1483 %ptr1 = getelementptr float, ptr %base, i64 %index84 %ptr2 = getelementptr float, ptr %ptr1, i64 10085 %val = load float, ptr %ptr286 %res = call float @llvm.sqrt.f32(float %val)87 ret float %res88}89 90; Test a case where we spill the source of at least one SQEBR. We want91; to use SQEB if possible.92define void @f7(ptr %ptr) {93; CHECK-LABEL: f7:94; CHECK-SCALAR: sqeb {{%f[0-9]+}}, 16{{[04]}}(%r15)95; CHECK: br %r1496 %val0 = load volatile float, ptr %ptr97 %val1 = load volatile float, ptr %ptr98 %val2 = load volatile float, ptr %ptr99 %val3 = load volatile float, ptr %ptr100 %val4 = load volatile float, ptr %ptr101 %val5 = load volatile float, ptr %ptr102 %val6 = load volatile float, ptr %ptr103 %val7 = load volatile float, ptr %ptr104 %val8 = load volatile float, ptr %ptr105 %val9 = load volatile float, ptr %ptr106 %val10 = load volatile float, ptr %ptr107 %val11 = load volatile float, ptr %ptr108 %val12 = load volatile float, ptr %ptr109 %val13 = load volatile float, ptr %ptr110 %val14 = load volatile float, ptr %ptr111 %val15 = load volatile float, ptr %ptr112 %val16 = load volatile float, ptr %ptr113 114 %sqrt0 = call float @llvm.sqrt.f32(float %val0)115 %sqrt1 = call float @llvm.sqrt.f32(float %val1)116 %sqrt2 = call float @llvm.sqrt.f32(float %val2)117 %sqrt3 = call float @llvm.sqrt.f32(float %val3)118 %sqrt4 = call float @llvm.sqrt.f32(float %val4)119 %sqrt5 = call float @llvm.sqrt.f32(float %val5)120 %sqrt6 = call float @llvm.sqrt.f32(float %val6)121 %sqrt7 = call float @llvm.sqrt.f32(float %val7)122 %sqrt8 = call float @llvm.sqrt.f32(float %val8)123 %sqrt9 = call float @llvm.sqrt.f32(float %val9)124 %sqrt10 = call float @llvm.sqrt.f32(float %val10)125 %sqrt11 = call float @llvm.sqrt.f32(float %val11)126 %sqrt12 = call float @llvm.sqrt.f32(float %val12)127 %sqrt13 = call float @llvm.sqrt.f32(float %val13)128 %sqrt14 = call float @llvm.sqrt.f32(float %val14)129 %sqrt15 = call float @llvm.sqrt.f32(float %val15)130 %sqrt16 = call float @llvm.sqrt.f32(float %val16)131 132 store volatile float %val0, ptr %ptr133 store volatile float %val1, ptr %ptr134 store volatile float %val2, ptr %ptr135 store volatile float %val3, ptr %ptr136 store volatile float %val4, ptr %ptr137 store volatile float %val5, ptr %ptr138 store volatile float %val6, ptr %ptr139 store volatile float %val7, ptr %ptr140 store volatile float %val8, ptr %ptr141 store volatile float %val9, ptr %ptr142 store volatile float %val10, ptr %ptr143 store volatile float %val11, ptr %ptr144 store volatile float %val12, ptr %ptr145 store volatile float %val13, ptr %ptr146 store volatile float %val14, ptr %ptr147 store volatile float %val15, ptr %ptr148 store volatile float %val16, ptr %ptr149 150 store volatile float %sqrt0, ptr %ptr151 store volatile float %sqrt1, ptr %ptr152 store volatile float %sqrt2, ptr %ptr153 store volatile float %sqrt3, ptr %ptr154 store volatile float %sqrt4, ptr %ptr155 store volatile float %sqrt5, ptr %ptr156 store volatile float %sqrt6, ptr %ptr157 store volatile float %sqrt7, ptr %ptr158 store volatile float %sqrt8, ptr %ptr159 store volatile float %sqrt9, ptr %ptr160 store volatile float %sqrt10, ptr %ptr161 store volatile float %sqrt11, ptr %ptr162 store volatile float %sqrt12, ptr %ptr163 store volatile float %sqrt13, ptr %ptr164 store volatile float %sqrt14, ptr %ptr165 store volatile float %sqrt15, ptr %ptr166 store volatile float %sqrt16, ptr %ptr167 168 ret void169}170 171; Check that a call to the normal sqrtf function is lowered.172define float @f8(float %dummy, float %val) {173; CHECK-LABEL: f8:174; CHECK: sqebr %f0, %f2175; CHECK: cebr %f0, %f0176; CHECK: bnor %r14177; CHECK: {{ler|ldr}} %f0, %f2178; CHECK: jg sqrtf@PLT179 %res = tail call float @sqrtf(float %val)180 ret float %res181}182