diff options
Diffstat (limited to 'test/CodeGen/SystemZ/fp-sqrt-01.ll')
| -rw-r--r-- | test/CodeGen/SystemZ/fp-sqrt-01.ll | 110 |
1 files changed, 103 insertions, 7 deletions
diff --git a/test/CodeGen/SystemZ/fp-sqrt-01.ll b/test/CodeGen/SystemZ/fp-sqrt-01.ll index 7ed27f56d0d0..7465af456b83 100644 --- a/test/CodeGen/SystemZ/fp-sqrt-01.ll +++ b/test/CodeGen/SystemZ/fp-sqrt-01.ll @@ -2,11 +2,12 @@ ; ; RUN: llc < %s -mtriple=s390x-linux-gnu | FileCheck %s -declare float @llvm.sqrt.f32(float %f) +declare float @llvm.sqrt.f32(float) +declare float @sqrtf(float) ; Check register square root. define float @f1(float %val) { -; CHECK: f1: +; CHECK-LABEL: f1: ; CHECK: sqebr %f0, %f0 ; CHECK: br %r14 %res = call float @llvm.sqrt.f32(float %val) @@ -15,7 +16,7 @@ define float @f1(float %val) { ; Check the low end of the SQEB range. define float @f2(float *%ptr) { -; CHECK: f2: +; CHECK-LABEL: f2: ; CHECK: sqeb %f0, 0(%r2) ; CHECK: br %r14 %val = load float *%ptr @@ -25,7 +26,7 @@ define float @f2(float *%ptr) { ; Check the high end of the aligned SQEB range. define float @f3(float *%base) { -; CHECK: f3: +; CHECK-LABEL: f3: ; CHECK: sqeb %f0, 4092(%r2) ; CHECK: br %r14 %ptr = getelementptr float *%base, i64 1023 @@ -37,7 +38,7 @@ define float @f3(float *%base) { ; Check the next word up, which needs separate address logic. ; Other sequences besides this one would be OK. define float @f4(float *%base) { -; CHECK: f4: +; CHECK-LABEL: f4: ; CHECK: aghi %r2, 4096 ; CHECK: sqeb %f0, 0(%r2) ; CHECK: br %r14 @@ -49,7 +50,7 @@ define float @f4(float *%base) { ; Check negative displacements, which also need separate address logic. define float @f5(float *%base) { -; CHECK: f5: +; CHECK-LABEL: f5: ; CHECK: aghi %r2, -4 ; CHECK: sqeb %f0, 0(%r2) ; CHECK: br %r14 @@ -61,7 +62,7 @@ define float @f5(float *%base) { ; Check that SQEB allows indices. define float @f6(float *%base, i64 %index) { -; CHECK: f6: +; CHECK-LABEL: f6: ; CHECK: sllg %r1, %r3, 2 ; CHECK: sqeb %f0, 400(%r1,%r2) ; CHECK: br %r14 @@ -71,3 +72,98 @@ define float @f6(float *%base, i64 %index) { %res = call float @llvm.sqrt.f32(float %val) ret float %res } + +; Test a case where we spill the source of at least one SQEBR. We want +; to use SQEB if possible. +define void @f7(float *%ptr) { +; CHECK-LABEL: f7: +; CHECK: sqeb {{%f[0-9]+}}, 16{{[04]}}(%r15) +; CHECK: br %r14 + %val0 = load volatile float *%ptr + %val1 = load volatile float *%ptr + %val2 = load volatile float *%ptr + %val3 = load volatile float *%ptr + %val4 = load volatile float *%ptr + %val5 = load volatile float *%ptr + %val6 = load volatile float *%ptr + %val7 = load volatile float *%ptr + %val8 = load volatile float *%ptr + %val9 = load volatile float *%ptr + %val10 = load volatile float *%ptr + %val11 = load volatile float *%ptr + %val12 = load volatile float *%ptr + %val13 = load volatile float *%ptr + %val14 = load volatile float *%ptr + %val15 = load volatile float *%ptr + %val16 = load volatile float *%ptr + + %sqrt0 = call float @llvm.sqrt.f32(float %val0) + %sqrt1 = call float @llvm.sqrt.f32(float %val1) + %sqrt2 = call float @llvm.sqrt.f32(float %val2) + %sqrt3 = call float @llvm.sqrt.f32(float %val3) + %sqrt4 = call float @llvm.sqrt.f32(float %val4) + %sqrt5 = call float @llvm.sqrt.f32(float %val5) + %sqrt6 = call float @llvm.sqrt.f32(float %val6) + %sqrt7 = call float @llvm.sqrt.f32(float %val7) + %sqrt8 = call float @llvm.sqrt.f32(float %val8) + %sqrt9 = call float @llvm.sqrt.f32(float %val9) + %sqrt10 = call float @llvm.sqrt.f32(float %val10) + %sqrt11 = call float @llvm.sqrt.f32(float %val11) + %sqrt12 = call float @llvm.sqrt.f32(float %val12) + %sqrt13 = call float @llvm.sqrt.f32(float %val13) + %sqrt14 = call float @llvm.sqrt.f32(float %val14) + %sqrt15 = call float @llvm.sqrt.f32(float %val15) + %sqrt16 = call float @llvm.sqrt.f32(float %val16) + + store volatile float %val0, float *%ptr + store volatile float %val1, float *%ptr + store volatile float %val2, float *%ptr + store volatile float %val3, float *%ptr + store volatile float %val4, float *%ptr + store volatile float %val5, float *%ptr + store volatile float %val6, float *%ptr + store volatile float %val7, float *%ptr + store volatile float %val8, float *%ptr + store volatile float %val9, float *%ptr + store volatile float %val10, float *%ptr + store volatile float %val11, float *%ptr + store volatile float %val12, float *%ptr + store volatile float %val13, float *%ptr + store volatile float %val14, float *%ptr + store volatile float %val15, float *%ptr + store volatile float %val16, float *%ptr + + store volatile float %sqrt0, float *%ptr + store volatile float %sqrt1, float *%ptr + store volatile float %sqrt2, float *%ptr + store volatile float %sqrt3, float *%ptr + store volatile float %sqrt4, float *%ptr + store volatile float %sqrt5, float *%ptr + store volatile float %sqrt6, float *%ptr + store volatile float %sqrt7, float *%ptr + store volatile float %sqrt8, float *%ptr + store volatile float %sqrt9, float *%ptr + store volatile float %sqrt10, float *%ptr + store volatile float %sqrt11, float *%ptr + store volatile float %sqrt12, float *%ptr + store volatile float %sqrt13, float *%ptr + store volatile float %sqrt14, float *%ptr + store volatile float %sqrt15, float *%ptr + store volatile float %sqrt16, float *%ptr + + ret void +} + +; Check that a call to the normal sqrtf function is lowered. +define float @f8(float %dummy, float %val) { +; CHECK-LABEL: f8: +; CHECK: sqebr %f0, %f2 +; CHECK: cebr %f0, %f0 +; CHECK: jo [[LABEL:\.L.*]] +; CHECK: br %r14 +; CHECK: [[LABEL]]: +; CHECK: ler %f0, %f2 +; CHECK: jg sqrtf@PLT + %res = tail call float @sqrtf(float %val) + ret float %res +} |
