1 ; RUN: llc < %s -march=nvptx -mcpu=sm_20 | FileCheck %s
2 ; RUN: llc < %s -march=nvptx64 -mcpu=sm_20 | FileCheck %s
4 ;; These tests should run for all targets
6 ;;===-- Basic instruction selection tests ---------------------------------===;;
11 define i64 @add_i64(i64 %a, i64 %b) {
12 ; CHECK: add.s64 %rl{{[0-9]+}}, %rl{{[0-9]+}}, %rl{{[0-9]+}}
18 define i64 @sub_i64(i64 %a, i64 %b) {
19 ; CHECK: sub.s64 %rl{{[0-9]+}}, %rl{{[0-9]+}}, %rl{{[0-9]+}}
25 define i64 @mul_i64(i64 %a, i64 %b) {
26 ; CHECK: mul.lo.s64 %rl{{[0-9]+}}, %rl{{[0-9]+}}, %rl{{[0-9]+}}
32 define i64 @sdiv_i64(i64 %a, i64 %b) {
33 ; CHECK: div.s64 %rl{{[0-9]+}}, %rl{{[0-9]+}}, %rl{{[0-9]+}}
35 %ret = sdiv i64 %a, %b
39 define i64 @udiv_i64(i64 %a, i64 %b) {
40 ; CHECK: div.u64 %rl{{[0-9]+}}, %rl{{[0-9]+}}, %rl{{[0-9]+}}
42 %ret = udiv i64 %a, %b
46 define i64 @srem_i64(i64 %a, i64 %b) {
47 ; CHECK: rem.s64 %rl{{[0-9]+}}, %rl{{[0-9]+}}, %rl{{[0-9]+}}
49 %ret = srem i64 %a, %b
53 define i64 @urem_i64(i64 %a, i64 %b) {
54 ; CHECK: rem.u64 %rl{{[0-9]+}}, %rl{{[0-9]+}}, %rl{{[0-9]+}}
56 %ret = urem i64 %a, %b
60 define i64 @and_i64(i64 %a, i64 %b) {
61 ; CHECK: and.b64 %rl{{[0-9]+}}, %rl{{[0-9]+}}, %rl{{[0-9]+}}
67 define i64 @or_i64(i64 %a, i64 %b) {
68 ; CHECK: or.b64 %rl{{[0-9]+}}, %rl{{[0-9]+}}, %rl{{[0-9]+}}
74 define i64 @xor_i64(i64 %a, i64 %b) {
75 ; CHECK: xor.b64 %rl{{[0-9]+}}, %rl{{[0-9]+}}, %rl{{[0-9]+}}
81 define i64 @shl_i64(i64 %a, i64 %b) {
82 ; PTX requires 32-bit shift amount
83 ; CHECK: shl.b64 %rl{{[0-9]+}}, %rl{{[0-9]+}}, %r{{[0-9]+}}
89 define i64 @ashr_i64(i64 %a, i64 %b) {
90 ; PTX requires 32-bit shift amount
91 ; CHECK: shr.s64 %rl{{[0-9]+}}, %rl{{[0-9]+}}, %r{{[0-9]+}}
93 %ret = ashr i64 %a, %b
97 define i64 @lshr_i64(i64 %a, i64 %b) {
98 ; PTX requires 32-bit shift amount
99 ; CHECK: shr.u64 %rl{{[0-9]+}}, %rl{{[0-9]+}}, %r{{[0-9]+}}
101 %ret = lshr i64 %a, %b
108 define i32 @add_i32(i32 %a, i32 %b) {
109 ; CHECK: add.s32 %r{{[0-9]+}}, %r{{[0-9]+}}, %r{{[0-9]+}}
111 %ret = add i32 %a, %b
115 define i32 @sub_i32(i32 %a, i32 %b) {
116 ; CHECK: sub.s32 %r{{[0-9]+}}, %r{{[0-9]+}}, %r{{[0-9]+}}
118 %ret = sub i32 %a, %b
122 define i32 @mul_i32(i32 %a, i32 %b) {
123 ; CHECK: mul.lo.s32 %r{{[0-9]+}}, %r{{[0-9]+}}, %r{{[0-9]+}}
125 %ret = mul i32 %a, %b
129 define i32 @sdiv_i32(i32 %a, i32 %b) {
130 ; CHECK: div.s32 %r{{[0-9]+}}, %r{{[0-9]+}}, %r{{[0-9]+}}
132 %ret = sdiv i32 %a, %b
136 define i32 @udiv_i32(i32 %a, i32 %b) {
137 ; CHECK: div.u32 %r{{[0-9]+}}, %r{{[0-9]+}}, %r{{[0-9]+}}
139 %ret = udiv i32 %a, %b
143 define i32 @srem_i32(i32 %a, i32 %b) {
144 ; CHECK: rem.s32 %r{{[0-9]+}}, %r{{[0-9]+}}, %r{{[0-9]+}}
146 %ret = srem i32 %a, %b
150 define i32 @urem_i32(i32 %a, i32 %b) {
151 ; CHECK: rem.u32 %r{{[0-9]+}}, %r{{[0-9]+}}, %r{{[0-9]+}}
153 %ret = urem i32 %a, %b
157 define i32 @and_i32(i32 %a, i32 %b) {
158 ; CHECK: and.b32 %r{{[0-9]+}}, %r{{[0-9]+}}, %r{{[0-9]+}}
160 %ret = and i32 %a, %b
164 define i32 @or_i32(i32 %a, i32 %b) {
165 ; CHECK: or.b32 %r{{[0-9]+}}, %r{{[0-9]+}}, %r{{[0-9]+}}
171 define i32 @xor_i32(i32 %a, i32 %b) {
172 ; CHECK: xor.b32 %r{{[0-9]+}}, %r{{[0-9]+}}, %r{{[0-9]+}}
174 %ret = xor i32 %a, %b
178 define i32 @shl_i32(i32 %a, i32 %b) {
179 ; CHECK: shl.b32 %r{{[0-9]+}}, %r{{[0-9]+}}, %r{{[0-9]+}}
181 %ret = shl i32 %a, %b
185 define i32 @ashr_i32(i32 %a, i32 %b) {
186 ; CHECK: shr.s32 %r{{[0-9]+}}, %r{{[0-9]+}}, %r{{[0-9]+}}
188 %ret = ashr i32 %a, %b
192 define i32 @lshr_i32(i32 %a, i32 %b) {
193 ; CHECK: shr.u32 %r{{[0-9]+}}, %r{{[0-9]+}}, %r{{[0-9]+}}
195 %ret = lshr i32 %a, %b
201 define i16 @add_i16(i16 %a, i16 %b) {
202 ; CHECK: add.s16 %rs{{[0-9]+}}, %rs{{[0-9]+}}, %rs{{[0-9]+}}
204 %ret = add i16 %a, %b
208 define i16 @sub_i16(i16 %a, i16 %b) {
209 ; CHECK: sub.s16 %rs{{[0-9]+}}, %rs{{[0-9]+}}, %rs{{[0-9]+}}
211 %ret = sub i16 %a, %b
215 define i16 @mul_i16(i16 %a, i16 %b) {
216 ; CHECK: mul.lo.s16 %rs{{[0-9]+}}, %rs{{[0-9]+}}, %rs{{[0-9]+}}
218 %ret = mul i16 %a, %b
222 define i16 @sdiv_i16(i16 %a, i16 %b) {
223 ; CHECK: div.s16 %rs{{[0-9]+}}, %rs{{[0-9]+}}, %rs{{[0-9]+}}
225 %ret = sdiv i16 %a, %b
229 define i16 @udiv_i16(i16 %a, i16 %b) {
230 ; CHECK: div.u16 %rs{{[0-9]+}}, %rs{{[0-9]+}}, %rs{{[0-9]+}}
232 %ret = udiv i16 %a, %b
236 define i16 @srem_i16(i16 %a, i16 %b) {
237 ; CHECK: rem.s16 %rs{{[0-9]+}}, %rs{{[0-9]+}}, %rs{{[0-9]+}}
239 %ret = srem i16 %a, %b
243 define i16 @urem_i16(i16 %a, i16 %b) {
244 ; CHECK: rem.u16 %rs{{[0-9]+}}, %rs{{[0-9]+}}, %rs{{[0-9]+}}
246 %ret = urem i16 %a, %b
250 define i16 @and_i16(i16 %a, i16 %b) {
251 ; CHECK: and.b16 %rs{{[0-9]+}}, %rs{{[0-9]+}}, %rs{{[0-9]+}}
253 %ret = and i16 %a, %b
257 define i16 @or_i16(i16 %a, i16 %b) {
258 ; CHECK: or.b16 %rs{{[0-9]+}}, %rs{{[0-9]+}}, %rs{{[0-9]+}}
264 define i16 @xor_i16(i16 %a, i16 %b) {
265 ; CHECK: xor.b16 %rs{{[0-9]+}}, %rs{{[0-9]+}}, %rs{{[0-9]+}}
267 %ret = xor i16 %a, %b
271 define 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]+}}
275 %ret = shl i16 %a, %b
279 define 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]+}}
283 %ret = ashr i16 %a, %b
287 define 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]+}}
291 %ret = lshr i16 %a, %b