xref: /aosp_15_r20/external/llvm/test/CodeGen/Mips/madd-msub.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; RUN: llc -march=mips -mcpu=mips32   < %s | FileCheck %s -check-prefixes=ALL,32
2*9880d681SAndroid Build Coastguard Worker; RUN: llc -march=mips -mcpu=mips32r2 < %s | FileCheck %s -check-prefixes=ALL,32
3*9880d681SAndroid Build Coastguard Worker; RUN: llc -march=mips -mcpu=mips32r6 < %s | FileCheck %s -check-prefixes=ALL,32R6
4*9880d681SAndroid Build Coastguard Worker; RUN: llc -march=mips -mcpu=mips32 -mattr=dsp < %s | FileCheck %s -check-prefix=DSP
5*9880d681SAndroid Build Coastguard Worker; RUN: llc -march=mips -mcpu=mips64   -target-abi n64 < %s | FileCheck %s -check-prefixes=ALL,64
6*9880d681SAndroid Build Coastguard Worker; RUN: llc -march=mips -mcpu=mips64r2 -target-abi n64 < %s | FileCheck %s -check-prefixes=ALL,64
7*9880d681SAndroid Build Coastguard Worker; RUN: llc -march=mips -mcpu=mips64r6 -target-abi n64 < %s | FileCheck %s -check-prefixes=ALL,64R6
8*9880d681SAndroid Build Coastguard Worker
9*9880d681SAndroid Build Coastguard Worker; FIXME: The MIPS16 test should check its output
10*9880d681SAndroid Build Coastguard Worker; RUN: llc -march=mips -mattr=mips16 < %s
11*9880d681SAndroid Build Coastguard Worker
12*9880d681SAndroid Build Coastguard Worker; ALL-LABEL: madd1:
13*9880d681SAndroid Build Coastguard Worker
14*9880d681SAndroid Build Coastguard Worker; 32-DAG:        sra $[[T0:[0-9]+]], $6, 31
15*9880d681SAndroid Build Coastguard Worker; 32-DAG:        mtlo $6
16*9880d681SAndroid Build Coastguard Worker; 32-DAG:        [[m:m]]add ${{[45]}}, ${{[45]}}
17*9880d681SAndroid Build Coastguard Worker; 32-DAG:        [[m]]fhi $2
18*9880d681SAndroid Build Coastguard Worker; 32-DAG:        [[m]]flo $3
19*9880d681SAndroid Build Coastguard Worker
20*9880d681SAndroid Build Coastguard Worker; DSP-DAG:       sra $[[T0:[0-9]+]], $6, 31
21*9880d681SAndroid Build Coastguard Worker; DSP-DAG:       mtlo $6, $[[AC:ac[0-3]+]]
22*9880d681SAndroid Build Coastguard Worker; DSP-DAG:       madd $[[AC]], ${{[45]}}, ${{[45]}}
23*9880d681SAndroid Build Coastguard Worker; DSP-DAG:       mfhi $2, $[[AC]]
24*9880d681SAndroid Build Coastguard Worker; DSP-DAG:       mflo $3, $[[AC]]
25*9880d681SAndroid Build Coastguard Worker
26*9880d681SAndroid Build Coastguard Worker; 32R6-DAG:      mul  $[[T0:[0-9]+]], ${{[45]}}, ${{[45]}}
27*9880d681SAndroid Build Coastguard Worker; 32R6-DAG:      addu $[[T1:[0-9]+]], $[[T0]], $6
28*9880d681SAndroid Build Coastguard Worker; 32R6-DAG:      sltu $[[T2:[0-9]+]], $[[T1]], $6
29*9880d681SAndroid Build Coastguard Worker; 32R6-DAG:      sra  $[[T3:[0-9]+]], $6, 31
30*9880d681SAndroid Build Coastguard Worker; 32R6-DAG:      addu $[[T4:[0-9]+]], $[[T2]], $[[T3]]
31*9880d681SAndroid Build Coastguard Worker; 32R6-DAG:      muh  $[[T5:[0-9]+]], ${{[45]}}, ${{[45]}}
32*9880d681SAndroid Build Coastguard Worker; 32R6-DAG:      addu $2, $[[T5]], $[[T4]]
33*9880d681SAndroid Build Coastguard Worker
34*9880d681SAndroid Build Coastguard Worker; 64-DAG:        sll $[[T0:[0-9]+]], $4, 0
35*9880d681SAndroid Build Coastguard Worker; 64-DAG:        sll $[[T1:[0-9]+]], $5, 0
36*9880d681SAndroid Build Coastguard Worker; 64-DAG:        d[[m:m]]ult $[[T1]], $[[T0]]
37*9880d681SAndroid Build Coastguard Worker; 64-DAG:        [[m]]flo $[[T2:[0-9]+]]
38*9880d681SAndroid Build Coastguard Worker; 64-DAG:        sll $[[T3:[0-9]+]], $6, 0
39*9880d681SAndroid Build Coastguard Worker; 64-DAG:        daddu $2, $[[T2]], $[[T3]]
40*9880d681SAndroid Build Coastguard Worker
41*9880d681SAndroid Build Coastguard Worker; 64R6-DAG:      sll $[[T0:[0-9]+]], $4, 0
42*9880d681SAndroid Build Coastguard Worker; 64R6-DAG:      sll $[[T1:[0-9]+]], $5, 0
43*9880d681SAndroid Build Coastguard Worker; 64R6-DAG:      dmul $[[T2:[0-9]+]], $[[T1]], $[[T0]]
44*9880d681SAndroid Build Coastguard Worker; 64R6-DAG:      sll $[[T3:[0-9]+]], $6, 0
45*9880d681SAndroid Build Coastguard Worker; 64R6-DAG:      daddu $2, $[[T2]], $[[T3]]
46*9880d681SAndroid Build Coastguard Worker
47*9880d681SAndroid Build Coastguard Workerdefine i64 @madd1(i32 %a, i32 %b, i32 %c) nounwind readnone {
48*9880d681SAndroid Build Coastguard Workerentry:
49*9880d681SAndroid Build Coastguard Worker  %conv = sext i32 %a to i64
50*9880d681SAndroid Build Coastguard Worker  %conv2 = sext i32 %b to i64
51*9880d681SAndroid Build Coastguard Worker  %mul = mul nsw i64 %conv2, %conv
52*9880d681SAndroid Build Coastguard Worker  %conv4 = sext i32 %c to i64
53*9880d681SAndroid Build Coastguard Worker  %add = add nsw i64 %mul, %conv4
54*9880d681SAndroid Build Coastguard Worker  ret i64 %add
55*9880d681SAndroid Build Coastguard Worker}
56*9880d681SAndroid Build Coastguard Worker
57*9880d681SAndroid Build Coastguard Worker; ALL-LABEL: madd2:
58*9880d681SAndroid Build Coastguard Worker
59*9880d681SAndroid Build Coastguard Worker; FIXME: We don't really need this instruction
60*9880d681SAndroid Build Coastguard Worker; 32-DAG:        addiu $[[T0:[0-9]+]], $zero, 0
61*9880d681SAndroid Build Coastguard Worker; 32-DAG:        mtlo $6
62*9880d681SAndroid Build Coastguard Worker; 32-DAG:        [[m:m]]addu ${{[45]}}, ${{[45]}}
63*9880d681SAndroid Build Coastguard Worker; 32-DAG:        [[m]]fhi $2
64*9880d681SAndroid Build Coastguard Worker; 32-DAG:        [[m]]flo $3
65*9880d681SAndroid Build Coastguard Worker
66*9880d681SAndroid Build Coastguard Worker; DSP-DAG:       addiu $[[T0:[0-9]+]], $zero, 0
67*9880d681SAndroid Build Coastguard Worker; DSP-DAG:       mtlo $6, $[[AC:ac[0-3]+]]
68*9880d681SAndroid Build Coastguard Worker; DSP-DAG:       maddu $[[AC]], ${{[45]}}, ${{[45]}}
69*9880d681SAndroid Build Coastguard Worker; DSP-DAG:       mfhi $2, $[[AC]]
70*9880d681SAndroid Build Coastguard Worker; DSP-DAG:       mflo $3, $[[AC]]
71*9880d681SAndroid Build Coastguard Worker
72*9880d681SAndroid Build Coastguard Worker; 32R6-DAG:      mul  $[[T0:[0-9]+]], ${{[45]}}, ${{[45]}}
73*9880d681SAndroid Build Coastguard Worker; 32R6-DAG:      addu $[[T1:[0-9]+]], $[[T0]], $6
74*9880d681SAndroid Build Coastguard Worker; 32R6-DAG:      sltu $[[T2:[0-9]+]], $[[T1]], $6
75*9880d681SAndroid Build Coastguard Worker; FIXME: There's a redundant move here. We should remove it
76*9880d681SAndroid Build Coastguard Worker; 32R6-DAG:      muhu $[[T3:[0-9]+]], ${{[45]}}, ${{[45]}}
77*9880d681SAndroid Build Coastguard Worker; 32R6-DAG:      addu $2, $[[T3]], $[[T2]]
78*9880d681SAndroid Build Coastguard Worker
79*9880d681SAndroid Build Coastguard Worker; 64-DAG:        d[[m:m]]ult $5, $4
80*9880d681SAndroid Build Coastguard Worker; 64-DAG:        [[m]]flo $[[T0:[0-9]+]]
81*9880d681SAndroid Build Coastguard Worker; 64-DAG:        daddu $2, $[[T0]], $6
82*9880d681SAndroid Build Coastguard Worker
83*9880d681SAndroid Build Coastguard Worker; 64R6-DAG:      dmul $[[T0:[0-9]+]], $5, $4
84*9880d681SAndroid Build Coastguard Worker; 64R6-DAG:      daddu $2, $[[T0]], $6
85*9880d681SAndroid Build Coastguard Worker
86*9880d681SAndroid Build Coastguard Workerdefine i64 @madd2(i32 zeroext %a, i32 zeroext %b, i32 zeroext %c) nounwind readnone {
87*9880d681SAndroid Build Coastguard Workerentry:
88*9880d681SAndroid Build Coastguard Worker  %conv = zext i32 %a to i64
89*9880d681SAndroid Build Coastguard Worker  %conv2 = zext i32 %b to i64
90*9880d681SAndroid Build Coastguard Worker  %mul = mul nsw i64 %conv2, %conv
91*9880d681SAndroid Build Coastguard Worker  %conv4 = zext i32 %c to i64
92*9880d681SAndroid Build Coastguard Worker  %add = add nsw i64 %mul, %conv4
93*9880d681SAndroid Build Coastguard Worker  ret i64 %add
94*9880d681SAndroid Build Coastguard Worker}
95*9880d681SAndroid Build Coastguard Worker
96*9880d681SAndroid Build Coastguard Worker; ALL-LABEL: madd3:
97*9880d681SAndroid Build Coastguard Worker
98*9880d681SAndroid Build Coastguard Worker; 32-DAG:        mthi $6
99*9880d681SAndroid Build Coastguard Worker; 32-DAG:        mtlo $7
100*9880d681SAndroid Build Coastguard Worker; 32-DAG:        [[m:m]]add ${{[45]}}, ${{[45]}}
101*9880d681SAndroid Build Coastguard Worker; 32-DAG:        [[m]]fhi $2
102*9880d681SAndroid Build Coastguard Worker; 32-DAG:        [[m]]flo $3
103*9880d681SAndroid Build Coastguard Worker
104*9880d681SAndroid Build Coastguard Worker; DSP-DAG:       mthi $6, $[[AC:ac[0-3]+]]
105*9880d681SAndroid Build Coastguard Worker; DSP-DAG:       mtlo $7, $[[AC]]
106*9880d681SAndroid Build Coastguard Worker; DSP-DAG:       madd $[[AC]], ${{[45]}}, ${{[45]}}
107*9880d681SAndroid Build Coastguard Worker; DSP-DAG:       mfhi $2, $[[AC]]
108*9880d681SAndroid Build Coastguard Worker; DSP-DAG:       mflo $3, $[[AC]]
109*9880d681SAndroid Build Coastguard Worker
110*9880d681SAndroid Build Coastguard Worker; 32R6-DAG:      mul  $[[T0:[0-9]+]], ${{[45]}}, ${{[45]}}
111*9880d681SAndroid Build Coastguard Worker; 32R6-DAG:      addu $[[T1:[0-9]+]], $[[T0]], $7
112*9880d681SAndroid Build Coastguard Worker; 32R6-DAG:      sltu $[[T2:[0-9]+]], $[[T1]], $7
113*9880d681SAndroid Build Coastguard Worker; 32R6-DAG:      addu $[[T4:[0-9]+]], $[[T2]], $6
114*9880d681SAndroid Build Coastguard Worker; 32R6-DAG:      muh  $[[T5:[0-9]+]], ${{[45]}}, ${{[45]}}
115*9880d681SAndroid Build Coastguard Worker; 32R6-DAG:      addu $2, $[[T5]], $[[T4]]
116*9880d681SAndroid Build Coastguard Worker
117*9880d681SAndroid Build Coastguard Worker; 64-DAG:        sll $[[T0:[0-9]+]], $4, 0
118*9880d681SAndroid Build Coastguard Worker; 64-DAG:        sll $[[T1:[0-9]+]], $5, 0
119*9880d681SAndroid Build Coastguard Worker; 64-DAG:        d[[m:m]]ult $[[T1]], $[[T0]]
120*9880d681SAndroid Build Coastguard Worker; 64-DAG:        [[m]]flo $[[T2:[0-9]+]]
121*9880d681SAndroid Build Coastguard Worker; 64-DAG:        daddu $2, $[[T2]], $6
122*9880d681SAndroid Build Coastguard Worker
123*9880d681SAndroid Build Coastguard Worker; 64R6-DAG:      sll $[[T0:[0-9]+]], $4, 0
124*9880d681SAndroid Build Coastguard Worker; 64R6-DAG:      sll $[[T1:[0-9]+]], $5, 0
125*9880d681SAndroid Build Coastguard Worker; 64R6-DAG:      dmul $[[T2:[0-9]+]], $[[T1]], $[[T0]]
126*9880d681SAndroid Build Coastguard Worker; 64R6-DAG:      daddu $2, $[[T2]], $6
127*9880d681SAndroid Build Coastguard Worker
128*9880d681SAndroid Build Coastguard Workerdefine i64 @madd3(i32 %a, i32 %b, i64 %c) nounwind readnone {
129*9880d681SAndroid Build Coastguard Workerentry:
130*9880d681SAndroid Build Coastguard Worker  %conv = sext i32 %a to i64
131*9880d681SAndroid Build Coastguard Worker  %conv2 = sext i32 %b to i64
132*9880d681SAndroid Build Coastguard Worker  %mul = mul nsw i64 %conv2, %conv
133*9880d681SAndroid Build Coastguard Worker  %add = add nsw i64 %mul, %c
134*9880d681SAndroid Build Coastguard Worker  ret i64 %add
135*9880d681SAndroid Build Coastguard Worker}
136*9880d681SAndroid Build Coastguard Worker
137*9880d681SAndroid Build Coastguard Worker; ALL-LABEL: msub1:
138*9880d681SAndroid Build Coastguard Worker
139*9880d681SAndroid Build Coastguard Worker; 32-DAG:        sra $[[T0:[0-9]+]], $6, 31
140*9880d681SAndroid Build Coastguard Worker; 32-DAG:        mtlo $6
141*9880d681SAndroid Build Coastguard Worker; 32-DAG:        [[m:m]]sub ${{[45]}}, ${{[45]}}
142*9880d681SAndroid Build Coastguard Worker; 32-DAG:        [[m]]fhi $2
143*9880d681SAndroid Build Coastguard Worker; 32-DAG:        [[m]]flo $3
144*9880d681SAndroid Build Coastguard Worker
145*9880d681SAndroid Build Coastguard Worker; DSP-DAG:       sra $[[T0:[0-9]+]], $6, 31
146*9880d681SAndroid Build Coastguard Worker; DSP-DAG:       mtlo $6, $[[AC:ac[0-3]+]]
147*9880d681SAndroid Build Coastguard Worker; DSP-DAG:       msub $[[AC]], ${{[45]}}, ${{[45]}}
148*9880d681SAndroid Build Coastguard Worker; DSP-DAG:       mfhi $2, $[[AC]]
149*9880d681SAndroid Build Coastguard Worker; DSP-DAG:       mflo $3, $[[AC]]
150*9880d681SAndroid Build Coastguard Worker
151*9880d681SAndroid Build Coastguard Worker; 32R6-DAG:      muh  $[[T0:[0-9]+]], ${{[45]}}, ${{[45]}}
152*9880d681SAndroid Build Coastguard Worker; 32R6-DAG:      mul  $[[T1:[0-9]+]], ${{[45]}}, ${{[45]}}
153*9880d681SAndroid Build Coastguard Worker; 32R6-DAG:      sltu $[[T3:[0-9]+]], $6, $[[T1]]
154*9880d681SAndroid Build Coastguard Worker; 32R6-DAG:      addu $[[T4:[0-9]+]], $[[T3]], $[[T0]]
155*9880d681SAndroid Build Coastguard Worker; 32R6-DAG:      sra  $[[T5:[0-9]+]], $6, 31
156*9880d681SAndroid Build Coastguard Worker; 32R6-DAG:      subu $2, $[[T5]], $[[T4]]
157*9880d681SAndroid Build Coastguard Worker; 32R6-DAG:      subu $3, $6, $[[T1]]
158*9880d681SAndroid Build Coastguard Worker
159*9880d681SAndroid Build Coastguard Worker; 64-DAG:        sll $[[T0:[0-9]+]], $4, 0
160*9880d681SAndroid Build Coastguard Worker; 64-DAG:        sll $[[T1:[0-9]+]], $5, 0
161*9880d681SAndroid Build Coastguard Worker; 64-DAG:        d[[m:m]]ult $[[T1]], $[[T0]]
162*9880d681SAndroid Build Coastguard Worker; 64-DAG:        [[m]]flo $[[T2:[0-9]+]]
163*9880d681SAndroid Build Coastguard Worker; 64-DAG:        sll $[[T3:[0-9]+]], $6, 0
164*9880d681SAndroid Build Coastguard Worker; 64-DAG:        dsubu $2, $[[T3]], $[[T2]]
165*9880d681SAndroid Build Coastguard Worker
166*9880d681SAndroid Build Coastguard Worker; 64R6-DAG:      sll $[[T0:[0-9]+]], $4, 0
167*9880d681SAndroid Build Coastguard Worker; 64R6-DAG:      sll $[[T1:[0-9]+]], $5, 0
168*9880d681SAndroid Build Coastguard Worker; 64R6-DAG:      dmul $[[T2:[0-9]+]], $[[T1]], $[[T0]]
169*9880d681SAndroid Build Coastguard Worker; 64R6-DAG:      sll $[[T3:[0-9]+]], $6, 0
170*9880d681SAndroid Build Coastguard Worker; 64R6-DAG:      dsubu $2, $[[T3]], $[[T2]]
171*9880d681SAndroid Build Coastguard Worker
172*9880d681SAndroid Build Coastguard Workerdefine i64 @msub1(i32 %a, i32 %b, i32 %c) nounwind readnone {
173*9880d681SAndroid Build Coastguard Workerentry:
174*9880d681SAndroid Build Coastguard Worker  %conv = sext i32 %c to i64
175*9880d681SAndroid Build Coastguard Worker  %conv2 = sext i32 %a to i64
176*9880d681SAndroid Build Coastguard Worker  %conv4 = sext i32 %b to i64
177*9880d681SAndroid Build Coastguard Worker  %mul = mul nsw i64 %conv4, %conv2
178*9880d681SAndroid Build Coastguard Worker  %sub = sub nsw i64 %conv, %mul
179*9880d681SAndroid Build Coastguard Worker  ret i64 %sub
180*9880d681SAndroid Build Coastguard Worker}
181*9880d681SAndroid Build Coastguard Worker
182*9880d681SAndroid Build Coastguard Worker; ALL-LABEL: msub2:
183*9880d681SAndroid Build Coastguard Worker
184*9880d681SAndroid Build Coastguard Worker; FIXME: We don't really need this instruction
185*9880d681SAndroid Build Coastguard Worker; 32-DAG:        addiu $[[T0:[0-9]+]], $zero, 0
186*9880d681SAndroid Build Coastguard Worker; 32-DAG:        mtlo $6
187*9880d681SAndroid Build Coastguard Worker; 32-DAG:        [[m:m]]subu ${{[45]}}, ${{[45]}}
188*9880d681SAndroid Build Coastguard Worker; 32-DAG:        [[m]]fhi $2
189*9880d681SAndroid Build Coastguard Worker; 32-DAG:        [[m]]flo $3
190*9880d681SAndroid Build Coastguard Worker
191*9880d681SAndroid Build Coastguard Worker; DSP-DAG:       addiu $[[T0:[0-9]+]], $zero, 0
192*9880d681SAndroid Build Coastguard Worker; DSP-DAG:       mtlo $6, $[[AC:ac[0-3]+]]
193*9880d681SAndroid Build Coastguard Worker; DSP-DAG:       msubu $[[AC]], ${{[45]}}, ${{[45]}}
194*9880d681SAndroid Build Coastguard Worker; DSP-DAG:       mfhi $2, $[[AC]]
195*9880d681SAndroid Build Coastguard Worker; DSP-DAG:       mflo $3, $[[AC]]
196*9880d681SAndroid Build Coastguard Worker
197*9880d681SAndroid Build Coastguard Worker; 32R6-DAG:      muhu $[[T0:[0-9]+]], ${{[45]}}, ${{[45]}}
198*9880d681SAndroid Build Coastguard Worker; 32R6-DAG:      mul $[[T1:[0-9]+]], ${{[45]}}, ${{[45]}}
199*9880d681SAndroid Build Coastguard Worker
200*9880d681SAndroid Build Coastguard Worker; 32R6-DAG:      sltu $[[T2:[0-9]+]], $6, $[[T1]]
201*9880d681SAndroid Build Coastguard Worker; 32R6-DAG:      addu $[[T3:[0-9]+]], $[[T2]], $[[T0]]
202*9880d681SAndroid Build Coastguard Worker; 32R6-DAG:      negu $2, $[[T3]]
203*9880d681SAndroid Build Coastguard Worker; 32R6-DAG:      subu $3, $6, $[[T1]]
204*9880d681SAndroid Build Coastguard Worker
205*9880d681SAndroid Build Coastguard Worker; 64-DAG:        d[[m:m]]ult $5, $4
206*9880d681SAndroid Build Coastguard Worker; 64-DAG:        [[m]]flo $[[T0:[0-9]+]]
207*9880d681SAndroid Build Coastguard Worker; 64-DAG:        dsubu $2, $6, $[[T0]]
208*9880d681SAndroid Build Coastguard Worker
209*9880d681SAndroid Build Coastguard Worker; 64R6-DAG:      dmul $[[T0:[0-9]+]], $5, $4
210*9880d681SAndroid Build Coastguard Worker; 64R6-DAG:      dsubu $2, $6, $[[T0]]
211*9880d681SAndroid Build Coastguard Worker
212*9880d681SAndroid Build Coastguard Workerdefine i64 @msub2(i32 zeroext %a, i32 zeroext %b, i32 zeroext %c) nounwind readnone {
213*9880d681SAndroid Build Coastguard Workerentry:
214*9880d681SAndroid Build Coastguard Worker  %conv = zext i32 %c to i64
215*9880d681SAndroid Build Coastguard Worker  %conv2 = zext i32 %a to i64
216*9880d681SAndroid Build Coastguard Worker  %conv4 = zext i32 %b to i64
217*9880d681SAndroid Build Coastguard Worker  %mul = mul nsw i64 %conv4, %conv2
218*9880d681SAndroid Build Coastguard Worker  %sub = sub nsw i64 %conv, %mul
219*9880d681SAndroid Build Coastguard Worker  ret i64 %sub
220*9880d681SAndroid Build Coastguard Worker}
221*9880d681SAndroid Build Coastguard Worker
222*9880d681SAndroid Build Coastguard Worker; ALL-LABEL: msub3:
223*9880d681SAndroid Build Coastguard Worker
224*9880d681SAndroid Build Coastguard Worker; FIXME: We don't really need this instruction
225*9880d681SAndroid Build Coastguard Worker; 32-DAG:        mthi $6
226*9880d681SAndroid Build Coastguard Worker; 32-DAG:        mtlo $7
227*9880d681SAndroid Build Coastguard Worker; 32-DAG:        [[m:m]]sub ${{[45]}}, ${{[45]}}
228*9880d681SAndroid Build Coastguard Worker; 32-DAG:        [[m]]fhi $2
229*9880d681SAndroid Build Coastguard Worker; 32-DAG:        [[m]]flo $3
230*9880d681SAndroid Build Coastguard Worker
231*9880d681SAndroid Build Coastguard Worker; DSP-DAG:       addiu $[[T0:[0-9]+]], $zero, 0
232*9880d681SAndroid Build Coastguard Worker; DSP-DAG:       mtlo $6, $[[AC:ac[0-3]+]]
233*9880d681SAndroid Build Coastguard Worker; DSP-DAG:       msub $[[AC]], ${{[45]}}, ${{[45]}}
234*9880d681SAndroid Build Coastguard Worker; DSP-DAG:       mfhi $2, $[[AC]]
235*9880d681SAndroid Build Coastguard Worker; DSP-DAG:       mflo $3, $[[AC]]
236*9880d681SAndroid Build Coastguard Worker
237*9880d681SAndroid Build Coastguard Worker; 32R6-DAG:      muh $[[T0:[0-9]+]], ${{[45]}}, ${{[45]}}
238*9880d681SAndroid Build Coastguard Worker; 32R6-DAG:      mul $[[T1:[0-9]+]], ${{[45]}}, ${{[45]}}
239*9880d681SAndroid Build Coastguard Worker; 32R6-DAG:      sltu $[[T2:[0-9]+]], $7, $[[T1]]
240*9880d681SAndroid Build Coastguard Worker; 32R6-DAG:      addu $[[T3:[0-9]+]], $[[T2]], $[[T0]]
241*9880d681SAndroid Build Coastguard Worker; 32R6-DAG:      subu $2, $6, $[[T3]]
242*9880d681SAndroid Build Coastguard Worker; 32R6-DAG:      subu $3, $7, $[[T1]]
243*9880d681SAndroid Build Coastguard Worker
244*9880d681SAndroid Build Coastguard Worker; 64-DAG:        sll $[[T0:[0-9]+]], $4, 0
245*9880d681SAndroid Build Coastguard Worker; 64-DAG:        sll $[[T1:[0-9]+]], $5, 0
246*9880d681SAndroid Build Coastguard Worker; 64-DAG:        d[[m:m]]ult $[[T1]], $[[T0]]
247*9880d681SAndroid Build Coastguard Worker; 64-DAG:        [[m]]flo $[[T2:[0-9]+]]
248*9880d681SAndroid Build Coastguard Worker; 64-DAG:        dsubu $2, $6, $[[T2]]
249*9880d681SAndroid Build Coastguard Worker
250*9880d681SAndroid Build Coastguard Worker; 64R6-DAG:      sll $[[T0:[0-9]+]], $4, 0
251*9880d681SAndroid Build Coastguard Worker; 64R6-DAG:      sll $[[T1:[0-9]+]], $5, 0
252*9880d681SAndroid Build Coastguard Worker; 64R6-DAG:      dmul $[[T2:[0-9]+]], $[[T1]], $[[T0]]
253*9880d681SAndroid Build Coastguard Worker; 64R6-DAG:      dsubu $2, $6, $[[T2]]
254*9880d681SAndroid Build Coastguard Worker
255*9880d681SAndroid Build Coastguard Workerdefine i64 @msub3(i32 %a, i32 %b, i64 %c) nounwind readnone {
256*9880d681SAndroid Build Coastguard Workerentry:
257*9880d681SAndroid Build Coastguard Worker  %conv = sext i32 %a to i64
258*9880d681SAndroid Build Coastguard Worker  %conv3 = sext i32 %b to i64
259*9880d681SAndroid Build Coastguard Worker  %mul = mul nsw i64 %conv3, %conv
260*9880d681SAndroid Build Coastguard Worker  %sub = sub nsw i64 %c, %mul
261*9880d681SAndroid Build Coastguard Worker  ret i64 %sub
262*9880d681SAndroid Build Coastguard Worker}
263