[lldb] Make sure Blocks always have a parent (#117683)
[llvm-project.git] / llvm / test / CodeGen / SystemZ / fp-strict-sqrt-02.ll
blob25ba0b85a58e0e8350aabe9980aea71a1d421751
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc < %s -mtriple=s390x-linux-gnu -mcpu=z10 | FileCheck %s
3 ; RUN: llc < %s -mtriple=s390x-linux-gnu -mcpu=z13 | FileCheck %s
6 ; Test strict 64-bit square root.
9 declare double @llvm.experimental.constrained.sqrt.f64(double, metadata, metadata)
11 ; Check register square root.
12 define double @f1(double %val) #0 {
13 ; CHECK-LABEL: f1:
14 ; CHECK:       # %bb.0:
15 ; CHECK-NEXT:    sqdbr %f0, %f0
16 ; CHECK-NEXT:    br %r14
17   %res = call double @llvm.experimental.constrained.sqrt.f64(
18                         double %val,
19                         metadata !"round.dynamic",
20                         metadata !"fpexcept.strict") #0
21   ret double %res
24 ; Check the low end of the SQDB range.
25 define double @f2(ptr %ptr) #0 {
26 ; CHECK-LABEL: f2:
27 ; CHECK:       # %bb.0:
28 ; CHECK-NEXT:    sqdb %f0, 0(%r2)
29 ; CHECK-NEXT:    br %r14
30   %val = load double, ptr %ptr
31   %res = call double @llvm.experimental.constrained.sqrt.f64(
32                         double %val,
33                         metadata !"round.dynamic",
34                         metadata !"fpexcept.strict") #0
35   ret double %res
38 ; Check the high end of the aligned SQDB range.
39 define double @f3(ptr %base) #0 {
40 ; CHECK-LABEL: f3:
41 ; CHECK:       # %bb.0:
42 ; CHECK-NEXT:    sqdb %f0, 4088(%r2)
43 ; CHECK-NEXT:    br %r14
44   %ptr = getelementptr double, ptr %base, i64 511
45   %val = load double, ptr %ptr
46   %res = call double @llvm.experimental.constrained.sqrt.f64(
47                         double %val,
48                         metadata !"round.dynamic",
49                         metadata !"fpexcept.strict") #0
50   ret double %res
53 ; Check the next doubleword up, which needs separate address logic.
54 ; Other sequences besides this one would be OK.
55 define double @f4(ptr %base) #0 {
56 ; CHECK-LABEL: f4:
57 ; CHECK:       # %bb.0:
58 ; CHECK-NEXT:    aghi %r2, 4096
59 ; CHECK-NEXT:    sqdb %f0, 0(%r2)
60 ; CHECK-NEXT:    br %r14
61   %ptr = getelementptr double, ptr %base, i64 512
62   %val = load double, ptr %ptr
63   %res = call double @llvm.experimental.constrained.sqrt.f64(
64                         double %val,
65                         metadata !"round.dynamic",
66                         metadata !"fpexcept.strict") #0
67   ret double %res
70 ; Check negative displacements, which also need separate address logic.
71 define double @f5(ptr %base) #0 {
72 ; CHECK-LABEL: f5:
73 ; CHECK:       # %bb.0:
74 ; CHECK-NEXT:    aghi %r2, -8
75 ; CHECK-NEXT:    sqdb %f0, 0(%r2)
76 ; CHECK-NEXT:    br %r14
77   %ptr = getelementptr double, ptr %base, i64 -1
78   %val = load double, ptr %ptr
79   %res = call double @llvm.experimental.constrained.sqrt.f64(
80                         double %val,
81                         metadata !"round.dynamic",
82                         metadata !"fpexcept.strict") #0
83   ret double %res
86 ; Check that SQDB allows indices.
87 define double @f6(ptr %base, i64 %index) #0 {
88 ; CHECK-LABEL: f6:
89 ; CHECK:       # %bb.0:
90 ; CHECK-NEXT:    sllg %r1, %r3, 3
91 ; CHECK-NEXT:    sqdb %f0, 800(%r1,%r2)
92 ; CHECK-NEXT:    br %r14
93   %ptr1 = getelementptr double, ptr %base, i64 %index
94   %ptr2 = getelementptr double, ptr %ptr1, i64 100
95   %val = load double, ptr %ptr2
96   %res = call double @llvm.experimental.constrained.sqrt.f64(
97                         double %val,
98                         metadata !"round.dynamic",
99                         metadata !"fpexcept.strict") #0
100   ret double %res
103 attributes #0 = { strictfp }