PTX: Adjust rounding modes
[oota-llvm.git] / test / CodeGen / PTX / cvt.ll
1 ; RUN: llc < %s -march=ptx32 | FileCheck %s
2
3 ; preds 
4 ; (note: we convert back to i32 to return)
5
6 define ptx_device i32 @cvt_pred_i16(i16 %x, i1 %y) {
7 ; CHECK: cvt.pred.u16 p0, rh1;
8 ; CHECK: ret;
9         %a = trunc i16 %x to i1
10         %b = and i1 %a, %y
11         %c = zext i1 %b to i32
12         ret i32 %c
13 }
14
15 define ptx_device i32 @cvt_pred_i32(i32 %x, i1 %y) {
16 ; CHECK: cvt.pred.u32 p0, r1;
17 ; CHECK: ret;
18         %a = trunc i32 %x to i1
19         %b = and i1 %a, %y
20         %c = zext i1 %b to i32
21         ret i32 %c
22 }
23
24 define ptx_device i32 @cvt_pred_i64(i64 %x, i1 %y) {
25 ; CHECK: cvt.pred.u64 p0, rd1;
26 ; CHECK: ret;
27         %a = trunc i64 %x to i1
28         %b = and i1 %a, %y
29         %c = zext i1 %b to i32
30         ret i32 %c
31 }
32
33 define ptx_device i32 @cvt_pred_f32(float %x, i1 %y) {
34 ; CHECK: cvt.rzi.pred.f32 p0, r1;
35 ; CHECK: ret;
36         %a = fptoui float %x to i1
37         %b = and i1 %a, %y
38         %c = zext i1 %b to i32
39         ret i32 %c
40 }
41
42 define ptx_device i32 @cvt_pred_f64(double %x, i1 %y) {
43 ; CHECK: cvt.rzi.pred.f64 p0, rd1;
44 ; CHECK: ret;
45         %a = fptoui double %x to i1
46         %b = and i1 %a, %y
47         %c = zext i1 %b to i32
48         ret i32 %c
49 }
50
51 ; i16
52
53 define ptx_device i16 @cvt_i16_preds(i1 %x) {
54 ; CHECK: cvt.u16.pred rh0, p1;
55 ; CHECK: ret;
56         %a = zext i1 %x to i16
57         ret i16 %a
58 }
59
60 define ptx_device i16 @cvt_i16_i32(i32 %x) {
61 ; CHECK: cvt.u16.u32 rh0, r1;
62 ; CHECK: ret;
63         %a = trunc i32 %x to i16
64         ret i16 %a
65 }
66
67 define ptx_device i16 @cvt_i16_i64(i64 %x) {
68 ; CHECK: cvt.u16.u64 rh0, rd1;
69 ; CHECK: ret;
70         %a = trunc i64 %x to i16
71         ret i16 %a
72 }
73
74 define ptx_device i16 @cvt_i16_f32(float %x) {
75 ; CHECK: cvt.rzi.u16.f32 rh0, r1;
76 ; CHECK: ret;
77         %a = fptoui float %x to i16
78         ret i16 %a
79 }
80
81 define ptx_device i16 @cvt_i16_f64(double %x) {
82 ; CHECK: cvt.rzi.u16.f64 rh0, rd1;
83 ; CHECK: ret;
84         %a = fptoui double %x to i16
85         ret i16 %a
86 }
87
88 ; i32
89
90 define ptx_device i32 @cvt_i32_preds(i1 %x) {
91 ; CHECK: cvt.u32.pred r0, p1;
92 ; CHECK: ret;
93         %a = zext i1 %x to i32
94         ret i32 %a
95 }
96
97 define ptx_device i32 @cvt_i32_i16(i16 %x) {
98 ; CHECK: cvt.u32.u16 r0, rh1;
99 ; CHECK: ret;
100         %a = zext i16 %x to i32
101         ret i32 %a
102 }
103
104 define ptx_device i32 @cvt_i32_i64(i64 %x) {
105 ; CHECK: cvt.u32.u64 r0, rd1;
106 ; CHECK: ret;
107         %a = trunc i64 %x to i32
108         ret i32 %a
109 }
110
111 define ptx_device i32 @cvt_i32_f32(float %x) {
112 ; CHECK: cvt.rzi.u32.f32 r0, r1;
113 ; CHECK: ret;
114         %a = fptoui float %x to i32
115         ret i32 %a
116 }
117
118 define ptx_device i32 @cvt_i32_f64(double %x) {
119 ; CHECK: cvt.rzi.u32.f64 r0, rd1;
120 ; CHECK: ret;
121         %a = fptoui double %x to i32
122         ret i32 %a
123 }
124
125 ; i64
126
127 define ptx_device i64 @cvt_i64_preds(i1 %x) {
128 ; CHECK: cvt.u64.pred rd0, p1;
129 ; CHECK: ret;
130         %a = zext i1 %x to i64
131         ret i64 %a
132 }
133
134 define ptx_device i64 @cvt_i64_i16(i16 %x) {
135 ; CHECK: cvt.u64.u16 rd0, rh1;
136 ; CHECK: ret;
137         %a = zext i16 %x to i64
138         ret i64 %a
139 }
140
141 define ptx_device i64 @cvt_i64_i32(i32 %x) {
142 ; CHECK: cvt.u64.u32 rd0, r1;
143 ; CHECK: ret;
144         %a = zext i32 %x to i64
145         ret i64 %a
146 }
147
148 define ptx_device i64 @cvt_i64_f32(float %x) {
149 ; CHECK: cvt.rzi.u64.f32 rd0, r1;
150 ; CHECK: ret;
151         %a = fptoui float %x to i64
152         ret i64 %a
153 }
154
155 define ptx_device i64 @cvt_i64_f64(double %x) {
156 ; CHECK: cvt.rzi.u64.f64 rd0, rd1;
157 ; CHECK: ret;
158         %a = fptoui double %x to i64
159         ret i64 %a
160 }
161
162 ; f32
163
164 define ptx_device float @cvt_f32_preds(i1 %x) {
165 ; CHECK: cvt.rn.f32.pred r0, p1;
166 ; CHECK: ret;
167         %a = uitofp i1 %x to float
168         ret float %a
169 }
170
171 define ptx_device float @cvt_f32_i16(i16 %x) {
172 ; CHECK: cvt.rn.f32.u16 r0, rh1;
173 ; CHECK: ret;
174         %a = uitofp i16 %x to float
175         ret float %a
176 }
177
178 define ptx_device float @cvt_f32_i32(i32 %x) {
179 ; CHECK: cvt.rn.f32.u32 r0, r1;
180 ; CHECK: ret;
181         %a = uitofp i32 %x to float
182         ret float %a
183 }
184
185 define ptx_device float @cvt_f32_i64(i64 %x) {
186 ; CHECK: cvt.rn.f32.u64 r0, rd1;
187 ; CHECK: ret;
188         %a = uitofp i64 %x to float
189         ret float %a
190 }
191
192 define ptx_device float @cvt_f32_f64(double %x) {
193 ; CHECK: cvt.rn.f32.f64 r0, rd1;
194 ; CHECK: ret;
195         %a = fptrunc double %x to float
196         ret float %a
197 }
198
199 ; f64
200
201 define ptx_device double @cvt_f64_preds(i1 %x) {
202 ; CHECK: cvt.rn.f64.pred rd0, p1;
203 ; CHECK: ret;
204         %a = uitofp i1 %x to double
205         ret double %a
206 }
207
208 define ptx_device double @cvt_f64_i16(i16 %x) {
209 ; CHECK: cvt.rn.f64.u16 rd0, rh1;
210 ; CHECK: ret;
211         %a = uitofp i16 %x to double
212         ret double %a
213 }
214
215 define ptx_device double @cvt_f64_i32(i32 %x) {
216 ; CHECK: cvt.rn.f64.u32 rd0, r1;
217 ; CHECK: ret;
218         %a = uitofp i32 %x to double
219         ret double %a
220 }
221
222 define ptx_device double @cvt_f64_i64(i64 %x) {
223 ; CHECK: cvt.rn.f64.u64 rd0, rd1;
224 ; CHECK: ret;
225         %a = uitofp i64 %x to double
226         ret double %a
227 }
228
229 define ptx_device double @cvt_f64_f32(float %x) {
230 ; CHECK: cvt.f64.f32 rd0, r1;
231 ; CHECK: ret;
232         %a = fpext float %x to double
233         ret double %a
234 }