1; RUN: llc < %s -mtriple=nvptx64 -mcpu=sm_20 -O3 | FileCheck %s --check-prefix=OPT 2; RUN: llc < %s -mtriple=nvptx64 -mcpu=sm_20 -O0 | FileCheck %s --check-prefix=NOOPT 3; RUN: %if ptxas %{ llc < %s -mtriple=nvptx64 -mcpu=sm_20 -O3 | %ptxas-verify %} 4; RUN: %if ptxas %{ llc < %s -mtriple=nvptx64 -mcpu=sm_20 -O0 | %ptxas-verify %} 5 6; OPT-LABEL: @mulwide16 7; NOOPT-LABEL: @mulwide16 8define i32 @mulwide16(i16 %a, i16 %b) { 9; OPT: mul.wide.s16 10; NOOPT: mul.lo.s32 11 %val0 = sext i16 %a to i32 12 %val1 = sext i16 %b to i32 13 %val2 = mul i32 %val0, %val1 14 ret i32 %val2 15} 16 17; OPT-LABEL: @mulwideu16 18; NOOPT-LABEL: @mulwideu16 19define i32 @mulwideu16(i16 %a, i16 %b) { 20; OPT: mul.wide.u16 21; NOOPT: mul.lo.s32 22 %val0 = zext i16 %a to i32 23 %val1 = zext i16 %b to i32 24 %val2 = mul i32 %val0, %val1 25 ret i32 %val2 26} 27 28; OPT-LABEL: @mulwide8 29; NOOPT-LABEL: @mulwide8 30define i32 @mulwide8(i8 %a, i8 %b) { 31; OPT: mul.wide.s16 32; NOOPT: mul.lo.s32 33 %val0 = sext i8 %a to i32 34 %val1 = sext i8 %b to i32 35 %val2 = mul i32 %val0, %val1 36 ret i32 %val2 37} 38 39; OPT-LABEL: @mulwideu8 40; NOOPT-LABEL: @mulwideu8 41define i32 @mulwideu8(i8 %a, i8 %b) { 42; OPT: mul.wide.u16 43; NOOPT: mul.lo.s32 44 %val0 = zext i8 %a to i32 45 %val1 = zext i8 %b to i32 46 %val2 = mul i32 %val0, %val1 47 ret i32 %val2 48} 49 50; OPT-LABEL: @mulwide32 51; NOOPT-LABEL: @mulwide32 52define i64 @mulwide32(i32 %a, i32 %b) { 53; OPT: mul.wide.s32 54; NOOPT: mul.lo.s64 55 %val0 = sext i32 %a to i64 56 %val1 = sext i32 %b to i64 57 %val2 = mul i64 %val0, %val1 58 ret i64 %val2 59} 60 61; OPT-LABEL: @mulwideu32 62; NOOPT-LABEL: @mulwideu32 63define i64 @mulwideu32(i32 %a, i32 %b) { 64; OPT: mul.wide.u32 65; NOOPT: mul.lo.s64 66 %val0 = zext i32 %a to i64 67 %val1 = zext i32 %b to i64 68 %val2 = mul i64 %val0, %val1 69 ret i64 %val2 70} 71 72; OPT-LABEL: @mulwideu7 73; NOOPT-LABEL: @mulwideu7 74define i64 @mulwideu7(i7 %a, i7 %b) { 75; OPT: mul.wide.u32 76; NOOPT: mul.lo.s64 77 %val0 = zext i7 %a to i64 78 %val1 = zext i7 %b to i64 79 %val2 = mul i64 %val0, %val1 80 ret i64 %val2 81} 82 83; OPT-LABEL: @mulwides7 84; NOOPT-LABEL: @mulwides7 85define i64 @mulwides7(i7 %a, i7 %b) { 86; OPT: mul.wide.s32 87; NOOPT: mul.lo.s64 88 %val0 = sext i7 %a to i64 89 %val1 = sext i7 %b to i64 90 %val2 = mul i64 %val0, %val1 91 ret i64 %val2 92} 93 94; OPT-LABEL: @shl30 95; NOOPT-LABEL: @shl30 96define i64 @shl30(i32 %a) { 97; OPT: mul.wide 98; NOOPT: shl.b64 99 %conv = sext i32 %a to i64 100 %shl = shl i64 %conv, 30 101 ret i64 %shl 102} 103 104; OPT-LABEL: @shl31 105; NOOPT-LABEL: @shl31 106define i64 @shl31(i32 %a) { 107; OPT-NOT: mul.wide 108; NOOPT-NOT: mul.wide 109 %conv = sext i32 %a to i64 110 %shl = shl i64 %conv, 31 111 ret i64 %shl 112} 113