343 lines · plain
1; RUN: llc < %s -mtriple=nvptx -mcpu=sm_20 | FileCheck %s2; RUN: llc < %s -mtriple=nvptx64 -mcpu=sm_20 | FileCheck %s3; RUN: %if ptxas-ptr32 %{ llc < %s -mtriple=nvptx -mcpu=sm_20 | %ptxas-verify %}4; RUN: %if ptxas %{ llc < %s -mtriple=nvptx64 -mcpu=sm_20 | %ptxas-verify %}5 6;; These tests should run for all targets7 8;;===-- Basic instruction selection tests ---------------------------------===;;9 10 11;;; i6412 13define i64 @add_i64(i64 %a, i64 %b) {14; CHECK: add.s64 %rd{{[0-9]+}}, %rd{{[0-9]+}}, %rd{{[0-9]+}}15; CHECK: ret16 %ret = add i64 %a, %b17 ret i64 %ret18}19 20define i64 @sub_i64(i64 %a, i64 %b) {21; CHECK: sub.s64 %rd{{[0-9]+}}, %rd{{[0-9]+}}, %rd{{[0-9]+}}22; CHECK: ret23 %ret = sub i64 %a, %b24 ret i64 %ret25}26 27define i64 @mul_i64(i64 %a, i64 %b) {28; CHECK: mul.lo.s64 %rd{{[0-9]+}}, %rd{{[0-9]+}}, %rd{{[0-9]+}}29; CHECK: ret30 %ret = mul i64 %a, %b31 ret i64 %ret32}33 34define i64 @umul_lohi_i64(i64 %a) {35; CHECK-LABEL: umul_lohi_i64(36entry:37 %0 = zext i64 %a to i12838 %1 = mul i128 %0, 28839; CHECK: mul.lo.{{u|s}}6440; CHECK: mul.hi.{{u|s}}6441 %2 = lshr i128 %1, 142 %3 = trunc i128 %2 to i6443 ret i64 %344}45 46define i64 @smul_lohi_i64(i64 %a) {47; CHECK-LABEL: smul_lohi_i64(48entry:49 %0 = sext i64 %a to i12850 %1 = mul i128 %0, 28851; CHECK: mul.lo.{{u|s}}6452; CHECK: mul.hi.{{u|s}}6453 %2 = ashr i128 %1, 154 %3 = trunc i128 %2 to i6455 ret i64 %356}57 58define i64 @sdiv_i64(i64 %a, i64 %b) {59; CHECK: div.s64 %rd{{[0-9]+}}, %rd{{[0-9]+}}, %rd{{[0-9]+}}60; CHECK: ret61 %ret = sdiv i64 %a, %b62 ret i64 %ret63}64 65define i64 @udiv_i64(i64 %a, i64 %b) {66; CHECK: div.u64 %rd{{[0-9]+}}, %rd{{[0-9]+}}, %rd{{[0-9]+}}67; CHECK: ret68 %ret = udiv i64 %a, %b69 ret i64 %ret70}71 72define i64 @srem_i64(i64 %a, i64 %b) {73; CHECK: rem.s64 %rd{{[0-9]+}}, %rd{{[0-9]+}}, %rd{{[0-9]+}}74; CHECK: ret75 %ret = srem i64 %a, %b76 ret i64 %ret77}78 79define i64 @urem_i64(i64 %a, i64 %b) {80; CHECK: rem.u64 %rd{{[0-9]+}}, %rd{{[0-9]+}}, %rd{{[0-9]+}}81; CHECK: ret82 %ret = urem i64 %a, %b83 ret i64 %ret84}85 86define i64 @and_i64(i64 %a, i64 %b) {87; CHECK: and.b64 %rd{{[0-9]+}}, %rd{{[0-9]+}}, %rd{{[0-9]+}}88; CHECK: ret89 %ret = and i64 %a, %b90 ret i64 %ret91}92 93define i64 @or_i64(i64 %a, i64 %b) {94; CHECK: or.b64 %rd{{[0-9]+}}, %rd{{[0-9]+}}, %rd{{[0-9]+}}95; CHECK: ret96 %ret = or i64 %a, %b97 ret i64 %ret98}99 100define i64 @xor_i64(i64 %a, i64 %b) {101; CHECK: xor.b64 %rd{{[0-9]+}}, %rd{{[0-9]+}}, %rd{{[0-9]+}}102; CHECK: ret103 %ret = xor i64 %a, %b104 ret i64 %ret105}106 107define i64 @shl_i64(i64 %a, i64 %b) {108; PTX requires 32-bit shift amount109; CHECK: shl.b64 %rd{{[0-9]+}}, %rd{{[0-9]+}}, %r{{[0-9]+}}110; CHECK: ret111 %ret = shl i64 %a, %b112 ret i64 %ret113}114 115define i64 @ashr_i64(i64 %a, i64 %b) {116; PTX requires 32-bit shift amount117; CHECK: shr.s64 %rd{{[0-9]+}}, %rd{{[0-9]+}}, %r{{[0-9]+}}118; CHECK: ret119 %ret = ashr i64 %a, %b120 ret i64 %ret121}122 123define i64 @lshr_i64(i64 %a, i64 %b) {124; PTX requires 32-bit shift amount125; CHECK: shr.u64 %rd{{[0-9]+}}, %rd{{[0-9]+}}, %r{{[0-9]+}}126; CHECK: ret127 %ret = lshr i64 %a, %b128 ret i64 %ret129}130 131 132;;; i32133 134define i32 @add_i32(i32 %a, i32 %b) {135; CHECK: add.s32 %r{{[0-9]+}}, %r{{[0-9]+}}, %r{{[0-9]+}}136; CHECK: ret137 %ret = add i32 %a, %b138 ret i32 %ret139}140 141define i32 @sub_i32(i32 %a, i32 %b) {142; CHECK: sub.s32 %r{{[0-9]+}}, %r{{[0-9]+}}, %r{{[0-9]+}}143; CHECK: ret144 %ret = sub i32 %a, %b145 ret i32 %ret146}147 148define i32 @mul_i32(i32 %a, i32 %b) {149; CHECK: mul.lo.s32 %r{{[0-9]+}}, %r{{[0-9]+}}, %r{{[0-9]+}}150; CHECK: ret151 %ret = mul i32 %a, %b152 ret i32 %ret153}154 155define i32 @sdiv_i32(i32 %a, i32 %b) {156; CHECK: div.s32 %r{{[0-9]+}}, %r{{[0-9]+}}, %r{{[0-9]+}}157; CHECK: ret158 %ret = sdiv i32 %a, %b159 ret i32 %ret160}161 162define i32 @udiv_i32(i32 %a, i32 %b) {163; CHECK: div.u32 %r{{[0-9]+}}, %r{{[0-9]+}}, %r{{[0-9]+}}164; CHECK: ret165 %ret = udiv i32 %a, %b166 ret i32 %ret167}168 169define i32 @srem_i32(i32 %a, i32 %b) {170; CHECK: rem.s32 %r{{[0-9]+}}, %r{{[0-9]+}}, %r{{[0-9]+}}171; CHECK: ret172 %ret = srem i32 %a, %b173 ret i32 %ret174}175 176define i32 @urem_i32(i32 %a, i32 %b) {177; CHECK: rem.u32 %r{{[0-9]+}}, %r{{[0-9]+}}, %r{{[0-9]+}}178; CHECK: ret179 %ret = urem i32 %a, %b180 ret i32 %ret181}182 183define i32 @and_i32(i32 %a, i32 %b) {184; CHECK: and.b32 %r{{[0-9]+}}, %r{{[0-9]+}}, %r{{[0-9]+}}185; CHECK: ret186 %ret = and i32 %a, %b187 ret i32 %ret188}189 190define i32 @or_i32(i32 %a, i32 %b) {191; CHECK: or.b32 %r{{[0-9]+}}, %r{{[0-9]+}}, %r{{[0-9]+}}192; CHECK: ret193 %ret = or i32 %a, %b194 ret i32 %ret195}196 197define i32 @xor_i32(i32 %a, i32 %b) {198; CHECK: xor.b32 %r{{[0-9]+}}, %r{{[0-9]+}}, %r{{[0-9]+}}199; CHECK: ret200 %ret = xor i32 %a, %b201 ret i32 %ret202}203 204define i32 @shl_i32(i32 %a, i32 %b) {205; CHECK: shl.b32 %r{{[0-9]+}}, %r{{[0-9]+}}, %r{{[0-9]+}}206; CHECK: ret207 %ret = shl i32 %a, %b208 ret i32 %ret209}210 211define i32 @ashr_i32(i32 %a, i32 %b) {212; CHECK: shr.s32 %r{{[0-9]+}}, %r{{[0-9]+}}, %r{{[0-9]+}}213; CHECK: ret214 %ret = ashr i32 %a, %b215 ret i32 %ret216}217 218define i32 @lshr_i32(i32 %a, i32 %b) {219; CHECK: shr.u32 %r{{[0-9]+}}, %r{{[0-9]+}}, %r{{[0-9]+}}220; CHECK: ret221 %ret = lshr i32 %a, %b222 ret i32 %ret223}224 225;;; i16226 227define i16 @add_i16(i16 %a, i16 %b) {228; CHECK: add.s16 %rs{{[0-9]+}}, %rs{{[0-9]+}}, %rs{{[0-9]+}}229; CHECK: ret230 %ret = add i16 %a, %b231 ret i16 %ret232}233 234define i16 @sub_i16(i16 %a, i16 %b) {235; CHECK: sub.s16 %rs{{[0-9]+}}, %rs{{[0-9]+}}, %rs{{[0-9]+}}236; CHECK: ret237 %ret = sub i16 %a, %b238 ret i16 %ret239}240 241define i16 @mul_i16(i16 %a, i16 %b) {242; CHECK: mul.lo.s16 %rs{{[0-9]+}}, %rs{{[0-9]+}}, %rs{{[0-9]+}}243; CHECK: ret244 %ret = mul i16 %a, %b245 ret i16 %ret246}247 248define i16 @sdiv_i16(i16 %a, i16 %b) {249; CHECK: div.s16 %rs{{[0-9]+}}, %rs{{[0-9]+}}, %rs{{[0-9]+}}250; CHECK: ret251 %ret = sdiv i16 %a, %b252 ret i16 %ret253}254 255define i16 @udiv_i16(i16 %a, i16 %b) {256; CHECK: div.u16 %rs{{[0-9]+}}, %rs{{[0-9]+}}, %rs{{[0-9]+}}257; CHECK: ret258 %ret = udiv i16 %a, %b259 ret i16 %ret260}261 262define i16 @srem_i16(i16 %a, i16 %b) {263; CHECK: rem.s16 %rs{{[0-9]+}}, %rs{{[0-9]+}}, %rs{{[0-9]+}}264; CHECK: ret265 %ret = srem i16 %a, %b266 ret i16 %ret267}268 269define i16 @urem_i16(i16 %a, i16 %b) {270; CHECK: rem.u16 %rs{{[0-9]+}}, %rs{{[0-9]+}}, %rs{{[0-9]+}}271; CHECK: ret272 %ret = urem i16 %a, %b273 ret i16 %ret274}275 276define i16 @and_i16(i16 %a, i16 %b) {277; CHECK: and.b16 %rs{{[0-9]+}}, %rs{{[0-9]+}}, %rs{{[0-9]+}}278; CHECK: ret279 %ret = and i16 %a, %b280 ret i16 %ret281}282 283define i16 @or_i16(i16 %a, i16 %b) {284; CHECK: or.b16 %rs{{[0-9]+}}, %rs{{[0-9]+}}, %rs{{[0-9]+}}285; CHECK: ret286 %ret = or i16 %a, %b287 ret i16 %ret288}289 290define i16 @xor_i16(i16 %a, i16 %b) {291; CHECK: xor.b16 %rs{{[0-9]+}}, %rs{{[0-9]+}}, %rs{{[0-9]+}}292; CHECK: ret293 %ret = xor i16 %a, %b294 ret i16 %ret295}296 297define i16 @shl_i16(i16 %a, i16 %b) {298; PTX requires 32-bit shift amount299; CHECK: shl.b16 %rs{{[0-9]+}}, %rs{{[0-9]+}}, %r{{[0-9]+}}300; CHECK: ret301 %ret = shl i16 %a, %b302 ret i16 %ret303}304 305define i16 @ashr_i16(i16 %a, i16 %b) {306; PTX requires 32-bit shift amount307; CHECK: shr.s16 %rs{{[0-9]+}}, %rs{{[0-9]+}}, %r{{[0-9]+}}308; CHECK: ret309 %ret = ashr i16 %a, %b310 ret i16 %ret311}312 313define i16 @lshr_i16(i16 %a, i16 %b) {314; PTX requires 32-bit shift amount315; CHECK: shr.u16 %rs{{[0-9]+}}, %rs{{[0-9]+}}, %r{{[0-9]+}}316; CHECK: ret317 %ret = lshr i16 %a, %b318 ret i16 %ret319}320 321;; Immediate cases322 323define i16 @srem_i16_ir(i16 %a) {324; CHECK: rem.s16 %rs{{[0-9]+}}, 12, %rs{{[0-9]+}}325; CHECK: ret326 %ret = srem i16 12, %a327 ret i16 %ret328}329 330define i32 @udiv_i32_ir(i32 %a) {331; CHECK: div.u32 %r{{[0-9]+}}, 34, %r{{[0-9]+}}332; CHECK: ret333 %ret = udiv i32 34, %a334 ret i32 %ret335}336 337define i64 @sub_i64_ir(i64 %a) {338; CHECK: sub.s64 %rd{{[0-9]+}}, 56, %rd{{[0-9]+}}339; CHECK: ret340 %ret = sub i64 56, %a341 ret i64 %ret342}343