Bump version to 19.1.0-rc3
[llvm-project.git] / llvm / test / CodeGen / NVPTX / mulwide.ll
blob77c21564c8aa76ad66d74084c8159fd5a9428883
1 ; RUN: llc < %s -march=nvptx64 -mcpu=sm_20 -O3 | FileCheck %s --check-prefix=OPT
2 ; RUN: llc < %s -march=nvptx64 -mcpu=sm_20 -O0 | FileCheck %s --check-prefix=NOOPT
3 ; RUN: %if ptxas %{ llc < %s -march=nvptx64 -mcpu=sm_20 -O3 | %ptxas-verify %}
4 ; RUN: %if ptxas %{ llc < %s -march=nvptx64 -mcpu=sm_20 -O0 | %ptxas-verify %}
6 ; OPT-LABEL: @mulwide16
7 ; NOOPT-LABEL: @mulwide16
8 define 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
17 ; OPT-LABEL: @mulwideu16
18 ; NOOPT-LABEL: @mulwideu16
19 define 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
28 ; OPT-LABEL: @mulwide8
29 ; NOOPT-LABEL: @mulwide8
30 define 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
39 ; OPT-LABEL: @mulwideu8
40 ; NOOPT-LABEL: @mulwideu8
41 define 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
50 ; OPT-LABEL: @mulwide32
51 ; NOOPT-LABEL: @mulwide32
52 define 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
61 ; OPT-LABEL: @mulwideu32
62 ; NOOPT-LABEL: @mulwideu32
63 define 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
72 ; OPT-LABEL: @mulwideu7
73 ; NOOPT-LABEL: @mulwideu7
74 define 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
83 ; OPT-LABEL: @mulwides7
84 ; NOOPT-LABEL: @mulwides7
85 define 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
94 ; OPT-LABEL: @shl30
95 ; NOOPT-LABEL: @shl30
96 define 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
104 ; OPT-LABEL: @shl31
105 ; NOOPT-LABEL: @shl31
106 define 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