xref: /aosp_15_r20/external/llvm/test/CodeGen/AArch64/arm64-xaluo.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; RUN: llc -march=arm64 -aarch64-atomic-cfg-tidy=0 -disable-post-ra -verify-machineinstrs < %s | FileCheck %s
2*9880d681SAndroid Build Coastguard Worker; RUN: llc -march=arm64 -aarch64-atomic-cfg-tidy=0 -fast-isel -fast-isel-abort=1 -disable-post-ra -verify-machineinstrs < %s | FileCheck %s
3*9880d681SAndroid Build Coastguard Worker
4*9880d681SAndroid Build Coastguard Worker;
5*9880d681SAndroid Build Coastguard Worker; Get the actual value of the overflow bit.
6*9880d681SAndroid Build Coastguard Worker;
7*9880d681SAndroid Build Coastguard Workerdefine zeroext i1 @saddo1.i32(i32 %v1, i32 %v2, i32* %res) {
8*9880d681SAndroid Build Coastguard Workerentry:
9*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL:  saddo1.i32
10*9880d681SAndroid Build Coastguard Worker; CHECK:        adds {{w[0-9]+}}, w0, w1
11*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:   cset {{w[0-9]+}}, vs
12*9880d681SAndroid Build Coastguard Worker  %t = call {i32, i1} @llvm.sadd.with.overflow.i32(i32 %v1, i32 %v2)
13*9880d681SAndroid Build Coastguard Worker  %val = extractvalue {i32, i1} %t, 0
14*9880d681SAndroid Build Coastguard Worker  %obit = extractvalue {i32, i1} %t, 1
15*9880d681SAndroid Build Coastguard Worker  store i32 %val, i32* %res
16*9880d681SAndroid Build Coastguard Worker  ret i1 %obit
17*9880d681SAndroid Build Coastguard Worker}
18*9880d681SAndroid Build Coastguard Worker
19*9880d681SAndroid Build Coastguard Worker; Test the immediate version.
20*9880d681SAndroid Build Coastguard Workerdefine zeroext i1 @saddo2.i32(i32 %v1, i32* %res) {
21*9880d681SAndroid Build Coastguard Workerentry:
22*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL:  saddo2.i32
23*9880d681SAndroid Build Coastguard Worker; CHECK:        adds {{w[0-9]+}}, w0, #4
24*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:   cset {{w[0-9]+}}, vs
25*9880d681SAndroid Build Coastguard Worker  %t = call {i32, i1} @llvm.sadd.with.overflow.i32(i32 %v1, i32 4)
26*9880d681SAndroid Build Coastguard Worker  %val = extractvalue {i32, i1} %t, 0
27*9880d681SAndroid Build Coastguard Worker  %obit = extractvalue {i32, i1} %t, 1
28*9880d681SAndroid Build Coastguard Worker  store i32 %val, i32* %res
29*9880d681SAndroid Build Coastguard Worker  ret i1 %obit
30*9880d681SAndroid Build Coastguard Worker}
31*9880d681SAndroid Build Coastguard Worker
32*9880d681SAndroid Build Coastguard Worker; Test negative immediates.
33*9880d681SAndroid Build Coastguard Workerdefine zeroext i1 @saddo3.i32(i32 %v1, i32* %res) {
34*9880d681SAndroid Build Coastguard Workerentry:
35*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL:  saddo3.i32
36*9880d681SAndroid Build Coastguard Worker; CHECK:        subs {{w[0-9]+}}, w0, #4
37*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:   cset {{w[0-9]+}}, vs
38*9880d681SAndroid Build Coastguard Worker  %t = call {i32, i1} @llvm.sadd.with.overflow.i32(i32 %v1, i32 -4)
39*9880d681SAndroid Build Coastguard Worker  %val = extractvalue {i32, i1} %t, 0
40*9880d681SAndroid Build Coastguard Worker  %obit = extractvalue {i32, i1} %t, 1
41*9880d681SAndroid Build Coastguard Worker  store i32 %val, i32* %res
42*9880d681SAndroid Build Coastguard Worker  ret i1 %obit
43*9880d681SAndroid Build Coastguard Worker}
44*9880d681SAndroid Build Coastguard Worker
45*9880d681SAndroid Build Coastguard Worker; Test immediates that are too large to be encoded.
46*9880d681SAndroid Build Coastguard Workerdefine zeroext i1 @saddo4.i32(i32 %v1, i32* %res) {
47*9880d681SAndroid Build Coastguard Workerentry:
48*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL:  saddo4.i32
49*9880d681SAndroid Build Coastguard Worker; CHECK:        adds {{w[0-9]+}}, w0, {{w[0-9]+}}
50*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:   cset {{w[0-9]+}}, vs
51*9880d681SAndroid Build Coastguard Worker  %t = call {i32, i1} @llvm.sadd.with.overflow.i32(i32 %v1, i32 16777215)
52*9880d681SAndroid Build Coastguard Worker  %val = extractvalue {i32, i1} %t, 0
53*9880d681SAndroid Build Coastguard Worker  %obit = extractvalue {i32, i1} %t, 1
54*9880d681SAndroid Build Coastguard Worker  store i32 %val, i32* %res
55*9880d681SAndroid Build Coastguard Worker  ret i1 %obit
56*9880d681SAndroid Build Coastguard Worker}
57*9880d681SAndroid Build Coastguard Worker
58*9880d681SAndroid Build Coastguard Worker; Test shift folding.
59*9880d681SAndroid Build Coastguard Workerdefine zeroext i1 @saddo5.i32(i32 %v1, i32 %v2, i32* %res) {
60*9880d681SAndroid Build Coastguard Workerentry:
61*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL:  saddo5.i32
62*9880d681SAndroid Build Coastguard Worker; CHECK:        adds {{w[0-9]+}}, w0, w1
63*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:   cset {{w[0-9]+}}, vs
64*9880d681SAndroid Build Coastguard Worker  %lsl = shl i32 %v2, 16
65*9880d681SAndroid Build Coastguard Worker  %t = call {i32, i1} @llvm.sadd.with.overflow.i32(i32 %v1, i32 %lsl)
66*9880d681SAndroid Build Coastguard Worker  %val = extractvalue {i32, i1} %t, 0
67*9880d681SAndroid Build Coastguard Worker  %obit = extractvalue {i32, i1} %t, 1
68*9880d681SAndroid Build Coastguard Worker  store i32 %val, i32* %res
69*9880d681SAndroid Build Coastguard Worker  ret i1 %obit
70*9880d681SAndroid Build Coastguard Worker}
71*9880d681SAndroid Build Coastguard Worker
72*9880d681SAndroid Build Coastguard Workerdefine zeroext i1 @saddo1.i64(i64 %v1, i64 %v2, i64* %res) {
73*9880d681SAndroid Build Coastguard Workerentry:
74*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL:  saddo1.i64
75*9880d681SAndroid Build Coastguard Worker; CHECK:        adds {{x[0-9]+}}, x0, x1
76*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:   cset {{w[0-9]+}}, vs
77*9880d681SAndroid Build Coastguard Worker  %t = call {i64, i1} @llvm.sadd.with.overflow.i64(i64 %v1, i64 %v2)
78*9880d681SAndroid Build Coastguard Worker  %val = extractvalue {i64, i1} %t, 0
79*9880d681SAndroid Build Coastguard Worker  %obit = extractvalue {i64, i1} %t, 1
80*9880d681SAndroid Build Coastguard Worker  store i64 %val, i64* %res
81*9880d681SAndroid Build Coastguard Worker  ret i1 %obit
82*9880d681SAndroid Build Coastguard Worker}
83*9880d681SAndroid Build Coastguard Worker
84*9880d681SAndroid Build Coastguard Workerdefine zeroext i1 @saddo2.i64(i64 %v1, i64* %res) {
85*9880d681SAndroid Build Coastguard Workerentry:
86*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL:  saddo2.i64
87*9880d681SAndroid Build Coastguard Worker; CHECK:        adds {{x[0-9]+}}, x0, #4
88*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:   cset {{w[0-9]+}}, vs
89*9880d681SAndroid Build Coastguard Worker  %t = call {i64, i1} @llvm.sadd.with.overflow.i64(i64 %v1, i64 4)
90*9880d681SAndroid Build Coastguard Worker  %val = extractvalue {i64, i1} %t, 0
91*9880d681SAndroid Build Coastguard Worker  %obit = extractvalue {i64, i1} %t, 1
92*9880d681SAndroid Build Coastguard Worker  store i64 %val, i64* %res
93*9880d681SAndroid Build Coastguard Worker  ret i1 %obit
94*9880d681SAndroid Build Coastguard Worker}
95*9880d681SAndroid Build Coastguard Worker
96*9880d681SAndroid Build Coastguard Workerdefine zeroext i1 @saddo3.i64(i64 %v1, i64* %res) {
97*9880d681SAndroid Build Coastguard Workerentry:
98*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL:  saddo3.i64
99*9880d681SAndroid Build Coastguard Worker; CHECK:        subs {{x[0-9]+}}, x0, #4
100*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:   cset {{w[0-9]+}}, vs
101*9880d681SAndroid Build Coastguard Worker  %t = call {i64, i1} @llvm.sadd.with.overflow.i64(i64 %v1, i64 -4)
102*9880d681SAndroid Build Coastguard Worker  %val = extractvalue {i64, i1} %t, 0
103*9880d681SAndroid Build Coastguard Worker  %obit = extractvalue {i64, i1} %t, 1
104*9880d681SAndroid Build Coastguard Worker  store i64 %val, i64* %res
105*9880d681SAndroid Build Coastguard Worker  ret i1 %obit
106*9880d681SAndroid Build Coastguard Worker}
107*9880d681SAndroid Build Coastguard Worker
108*9880d681SAndroid Build Coastguard Workerdefine zeroext i1 @uaddo.i32(i32 %v1, i32 %v2, i32* %res) {
109*9880d681SAndroid Build Coastguard Workerentry:
110*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL:  uaddo.i32
111*9880d681SAndroid Build Coastguard Worker; CHECK:        adds {{w[0-9]+}}, w0, w1
112*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:   cset {{w[0-9]+}}, hs
113*9880d681SAndroid Build Coastguard Worker  %t = call {i32, i1} @llvm.uadd.with.overflow.i32(i32 %v1, i32 %v2)
114*9880d681SAndroid Build Coastguard Worker  %val = extractvalue {i32, i1} %t, 0
115*9880d681SAndroid Build Coastguard Worker  %obit = extractvalue {i32, i1} %t, 1
116*9880d681SAndroid Build Coastguard Worker  store i32 %val, i32* %res
117*9880d681SAndroid Build Coastguard Worker  ret i1 %obit
118*9880d681SAndroid Build Coastguard Worker}
119*9880d681SAndroid Build Coastguard Worker
120*9880d681SAndroid Build Coastguard Workerdefine zeroext i1 @uaddo.i64(i64 %v1, i64 %v2, i64* %res) {
121*9880d681SAndroid Build Coastguard Workerentry:
122*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL:  uaddo.i64
123*9880d681SAndroid Build Coastguard Worker; CHECK:        adds {{x[0-9]+}}, x0, x1
124*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:   cset {{w[0-9]+}}, hs
125*9880d681SAndroid Build Coastguard Worker  %t = call {i64, i1} @llvm.uadd.with.overflow.i64(i64 %v1, i64 %v2)
126*9880d681SAndroid Build Coastguard Worker  %val = extractvalue {i64, i1} %t, 0
127*9880d681SAndroid Build Coastguard Worker  %obit = extractvalue {i64, i1} %t, 1
128*9880d681SAndroid Build Coastguard Worker  store i64 %val, i64* %res
129*9880d681SAndroid Build Coastguard Worker  ret i1 %obit
130*9880d681SAndroid Build Coastguard Worker}
131*9880d681SAndroid Build Coastguard Worker
132*9880d681SAndroid Build Coastguard Workerdefine zeroext i1 @ssubo1.i32(i32 %v1, i32 %v2, i32* %res) {
133*9880d681SAndroid Build Coastguard Workerentry:
134*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL:  ssubo1.i32
135*9880d681SAndroid Build Coastguard Worker; CHECK:        subs {{w[0-9]+}}, w0, w1
136*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:   cset {{w[0-9]+}}, vs
137*9880d681SAndroid Build Coastguard Worker  %t = call {i32, i1} @llvm.ssub.with.overflow.i32(i32 %v1, i32 %v2)
138*9880d681SAndroid Build Coastguard Worker  %val = extractvalue {i32, i1} %t, 0
139*9880d681SAndroid Build Coastguard Worker  %obit = extractvalue {i32, i1} %t, 1
140*9880d681SAndroid Build Coastguard Worker  store i32 %val, i32* %res
141*9880d681SAndroid Build Coastguard Worker  ret i1 %obit
142*9880d681SAndroid Build Coastguard Worker}
143*9880d681SAndroid Build Coastguard Worker
144*9880d681SAndroid Build Coastguard Workerdefine zeroext i1 @ssubo2.i32(i32 %v1, i32* %res) {
145*9880d681SAndroid Build Coastguard Workerentry:
146*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL:  ssubo2.i32
147*9880d681SAndroid Build Coastguard Worker; CHECK:        adds {{w[0-9]+}}, w0, #4
148*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:   cset {{w[0-9]+}}, vs
149*9880d681SAndroid Build Coastguard Worker  %t = call {i32, i1} @llvm.ssub.with.overflow.i32(i32 %v1, i32 -4)
150*9880d681SAndroid Build Coastguard Worker  %val = extractvalue {i32, i1} %t, 0
151*9880d681SAndroid Build Coastguard Worker  %obit = extractvalue {i32, i1} %t, 1
152*9880d681SAndroid Build Coastguard Worker  store i32 %val, i32* %res
153*9880d681SAndroid Build Coastguard Worker  ret i1 %obit
154*9880d681SAndroid Build Coastguard Worker}
155*9880d681SAndroid Build Coastguard Worker
156*9880d681SAndroid Build Coastguard Workerdefine zeroext i1 @ssubo.i64(i64 %v1, i64 %v2, i64* %res) {
157*9880d681SAndroid Build Coastguard Workerentry:
158*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL:  ssubo.i64
159*9880d681SAndroid Build Coastguard Worker; CHECK:        subs {{x[0-9]+}}, x0, x1
160*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:   cset {{w[0-9]+}}, vs
161*9880d681SAndroid Build Coastguard Worker  %t = call {i64, i1} @llvm.ssub.with.overflow.i64(i64 %v1, i64 %v2)
162*9880d681SAndroid Build Coastguard Worker  %val = extractvalue {i64, i1} %t, 0
163*9880d681SAndroid Build Coastguard Worker  %obit = extractvalue {i64, i1} %t, 1
164*9880d681SAndroid Build Coastguard Worker  store i64 %val, i64* %res
165*9880d681SAndroid Build Coastguard Worker  ret i1 %obit
166*9880d681SAndroid Build Coastguard Worker}
167*9880d681SAndroid Build Coastguard Worker
168*9880d681SAndroid Build Coastguard Workerdefine zeroext i1 @usubo.i32(i32 %v1, i32 %v2, i32* %res) {
169*9880d681SAndroid Build Coastguard Workerentry:
170*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL:  usubo.i32
171*9880d681SAndroid Build Coastguard Worker; CHECK:        subs {{w[0-9]+}}, w0, w1
172*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:   cset {{w[0-9]+}}, lo
173*9880d681SAndroid Build Coastguard Worker  %t = call {i32, i1} @llvm.usub.with.overflow.i32(i32 %v1, i32 %v2)
174*9880d681SAndroid Build Coastguard Worker  %val = extractvalue {i32, i1} %t, 0
175*9880d681SAndroid Build Coastguard Worker  %obit = extractvalue {i32, i1} %t, 1
176*9880d681SAndroid Build Coastguard Worker  store i32 %val, i32* %res
177*9880d681SAndroid Build Coastguard Worker  ret i1 %obit
178*9880d681SAndroid Build Coastguard Worker}
179*9880d681SAndroid Build Coastguard Worker
180*9880d681SAndroid Build Coastguard Workerdefine zeroext i1 @usubo.i64(i64 %v1, i64 %v2, i64* %res) {
181*9880d681SAndroid Build Coastguard Workerentry:
182*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL:  usubo.i64
183*9880d681SAndroid Build Coastguard Worker; CHECK:        subs {{x[0-9]+}}, x0, x1
184*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:   cset {{w[0-9]+}}, lo
185*9880d681SAndroid Build Coastguard Worker  %t = call {i64, i1} @llvm.usub.with.overflow.i64(i64 %v1, i64 %v2)
186*9880d681SAndroid Build Coastguard Worker  %val = extractvalue {i64, i1} %t, 0
187*9880d681SAndroid Build Coastguard Worker  %obit = extractvalue {i64, i1} %t, 1
188*9880d681SAndroid Build Coastguard Worker  store i64 %val, i64* %res
189*9880d681SAndroid Build Coastguard Worker  ret i1 %obit
190*9880d681SAndroid Build Coastguard Worker}
191*9880d681SAndroid Build Coastguard Worker
192*9880d681SAndroid Build Coastguard Workerdefine zeroext i1 @smulo.i32(i32 %v1, i32 %v2, i32* %res) {
193*9880d681SAndroid Build Coastguard Workerentry:
194*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL:  smulo.i32
195*9880d681SAndroid Build Coastguard Worker; CHECK:        smull x[[MREG:[0-9]+]], w0, w1
196*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:   lsr x[[SREG:[0-9]+]], x[[MREG]], #32
197*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:   cmp w[[SREG]], w[[MREG]], asr #31
198*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:   cset {{w[0-9]+}}, ne
199*9880d681SAndroid Build Coastguard Worker  %t = call {i32, i1} @llvm.smul.with.overflow.i32(i32 %v1, i32 %v2)
200*9880d681SAndroid Build Coastguard Worker  %val = extractvalue {i32, i1} %t, 0
201*9880d681SAndroid Build Coastguard Worker  %obit = extractvalue {i32, i1} %t, 1
202*9880d681SAndroid Build Coastguard Worker  store i32 %val, i32* %res
203*9880d681SAndroid Build Coastguard Worker  ret i1 %obit
204*9880d681SAndroid Build Coastguard Worker}
205*9880d681SAndroid Build Coastguard Worker
206*9880d681SAndroid Build Coastguard Workerdefine zeroext i1 @smulo.i64(i64 %v1, i64 %v2, i64* %res) {
207*9880d681SAndroid Build Coastguard Workerentry:
208*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL:  smulo.i64
209*9880d681SAndroid Build Coastguard Worker; CHECK:        mul [[MREG:x[0-9]+]], x0, x1
210*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:   smulh [[HREG:x[0-9]+]], x0, x1
211*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:   cmp [[HREG]], [[MREG]], asr #63
212*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:   cset {{w[0-9]+}}, ne
213*9880d681SAndroid Build Coastguard Worker  %t = call {i64, i1} @llvm.smul.with.overflow.i64(i64 %v1, i64 %v2)
214*9880d681SAndroid Build Coastguard Worker  %val = extractvalue {i64, i1} %t, 0
215*9880d681SAndroid Build Coastguard Worker  %obit = extractvalue {i64, i1} %t, 1
216*9880d681SAndroid Build Coastguard Worker  store i64 %val, i64* %res
217*9880d681SAndroid Build Coastguard Worker  ret i1 %obit
218*9880d681SAndroid Build Coastguard Worker}
219*9880d681SAndroid Build Coastguard Worker
220*9880d681SAndroid Build Coastguard Workerdefine zeroext i1 @smulo2.i64(i64 %v1, i64* %res) {
221*9880d681SAndroid Build Coastguard Workerentry:
222*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL:  smulo2.i64
223*9880d681SAndroid Build Coastguard Worker; CHECK:        adds [[MREG:x[0-9]+]], x0, x0
224*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:   cset {{w[0-9]+}}, vs
225*9880d681SAndroid Build Coastguard Worker  %t = call {i64, i1} @llvm.smul.with.overflow.i64(i64 %v1, i64 2)
226*9880d681SAndroid Build Coastguard Worker  %val = extractvalue {i64, i1} %t, 0
227*9880d681SAndroid Build Coastguard Worker  %obit = extractvalue {i64, i1} %t, 1
228*9880d681SAndroid Build Coastguard Worker  store i64 %val, i64* %res
229*9880d681SAndroid Build Coastguard Worker  ret i1 %obit
230*9880d681SAndroid Build Coastguard Worker}
231*9880d681SAndroid Build Coastguard Worker
232*9880d681SAndroid Build Coastguard Workerdefine zeroext i1 @umulo.i32(i32 %v1, i32 %v2, i32* %res) {
233*9880d681SAndroid Build Coastguard Workerentry:
234*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL:  umulo.i32
235*9880d681SAndroid Build Coastguard Worker; CHECK:        umull [[MREG:x[0-9]+]], w0, w1
236*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:   cmp xzr, [[MREG]], lsr #32
237*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:   cset {{w[0-9]+}}, ne
238*9880d681SAndroid Build Coastguard Worker  %t = call {i32, i1} @llvm.umul.with.overflow.i32(i32 %v1, i32 %v2)
239*9880d681SAndroid Build Coastguard Worker  %val = extractvalue {i32, i1} %t, 0
240*9880d681SAndroid Build Coastguard Worker  %obit = extractvalue {i32, i1} %t, 1
241*9880d681SAndroid Build Coastguard Worker  store i32 %val, i32* %res
242*9880d681SAndroid Build Coastguard Worker  ret i1 %obit
243*9880d681SAndroid Build Coastguard Worker}
244*9880d681SAndroid Build Coastguard Worker
245*9880d681SAndroid Build Coastguard Workerdefine zeroext i1 @umulo.i64(i64 %v1, i64 %v2, i64* %res) {
246*9880d681SAndroid Build Coastguard Workerentry:
247*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL:  umulo.i64
248*9880d681SAndroid Build Coastguard Worker; CHECK:        umulh [[MREG:x[0-9]+]], x0, x1
249*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:   cmp xzr, [[MREG]]
250*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:   cset {{w[0-9]+}}, ne
251*9880d681SAndroid Build Coastguard Worker  %t = call {i64, i1} @llvm.umul.with.overflow.i64(i64 %v1, i64 %v2)
252*9880d681SAndroid Build Coastguard Worker  %val = extractvalue {i64, i1} %t, 0
253*9880d681SAndroid Build Coastguard Worker  %obit = extractvalue {i64, i1} %t, 1
254*9880d681SAndroid Build Coastguard Worker  store i64 %val, i64* %res
255*9880d681SAndroid Build Coastguard Worker  ret i1 %obit
256*9880d681SAndroid Build Coastguard Worker}
257*9880d681SAndroid Build Coastguard Worker
258*9880d681SAndroid Build Coastguard Workerdefine zeroext i1 @umulo2.i64(i64 %v1, i64* %res) {
259*9880d681SAndroid Build Coastguard Workerentry:
260*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL:  umulo2.i64
261*9880d681SAndroid Build Coastguard Worker; CHECK:        adds [[MREG:x[0-9]+]], x0, x0
262*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:   cset {{w[0-9]+}}, hs
263*9880d681SAndroid Build Coastguard Worker  %t = call {i64, i1} @llvm.umul.with.overflow.i64(i64 %v1, i64 2)
264*9880d681SAndroid Build Coastguard Worker  %val = extractvalue {i64, i1} %t, 0
265*9880d681SAndroid Build Coastguard Worker  %obit = extractvalue {i64, i1} %t, 1
266*9880d681SAndroid Build Coastguard Worker  store i64 %val, i64* %res
267*9880d681SAndroid Build Coastguard Worker  ret i1 %obit
268*9880d681SAndroid Build Coastguard Worker}
269*9880d681SAndroid Build Coastguard Worker
270*9880d681SAndroid Build Coastguard Worker
271*9880d681SAndroid Build Coastguard Worker;
272*9880d681SAndroid Build Coastguard Worker; Check the use of the overflow bit in combination with a select instruction.
273*9880d681SAndroid Build Coastguard Worker;
274*9880d681SAndroid Build Coastguard Workerdefine i32 @saddo.select.i32(i32 %v1, i32 %v2) {
275*9880d681SAndroid Build Coastguard Workerentry:
276*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL:  saddo.select.i32
277*9880d681SAndroid Build Coastguard Worker; CHECK:        cmn w0, w1
278*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:   csel w0, w0, w1, vs
279*9880d681SAndroid Build Coastguard Worker  %t = call {i32, i1} @llvm.sadd.with.overflow.i32(i32 %v1, i32 %v2)
280*9880d681SAndroid Build Coastguard Worker  %obit = extractvalue {i32, i1} %t, 1
281*9880d681SAndroid Build Coastguard Worker  %ret = select i1 %obit, i32 %v1, i32 %v2
282*9880d681SAndroid Build Coastguard Worker  ret i32 %ret
283*9880d681SAndroid Build Coastguard Worker}
284*9880d681SAndroid Build Coastguard Worker
285*9880d681SAndroid Build Coastguard Workerdefine i64 @saddo.select.i64(i64 %v1, i64 %v2) {
286*9880d681SAndroid Build Coastguard Workerentry:
287*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL:  saddo.select.i64
288*9880d681SAndroid Build Coastguard Worker; CHECK:        cmn x0, x1
289*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:   csel x0, x0, x1, vs
290*9880d681SAndroid Build Coastguard Worker  %t = call {i64, i1} @llvm.sadd.with.overflow.i64(i64 %v1, i64 %v2)
291*9880d681SAndroid Build Coastguard Worker  %obit = extractvalue {i64, i1} %t, 1
292*9880d681SAndroid Build Coastguard Worker  %ret = select i1 %obit, i64 %v1, i64 %v2
293*9880d681SAndroid Build Coastguard Worker  ret i64 %ret
294*9880d681SAndroid Build Coastguard Worker}
295*9880d681SAndroid Build Coastguard Worker
296*9880d681SAndroid Build Coastguard Workerdefine i32 @uaddo.select.i32(i32 %v1, i32 %v2) {
297*9880d681SAndroid Build Coastguard Workerentry:
298*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL:  uaddo.select.i32
299*9880d681SAndroid Build Coastguard Worker; CHECK:        cmn w0, w1
300*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:   csel w0, w0, w1, hs
301*9880d681SAndroid Build Coastguard Worker  %t = call {i32, i1} @llvm.uadd.with.overflow.i32(i32 %v1, i32 %v2)
302*9880d681SAndroid Build Coastguard Worker  %obit = extractvalue {i32, i1} %t, 1
303*9880d681SAndroid Build Coastguard Worker  %ret = select i1 %obit, i32 %v1, i32 %v2
304*9880d681SAndroid Build Coastguard Worker  ret i32 %ret
305*9880d681SAndroid Build Coastguard Worker}
306*9880d681SAndroid Build Coastguard Worker
307*9880d681SAndroid Build Coastguard Workerdefine i64 @uaddo.select.i64(i64 %v1, i64 %v2) {
308*9880d681SAndroid Build Coastguard Workerentry:
309*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL:  uaddo.select.i64
310*9880d681SAndroid Build Coastguard Worker; CHECK:        cmn x0, x1
311*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:   csel x0, x0, x1, hs
312*9880d681SAndroid Build Coastguard Worker  %t = call {i64, i1} @llvm.uadd.with.overflow.i64(i64 %v1, i64 %v2)
313*9880d681SAndroid Build Coastguard Worker  %obit = extractvalue {i64, i1} %t, 1
314*9880d681SAndroid Build Coastguard Worker  %ret = select i1 %obit, i64 %v1, i64 %v2
315*9880d681SAndroid Build Coastguard Worker  ret i64 %ret
316*9880d681SAndroid Build Coastguard Worker}
317*9880d681SAndroid Build Coastguard Worker
318*9880d681SAndroid Build Coastguard Workerdefine i32 @ssubo.select.i32(i32 %v1, i32 %v2) {
319*9880d681SAndroid Build Coastguard Workerentry:
320*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL:  ssubo.select.i32
321*9880d681SAndroid Build Coastguard Worker; CHECK:        cmp w0, w1
322*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:   csel w0, w0, w1, vs
323*9880d681SAndroid Build Coastguard Worker  %t = call {i32, i1} @llvm.ssub.with.overflow.i32(i32 %v1, i32 %v2)
324*9880d681SAndroid Build Coastguard Worker  %obit = extractvalue {i32, i1} %t, 1
325*9880d681SAndroid Build Coastguard Worker  %ret = select i1 %obit, i32 %v1, i32 %v2
326*9880d681SAndroid Build Coastguard Worker  ret i32 %ret
327*9880d681SAndroid Build Coastguard Worker}
328*9880d681SAndroid Build Coastguard Worker
329*9880d681SAndroid Build Coastguard Workerdefine i64 @ssubo.select.i64(i64 %v1, i64 %v2) {
330*9880d681SAndroid Build Coastguard Workerentry:
331*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL:  ssubo.select.i64
332*9880d681SAndroid Build Coastguard Worker; CHECK:        cmp x0, x1
333*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:   csel x0, x0, x1, vs
334*9880d681SAndroid Build Coastguard Worker  %t = call {i64, i1} @llvm.ssub.with.overflow.i64(i64 %v1, i64 %v2)
335*9880d681SAndroid Build Coastguard Worker  %obit = extractvalue {i64, i1} %t, 1
336*9880d681SAndroid Build Coastguard Worker  %ret = select i1 %obit, i64 %v1, i64 %v2
337*9880d681SAndroid Build Coastguard Worker  ret i64 %ret
338*9880d681SAndroid Build Coastguard Worker}
339*9880d681SAndroid Build Coastguard Worker
340*9880d681SAndroid Build Coastguard Workerdefine i32 @usubo.select.i32(i32 %v1, i32 %v2) {
341*9880d681SAndroid Build Coastguard Workerentry:
342*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL:  usubo.select.i32
343*9880d681SAndroid Build Coastguard Worker; CHECK:        cmp w0, w1
344*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:   csel w0, w0, w1, lo
345*9880d681SAndroid Build Coastguard Worker  %t = call {i32, i1} @llvm.usub.with.overflow.i32(i32 %v1, i32 %v2)
346*9880d681SAndroid Build Coastguard Worker  %obit = extractvalue {i32, i1} %t, 1
347*9880d681SAndroid Build Coastguard Worker  %ret = select i1 %obit, i32 %v1, i32 %v2
348*9880d681SAndroid Build Coastguard Worker  ret i32 %ret
349*9880d681SAndroid Build Coastguard Worker}
350*9880d681SAndroid Build Coastguard Worker
351*9880d681SAndroid Build Coastguard Workerdefine i64 @usubo.select.i64(i64 %v1, i64 %v2) {
352*9880d681SAndroid Build Coastguard Workerentry:
353*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL:  usubo.select.i64
354*9880d681SAndroid Build Coastguard Worker; CHECK:        cmp x0, x1
355*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:   csel x0, x0, x1, lo
356*9880d681SAndroid Build Coastguard Worker  %t = call {i64, i1} @llvm.usub.with.overflow.i64(i64 %v1, i64 %v2)
357*9880d681SAndroid Build Coastguard Worker  %obit = extractvalue {i64, i1} %t, 1
358*9880d681SAndroid Build Coastguard Worker  %ret = select i1 %obit, i64 %v1, i64 %v2
359*9880d681SAndroid Build Coastguard Worker  ret i64 %ret
360*9880d681SAndroid Build Coastguard Worker}
361*9880d681SAndroid Build Coastguard Worker
362*9880d681SAndroid Build Coastguard Workerdefine i32 @smulo.select.i32(i32 %v1, i32 %v2) {
363*9880d681SAndroid Build Coastguard Workerentry:
364*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL:  smulo.select.i32
365*9880d681SAndroid Build Coastguard Worker; CHECK:        smull   x[[MREG:[0-9]+]], w0, w1
366*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:   lsr     x[[SREG:[0-9]+]], x[[MREG]], #32
367*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:   cmp     w[[SREG]], w[[MREG]], asr #31
368*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:   csel    w0, w0, w1, ne
369*9880d681SAndroid Build Coastguard Worker  %t = call {i32, i1} @llvm.smul.with.overflow.i32(i32 %v1, i32 %v2)
370*9880d681SAndroid Build Coastguard Worker  %obit = extractvalue {i32, i1} %t, 1
371*9880d681SAndroid Build Coastguard Worker  %ret = select i1 %obit, i32 %v1, i32 %v2
372*9880d681SAndroid Build Coastguard Worker  ret i32 %ret
373*9880d681SAndroid Build Coastguard Worker}
374*9880d681SAndroid Build Coastguard Worker
375*9880d681SAndroid Build Coastguard Workerdefine i64 @smulo.select.i64(i64 %v1, i64 %v2) {
376*9880d681SAndroid Build Coastguard Workerentry:
377*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL:  smulo.select.i64
378*9880d681SAndroid Build Coastguard Worker; CHECK:        mul     [[MREG:x[0-9]+]], x0, x1
379*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:   smulh   [[HREG:x[0-9]+]], x0, x1
380*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:   cmp     [[HREG]], [[MREG]], asr #63
381*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:   csel    x0, x0, x1, ne
382*9880d681SAndroid Build Coastguard Worker  %t = call {i64, i1} @llvm.smul.with.overflow.i64(i64 %v1, i64 %v2)
383*9880d681SAndroid Build Coastguard Worker  %obit = extractvalue {i64, i1} %t, 1
384*9880d681SAndroid Build Coastguard Worker  %ret = select i1 %obit, i64 %v1, i64 %v2
385*9880d681SAndroid Build Coastguard Worker  ret i64 %ret
386*9880d681SAndroid Build Coastguard Worker}
387*9880d681SAndroid Build Coastguard Worker
388*9880d681SAndroid Build Coastguard Workerdefine i32 @umulo.select.i32(i32 %v1, i32 %v2) {
389*9880d681SAndroid Build Coastguard Workerentry:
390*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL:  umulo.select.i32
391*9880d681SAndroid Build Coastguard Worker; CHECK:        umull   [[MREG:x[0-9]+]], w0, w1
392*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:   cmp     xzr, [[MREG]], lsr #32
393*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:   csel    w0, w0, w1, ne
394*9880d681SAndroid Build Coastguard Worker  %t = call {i32, i1} @llvm.umul.with.overflow.i32(i32 %v1, i32 %v2)
395*9880d681SAndroid Build Coastguard Worker  %obit = extractvalue {i32, i1} %t, 1
396*9880d681SAndroid Build Coastguard Worker  %ret = select i1 %obit, i32 %v1, i32 %v2
397*9880d681SAndroid Build Coastguard Worker  ret i32 %ret
398*9880d681SAndroid Build Coastguard Worker}
399*9880d681SAndroid Build Coastguard Worker
400*9880d681SAndroid Build Coastguard Workerdefine i64 @umulo.select.i64(i64 %v1, i64 %v2) {
401*9880d681SAndroid Build Coastguard Workerentry:
402*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL:  umulo.select.i64
403*9880d681SAndroid Build Coastguard Worker; CHECK:        umulh   [[MREG:x[0-9]+]], x0, x1
404*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:   cmp     xzr, [[MREG]]
405*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:   csel    x0, x0, x1, ne
406*9880d681SAndroid Build Coastguard Worker  %t = call {i64, i1} @llvm.umul.with.overflow.i64(i64 %v1, i64 %v2)
407*9880d681SAndroid Build Coastguard Worker  %obit = extractvalue {i64, i1} %t, 1
408*9880d681SAndroid Build Coastguard Worker  %ret = select i1 %obit, i64 %v1, i64 %v2
409*9880d681SAndroid Build Coastguard Worker  ret i64 %ret
410*9880d681SAndroid Build Coastguard Worker}
411*9880d681SAndroid Build Coastguard Worker
412*9880d681SAndroid Build Coastguard Worker
413*9880d681SAndroid Build Coastguard Worker;
414*9880d681SAndroid Build Coastguard Worker; Check the use of the overflow bit in combination with a branch instruction.
415*9880d681SAndroid Build Coastguard Worker;
416*9880d681SAndroid Build Coastguard Workerdefine zeroext i1 @saddo.br.i32(i32 %v1, i32 %v2) {
417*9880d681SAndroid Build Coastguard Workerentry:
418*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL:  saddo.br.i32
419*9880d681SAndroid Build Coastguard Worker; CHECK:        cmn w0, w1
420*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:   b.vc
421*9880d681SAndroid Build Coastguard Worker  %t = call {i32, i1} @llvm.sadd.with.overflow.i32(i32 %v1, i32 %v2)
422*9880d681SAndroid Build Coastguard Worker  %val = extractvalue {i32, i1} %t, 0
423*9880d681SAndroid Build Coastguard Worker  %obit = extractvalue {i32, i1} %t, 1
424*9880d681SAndroid Build Coastguard Worker  br i1 %obit, label %overflow, label %continue
425*9880d681SAndroid Build Coastguard Worker
426*9880d681SAndroid Build Coastguard Workeroverflow:
427*9880d681SAndroid Build Coastguard Worker  ret i1 false
428*9880d681SAndroid Build Coastguard Worker
429*9880d681SAndroid Build Coastguard Workercontinue:
430*9880d681SAndroid Build Coastguard Worker  ret i1 true
431*9880d681SAndroid Build Coastguard Worker}
432*9880d681SAndroid Build Coastguard Worker
433*9880d681SAndroid Build Coastguard Workerdefine zeroext i1 @saddo.br.i64(i64 %v1, i64 %v2) {
434*9880d681SAndroid Build Coastguard Workerentry:
435*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL:  saddo.br.i64
436*9880d681SAndroid Build Coastguard Worker; CHECK:        cmn x0, x1
437*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:   b.vc
438*9880d681SAndroid Build Coastguard Worker  %t = call {i64, i1} @llvm.sadd.with.overflow.i64(i64 %v1, i64 %v2)
439*9880d681SAndroid Build Coastguard Worker  %val = extractvalue {i64, i1} %t, 0
440*9880d681SAndroid Build Coastguard Worker  %obit = extractvalue {i64, i1} %t, 1
441*9880d681SAndroid Build Coastguard Worker  br i1 %obit, label %overflow, label %continue
442*9880d681SAndroid Build Coastguard Worker
443*9880d681SAndroid Build Coastguard Workeroverflow:
444*9880d681SAndroid Build Coastguard Worker  ret i1 false
445*9880d681SAndroid Build Coastguard Worker
446*9880d681SAndroid Build Coastguard Workercontinue:
447*9880d681SAndroid Build Coastguard Worker  ret i1 true
448*9880d681SAndroid Build Coastguard Worker}
449*9880d681SAndroid Build Coastguard Worker
450*9880d681SAndroid Build Coastguard Workerdefine zeroext i1 @uaddo.br.i32(i32 %v1, i32 %v2) {
451*9880d681SAndroid Build Coastguard Workerentry:
452*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL:  uaddo.br.i32
453*9880d681SAndroid Build Coastguard Worker; CHECK:        cmn w0, w1
454*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:   b.lo
455*9880d681SAndroid Build Coastguard Worker  %t = call {i32, i1} @llvm.uadd.with.overflow.i32(i32 %v1, i32 %v2)
456*9880d681SAndroid Build Coastguard Worker  %val = extractvalue {i32, i1} %t, 0
457*9880d681SAndroid Build Coastguard Worker  %obit = extractvalue {i32, i1} %t, 1
458*9880d681SAndroid Build Coastguard Worker  br i1 %obit, label %overflow, label %continue
459*9880d681SAndroid Build Coastguard Worker
460*9880d681SAndroid Build Coastguard Workeroverflow:
461*9880d681SAndroid Build Coastguard Worker  ret i1 false
462*9880d681SAndroid Build Coastguard Worker
463*9880d681SAndroid Build Coastguard Workercontinue:
464*9880d681SAndroid Build Coastguard Worker  ret i1 true
465*9880d681SAndroid Build Coastguard Worker}
466*9880d681SAndroid Build Coastguard Worker
467*9880d681SAndroid Build Coastguard Workerdefine zeroext i1 @uaddo.br.i64(i64 %v1, i64 %v2) {
468*9880d681SAndroid Build Coastguard Workerentry:
469*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL:  uaddo.br.i64
470*9880d681SAndroid Build Coastguard Worker; CHECK:        cmn x0, x1
471*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:   b.lo
472*9880d681SAndroid Build Coastguard Worker  %t = call {i64, i1} @llvm.uadd.with.overflow.i64(i64 %v1, i64 %v2)
473*9880d681SAndroid Build Coastguard Worker  %val = extractvalue {i64, i1} %t, 0
474*9880d681SAndroid Build Coastguard Worker  %obit = extractvalue {i64, i1} %t, 1
475*9880d681SAndroid Build Coastguard Worker  br i1 %obit, label %overflow, label %continue
476*9880d681SAndroid Build Coastguard Worker
477*9880d681SAndroid Build Coastguard Workeroverflow:
478*9880d681SAndroid Build Coastguard Worker  ret i1 false
479*9880d681SAndroid Build Coastguard Worker
480*9880d681SAndroid Build Coastguard Workercontinue:
481*9880d681SAndroid Build Coastguard Worker  ret i1 true
482*9880d681SAndroid Build Coastguard Worker}
483*9880d681SAndroid Build Coastguard Worker
484*9880d681SAndroid Build Coastguard Workerdefine zeroext i1 @ssubo.br.i32(i32 %v1, i32 %v2) {
485*9880d681SAndroid Build Coastguard Workerentry:
486*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL:  ssubo.br.i32
487*9880d681SAndroid Build Coastguard Worker; CHECK:        cmp w0, w1
488*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:   b.vc
489*9880d681SAndroid Build Coastguard Worker  %t = call {i32, i1} @llvm.ssub.with.overflow.i32(i32 %v1, i32 %v2)
490*9880d681SAndroid Build Coastguard Worker  %val = extractvalue {i32, i1} %t, 0
491*9880d681SAndroid Build Coastguard Worker  %obit = extractvalue {i32, i1} %t, 1
492*9880d681SAndroid Build Coastguard Worker  br i1 %obit, label %overflow, label %continue
493*9880d681SAndroid Build Coastguard Worker
494*9880d681SAndroid Build Coastguard Workeroverflow:
495*9880d681SAndroid Build Coastguard Worker  ret i1 false
496*9880d681SAndroid Build Coastguard Worker
497*9880d681SAndroid Build Coastguard Workercontinue:
498*9880d681SAndroid Build Coastguard Worker  ret i1 true
499*9880d681SAndroid Build Coastguard Worker}
500*9880d681SAndroid Build Coastguard Worker
501*9880d681SAndroid Build Coastguard Workerdefine zeroext i1 @ssubo.br.i64(i64 %v1, i64 %v2) {
502*9880d681SAndroid Build Coastguard Workerentry:
503*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL:  ssubo.br.i64
504*9880d681SAndroid Build Coastguard Worker; CHECK:        cmp x0, x1
505*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:   b.vc
506*9880d681SAndroid Build Coastguard Worker  %t = call {i64, i1} @llvm.ssub.with.overflow.i64(i64 %v1, i64 %v2)
507*9880d681SAndroid Build Coastguard Worker  %val = extractvalue {i64, i1} %t, 0
508*9880d681SAndroid Build Coastguard Worker  %obit = extractvalue {i64, i1} %t, 1
509*9880d681SAndroid Build Coastguard Worker  br i1 %obit, label %overflow, label %continue
510*9880d681SAndroid Build Coastguard Worker
511*9880d681SAndroid Build Coastguard Workeroverflow:
512*9880d681SAndroid Build Coastguard Worker  ret i1 false
513*9880d681SAndroid Build Coastguard Worker
514*9880d681SAndroid Build Coastguard Workercontinue:
515*9880d681SAndroid Build Coastguard Worker  ret i1 true
516*9880d681SAndroid Build Coastguard Worker}
517*9880d681SAndroid Build Coastguard Worker
518*9880d681SAndroid Build Coastguard Workerdefine zeroext i1 @usubo.br.i32(i32 %v1, i32 %v2) {
519*9880d681SAndroid Build Coastguard Workerentry:
520*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL:  usubo.br.i32
521*9880d681SAndroid Build Coastguard Worker; CHECK:        cmp w0, w1
522*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:   b.hs
523*9880d681SAndroid Build Coastguard Worker  %t = call {i32, i1} @llvm.usub.with.overflow.i32(i32 %v1, i32 %v2)
524*9880d681SAndroid Build Coastguard Worker  %val = extractvalue {i32, i1} %t, 0
525*9880d681SAndroid Build Coastguard Worker  %obit = extractvalue {i32, i1} %t, 1
526*9880d681SAndroid Build Coastguard Worker  br i1 %obit, label %overflow, label %continue
527*9880d681SAndroid Build Coastguard Worker
528*9880d681SAndroid Build Coastguard Workeroverflow:
529*9880d681SAndroid Build Coastguard Worker  ret i1 false
530*9880d681SAndroid Build Coastguard Worker
531*9880d681SAndroid Build Coastguard Workercontinue:
532*9880d681SAndroid Build Coastguard Worker  ret i1 true
533*9880d681SAndroid Build Coastguard Worker}
534*9880d681SAndroid Build Coastguard Worker
535*9880d681SAndroid Build Coastguard Workerdefine zeroext i1 @usubo.br.i64(i64 %v1, i64 %v2) {
536*9880d681SAndroid Build Coastguard Workerentry:
537*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL:  usubo.br.i64
538*9880d681SAndroid Build Coastguard Worker; CHECK:        cmp x0, x1
539*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:   b.hs
540*9880d681SAndroid Build Coastguard Worker  %t = call {i64, i1} @llvm.usub.with.overflow.i64(i64 %v1, i64 %v2)
541*9880d681SAndroid Build Coastguard Worker  %val = extractvalue {i64, i1} %t, 0
542*9880d681SAndroid Build Coastguard Worker  %obit = extractvalue {i64, i1} %t, 1
543*9880d681SAndroid Build Coastguard Worker  br i1 %obit, label %overflow, label %continue
544*9880d681SAndroid Build Coastguard Worker
545*9880d681SAndroid Build Coastguard Workeroverflow:
546*9880d681SAndroid Build Coastguard Worker  ret i1 false
547*9880d681SAndroid Build Coastguard Worker
548*9880d681SAndroid Build Coastguard Workercontinue:
549*9880d681SAndroid Build Coastguard Worker  ret i1 true
550*9880d681SAndroid Build Coastguard Worker}
551*9880d681SAndroid Build Coastguard Worker
552*9880d681SAndroid Build Coastguard Workerdefine zeroext i1 @smulo.br.i32(i32 %v1, i32 %v2) {
553*9880d681SAndroid Build Coastguard Workerentry:
554*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL:  smulo.br.i32
555*9880d681SAndroid Build Coastguard Worker; CHECK:        smull   x[[MREG:[0-9]+]], w0, w1
556*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:   lsr     x[[SREG:[0-9]+]], x8, #32
557*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:   cmp     w[[SREG]], w[[MREG]], asr #31
558*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:   b.eq
559*9880d681SAndroid Build Coastguard Worker  %t = call {i32, i1} @llvm.smul.with.overflow.i32(i32 %v1, i32 %v2)
560*9880d681SAndroid Build Coastguard Worker  %val = extractvalue {i32, i1} %t, 0
561*9880d681SAndroid Build Coastguard Worker  %obit = extractvalue {i32, i1} %t, 1
562*9880d681SAndroid Build Coastguard Worker  br i1 %obit, label %overflow, label %continue
563*9880d681SAndroid Build Coastguard Worker
564*9880d681SAndroid Build Coastguard Workeroverflow:
565*9880d681SAndroid Build Coastguard Worker  ret i1 false
566*9880d681SAndroid Build Coastguard Worker
567*9880d681SAndroid Build Coastguard Workercontinue:
568*9880d681SAndroid Build Coastguard Worker  ret i1 true
569*9880d681SAndroid Build Coastguard Worker}
570*9880d681SAndroid Build Coastguard Worker
571*9880d681SAndroid Build Coastguard Workerdefine zeroext i1 @smulo.br.i64(i64 %v1, i64 %v2) {
572*9880d681SAndroid Build Coastguard Workerentry:
573*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL:  smulo.br.i64
574*9880d681SAndroid Build Coastguard Worker; CHECK:        mul     [[MREG:x[0-9]+]], x0, x1
575*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:   smulh   [[HREG:x[0-9]+]], x0, x1
576*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:   cmp     [[HREG]], [[MREG]], asr #63
577*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:   b.eq
578*9880d681SAndroid Build Coastguard Worker  %t = call {i64, i1} @llvm.smul.with.overflow.i64(i64 %v1, i64 %v2)
579*9880d681SAndroid Build Coastguard Worker  %val = extractvalue {i64, i1} %t, 0
580*9880d681SAndroid Build Coastguard Worker  %obit = extractvalue {i64, i1} %t, 1
581*9880d681SAndroid Build Coastguard Worker  br i1 %obit, label %overflow, label %continue
582*9880d681SAndroid Build Coastguard Worker
583*9880d681SAndroid Build Coastguard Workeroverflow:
584*9880d681SAndroid Build Coastguard Worker  ret i1 false
585*9880d681SAndroid Build Coastguard Worker
586*9880d681SAndroid Build Coastguard Workercontinue:
587*9880d681SAndroid Build Coastguard Worker  ret i1 true
588*9880d681SAndroid Build Coastguard Worker}
589*9880d681SAndroid Build Coastguard Worker
590*9880d681SAndroid Build Coastguard Workerdefine zeroext i1 @smulo2.br.i64(i64 %v1) {
591*9880d681SAndroid Build Coastguard Workerentry:
592*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL:  smulo2.br.i64
593*9880d681SAndroid Build Coastguard Worker; CHECK:        cmn  x0, x0
594*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:   b.vc
595*9880d681SAndroid Build Coastguard Worker  %t = call {i64, i1} @llvm.smul.with.overflow.i64(i64 %v1, i64 2)
596*9880d681SAndroid Build Coastguard Worker  %val = extractvalue {i64, i1} %t, 0
597*9880d681SAndroid Build Coastguard Worker  %obit = extractvalue {i64, i1} %t, 1
598*9880d681SAndroid Build Coastguard Worker  br i1 %obit, label %overflow, label %continue
599*9880d681SAndroid Build Coastguard Worker
600*9880d681SAndroid Build Coastguard Workeroverflow:
601*9880d681SAndroid Build Coastguard Worker  ret i1 false
602*9880d681SAndroid Build Coastguard Worker
603*9880d681SAndroid Build Coastguard Workercontinue:
604*9880d681SAndroid Build Coastguard Worker  ret i1 true
605*9880d681SAndroid Build Coastguard Worker}
606*9880d681SAndroid Build Coastguard Worker
607*9880d681SAndroid Build Coastguard Workerdefine zeroext i1 @umulo.br.i32(i32 %v1, i32 %v2) {
608*9880d681SAndroid Build Coastguard Workerentry:
609*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL:  umulo.br.i32
610*9880d681SAndroid Build Coastguard Worker; CHECK:        umull   [[MREG:x[0-9]+]], w0, w1
611*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:   cmp     xzr, [[MREG]], lsr #32
612*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:   b.eq
613*9880d681SAndroid Build Coastguard Worker  %t = call {i32, i1} @llvm.umul.with.overflow.i32(i32 %v1, i32 %v2)
614*9880d681SAndroid Build Coastguard Worker  %val = extractvalue {i32, i1} %t, 0
615*9880d681SAndroid Build Coastguard Worker  %obit = extractvalue {i32, i1} %t, 1
616*9880d681SAndroid Build Coastguard Worker  br i1 %obit, label %overflow, label %continue
617*9880d681SAndroid Build Coastguard Worker
618*9880d681SAndroid Build Coastguard Workeroverflow:
619*9880d681SAndroid Build Coastguard Worker  ret i1 false
620*9880d681SAndroid Build Coastguard Worker
621*9880d681SAndroid Build Coastguard Workercontinue:
622*9880d681SAndroid Build Coastguard Worker  ret i1 true
623*9880d681SAndroid Build Coastguard Worker}
624*9880d681SAndroid Build Coastguard Worker
625*9880d681SAndroid Build Coastguard Workerdefine zeroext i1 @umulo.br.i64(i64 %v1, i64 %v2) {
626*9880d681SAndroid Build Coastguard Workerentry:
627*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL:  umulo.br.i64
628*9880d681SAndroid Build Coastguard Worker; CHECK:        umulh   [[REG:x[0-9]+]], x0, x1
629*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:   {{cbz|cmp}}
630*9880d681SAndroid Build Coastguard Worker  %t = call {i64, i1} @llvm.umul.with.overflow.i64(i64 %v1, i64 %v2)
631*9880d681SAndroid Build Coastguard Worker  %val = extractvalue {i64, i1} %t, 0
632*9880d681SAndroid Build Coastguard Worker  %obit = extractvalue {i64, i1} %t, 1
633*9880d681SAndroid Build Coastguard Worker  br i1 %obit, label %overflow, label %continue
634*9880d681SAndroid Build Coastguard Worker
635*9880d681SAndroid Build Coastguard Workeroverflow:
636*9880d681SAndroid Build Coastguard Worker  ret i1 false
637*9880d681SAndroid Build Coastguard Worker
638*9880d681SAndroid Build Coastguard Workercontinue:
639*9880d681SAndroid Build Coastguard Worker  ret i1 true
640*9880d681SAndroid Build Coastguard Worker}
641*9880d681SAndroid Build Coastguard Worker
642*9880d681SAndroid Build Coastguard Workerdefine zeroext i1 @umulo2.br.i64(i64 %v1) {
643*9880d681SAndroid Build Coastguard Workerentry:
644*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL:  umulo2.br.i64
645*9880d681SAndroid Build Coastguard Worker; CHECK:        cmn  x0, x0
646*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:   b.lo
647*9880d681SAndroid Build Coastguard Worker  %t = call {i64, i1} @llvm.umul.with.overflow.i64(i64 %v1, i64 2)
648*9880d681SAndroid Build Coastguard Worker  %val = extractvalue {i64, i1} %t, 0
649*9880d681SAndroid Build Coastguard Worker  %obit = extractvalue {i64, i1} %t, 1
650*9880d681SAndroid Build Coastguard Worker  br i1 %obit, label %overflow, label %continue
651*9880d681SAndroid Build Coastguard Worker
652*9880d681SAndroid Build Coastguard Workeroverflow:
653*9880d681SAndroid Build Coastguard Worker  ret i1 false
654*9880d681SAndroid Build Coastguard Worker
655*9880d681SAndroid Build Coastguard Workercontinue:
656*9880d681SAndroid Build Coastguard Worker  ret i1 true
657*9880d681SAndroid Build Coastguard Worker}
658*9880d681SAndroid Build Coastguard Worker
659*9880d681SAndroid Build Coastguard Workerdeclare {i32, i1} @llvm.sadd.with.overflow.i32(i32, i32) nounwind readnone
660*9880d681SAndroid Build Coastguard Workerdeclare {i64, i1} @llvm.sadd.with.overflow.i64(i64, i64) nounwind readnone
661*9880d681SAndroid Build Coastguard Workerdeclare {i32, i1} @llvm.uadd.with.overflow.i32(i32, i32) nounwind readnone
662*9880d681SAndroid Build Coastguard Workerdeclare {i64, i1} @llvm.uadd.with.overflow.i64(i64, i64) nounwind readnone
663*9880d681SAndroid Build Coastguard Workerdeclare {i32, i1} @llvm.ssub.with.overflow.i32(i32, i32) nounwind readnone
664*9880d681SAndroid Build Coastguard Workerdeclare {i64, i1} @llvm.ssub.with.overflow.i64(i64, i64) nounwind readnone
665*9880d681SAndroid Build Coastguard Workerdeclare {i32, i1} @llvm.usub.with.overflow.i32(i32, i32) nounwind readnone
666*9880d681SAndroid Build Coastguard Workerdeclare {i64, i1} @llvm.usub.with.overflow.i64(i64, i64) nounwind readnone
667*9880d681SAndroid Build Coastguard Workerdeclare {i32, i1} @llvm.smul.with.overflow.i32(i32, i32) nounwind readnone
668*9880d681SAndroid Build Coastguard Workerdeclare {i64, i1} @llvm.smul.with.overflow.i64(i64, i64) nounwind readnone
669*9880d681SAndroid Build Coastguard Workerdeclare {i32, i1} @llvm.umul.with.overflow.i32(i32, i32) nounwind readnone
670*9880d681SAndroid Build Coastguard Workerdeclare {i64, i1} @llvm.umul.with.overflow.i64(i64, i64) nounwind readnone
671*9880d681SAndroid Build Coastguard Worker
672