• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1; RUN: llc < %s -march=ptx32 | FileCheck %s
2
3; preds
4; (note: we convert back to i32 to return)
5
6define ptx_device i32 @cvt_pred_i16(i16 %x, i1 %y) {
7; CHECK: setp.gt.u16 %p[[P0:[0-9]+]], %rh{{[0-9]+}}, 0
8; CHECK: and.pred %p2, %p[[P0:[0-9]+]], %p{{[0-9]+}};
9; CHECK: selp.u32 %ret{{[0-9]+}}, 1, 0, %p[[P0:[0-9]+]];
10; CHECK: ret;
11	%a = trunc i16 %x to i1
12	%b = and i1 %a, %y
13	%c = zext i1 %b to i32
14	ret i32 %c
15}
16
17define ptx_device i32 @cvt_pred_i32(i32 %x, i1 %y) {
18; CHECK: setp.gt.u32 %p[[P0:[0-9]+]], %r{{[0-9]+}}, 0
19; CHECK: and.pred %p2, %p[[P0:[0-9]+]], %p{{[0-9]+}};
20; CHECK: selp.u32 %ret{{[0-9]+}}, 1, 0, %p[[P0:[0-9]+]];
21; CHECK: ret;
22	%a = trunc i32 %x to i1
23	%b = and i1 %a, %y
24	%c = zext i1 %b to i32
25	ret i32 %c
26}
27
28define ptx_device i32 @cvt_pred_i64(i64 %x, i1 %y) {
29; CHECK: setp.gt.u64 %p[[P0:[0-9]+]], %rd{{[0-9]+}}, 0
30; CHECK: and.pred %p2, %p[[P0:[0-9]+]], %p{{[0-9]+}};
31; CHECK: selp.u32 %ret{{[0-9]+}}, 1, 0, %p[[P0:[0-9]+]];
32; CHECK: ret;
33	%a = trunc i64 %x to i1
34	%b = and i1 %a, %y
35	%c = zext i1 %b to i32
36	ret i32 %c
37}
38
39define ptx_device i32 @cvt_pred_f32(float %x, i1 %y) {
40; CHECK: setp.gt.u32 %p[[P0:[0-9]+]], %r{{[0-9]+}}, 0
41; CHECK: and.pred %p2, %p[[P0:[0-9]+]], %p{{[0-9]+}};
42; CHECK: selp.u32 %ret{{[0-9]+}}, 1, 0, %p[[P0:[0-9]+]];
43; CHECK: ret;
44	%a = fptoui float %x to i1
45	%b = and i1 %a, %y
46	%c = zext i1 %b to i32
47	ret i32 %c
48}
49
50define ptx_device i32 @cvt_pred_f64(double %x, i1 %y) {
51; CHECK: setp.gt.u64 %p[[P0:[0-9]+]], %rd{{[0-9]+}}, 0
52; CHECK: and.pred %p2, %p[[P0:[0-9]+]], %p{{[0-9]+}};
53; CHECK: selp.u32 %ret{{[0-9]+}}, 1, 0, %p[[P0:[0-9]+]];
54; CHECK: ret;
55	%a = fptoui double %x to i1
56	%b = and i1 %a, %y
57	%c = zext i1 %b to i32
58	ret i32 %c
59}
60
61; i16
62
63define ptx_device i16 @cvt_i16_preds(i1 %x) {
64; CHECK: selp.u16 %ret{{[0-9]+}}, 1, 0, %p{{[0-9]+}};
65; CHECK: ret;
66	%a = zext i1 %x to i16
67	ret i16 %a
68}
69
70define ptx_device i16 @cvt_i16_i32(i32 %x) {
71; CHECK: cvt.u16.u32 %ret{{[0-9]+}}, %r{{[0-9]+}};
72; CHECK: ret;
73	%a = trunc i32 %x to i16
74	ret i16 %a
75}
76
77define ptx_device i16 @cvt_i16_i64(i64 %x) {
78; CHECK: cvt.u16.u64 %ret{{[0-9]+}}, %rd{{[0-9]+}};
79; CHECK: ret;
80	%a = trunc i64 %x to i16
81	ret i16 %a
82}
83
84define ptx_device i16 @cvt_i16_f32(float %x) {
85; CHECK: cvt.rzi.u16.f32 %ret{{[0-9]+}}, %f{{[0-9]+}};
86; CHECK: ret;
87	%a = fptoui float %x to i16
88	ret i16 %a
89}
90
91define ptx_device i16 @cvt_i16_f64(double %x) {
92; CHECK: cvt.rzi.u16.f64 %ret{{[0-9]+}}, %fd{{[0-9]+}};
93; CHECK: ret;
94	%a = fptoui double %x to i16
95	ret i16 %a
96}
97
98; i32
99
100define ptx_device i32 @cvt_i32_preds(i1 %x) {
101; CHECK: selp.u32 %ret{{[0-9]+}}, 1, 0, %p{{[0-9]+}};
102; CHECK: ret;
103	%a = zext i1 %x to i32
104	ret i32 %a
105}
106
107define ptx_device i32 @cvt_i32_i16(i16 %x) {
108; CHECK: cvt.u32.u16 %ret{{[0-9]+}}, %rh{{[0-9]+}};
109; CHECK: ret;
110	%a = zext i16 %x to i32
111	ret i32 %a
112}
113
114define ptx_device i32 @cvt_i32_i64(i64 %x) {
115; CHECK: cvt.u32.u64 %ret{{[0-9]+}}, %rd{{[0-9]+}};
116; CHECK: ret;
117	%a = trunc i64 %x to i32
118	ret i32 %a
119}
120
121define ptx_device i32 @cvt_i32_f32(float %x) {
122; CHECK: cvt.rzi.u32.f32 %ret{{[0-9]+}}, %f{{[0-9]+}};
123; CHECK: ret;
124	%a = fptoui float %x to i32
125	ret i32 %a
126}
127
128define ptx_device i32 @cvt_i32_f64(double %x) {
129; CHECK: cvt.rzi.u32.f64 %ret{{[0-9]+}}, %fd{{[0-9]+}};
130; CHECK: ret;
131	%a = fptoui double %x to i32
132	ret i32 %a
133}
134
135; i64
136
137define ptx_device i64 @cvt_i64_preds(i1 %x) {
138; CHECK: selp.u64 %ret{{[0-9]+}}, 1, 0, %p{{[0-9]+}};
139; CHECK: ret;
140	%a = zext i1 %x to i64
141	ret i64 %a
142}
143
144define ptx_device i64 @cvt_i64_i16(i16 %x) {
145; CHECK: cvt.u64.u16 %ret{{[0-9]+}}, %rh{{[0-9]+}};
146; CHECK: ret;
147	%a = zext i16 %x to i64
148	ret i64 %a
149}
150
151define ptx_device i64 @cvt_i64_i32(i32 %x) {
152; CHECK: cvt.u64.u32 %ret{{[0-9]+}}, %r{{[0-9]+}};
153; CHECK: ret;
154	%a = zext i32 %x to i64
155	ret i64 %a
156}
157
158define ptx_device i64 @cvt_i64_f32(float %x) {
159; CHECK: cvt.rzi.u64.f32 %ret{{[0-9]+}}, %f{{[0-9]+}};
160; CHECK: ret;
161	%a = fptoui float %x to i64
162	ret i64 %a
163}
164
165define ptx_device i64 @cvt_i64_f64(double %x) {
166; CHECK: cvt.rzi.u64.f64 %ret{{[0-9]+}}, %fd{{[0-9]+}};
167; CHECK: ret;
168	%a = fptoui double %x to i64
169	ret i64 %a
170}
171
172; f32
173
174define ptx_device float @cvt_f32_preds(i1 %x) {
175; CHECK: mov.b32 %f0, 1065353216;
176; CHECK: mov.b32 %f1, 0;
177; CHECK: selp.f32 %ret{{[0-9]+}}, %f0, %f1, %p{{[0-9]+}};
178; CHECK: ret;
179	%a = uitofp i1 %x to float
180	ret float %a
181}
182
183define ptx_device float @cvt_f32_i16(i16 %x) {
184; CHECK: cvt.rn.f32.u16 %ret{{[0-9]+}}, %rh{{[0-9]+}};
185; CHECK: ret;
186	%a = uitofp i16 %x to float
187	ret float %a
188}
189
190define ptx_device float @cvt_f32_i32(i32 %x) {
191; CHECK: cvt.rn.f32.u32 %ret{{[0-9]+}}, %r{{[0-9]+}};
192; CHECK: ret;
193	%a = uitofp i32 %x to float
194	ret float %a
195}
196
197define ptx_device float @cvt_f32_i64(i64 %x) {
198; CHECK: cvt.rn.f32.u64 %ret{{[0-9]+}}, %rd{{[0-9]+}};
199; CHECK: ret;
200	%a = uitofp i64 %x to float
201	ret float %a
202}
203
204define ptx_device float @cvt_f32_f64(double %x) {
205; CHECK: cvt.rn.f32.f64 %ret{{[0-9]+}}, %fd{{[0-9]+}};
206; CHECK: ret;
207	%a = fptrunc double %x to float
208	ret float %a
209}
210
211define ptx_device float @cvt_f32_s16(i16 %x) {
212; CHECK: cvt.rn.f32.s16 %ret{{[0-9]+}}, %rh{{[0-9]+}}
213; CHECK: ret
214  %a = sitofp i16 %x to float
215  ret float %a
216}
217
218define ptx_device float @cvt_f32_s32(i32 %x) {
219; CHECK: cvt.rn.f32.s32 %ret{{[0-9]+}}, %r{{[0-9]+}}
220; CHECK: ret
221  %a = sitofp i32 %x to float
222  ret float %a
223}
224
225define ptx_device float @cvt_f32_s64(i64 %x) {
226; CHECK: cvt.rn.f32.s64 %ret{{[0-9]+}}, %rd{{[0-9]+}}
227; CHECK: ret
228  %a = sitofp i64 %x to float
229  ret float %a
230}
231
232; f64
233
234define ptx_device double @cvt_f64_preds(i1 %x) {
235; CHECK: mov.b64 %fd0, 4575657221408423936;
236; CHECK: mov.b64 %fd1, 0;
237; CHECK: selp.f64 %ret{{[0-9]+}}, %fd0, %fd1, %p{{[0-9]+}};
238; CHECK: ret;
239	%a = uitofp i1 %x to double
240	ret double %a
241}
242
243define ptx_device double @cvt_f64_i16(i16 %x) {
244; CHECK: cvt.rn.f64.u16 %ret{{[0-9]+}}, %rh{{[0-9]+}};
245; CHECK: ret;
246	%a = uitofp i16 %x to double
247	ret double %a
248}
249
250define ptx_device double @cvt_f64_i32(i32 %x) {
251; CHECK: cvt.rn.f64.u32 %ret{{[0-9]+}}, %r{{[0-9]+}};
252; CHECK: ret;
253	%a = uitofp i32 %x to double
254	ret double %a
255}
256
257define ptx_device double @cvt_f64_i64(i64 %x) {
258; CHECK: cvt.rn.f64.u64 %ret{{[0-9]+}}, %rd{{[0-9]+}};
259; CHECK: ret;
260	%a = uitofp i64 %x to double
261	ret double %a
262}
263
264define ptx_device double @cvt_f64_f32(float %x) {
265; CHECK: cvt.f64.f32 %ret{{[0-9]+}}, %f{{[0-9]+}};
266; CHECK: ret;
267	%a = fpext float %x to double
268	ret double %a
269}
270
271define ptx_device double @cvt_f64_s16(i16 %x) {
272; CHECK: cvt.rn.f64.s16 %ret{{[0-9]+}}, %rh{{[0-9]+}}
273; CHECK: ret
274  %a = sitofp i16 %x to double
275  ret double %a
276}
277
278define ptx_device double @cvt_f64_s32(i32 %x) {
279; CHECK: cvt.rn.f64.s32 %ret{{[0-9]+}}, %r{{[0-9]+}}
280; CHECK: ret
281  %a = sitofp i32 %x to double
282  ret double %a
283}
284
285define ptx_device double @cvt_f64_s64(i64 %x) {
286; CHECK: cvt.rn.f64.s64 %ret{{[0-9]+}}, %rd{{[0-9]+}}
287; CHECK: ret
288  %a = sitofp i64 %x to double
289  ret double %a
290}
291