blob: 828a8807dcfaabab89b023bda8cfa095bfb0d10e [file] [log] [blame]
Justin Lebarb5e88492016-09-09 21:07:26 +00001; RUN: llc < %s | FileCheck %s
2target triple = "nvptx64-nvidia-cuda"
3
4; Checks that llvm intrinsics for math functions are correctly lowered to PTX.
5
6declare float @llvm.ceil.f32(float) #0
7declare double @llvm.ceil.f64(double) #0
8declare float @llvm.floor.f32(float) #0
9declare double @llvm.floor.f64(double) #0
10declare float @llvm.round.f32(float) #0
11declare double @llvm.round.f64(double) #0
12declare float @llvm.nearbyint.f32(float) #0
13declare double @llvm.nearbyint.f64(double) #0
14declare float @llvm.rint.f32(float) #0
15declare double @llvm.rint.f64(double) #0
16declare float @llvm.trunc.f32(float) #0
17declare double @llvm.trunc.f64(double) #0
18declare float @llvm.fabs.f32(float) #0
19declare double @llvm.fabs.f64(double) #0
20declare float @llvm.minnum.f32(float, float) #0
21declare double @llvm.minnum.f64(double, double) #0
22declare float @llvm.maxnum.f32(float, float) #0
23declare double @llvm.maxnum.f64(double, double) #0
Justin Lebar3cf4e3e2017-01-15 16:55:37 +000024declare float @llvm.fma.f32(float, float, float) #0
25declare double @llvm.fma.f64(double, double, double) #0
Justin Lebarb5e88492016-09-09 21:07:26 +000026
27; ---- ceil ----
28
29; CHECK-LABEL: ceil_float
30define float @ceil_float(float %a) {
31 ; CHECK: cvt.rpi.f32.f32
32 %b = call float @llvm.ceil.f32(float %a)
33 ret float %b
34}
35
36; CHECK-LABEL: ceil_float_ftz
37define float @ceil_float_ftz(float %a) #1 {
38 ; CHECK: cvt.rpi.ftz.f32.f32
39 %b = call float @llvm.ceil.f32(float %a)
40 ret float %b
41}
42
43; CHECK-LABEL: ceil_double
44define double @ceil_double(double %a) {
45 ; CHECK: cvt.rpi.f64.f64
46 %b = call double @llvm.ceil.f64(double %a)
47 ret double %b
48}
49
50; ---- floor ----
51
52; CHECK-LABEL: floor_float
53define float @floor_float(float %a) {
54 ; CHECK: cvt.rmi.f32.f32
55 %b = call float @llvm.floor.f32(float %a)
56 ret float %b
57}
58
59; CHECK-LABEL: floor_float_ftz
60define float @floor_float_ftz(float %a) #1 {
61 ; CHECK: cvt.rmi.ftz.f32.f32
62 %b = call float @llvm.floor.f32(float %a)
63 ret float %b
64}
65
66; CHECK-LABEL: floor_double
67define double @floor_double(double %a) {
68 ; CHECK: cvt.rmi.f64.f64
69 %b = call double @llvm.floor.f64(double %a)
70 ret double %b
71}
72
73; ---- round ----
74
75; CHECK-LABEL: round_float
76define float @round_float(float %a) {
77 ; CHECK: cvt.rni.f32.f32
78 %b = call float @llvm.round.f32(float %a)
79 ret float %b
80}
81
82; CHECK-LABEL: round_float_ftz
83define float @round_float_ftz(float %a) #1 {
84 ; CHECK: cvt.rni.ftz.f32.f32
85 %b = call float @llvm.round.f32(float %a)
86 ret float %b
87}
88
89; CHECK-LABEL: round_double
90define double @round_double(double %a) {
91 ; CHECK: cvt.rni.f64.f64
92 %b = call double @llvm.round.f64(double %a)
93 ret double %b
94}
95
96; ---- nearbyint ----
97
98; CHECK-LABEL: nearbyint_float
99define float @nearbyint_float(float %a) {
100 ; CHECK: cvt.rni.f32.f32
101 %b = call float @llvm.nearbyint.f32(float %a)
102 ret float %b
103}
104
105; CHECK-LABEL: nearbyint_float_ftz
106define float @nearbyint_float_ftz(float %a) #1 {
107 ; CHECK: cvt.rni.ftz.f32.f32
108 %b = call float @llvm.nearbyint.f32(float %a)
109 ret float %b
110}
111
112; CHECK-LABEL: nearbyint_double
113define double @nearbyint_double(double %a) {
114 ; CHECK: cvt.rni.f64.f64
115 %b = call double @llvm.nearbyint.f64(double %a)
116 ret double %b
117}
118
119; ---- rint ----
120
121; CHECK-LABEL: rint_float
122define float @rint_float(float %a) {
123 ; CHECK: cvt.rni.f32.f32
124 %b = call float @llvm.rint.f32(float %a)
125 ret float %b
126}
127
128; CHECK-LABEL: rint_float_ftz
129define float @rint_float_ftz(float %a) #1 {
130 ; CHECK: cvt.rni.ftz.f32.f32
131 %b = call float @llvm.rint.f32(float %a)
132 ret float %b
133}
134
135; CHECK-LABEL: rint_double
136define double @rint_double(double %a) {
137 ; CHECK: cvt.rni.f64.f64
138 %b = call double @llvm.rint.f64(double %a)
139 ret double %b
140}
141
142; ---- trunc ----
143
144; CHECK-LABEL: trunc_float
145define float @trunc_float(float %a) {
146 ; CHECK: cvt.rzi.f32.f32
147 %b = call float @llvm.trunc.f32(float %a)
148 ret float %b
149}
150
151; CHECK-LABEL: trunc_float_ftz
152define float @trunc_float_ftz(float %a) #1 {
153 ; CHECK: cvt.rzi.ftz.f32.f32
154 %b = call float @llvm.trunc.f32(float %a)
155 ret float %b
156}
157
158; CHECK-LABEL: trunc_double
159define double @trunc_double(double %a) {
160 ; CHECK: cvt.rzi.f64.f64
161 %b = call double @llvm.trunc.f64(double %a)
162 ret double %b
163}
164
165; ---- abs ----
166
167; CHECK-LABEL: abs_float
168define float @abs_float(float %a) {
169 ; CHECK: abs.f32
170 %b = call float @llvm.fabs.f32(float %a)
171 ret float %b
172}
173
174; CHECK-LABEL: abs_float_ftz
175define float @abs_float_ftz(float %a) #1 {
176 ; CHECK: abs.ftz.f32
177 %b = call float @llvm.fabs.f32(float %a)
178 ret float %b
179}
180
181; CHECK-LABEL: abs_double
182define double @abs_double(double %a) {
183 ; CHECK: abs.f64
184 %b = call double @llvm.fabs.f64(double %a)
185 ret double %b
186}
187
188; ---- min ----
189
190; CHECK-LABEL: min_float
191define float @min_float(float %a, float %b) {
192 ; CHECK: min.f32
193 %x = call float @llvm.minnum.f32(float %a, float %b)
194 ret float %x
195}
196
197; CHECK-LABEL: min_imm1
198define float @min_imm1(float %a) {
199 ; CHECK: min.f32
200 %x = call float @llvm.minnum.f32(float %a, float 0.0)
201 ret float %x
202}
203
204; CHECK-LABEL: min_imm2
205define float @min_imm2(float %a) {
206 ; CHECK: min.f32
207 %x = call float @llvm.minnum.f32(float 0.0, float %a)
208 ret float %x
209}
210
211; CHECK-LABEL: min_float_ftz
212define float @min_float_ftz(float %a, float %b) #1 {
213 ; CHECK: min.ftz.f32
214 %x = call float @llvm.minnum.f32(float %a, float %b)
215 ret float %x
216}
217
218; CHECK-LABEL: min_double
219define double @min_double(double %a, double %b) {
220 ; CHECK: min.f64
221 %x = call double @llvm.minnum.f64(double %a, double %b)
222 ret double %x
223}
224
225; ---- max ----
226
227; CHECK-LABEL: max_imm1
228define float @max_imm1(float %a) {
229 ; CHECK: max.f32
230 %x = call float @llvm.maxnum.f32(float %a, float 0.0)
231 ret float %x
232}
233
234; CHECK-LABEL: max_imm2
235define float @max_imm2(float %a) {
236 ; CHECK: max.f32
237 %x = call float @llvm.maxnum.f32(float 0.0, float %a)
238 ret float %x
239}
240
241; CHECK-LABEL: max_float
242define float @max_float(float %a, float %b) {
243 ; CHECK: max.f32
244 %x = call float @llvm.maxnum.f32(float %a, float %b)
245 ret float %x
246}
247
248; CHECK-LABEL: max_float_ftz
249define float @max_float_ftz(float %a, float %b) #1 {
250 ; CHECK: max.ftz.f32
251 %x = call float @llvm.maxnum.f32(float %a, float %b)
252 ret float %x
253}
254
255; CHECK-LABEL: max_double
256define double @max_double(double %a, double %b) {
257 ; CHECK: max.f64
258 %x = call double @llvm.maxnum.f64(double %a, double %b)
259 ret double %x
260}
261
Justin Lebar3cf4e3e2017-01-15 16:55:37 +0000262; ---- fma ----
263
264; CHECK-LABEL: @fma_float
265define float @fma_float(float %a, float %b, float %c) {
266 ; CHECK: fma.rn.f32
267 %x = call float @llvm.fma.f32(float %a, float %b, float %c)
268 ret float %x
269}
270
271; CHECK-LABEL: @fma_float_ftz
272define float @fma_float_ftz(float %a, float %b, float %c) #1 {
273 ; CHECK: fma.rn.ftz.f32
274 %x = call float @llvm.fma.f32(float %a, float %b, float %c)
275 ret float %x
276}
277
278; CHECK-LABEL: @fma_double
279define double @fma_double(double %a, double %b, double %c) {
280 ; CHECK: fma.rn.f64
281 %x = call double @llvm.fma.f64(double %a, double %b, double %c)
282 ret double %x
283}
284
Justin Lebarb5e88492016-09-09 21:07:26 +0000285attributes #0 = { nounwind readnone }
286attributes #1 = { "nvptx-f32ftz" = "true" }