[PowerPC] Generate Power9 extswsli extend sign and shift immediate instruction
[llvm-core.git] / test / CodeGen / NVPTX / math-intrins.ll
blob828a8807dcfaabab89b023bda8cfa095bfb0d10e
1 ; RUN: llc < %s | FileCheck %s
2 target triple = "nvptx64-nvidia-cuda"
4 ; Checks that llvm intrinsics for math functions are correctly lowered to PTX.
6 declare float @llvm.ceil.f32(float) #0
7 declare double @llvm.ceil.f64(double) #0
8 declare float @llvm.floor.f32(float) #0
9 declare double @llvm.floor.f64(double) #0
10 declare float @llvm.round.f32(float) #0
11 declare double @llvm.round.f64(double) #0
12 declare float @llvm.nearbyint.f32(float) #0
13 declare double @llvm.nearbyint.f64(double) #0
14 declare float @llvm.rint.f32(float) #0
15 declare double @llvm.rint.f64(double) #0
16 declare float @llvm.trunc.f32(float) #0
17 declare double @llvm.trunc.f64(double) #0
18 declare float @llvm.fabs.f32(float) #0
19 declare double @llvm.fabs.f64(double) #0
20 declare float @llvm.minnum.f32(float, float) #0
21 declare double @llvm.minnum.f64(double, double) #0
22 declare float @llvm.maxnum.f32(float, float) #0
23 declare double @llvm.maxnum.f64(double, double) #0
24 declare float @llvm.fma.f32(float, float, float) #0
25 declare double @llvm.fma.f64(double, double, double) #0
27 ; ---- ceil ----
29 ; CHECK-LABEL: ceil_float
30 define float @ceil_float(float %a) {
31   ; CHECK: cvt.rpi.f32.f32
32   %b = call float @llvm.ceil.f32(float %a)
33   ret float %b
36 ; CHECK-LABEL: ceil_float_ftz
37 define 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
43 ; CHECK-LABEL: ceil_double
44 define double @ceil_double(double %a) {
45   ; CHECK: cvt.rpi.f64.f64
46   %b = call double @llvm.ceil.f64(double %a)
47   ret double %b
50 ; ---- floor ----
52 ; CHECK-LABEL: floor_float
53 define float @floor_float(float %a) {
54   ; CHECK: cvt.rmi.f32.f32
55   %b = call float @llvm.floor.f32(float %a)
56   ret float %b
59 ; CHECK-LABEL: floor_float_ftz
60 define 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
66 ; CHECK-LABEL: floor_double
67 define double @floor_double(double %a) {
68   ; CHECK: cvt.rmi.f64.f64
69   %b = call double @llvm.floor.f64(double %a)
70   ret double %b
73 ; ---- round ----
75 ; CHECK-LABEL: round_float
76 define float @round_float(float %a) {
77   ; CHECK: cvt.rni.f32.f32
78   %b = call float @llvm.round.f32(float %a)
79   ret float %b
82 ; CHECK-LABEL: round_float_ftz
83 define 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
89 ; CHECK-LABEL: round_double
90 define double @round_double(double %a) {
91   ; CHECK: cvt.rni.f64.f64
92   %b = call double @llvm.round.f64(double %a)
93   ret double %b
96 ; ---- nearbyint ----
98 ; CHECK-LABEL: nearbyint_float
99 define float @nearbyint_float(float %a) {
100   ; CHECK: cvt.rni.f32.f32
101   %b = call float @llvm.nearbyint.f32(float %a)
102   ret float %b
105 ; CHECK-LABEL: nearbyint_float_ftz
106 define 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
112 ; CHECK-LABEL: nearbyint_double
113 define double @nearbyint_double(double %a) {
114   ; CHECK: cvt.rni.f64.f64
115   %b = call double @llvm.nearbyint.f64(double %a)
116   ret double %b
119 ; ---- rint ----
121 ; CHECK-LABEL: rint_float
122 define float @rint_float(float %a) {
123   ; CHECK: cvt.rni.f32.f32
124   %b = call float @llvm.rint.f32(float %a)
125   ret float %b
128 ; CHECK-LABEL: rint_float_ftz
129 define 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
135 ; CHECK-LABEL: rint_double
136 define double @rint_double(double %a) {
137   ; CHECK: cvt.rni.f64.f64
138   %b = call double @llvm.rint.f64(double %a)
139   ret double %b
142 ; ---- trunc ----
144 ; CHECK-LABEL: trunc_float
145 define float @trunc_float(float %a) {
146   ; CHECK: cvt.rzi.f32.f32
147   %b = call float @llvm.trunc.f32(float %a)
148   ret float %b
151 ; CHECK-LABEL: trunc_float_ftz
152 define 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
158 ; CHECK-LABEL: trunc_double
159 define double @trunc_double(double %a) {
160   ; CHECK: cvt.rzi.f64.f64
161   %b = call double @llvm.trunc.f64(double %a)
162   ret double %b
165 ; ---- abs ----
167 ; CHECK-LABEL: abs_float
168 define float @abs_float(float %a) {
169   ; CHECK: abs.f32
170   %b = call float @llvm.fabs.f32(float %a)
171   ret float %b
174 ; CHECK-LABEL: abs_float_ftz
175 define 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
181 ; CHECK-LABEL: abs_double
182 define double @abs_double(double %a) {
183   ; CHECK: abs.f64
184   %b = call double @llvm.fabs.f64(double %a)
185   ret double %b
188 ; ---- min ----
190 ; CHECK-LABEL: min_float
191 define 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
197 ; CHECK-LABEL: min_imm1
198 define 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
204 ; CHECK-LABEL: min_imm2
205 define 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
211 ; CHECK-LABEL: min_float_ftz
212 define 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
218 ; CHECK-LABEL: min_double
219 define 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
225 ; ---- max ----
227 ; CHECK-LABEL: max_imm1
228 define 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
234 ; CHECK-LABEL: max_imm2
235 define 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
241 ; CHECK-LABEL: max_float
242 define 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
248 ; CHECK-LABEL: max_float_ftz
249 define 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
255 ; CHECK-LABEL: max_double
256 define 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
262 ; ---- fma ----
264 ; CHECK-LABEL: @fma_float
265 define 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
271 ; CHECK-LABEL: @fma_float_ftz
272 define 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
278 ; CHECK-LABEL: @fma_double
279 define 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
285 attributes #0 = { nounwind readnone }
286 attributes #1 = { "nvptx-f32ftz" = "true" }