1; RUN: llc < %s -march=nvptx -mcpu=sm_20 | FileCheck %s
2; RUN: llc < %s -march=nvptx64 -mcpu=sm_20 | FileCheck %s
3
4;; These tests should run for all targets
5
6;;===-- Basic instruction selection tests ---------------------------------===;;
7
8
9;;; i64
10
11define i64 @add_i64(i64 %a, i64 %b) {
12; CHECK: add.s64 %rd{{[0-9]+}}, %rd{{[0-9]+}}, %rd{{[0-9]+}}
13; CHECK: ret
14  %ret = add i64 %a, %b
15  ret i64 %ret
16}
17
18define i64 @sub_i64(i64 %a, i64 %b) {
19; CHECK: sub.s64 %rd{{[0-9]+}}, %rd{{[0-9]+}}, %rd{{[0-9]+}}
20; CHECK: ret
21  %ret = sub i64 %a, %b
22  ret i64 %ret
23}
24
25define i64 @mul_i64(i64 %a, i64 %b) {
26; CHECK: mul.lo.s64 %rd{{[0-9]+}}, %rd{{[0-9]+}}, %rd{{[0-9]+}}
27; CHECK: ret
28  %ret = mul i64 %a, %b
29  ret i64 %ret
30}
31
32define i64 @sdiv_i64(i64 %a, i64 %b) {
33; CHECK: div.s64 %rd{{[0-9]+}}, %rd{{[0-9]+}}, %rd{{[0-9]+}}
34; CHECK: ret
35  %ret = sdiv i64 %a, %b
36  ret i64 %ret
37}
38
39define i64 @udiv_i64(i64 %a, i64 %b) {
40; CHECK: div.u64 %rd{{[0-9]+}}, %rd{{[0-9]+}}, %rd{{[0-9]+}}
41; CHECK: ret
42  %ret = udiv i64 %a, %b
43  ret i64 %ret
44}
45
46define i64 @srem_i64(i64 %a, i64 %b) {
47; CHECK: rem.s64 %rd{{[0-9]+}}, %rd{{[0-9]+}}, %rd{{[0-9]+}}
48; CHECK: ret
49  %ret = srem i64 %a, %b
50  ret i64 %ret
51}
52
53define i64 @urem_i64(i64 %a, i64 %b) {
54; CHECK: rem.u64 %rd{{[0-9]+}}, %rd{{[0-9]+}}, %rd{{[0-9]+}}
55; CHECK: ret
56  %ret = urem i64 %a, %b
57  ret i64 %ret
58}
59
60define i64 @and_i64(i64 %a, i64 %b) {
61; CHECK: and.b64 %rd{{[0-9]+}}, %rd{{[0-9]+}}, %rd{{[0-9]+}}
62; CHECK: ret
63  %ret = and i64 %a, %b
64  ret i64 %ret
65}
66
67define i64 @or_i64(i64 %a, i64 %b) {
68; CHECK: or.b64 %rd{{[0-9]+}}, %rd{{[0-9]+}}, %rd{{[0-9]+}}
69; CHECK: ret
70  %ret = or i64 %a, %b
71  ret i64 %ret
72}
73
74define i64 @xor_i64(i64 %a, i64 %b) {
75; CHECK: xor.b64 %rd{{[0-9]+}}, %rd{{[0-9]+}}, %rd{{[0-9]+}}
76; CHECK: ret
77  %ret = xor i64 %a, %b
78  ret i64 %ret
79}
80
81define i64 @shl_i64(i64 %a, i64 %b) {
82; PTX requires 32-bit shift amount
83; CHECK: shl.b64 %rd{{[0-9]+}}, %rd{{[0-9]+}}, %r{{[0-9]+}}
84; CHECK: ret
85  %ret = shl i64 %a, %b
86  ret i64 %ret
87}
88
89define i64 @ashr_i64(i64 %a, i64 %b) {
90; PTX requires 32-bit shift amount
91; CHECK: shr.s64 %rd{{[0-9]+}}, %rd{{[0-9]+}}, %r{{[0-9]+}}
92; CHECK: ret
93  %ret = ashr i64 %a, %b
94  ret i64 %ret
95}
96
97define i64 @lshr_i64(i64 %a, i64 %b) {
98; PTX requires 32-bit shift amount
99; CHECK: shr.u64 %rd{{[0-9]+}}, %rd{{[0-9]+}}, %r{{[0-9]+}}
100; CHECK: ret
101  %ret = lshr i64 %a, %b
102  ret i64 %ret
103}
104
105
106;;; i32
107
108define i32 @add_i32(i32 %a, i32 %b) {
109; CHECK: add.s32 %r{{[0-9]+}}, %r{{[0-9]+}}, %r{{[0-9]+}}
110; CHECK: ret
111  %ret = add i32 %a, %b
112  ret i32 %ret
113}
114
115define i32 @sub_i32(i32 %a, i32 %b) {
116; CHECK: sub.s32 %r{{[0-9]+}}, %r{{[0-9]+}}, %r{{[0-9]+}}
117; CHECK: ret
118  %ret = sub i32 %a, %b
119  ret i32 %ret
120}
121
122define i32 @mul_i32(i32 %a, i32 %b) {
123; CHECK: mul.lo.s32 %r{{[0-9]+}}, %r{{[0-9]+}}, %r{{[0-9]+}}
124; CHECK: ret
125  %ret = mul i32 %a, %b
126  ret i32 %ret
127}
128
129define i32 @sdiv_i32(i32 %a, i32 %b) {
130; CHECK: div.s32 %r{{[0-9]+}}, %r{{[0-9]+}}, %r{{[0-9]+}}
131; CHECK: ret
132  %ret = sdiv i32 %a, %b
133  ret i32 %ret
134}
135
136define i32 @udiv_i32(i32 %a, i32 %b) {
137; CHECK: div.u32 %r{{[0-9]+}}, %r{{[0-9]+}}, %r{{[0-9]+}}
138; CHECK: ret
139  %ret = udiv i32 %a, %b
140  ret i32 %ret
141}
142
143define i32 @srem_i32(i32 %a, i32 %b) {
144; CHECK: rem.s32 %r{{[0-9]+}}, %r{{[0-9]+}}, %r{{[0-9]+}}
145; CHECK: ret
146  %ret = srem i32 %a, %b
147  ret i32 %ret
148}
149
150define i32 @urem_i32(i32 %a, i32 %b) {
151; CHECK: rem.u32 %r{{[0-9]+}}, %r{{[0-9]+}}, %r{{[0-9]+}}
152; CHECK: ret
153  %ret = urem i32 %a, %b
154  ret i32 %ret
155}
156
157define i32 @and_i32(i32 %a, i32 %b) {
158; CHECK: and.b32 %r{{[0-9]+}}, %r{{[0-9]+}}, %r{{[0-9]+}}
159; CHECK: ret
160  %ret = and i32 %a, %b
161  ret i32 %ret
162}
163
164define i32 @or_i32(i32 %a, i32 %b) {
165; CHECK: or.b32 %r{{[0-9]+}}, %r{{[0-9]+}}, %r{{[0-9]+}}
166; CHECK: ret
167  %ret = or i32 %a, %b
168  ret i32 %ret
169}
170
171define i32 @xor_i32(i32 %a, i32 %b) {
172; CHECK: xor.b32 %r{{[0-9]+}}, %r{{[0-9]+}}, %r{{[0-9]+}}
173; CHECK: ret
174  %ret = xor i32 %a, %b
175  ret i32 %ret
176}
177
178define i32 @shl_i32(i32 %a, i32 %b) {
179; CHECK: shl.b32 %r{{[0-9]+}}, %r{{[0-9]+}}, %r{{[0-9]+}}
180; CHECK: ret
181  %ret = shl i32 %a, %b
182  ret i32 %ret
183}
184
185define i32 @ashr_i32(i32 %a, i32 %b) {
186; CHECK: shr.s32 %r{{[0-9]+}}, %r{{[0-9]+}}, %r{{[0-9]+}}
187; CHECK: ret
188  %ret = ashr i32 %a, %b
189  ret i32 %ret
190}
191
192define i32 @lshr_i32(i32 %a, i32 %b) {
193; CHECK: shr.u32 %r{{[0-9]+}}, %r{{[0-9]+}}, %r{{[0-9]+}}
194; CHECK: ret
195  %ret = lshr i32 %a, %b
196  ret i32 %ret
197}
198
199;;; i16
200
201define i16 @add_i16(i16 %a, i16 %b) {
202; CHECK: add.s16 %rs{{[0-9]+}}, %rs{{[0-9]+}}, %rs{{[0-9]+}}
203; CHECK: ret
204  %ret = add i16 %a, %b
205  ret i16 %ret
206}
207
208define i16 @sub_i16(i16 %a, i16 %b) {
209; CHECK: sub.s16 %rs{{[0-9]+}}, %rs{{[0-9]+}}, %rs{{[0-9]+}}
210; CHECK: ret
211  %ret = sub i16 %a, %b
212  ret i16 %ret
213}
214
215define i16 @mul_i16(i16 %a, i16 %b) {
216; CHECK: mul.lo.s16 %rs{{[0-9]+}}, %rs{{[0-9]+}}, %rs{{[0-9]+}}
217; CHECK: ret
218  %ret = mul i16 %a, %b
219  ret i16 %ret
220}
221
222define i16 @sdiv_i16(i16 %a, i16 %b) {
223; CHECK: div.s16 %rs{{[0-9]+}}, %rs{{[0-9]+}}, %rs{{[0-9]+}}
224; CHECK: ret
225  %ret = sdiv i16 %a, %b
226  ret i16 %ret
227}
228
229define i16 @udiv_i16(i16 %a, i16 %b) {
230; CHECK: div.u16 %rs{{[0-9]+}}, %rs{{[0-9]+}}, %rs{{[0-9]+}}
231; CHECK: ret
232  %ret = udiv i16 %a, %b
233  ret i16 %ret
234}
235
236define i16 @srem_i16(i16 %a, i16 %b) {
237; CHECK: rem.s16 %rs{{[0-9]+}}, %rs{{[0-9]+}}, %rs{{[0-9]+}}
238; CHECK: ret
239  %ret = srem i16 %a, %b
240  ret i16 %ret
241}
242
243define i16 @urem_i16(i16 %a, i16 %b) {
244; CHECK: rem.u16 %rs{{[0-9]+}}, %rs{{[0-9]+}}, %rs{{[0-9]+}}
245; CHECK: ret
246  %ret = urem i16 %a, %b
247  ret i16 %ret
248}
249
250define i16 @and_i16(i16 %a, i16 %b) {
251; CHECK: and.b16 %rs{{[0-9]+}}, %rs{{[0-9]+}}, %rs{{[0-9]+}}
252; CHECK: ret
253  %ret = and i16 %a, %b
254  ret i16 %ret
255}
256
257define i16 @or_i16(i16 %a, i16 %b) {
258; CHECK: or.b16 %rs{{[0-9]+}}, %rs{{[0-9]+}}, %rs{{[0-9]+}}
259; CHECK: ret
260  %ret = or i16 %a, %b
261  ret i16 %ret
262}
263
264define i16 @xor_i16(i16 %a, i16 %b) {
265; CHECK: xor.b16 %rs{{[0-9]+}}, %rs{{[0-9]+}}, %rs{{[0-9]+}}
266; CHECK: ret
267  %ret = xor i16 %a, %b
268  ret i16 %ret
269}
270
271define i16 @shl_i16(i16 %a, i16 %b) {
272; PTX requires 32-bit shift amount
273; CHECK: shl.b16 %rs{{[0-9]+}}, %rs{{[0-9]+}}, %r{{[0-9]+}}
274; CHECK: ret
275  %ret = shl i16 %a, %b
276  ret i16 %ret
277}
278
279define i16 @ashr_i16(i16 %a, i16 %b) {
280; PTX requires 32-bit shift amount
281; CHECK: shr.s16 %rs{{[0-9]+}}, %rs{{[0-9]+}}, %r{{[0-9]+}}
282; CHECK: ret
283  %ret = ashr i16 %a, %b
284  ret i16 %ret
285}
286
287define i16 @lshr_i16(i16 %a, i16 %b) {
288; PTX requires 32-bit shift amount
289; CHECK: shr.u16 %rs{{[0-9]+}}, %rs{{[0-9]+}}, %r{{[0-9]+}}
290; CHECK: ret
291  %ret = lshr i16 %a, %b
292  ret i16 %ret
293}
294