xref: /llvm-project/llvm/test/CodeGen/NVPTX/mulwide.ll (revision b279f6b098d3849f7f1c1f539b108307d5f8ae2d)
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