[Stack realignment] Handling of aligned allocas.
[oota-llvm.git] / test / CodeGen / SystemZ / fp-round-02.ll
1 ; Test rounding functions for z196 and above.
2 ;
3 ; RUN: llc < %s -mtriple=s390x-linux-gnu -mcpu=z196 \
4 ; RUN:   | FileCheck -check-prefix=CHECK -check-prefix=CHECK-SCALAR %s
5 ; RUN: llc < %s -mtriple=s390x-linux-gnu -mcpu=z13 \
6 ; RUN:   | FileCheck -check-prefix=CHECK -check-prefix=CHECK-VECTOR %s
7
8 ; Test rint for f32.
9 declare float @llvm.rint.f32(float %f)
10 define float @f1(float %f) {
11 ; CHECK-LABEL: f1:
12 ; CHECK: fiebr %f0, 0, %f0
13 ; CHECK: br %r14
14   %res = call float @llvm.rint.f32(float %f)
15   ret float %res
16 }
17
18 ; Test rint for f64.
19 declare double @llvm.rint.f64(double %f)
20 define double @f2(double %f) {
21 ; CHECK-LABEL: f2:
22 ; CHECK-SCALAR: fidbr %f0, 0, %f0
23 ; CHECK-VECTOR: fidbra %f0, 0, %f0, 0
24 ; CHECK: br %r14
25   %res = call double @llvm.rint.f64(double %f)
26   ret double %res
27 }
28
29 ; Test rint for f128.
30 declare fp128 @llvm.rint.f128(fp128 %f)
31 define void @f3(fp128 *%ptr) {
32 ; CHECK-LABEL: f3:
33 ; CHECK: fixbr %f0, 0, %f0
34 ; CHECK: br %r14
35   %src = load fp128 , fp128 *%ptr
36   %res = call fp128 @llvm.rint.f128(fp128 %src)
37   store fp128 %res, fp128 *%ptr
38   ret void
39 }
40
41 ; Test nearbyint for f32.
42 declare float @llvm.nearbyint.f32(float %f)
43 define float @f4(float %f) {
44 ; CHECK-LABEL: f4:
45 ; CHECK: fiebra %f0, 0, %f0, 4
46 ; CHECK: br %r14
47   %res = call float @llvm.nearbyint.f32(float %f)
48   ret float %res
49 }
50
51 ; Test nearbyint for f64.
52 declare double @llvm.nearbyint.f64(double %f)
53 define double @f5(double %f) {
54 ; CHECK-LABEL: f5:
55 ; CHECK: fidbra %f0, 0, %f0, 4
56 ; CHECK: br %r14
57   %res = call double @llvm.nearbyint.f64(double %f)
58   ret double %res
59 }
60
61 ; Test nearbyint for f128.
62 declare fp128 @llvm.nearbyint.f128(fp128 %f)
63 define void @f6(fp128 *%ptr) {
64 ; CHECK-LABEL: f6:
65 ; CHECK: fixbra %f0, 0, %f0, 4
66 ; CHECK: br %r14
67   %src = load fp128 , fp128 *%ptr
68   %res = call fp128 @llvm.nearbyint.f128(fp128 %src)
69   store fp128 %res, fp128 *%ptr
70   ret void
71 }
72
73 ; Test floor for f32.
74 declare float @llvm.floor.f32(float %f)
75 define float @f7(float %f) {
76 ; CHECK-LABEL: f7:
77 ; CHECK: fiebra %f0, 7, %f0, 4
78 ; CHECK: br %r14
79   %res = call float @llvm.floor.f32(float %f)
80   ret float %res
81 }
82
83 ; Test floor for f64.
84 declare double @llvm.floor.f64(double %f)
85 define double @f8(double %f) {
86 ; CHECK-LABEL: f8:
87 ; CHECK: fidbra %f0, 7, %f0, 4
88 ; CHECK: br %r14
89   %res = call double @llvm.floor.f64(double %f)
90   ret double %res
91 }
92
93 ; Test floor for f128.
94 declare fp128 @llvm.floor.f128(fp128 %f)
95 define void @f9(fp128 *%ptr) {
96 ; CHECK-LABEL: f9:
97 ; CHECK: fixbra %f0, 7, %f0, 4
98 ; CHECK: br %r14
99   %src = load fp128 , fp128 *%ptr
100   %res = call fp128 @llvm.floor.f128(fp128 %src)
101   store fp128 %res, fp128 *%ptr
102   ret void
103 }
104
105 ; Test ceil for f32.
106 declare float @llvm.ceil.f32(float %f)
107 define float @f10(float %f) {
108 ; CHECK-LABEL: f10:
109 ; CHECK: fiebra %f0, 6, %f0, 4
110 ; CHECK: br %r14
111   %res = call float @llvm.ceil.f32(float %f)
112   ret float %res
113 }
114
115 ; Test ceil for f64.
116 declare double @llvm.ceil.f64(double %f)
117 define double @f11(double %f) {
118 ; CHECK-LABEL: f11:
119 ; CHECK: fidbra %f0, 6, %f0, 4
120 ; CHECK: br %r14
121   %res = call double @llvm.ceil.f64(double %f)
122   ret double %res
123 }
124
125 ; Test ceil for f128.
126 declare fp128 @llvm.ceil.f128(fp128 %f)
127 define void @f12(fp128 *%ptr) {
128 ; CHECK-LABEL: f12:
129 ; CHECK: fixbra %f0, 6, %f0, 4
130 ; CHECK: br %r14
131   %src = load fp128 , fp128 *%ptr
132   %res = call fp128 @llvm.ceil.f128(fp128 %src)
133   store fp128 %res, fp128 *%ptr
134   ret void
135 }
136
137 ; Test trunc for f32.
138 declare float @llvm.trunc.f32(float %f)
139 define float @f13(float %f) {
140 ; CHECK-LABEL: f13:
141 ; CHECK: fiebra %f0, 5, %f0, 4
142 ; CHECK: br %r14
143   %res = call float @llvm.trunc.f32(float %f)
144   ret float %res
145 }
146
147 ; Test trunc for f64.
148 declare double @llvm.trunc.f64(double %f)
149 define double @f14(double %f) {
150 ; CHECK-LABEL: f14:
151 ; CHECK: fidbra %f0, 5, %f0, 4
152 ; CHECK: br %r14
153   %res = call double @llvm.trunc.f64(double %f)
154   ret double %res
155 }
156
157 ; Test trunc for f128.
158 declare fp128 @llvm.trunc.f128(fp128 %f)
159 define void @f15(fp128 *%ptr) {
160 ; CHECK-LABEL: f15:
161 ; CHECK: fixbra %f0, 5, %f0, 4
162 ; CHECK: br %r14
163   %src = load fp128 , fp128 *%ptr
164   %res = call fp128 @llvm.trunc.f128(fp128 %src)
165   store fp128 %res, fp128 *%ptr
166   ret void
167 }
168
169 ; Test round for f32.
170 declare float @llvm.round.f32(float %f)
171 define float @f16(float %f) {
172 ; CHECK-LABEL: f16:
173 ; CHECK: fiebra %f0, 1, %f0, 4
174 ; CHECK: br %r14
175   %res = call float @llvm.round.f32(float %f)
176   ret float %res
177 }
178
179 ; Test round for f64.
180 declare double @llvm.round.f64(double %f)
181 define double @f17(double %f) {
182 ; CHECK-LABEL: f17:
183 ; CHECK: fidbra %f0, 1, %f0, 4
184 ; CHECK: br %r14
185   %res = call double @llvm.round.f64(double %f)
186   ret double %res
187 }
188
189 ; Test round for f128.
190 declare fp128 @llvm.round.f128(fp128 %f)
191 define void @f18(fp128 *%ptr) {
192 ; CHECK-LABEL: f18:
193 ; CHECK: fixbra %f0, 1, %f0, 4
194 ; CHECK: br %r14
195   %src = load fp128 , fp128 *%ptr
196   %res = call fp128 @llvm.round.f128(fp128 %src)
197   store fp128 %res, fp128 *%ptr
198   ret void
199 }