brintos

brintos / llvm-project-archived public Read only

0
0
Text · 5.7 KiB · 2f7d383 Raw
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