120 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=s390x-linux-gnu -mcpu=z10 | FileCheck %s3; RUN: llc < %s -mtriple=s390x-linux-gnu -mcpu=z14 | FileCheck %s4 5;6; Test strict 32-bit square root.7;8 9declare half @llvm.experimental.constrained.sqrt.f16(half, metadata, metadata)10declare float @llvm.experimental.constrained.sqrt.f32(float, metadata, metadata)11 12; Check register square root.13define half @f0(half %val) #0 {14; CHECK-LABEL: f0:15; CHECK: # %bb.0:16; CHECK: brasl %r14, __extendhfsf2@PLT17; CHECK-NEXT: sqebr %f0, %f018; CHECK-NEXT: brasl %r14, __truncsfhf2@PLT19; CHECK: br %r1420 %res = call half @llvm.experimental.constrained.sqrt.f16(21 half %val,22 metadata !"round.dynamic",23 metadata !"fpexcept.strict") #024 ret half %res25}26 27; Check register square root.28define float @f1(float %val) #0 {29; CHECK-LABEL: f1:30; CHECK: # %bb.0:31; CHECK-NEXT: sqebr %f0, %f032; CHECK-NEXT: br %r1433 %res = call float @llvm.experimental.constrained.sqrt.f32(34 float %val,35 metadata !"round.dynamic",36 metadata !"fpexcept.strict") #037 ret float %res38}39 40; Check the low end of the SQEB range.41define float @f2(ptr %ptr) #0 {42; CHECK-LABEL: f2:43; CHECK: # %bb.0:44; CHECK-NEXT: sqeb %f0, 0(%r2)45; CHECK-NEXT: br %r1446 %val = load float, ptr %ptr47 %res = call float @llvm.experimental.constrained.sqrt.f32(48 float %val,49 metadata !"round.dynamic",50 metadata !"fpexcept.strict") #051 ret float %res52}53 54; Check the high end of the aligned SQEB range.55define float @f3(ptr %base) #0 {56; CHECK-LABEL: f3:57; CHECK: # %bb.0:58; CHECK-NEXT: sqeb %f0, 4092(%r2)59; CHECK-NEXT: br %r1460 %ptr = getelementptr float, ptr %base, i64 102361 %val = load float, ptr %ptr62 %res = call float @llvm.experimental.constrained.sqrt.f32(63 float %val,64 metadata !"round.dynamic",65 metadata !"fpexcept.strict") #066 ret float %res67}68 69; Check the next word up, which needs separate address logic.70; Other sequences besides this one would be OK.71define float @f4(ptr %base) #0 {72; CHECK-LABEL: f4:73; CHECK: # %bb.0:74; CHECK-NEXT: aghi %r2, 409675; CHECK-NEXT: sqeb %f0, 0(%r2)76; CHECK-NEXT: br %r1477 %ptr = getelementptr float, ptr %base, i64 102478 %val = load float, ptr %ptr79 %res = call float @llvm.experimental.constrained.sqrt.f32(80 float %val,81 metadata !"round.dynamic",82 metadata !"fpexcept.strict") #083 ret float %res84}85 86; Check negative displacements, which also need separate address logic.87define float @f5(ptr %base) #0 {88; CHECK-LABEL: f5:89; CHECK: # %bb.0:90; CHECK-NEXT: aghi %r2, -491; CHECK-NEXT: sqeb %f0, 0(%r2)92; CHECK-NEXT: br %r1493 %ptr = getelementptr float, ptr %base, i64 -194 %val = load float, ptr %ptr95 %res = call float @llvm.experimental.constrained.sqrt.f32(96 float %val,97 metadata !"round.dynamic",98 metadata !"fpexcept.strict") #099 ret float %res100}101 102; Check that SQEB allows indices.103define float @f6(ptr %base, i64 %index) #0 {104; CHECK-LABEL: f6:105; CHECK: # %bb.0:106; CHECK-NEXT: sllg %r1, %r3, 2107; CHECK-NEXT: sqeb %f0, 400(%r1,%r2)108; CHECK-NEXT: br %r14109 %ptr1 = getelementptr float, ptr %base, i64 %index110 %ptr2 = getelementptr float, ptr %ptr1, i64 100111 %val = load float, ptr %ptr2112 %res = call float @llvm.experimental.constrained.sqrt.f32(113 float %val,114 metadata !"round.dynamic",115 metadata !"fpexcept.strict") #0116 ret float %res117}118 119attributes #0 = { strictfp }120