1 ; RUN: llc < %s -march=nvptx -mcpu=sm_20 | FileCheck %s
2 ; RUN: llc < %s -march=nvptx64 -mcpu=sm_20 | FileCheck %s
3 ; RUN: %if ptxas && !ptxas-12.0 %{ llc < %s -march=nvptx -mcpu=sm_20 | %ptxas-verify %}
4 ; RUN: %if ptxas %{ llc < %s -march=nvptx64 -mcpu=sm_20 | %ptxas-verify %}
6 ;; These tests should run for all targets
8 ;;===-- Basic instruction selection tests ---------------------------------===;;
13 define i64 @add_i64(i64 %a, i64 %b) {
14 ; CHECK: add.s64 %rd{{[0-9]+}}, %rd{{[0-9]+}}, %rd{{[0-9]+}}
20 define i64 @sub_i64(i64 %a, i64 %b) {
21 ; CHECK: sub.s64 %rd{{[0-9]+}}, %rd{{[0-9]+}}, %rd{{[0-9]+}}
27 define i64 @mul_i64(i64 %a, i64 %b) {
28 ; CHECK: mul.lo.s64 %rd{{[0-9]+}}, %rd{{[0-9]+}}, %rd{{[0-9]+}}
34 define i64 @umul_lohi_i64(i64 %a) {
35 ; CHECK-LABEL: umul_lohi_i64(
37 %0 = zext i64 %a to i128
39 ; CHECK: mul.lo.{{u|s}}64
40 ; CHECK: mul.hi.{{u|s}}64
42 %3 = trunc i128 %2 to i64
46 define i64 @smul_lohi_i64(i64 %a) {
47 ; CHECK-LABEL: smul_lohi_i64(
49 %0 = sext i64 %a to i128
51 ; CHECK: mul.lo.{{u|s}}64
52 ; CHECK: mul.hi.{{u|s}}64
54 %3 = trunc i128 %2 to i64
58 define i64 @sdiv_i64(i64 %a, i64 %b) {
59 ; CHECK: div.s64 %rd{{[0-9]+}}, %rd{{[0-9]+}}, %rd{{[0-9]+}}
61 %ret = sdiv i64 %a, %b
65 define i64 @udiv_i64(i64 %a, i64 %b) {
66 ; CHECK: div.u64 %rd{{[0-9]+}}, %rd{{[0-9]+}}, %rd{{[0-9]+}}
68 %ret = udiv i64 %a, %b
72 define i64 @srem_i64(i64 %a, i64 %b) {
73 ; CHECK: rem.s64 %rd{{[0-9]+}}, %rd{{[0-9]+}}, %rd{{[0-9]+}}
75 %ret = srem i64 %a, %b
79 define i64 @urem_i64(i64 %a, i64 %b) {
80 ; CHECK: rem.u64 %rd{{[0-9]+}}, %rd{{[0-9]+}}, %rd{{[0-9]+}}
82 %ret = urem i64 %a, %b
86 define i64 @and_i64(i64 %a, i64 %b) {
87 ; CHECK: and.b64 %rd{{[0-9]+}}, %rd{{[0-9]+}}, %rd{{[0-9]+}}
93 define i64 @or_i64(i64 %a, i64 %b) {
94 ; CHECK: or.b64 %rd{{[0-9]+}}, %rd{{[0-9]+}}, %rd{{[0-9]+}}
100 define i64 @xor_i64(i64 %a, i64 %b) {
101 ; CHECK: xor.b64 %rd{{[0-9]+}}, %rd{{[0-9]+}}, %rd{{[0-9]+}}
103 %ret = xor i64 %a, %b
107 define i64 @shl_i64(i64 %a, i64 %b) {
108 ; PTX requires 32-bit shift amount
109 ; CHECK: shl.b64 %rd{{[0-9]+}}, %rd{{[0-9]+}}, %r{{[0-9]+}}
111 %ret = shl i64 %a, %b
115 define i64 @ashr_i64(i64 %a, i64 %b) {
116 ; PTX requires 32-bit shift amount
117 ; CHECK: shr.s64 %rd{{[0-9]+}}, %rd{{[0-9]+}}, %r{{[0-9]+}}
119 %ret = ashr i64 %a, %b
123 define i64 @lshr_i64(i64 %a, i64 %b) {
124 ; PTX requires 32-bit shift amount
125 ; CHECK: shr.u64 %rd{{[0-9]+}}, %rd{{[0-9]+}}, %r{{[0-9]+}}
127 %ret = lshr i64 %a, %b
134 define i32 @add_i32(i32 %a, i32 %b) {
135 ; CHECK: add.s32 %r{{[0-9]+}}, %r{{[0-9]+}}, %r{{[0-9]+}}
137 %ret = add i32 %a, %b
141 define i32 @sub_i32(i32 %a, i32 %b) {
142 ; CHECK: sub.s32 %r{{[0-9]+}}, %r{{[0-9]+}}, %r{{[0-9]+}}
144 %ret = sub i32 %a, %b
148 define i32 @mul_i32(i32 %a, i32 %b) {
149 ; CHECK: mul.lo.s32 %r{{[0-9]+}}, %r{{[0-9]+}}, %r{{[0-9]+}}
151 %ret = mul i32 %a, %b
155 define i32 @sdiv_i32(i32 %a, i32 %b) {
156 ; CHECK: div.s32 %r{{[0-9]+}}, %r{{[0-9]+}}, %r{{[0-9]+}}
158 %ret = sdiv i32 %a, %b
162 define i32 @udiv_i32(i32 %a, i32 %b) {
163 ; CHECK: div.u32 %r{{[0-9]+}}, %r{{[0-9]+}}, %r{{[0-9]+}}
165 %ret = udiv i32 %a, %b
169 define i32 @srem_i32(i32 %a, i32 %b) {
170 ; CHECK: rem.s32 %r{{[0-9]+}}, %r{{[0-9]+}}, %r{{[0-9]+}}
172 %ret = srem i32 %a, %b
176 define i32 @urem_i32(i32 %a, i32 %b) {
177 ; CHECK: rem.u32 %r{{[0-9]+}}, %r{{[0-9]+}}, %r{{[0-9]+}}
179 %ret = urem i32 %a, %b
183 define i32 @and_i32(i32 %a, i32 %b) {
184 ; CHECK: and.b32 %r{{[0-9]+}}, %r{{[0-9]+}}, %r{{[0-9]+}}
186 %ret = and i32 %a, %b
190 define i32 @or_i32(i32 %a, i32 %b) {
191 ; CHECK: or.b32 %r{{[0-9]+}}, %r{{[0-9]+}}, %r{{[0-9]+}}
197 define i32 @xor_i32(i32 %a, i32 %b) {
198 ; CHECK: xor.b32 %r{{[0-9]+}}, %r{{[0-9]+}}, %r{{[0-9]+}}
200 %ret = xor i32 %a, %b
204 define i32 @shl_i32(i32 %a, i32 %b) {
205 ; CHECK: shl.b32 %r{{[0-9]+}}, %r{{[0-9]+}}, %r{{[0-9]+}}
207 %ret = shl i32 %a, %b
211 define i32 @ashr_i32(i32 %a, i32 %b) {
212 ; CHECK: shr.s32 %r{{[0-9]+}}, %r{{[0-9]+}}, %r{{[0-9]+}}
214 %ret = ashr i32 %a, %b
218 define i32 @lshr_i32(i32 %a, i32 %b) {
219 ; CHECK: shr.u32 %r{{[0-9]+}}, %r{{[0-9]+}}, %r{{[0-9]+}}
221 %ret = lshr i32 %a, %b
227 define i16 @add_i16(i16 %a, i16 %b) {
228 ; CHECK: add.s16 %rs{{[0-9]+}}, %rs{{[0-9]+}}, %rs{{[0-9]+}}
230 %ret = add i16 %a, %b
234 define i16 @sub_i16(i16 %a, i16 %b) {
235 ; CHECK: sub.s16 %rs{{[0-9]+}}, %rs{{[0-9]+}}, %rs{{[0-9]+}}
237 %ret = sub i16 %a, %b
241 define i16 @mul_i16(i16 %a, i16 %b) {
242 ; CHECK: mul.lo.s16 %rs{{[0-9]+}}, %rs{{[0-9]+}}, %rs{{[0-9]+}}
244 %ret = mul i16 %a, %b
248 define i16 @sdiv_i16(i16 %a, i16 %b) {
249 ; CHECK: div.s16 %rs{{[0-9]+}}, %rs{{[0-9]+}}, %rs{{[0-9]+}}
251 %ret = sdiv i16 %a, %b
255 define i16 @udiv_i16(i16 %a, i16 %b) {
256 ; CHECK: div.u16 %rs{{[0-9]+}}, %rs{{[0-9]+}}, %rs{{[0-9]+}}
258 %ret = udiv i16 %a, %b
262 define i16 @srem_i16(i16 %a, i16 %b) {
263 ; CHECK: rem.s16 %rs{{[0-9]+}}, %rs{{[0-9]+}}, %rs{{[0-9]+}}
265 %ret = srem i16 %a, %b
269 define i16 @urem_i16(i16 %a, i16 %b) {
270 ; CHECK: rem.u16 %rs{{[0-9]+}}, %rs{{[0-9]+}}, %rs{{[0-9]+}}
272 %ret = urem i16 %a, %b
276 define i16 @and_i16(i16 %a, i16 %b) {
277 ; CHECK: and.b16 %rs{{[0-9]+}}, %rs{{[0-9]+}}, %rs{{[0-9]+}}
279 %ret = and i16 %a, %b
283 define i16 @or_i16(i16 %a, i16 %b) {
284 ; CHECK: or.b16 %rs{{[0-9]+}}, %rs{{[0-9]+}}, %rs{{[0-9]+}}
290 define i16 @xor_i16(i16 %a, i16 %b) {
291 ; CHECK: xor.b16 %rs{{[0-9]+}}, %rs{{[0-9]+}}, %rs{{[0-9]+}}
293 %ret = xor i16 %a, %b
297 define i16 @shl_i16(i16 %a, i16 %b) {
298 ; PTX requires 32-bit shift amount
299 ; CHECK: shl.b16 %rs{{[0-9]+}}, %rs{{[0-9]+}}, %r{{[0-9]+}}
301 %ret = shl i16 %a, %b
305 define i16 @ashr_i16(i16 %a, i16 %b) {
306 ; PTX requires 32-bit shift amount
307 ; CHECK: shr.s16 %rs{{[0-9]+}}, %rs{{[0-9]+}}, %r{{[0-9]+}}
309 %ret = ashr i16 %a, %b
313 define i16 @lshr_i16(i16 %a, i16 %b) {
314 ; PTX requires 32-bit shift amount
315 ; CHECK: shr.u16 %rs{{[0-9]+}}, %rs{{[0-9]+}}, %r{{[0-9]+}}
317 %ret = lshr i16 %a, %b