[InstCombine] Signed saturation patterns
[llvm-complete.git] / test / CodeGen / SystemZ / fp-strict-sqrt-01.ll
blobcff83950617c38ad3ecfc48dcf54253be3e3bd17
1 ; Test strict 32-bit square root.
3 ; RUN: llc < %s -mtriple=s390x-linux-gnu -mcpu=z10 \
4 ; RUN:   | FileCheck -check-prefix=CHECK -check-prefix=CHECK-SCALAR %s
5 ; RUN: llc < %s -mtriple=s390x-linux-gnu -mcpu=z14 | FileCheck %s
7 declare float @llvm.experimental.constrained.sqrt.f32(float, metadata, metadata)
9 ; Check register square root.
10 define float @f1(float %val) #0 {
11 ; CHECK-LABEL: f1:
12 ; CHECK: sqebr %f0, %f0
13 ; CHECK: br %r14
14   %res = call float @llvm.experimental.constrained.sqrt.f32(
15                         float %val,
16                         metadata !"round.dynamic",
17                         metadata !"fpexcept.strict") #0
18   ret float %res
21 ; Check the low end of the SQEB range.
22 define float @f2(float *%ptr) #0 {
23 ; CHECK-LABEL: f2:
24 ; CHECK: sqeb %f0, 0(%r2)
25 ; CHECK: br %r14
26   %val = load float, float *%ptr
27   %res = call float @llvm.experimental.constrained.sqrt.f32(
28                         float %val,
29                         metadata !"round.dynamic",
30                         metadata !"fpexcept.strict") #0
31   ret float %res
34 ; Check the high end of the aligned SQEB range.
35 define float @f3(float *%base) #0 {
36 ; CHECK-LABEL: f3:
37 ; CHECK: sqeb %f0, 4092(%r2)
38 ; CHECK: br %r14
39   %ptr = getelementptr float, float *%base, i64 1023
40   %val = load float, float *%ptr
41   %res = call float @llvm.experimental.constrained.sqrt.f32(
42                         float %val,
43                         metadata !"round.dynamic",
44                         metadata !"fpexcept.strict") #0
45   ret float %res
48 ; Check the next word up, which needs separate address logic.
49 ; Other sequences besides this one would be OK.
50 define float @f4(float *%base) #0 {
51 ; CHECK-LABEL: f4:
52 ; CHECK: aghi %r2, 4096
53 ; CHECK: sqeb %f0, 0(%r2)
54 ; CHECK: br %r14
55   %ptr = getelementptr float, float *%base, i64 1024
56   %val = load float, float *%ptr
57   %res = call float @llvm.experimental.constrained.sqrt.f32(
58                         float %val,
59                         metadata !"round.dynamic",
60                         metadata !"fpexcept.strict") #0
61   ret float %res
64 ; Check negative displacements, which also need separate address logic.
65 define float @f5(float *%base) #0 {
66 ; CHECK-LABEL: f5:
67 ; CHECK: aghi %r2, -4
68 ; CHECK: sqeb %f0, 0(%r2)
69 ; CHECK: br %r14
70   %ptr = getelementptr float, float *%base, i64 -1
71   %val = load float, float *%ptr
72   %res = call float @llvm.experimental.constrained.sqrt.f32(
73                         float %val,
74                         metadata !"round.dynamic",
75                         metadata !"fpexcept.strict") #0
76   ret float %res
79 ; Check that SQEB allows indices.
80 define float @f6(float *%base, i64 %index) #0 {
81 ; CHECK-LABEL: f6:
82 ; CHECK: sllg %r1, %r3, 2
83 ; CHECK: sqeb %f0, 400(%r1,%r2)
84 ; CHECK: br %r14
85   %ptr1 = getelementptr float, float *%base, i64 %index
86   %ptr2 = getelementptr float, float *%ptr1, i64 100
87   %val = load float, float *%ptr2
88   %res = call float @llvm.experimental.constrained.sqrt.f32(
89                         float %val,
90                         metadata !"round.dynamic",
91                         metadata !"fpexcept.strict") #0
92   ret float %res
95 attributes #0 = { strictfp }