xref: /aosp_15_r20/external/llvm/test/CodeGen/ARM/smul.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; RUN: llc -mtriple=arm-eabi -mcpu=generic %s -o /dev/null
2*9880d681SAndroid Build Coastguard Worker; RUN: llc -mtriple=arm-eabi -mcpu=cortex-a8 %s -o - | FileCheck %s
3*9880d681SAndroid Build Coastguard Worker; RUN: llc -mtriple=thumb--none-eabi -mcpu=cortex-a8 %s -o - | FileCheck %s
4*9880d681SAndroid Build Coastguard Worker
5*9880d681SAndroid Build Coastguard Worker@x = weak global i16 0          ; <i16*> [#uses=1]
6*9880d681SAndroid Build Coastguard Worker@y = weak global i16 0          ; <i16*> [#uses=0]
7*9880d681SAndroid Build Coastguard Worker
8*9880d681SAndroid Build Coastguard Workerdefine i32 @f1(i32 %y) {
9*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f1:
10*9880d681SAndroid Build Coastguard Worker; CHECK: smulbt
11*9880d681SAndroid Build Coastguard Worker        %tmp = load i16, i16* @x             ; <i16> [#uses=1]
12*9880d681SAndroid Build Coastguard Worker        %tmp1 = add i16 %tmp, 2         ; <i16> [#uses=1]
13*9880d681SAndroid Build Coastguard Worker        %tmp2 = sext i16 %tmp1 to i32           ; <i32> [#uses=1]
14*9880d681SAndroid Build Coastguard Worker        %tmp3 = ashr i32 %y, 16         ; <i32> [#uses=1]
15*9880d681SAndroid Build Coastguard Worker        %tmp4 = mul i32 %tmp2, %tmp3            ; <i32> [#uses=1]
16*9880d681SAndroid Build Coastguard Worker        ret i32 %tmp4
17*9880d681SAndroid Build Coastguard Worker}
18*9880d681SAndroid Build Coastguard Worker
19*9880d681SAndroid Build Coastguard Workerdefine i32 @f2(i32 %x, i32 %y) {
20*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f2:
21*9880d681SAndroid Build Coastguard Worker; CHECK: smultt
22*9880d681SAndroid Build Coastguard Worker        %tmp1 = ashr i32 %x, 16         ; <i32> [#uses=1]
23*9880d681SAndroid Build Coastguard Worker        %tmp3 = ashr i32 %y, 16         ; <i32> [#uses=1]
24*9880d681SAndroid Build Coastguard Worker        %tmp4 = mul i32 %tmp3, %tmp1            ; <i32> [#uses=1]
25*9880d681SAndroid Build Coastguard Worker        ret i32 %tmp4
26*9880d681SAndroid Build Coastguard Worker}
27*9880d681SAndroid Build Coastguard Worker
28*9880d681SAndroid Build Coastguard Workerdefine i32 @f3(i32 %a, i16 %x, i32 %y) {
29*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f3:
30*9880d681SAndroid Build Coastguard Worker; CHECK: smlabt
31*9880d681SAndroid Build Coastguard Worker        %tmp = sext i16 %x to i32               ; <i32> [#uses=1]
32*9880d681SAndroid Build Coastguard Worker        %tmp2 = ashr i32 %y, 16         ; <i32> [#uses=1]
33*9880d681SAndroid Build Coastguard Worker        %tmp3 = mul i32 %tmp2, %tmp             ; <i32> [#uses=1]
34*9880d681SAndroid Build Coastguard Worker        %tmp5 = add i32 %tmp3, %a               ; <i32> [#uses=1]
35*9880d681SAndroid Build Coastguard Worker        ret i32 %tmp5
36*9880d681SAndroid Build Coastguard Worker}
37*9880d681SAndroid Build Coastguard Worker
38*9880d681SAndroid Build Coastguard Workerdefine i32 @f4(i32 %a, i32 %x, i32 %y) {
39*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f4:
40*9880d681SAndroid Build Coastguard Worker; CHECK: smlatt
41*9880d681SAndroid Build Coastguard Worker        %tmp1 = ashr i32 %x, 16
42*9880d681SAndroid Build Coastguard Worker        %tmp3 = ashr i32 %y, 16
43*9880d681SAndroid Build Coastguard Worker        %tmp4 = mul i32 %tmp3, %tmp1
44*9880d681SAndroid Build Coastguard Worker        %tmp5 = add i32 %tmp4, %a
45*9880d681SAndroid Build Coastguard Worker        ret i32 %tmp5
46*9880d681SAndroid Build Coastguard Worker}
47*9880d681SAndroid Build Coastguard Worker
48*9880d681SAndroid Build Coastguard Workerdefine i32 @f5(i32 %a, i16 %x, i16 %y) {
49*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f5:
50*9880d681SAndroid Build Coastguard Worker; CHECK: smlabb
51*9880d681SAndroid Build Coastguard Worker        %tmp1 = sext i16 %x to i32
52*9880d681SAndroid Build Coastguard Worker        %tmp3 = sext i16 %y to i32
53*9880d681SAndroid Build Coastguard Worker        %tmp4 = mul i32 %tmp3, %tmp1
54*9880d681SAndroid Build Coastguard Worker        %tmp5 = add i32 %tmp4, %a
55*9880d681SAndroid Build Coastguard Worker        ret i32 %tmp5
56*9880d681SAndroid Build Coastguard Worker}
57*9880d681SAndroid Build Coastguard Worker
58*9880d681SAndroid Build Coastguard Workerdefine i32 @f6(i32 %a, i16 %x, i32 %y) {
59*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f6:
60*9880d681SAndroid Build Coastguard Worker; CHECK: smlabt
61*9880d681SAndroid Build Coastguard Worker        %tmp1 = sext i16 %x to i32
62*9880d681SAndroid Build Coastguard Worker        %tmp3 = ashr i32 %y, 16
63*9880d681SAndroid Build Coastguard Worker        %tmp4 = mul i32 %tmp3, %tmp1
64*9880d681SAndroid Build Coastguard Worker        %tmp5 = add i32 %tmp4, %a
65*9880d681SAndroid Build Coastguard Worker        ret i32 %tmp5
66*9880d681SAndroid Build Coastguard Worker}
67*9880d681SAndroid Build Coastguard Worker
68*9880d681SAndroid Build Coastguard Workerdefine i32 @f7(i32 %a, i32 %b, i32 %c) {
69*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f7:
70*9880d681SAndroid Build Coastguard Worker; CHECK: smlawb
71*9880d681SAndroid Build Coastguard Worker        %shl = shl i32 %b, 16
72*9880d681SAndroid Build Coastguard Worker        %shr = ashr exact i32 %shl, 16
73*9880d681SAndroid Build Coastguard Worker        %conv = sext i32 %a to i64
74*9880d681SAndroid Build Coastguard Worker        %conv2 = sext i32 %shr to i64
75*9880d681SAndroid Build Coastguard Worker        %mul = mul nsw i64 %conv2, %conv
76*9880d681SAndroid Build Coastguard Worker        %shr49 = lshr i64 %mul, 16
77*9880d681SAndroid Build Coastguard Worker        %conv5 = trunc i64 %shr49 to i32
78*9880d681SAndroid Build Coastguard Worker        %add = add nsw i32 %conv5, %c
79*9880d681SAndroid Build Coastguard Worker        ret i32 %add
80*9880d681SAndroid Build Coastguard Worker}
81*9880d681SAndroid Build Coastguard Worker
82*9880d681SAndroid Build Coastguard Workerdefine i32 @f8(i32 %a, i16 signext %b, i32 %c) {
83*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f8:
84*9880d681SAndroid Build Coastguard Worker; CHECK: smlawb
85*9880d681SAndroid Build Coastguard Worker        %conv = sext i32 %a to i64
86*9880d681SAndroid Build Coastguard Worker        %conv1 = sext i16 %b to i64
87*9880d681SAndroid Build Coastguard Worker        %mul = mul nsw i64 %conv1, %conv
88*9880d681SAndroid Build Coastguard Worker        %shr5 = lshr i64 %mul, 16
89*9880d681SAndroid Build Coastguard Worker        %conv2 = trunc i64 %shr5 to i32
90*9880d681SAndroid Build Coastguard Worker        %add = add nsw i32 %conv2, %c
91*9880d681SAndroid Build Coastguard Worker        ret i32 %add
92*9880d681SAndroid Build Coastguard Worker}
93*9880d681SAndroid Build Coastguard Worker
94*9880d681SAndroid Build Coastguard Workerdefine i32 @f9(i32 %a, i32 %b, i32 %c) {
95*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f9:
96*9880d681SAndroid Build Coastguard Worker; CHECK: smlawt
97*9880d681SAndroid Build Coastguard Worker        %conv = sext i32 %a to i64
98*9880d681SAndroid Build Coastguard Worker        %shr = ashr i32 %b, 16
99*9880d681SAndroid Build Coastguard Worker        %conv1 = sext i32 %shr to i64
100*9880d681SAndroid Build Coastguard Worker        %mul = mul nsw i64 %conv1, %conv
101*9880d681SAndroid Build Coastguard Worker        %shr26 = lshr i64 %mul, 16
102*9880d681SAndroid Build Coastguard Worker        %conv3 = trunc i64 %shr26 to i32
103*9880d681SAndroid Build Coastguard Worker        %add = add nsw i32 %conv3, %c
104*9880d681SAndroid Build Coastguard Worker        ret i32 %add
105*9880d681SAndroid Build Coastguard Worker}
106*9880d681SAndroid Build Coastguard Worker
107*9880d681SAndroid Build Coastguard Workerdefine i32 @f10(i32 %a, i32 %b, i32 %c) {
108*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f10:
109*9880d681SAndroid Build Coastguard Worker; CHECK: smulwb
110*9880d681SAndroid Build Coastguard Worker        %shl = shl i32 %b, 16
111*9880d681SAndroid Build Coastguard Worker        %shr = ashr exact i32 %shl, 16
112*9880d681SAndroid Build Coastguard Worker        %conv = sext i32 %a to i64
113*9880d681SAndroid Build Coastguard Worker        %conv2 = sext i32 %shr to i64
114*9880d681SAndroid Build Coastguard Worker        %mul = mul nsw i64 %conv2, %conv
115*9880d681SAndroid Build Coastguard Worker        %shr37 = lshr i64 %mul, 16
116*9880d681SAndroid Build Coastguard Worker        %conv4 = trunc i64 %shr37 to i32
117*9880d681SAndroid Build Coastguard Worker        ret i32 %conv4
118*9880d681SAndroid Build Coastguard Worker}
119*9880d681SAndroid Build Coastguard Worker
120*9880d681SAndroid Build Coastguard Workerdefine i32 @f11(i32 %a, i16 signext %b, i32 %c) {
121*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f11:
122*9880d681SAndroid Build Coastguard Worker; CHECK: smulwb
123*9880d681SAndroid Build Coastguard Worker        %conv = sext i32 %a to i64
124*9880d681SAndroid Build Coastguard Worker        %conv1 = sext i16 %b to i64
125*9880d681SAndroid Build Coastguard Worker        %mul = mul nsw i64 %conv1, %conv
126*9880d681SAndroid Build Coastguard Worker        %shr4 = lshr i64 %mul, 16
127*9880d681SAndroid Build Coastguard Worker        %conv2 = trunc i64 %shr4 to i32
128*9880d681SAndroid Build Coastguard Worker        ret i32 %conv2
129*9880d681SAndroid Build Coastguard Worker}
130*9880d681SAndroid Build Coastguard Worker
131*9880d681SAndroid Build Coastguard Workerdefine i32 @f12(i32 %a, i32 %b, i32 %c) {
132*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f12:
133*9880d681SAndroid Build Coastguard Worker; CHECK: smulwt
134*9880d681SAndroid Build Coastguard Worker        %conv = sext i32 %a to i64
135*9880d681SAndroid Build Coastguard Worker        %shr = ashr i32 %b, 16
136*9880d681SAndroid Build Coastguard Worker        %conv1 = sext i32 %shr to i64
137*9880d681SAndroid Build Coastguard Worker        %mul = mul nsw i64 %conv1, %conv
138*9880d681SAndroid Build Coastguard Worker        %shr25 = lshr i64 %mul, 16
139*9880d681SAndroid Build Coastguard Worker        %conv3 = trunc i64 %shr25 to i32
140*9880d681SAndroid Build Coastguard Worker        ret i32 %conv3
141*9880d681SAndroid Build Coastguard Worker}
142