[InstCombine] Signed saturation patterns
[llvm-complete.git] / test / CodeGen / SystemZ / fp-strict-sqrt-02.ll
blob791c39301e4818d3733a127ddea86376f86adcfe
1 ; Test strict 64-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=z13 | FileCheck %s
7 declare double @llvm.experimental.constrained.sqrt.f64(double, metadata, metadata)
9 ; Check register square root.
10 define double @f1(double %val) #0 {
11 ; CHECK-LABEL: f1:
12 ; CHECK: sqdbr %f0, %f0
13 ; CHECK: br %r14
14   %res = call double @llvm.experimental.constrained.sqrt.f64(
15                         double %val,
16                         metadata !"round.dynamic",
17                         metadata !"fpexcept.strict") #0
18   ret double %res
21 ; Check the low end of the SQDB range.
22 define double @f2(double *%ptr) #0 {
23 ; CHECK-LABEL: f2:
24 ; CHECK: sqdb %f0, 0(%r2)
25 ; CHECK: br %r14
26   %val = load double, double *%ptr
27   %res = call double @llvm.experimental.constrained.sqrt.f64(
28                         double %val,
29                         metadata !"round.dynamic",
30                         metadata !"fpexcept.strict") #0
31   ret double %res
34 ; Check the high end of the aligned SQDB range.
35 define double @f3(double *%base) #0 {
36 ; CHECK-LABEL: f3:
37 ; CHECK: sqdb %f0, 4088(%r2)
38 ; CHECK: br %r14
39   %ptr = getelementptr double, double *%base, i64 511
40   %val = load double, double *%ptr
41   %res = call double @llvm.experimental.constrained.sqrt.f64(
42                         double %val,
43                         metadata !"round.dynamic",
44                         metadata !"fpexcept.strict") #0
45   ret double %res
48 ; Check the next doubleword up, which needs separate address logic.
49 ; Other sequences besides this one would be OK.
50 define double @f4(double *%base) #0 {
51 ; CHECK-LABEL: f4:
52 ; CHECK: aghi %r2, 4096
53 ; CHECK: sqdb %f0, 0(%r2)
54 ; CHECK: br %r14
55   %ptr = getelementptr double, double *%base, i64 512
56   %val = load double, double *%ptr
57   %res = call double @llvm.experimental.constrained.sqrt.f64(
58                         double %val,
59                         metadata !"round.dynamic",
60                         metadata !"fpexcept.strict") #0
61   ret double %res
64 ; Check negative displacements, which also need separate address logic.
65 define double @f5(double *%base) #0 {
66 ; CHECK-LABEL: f5:
67 ; CHECK: aghi %r2, -8
68 ; CHECK: sqdb %f0, 0(%r2)
69 ; CHECK: br %r14
70   %ptr = getelementptr double, double *%base, i64 -1
71   %val = load double, double *%ptr
72   %res = call double @llvm.experimental.constrained.sqrt.f64(
73                         double %val,
74                         metadata !"round.dynamic",
75                         metadata !"fpexcept.strict") #0
76   ret double %res
79 ; Check that SQDB allows indices.
80 define double @f6(double *%base, i64 %index) #0 {
81 ; CHECK-LABEL: f6:
82 ; CHECK: sllg %r1, %r3, 3
83 ; CHECK: sqdb %f0, 800(%r1,%r2)
84 ; CHECK: br %r14
85   %ptr1 = getelementptr double, double *%base, i64 %index
86   %ptr2 = getelementptr double, double *%ptr1, i64 100
87   %val = load double, double *%ptr2
88   %res = call double @llvm.experimental.constrained.sqrt.f64(
89                         double %val,
90                         metadata !"round.dynamic",
91                         metadata !"fpexcept.strict") #0
92   ret double %res
95 attributes #0 = { strictfp }