xref: /aosp_15_r20/external/llvm/test/CodeGen/ARM/divmod-eabi.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; RUN: llc -mtriple armv7-none-eabi %s -o - | FileCheck %s --check-prefix=EABI
2*9880d681SAndroid Build Coastguard Worker; RUN: llc -mtriple armv7-none-eabihf %s -o - | FileCheck %s --check-prefix=EABI
3*9880d681SAndroid Build Coastguard Worker; All "eabi" (Bare, GNU and Android) must lower SREM/UREM to __aeabi_{u,i}divmod
4*9880d681SAndroid Build Coastguard Worker; RUN: llc -mtriple armv7-linux-androideabi %s -o - | FileCheck %s --check-prefix=EABI
5*9880d681SAndroid Build Coastguard Worker; RUN: llc -mtriple armv7-linux-gnueabi %s -o - | FileCheck %s --check-prefix=EABI
6*9880d681SAndroid Build Coastguard Worker; RUN: llc -mtriple armv7-linux-musleabi %s -o - | FileCheck %s --check-prefix=EABI
7*9880d681SAndroid Build Coastguard Worker; RUN: llc -mtriple armv7-apple-darwin %s -o - | FileCheck %s --check-prefix=DARWIN
8*9880d681SAndroid Build Coastguard Worker; FIXME: long-term, we will use "-apple-macho" and won't need this exception:
9*9880d681SAndroid Build Coastguard Worker; RUN: llc -mtriple armv7-apple-darwin-eabi %s -o - | FileCheck %s --check-prefix=DARWIN
10*9880d681SAndroid Build Coastguard Worker
11*9880d681SAndroid Build Coastguard Workerdefine signext i16 @f16(i16 signext %a, i16 signext %b) {
12*9880d681SAndroid Build Coastguard Worker; EABI-LABEL: f16:
13*9880d681SAndroid Build Coastguard Worker; DARWIN-LABEL: f16:
14*9880d681SAndroid Build Coastguard Workerentry:
15*9880d681SAndroid Build Coastguard Worker  %conv = sext i16 %a to i32
16*9880d681SAndroid Build Coastguard Worker  %conv1 = sext i16 %b to i32
17*9880d681SAndroid Build Coastguard Worker  %div = sdiv i32 %conv, %conv1
18*9880d681SAndroid Build Coastguard Worker  %rem = srem i32 %conv, %conv1
19*9880d681SAndroid Build Coastguard Worker; EABI: __aeabi_idivmod
20*9880d681SAndroid Build Coastguard Worker; EABI: mov [[div:r[0-9]+]], r0
21*9880d681SAndroid Build Coastguard Worker; EABI: mov [[rem:r[0-9]+]], r1
22*9880d681SAndroid Build Coastguard Worker; DARWIN: ___divsi3
23*9880d681SAndroid Build Coastguard Worker; DARWIN: mov [[sum:r[0-9]+]], r0
24*9880d681SAndroid Build Coastguard Worker; DARWIN: __modsi3
25*9880d681SAndroid Build Coastguard Worker; DARWIN: add [[sum]]{{.*}}r0
26*9880d681SAndroid Build Coastguard Worker  %rem8 = srem i32 %conv1, %conv
27*9880d681SAndroid Build Coastguard Worker; EABI: __aeabi_idivmod
28*9880d681SAndroid Build Coastguard Worker; DARWIN: __modsi3
29*9880d681SAndroid Build Coastguard Worker  %add = add nsw i32 %rem, %div
30*9880d681SAndroid Build Coastguard Worker  %add13 = add nsw i32 %add, %rem8
31*9880d681SAndroid Build Coastguard Worker  %conv14 = trunc i32 %add13 to i16
32*9880d681SAndroid Build Coastguard Worker; EABI: add r0{{.*}}r1
33*9880d681SAndroid Build Coastguard Worker; EABI: sxth r0, r0
34*9880d681SAndroid Build Coastguard Worker; DARWIN: add r0{{.*}}[[sum]]
35*9880d681SAndroid Build Coastguard Worker; DARWIN: sxth r0, r0
36*9880d681SAndroid Build Coastguard Worker  ret i16 %conv14
37*9880d681SAndroid Build Coastguard Worker}
38*9880d681SAndroid Build Coastguard Worker
39*9880d681SAndroid Build Coastguard Workerdefine i32 @f32(i32 %a, i32 %b) {
40*9880d681SAndroid Build Coastguard Worker; EABI-LABEL: f32:
41*9880d681SAndroid Build Coastguard Worker; DARWIN-LABEL: f32:
42*9880d681SAndroid Build Coastguard Workerentry:
43*9880d681SAndroid Build Coastguard Worker  %div = sdiv i32 %a, %b
44*9880d681SAndroid Build Coastguard Worker  %rem = srem i32 %a, %b
45*9880d681SAndroid Build Coastguard Worker; EABI: __aeabi_idivmod
46*9880d681SAndroid Build Coastguard Worker; EABI: mov [[div:r[0-9]+]], r0
47*9880d681SAndroid Build Coastguard Worker; EABI: mov [[rem:r[0-9]+]], r1
48*9880d681SAndroid Build Coastguard Worker; DARWIN: ___divsi3
49*9880d681SAndroid Build Coastguard Worker; DARWIN: mov [[sum:r[0-9]+]], r0
50*9880d681SAndroid Build Coastguard Worker; DARWIN: __modsi3
51*9880d681SAndroid Build Coastguard Worker; DARWIN: add [[sum]]{{.*}}r0
52*9880d681SAndroid Build Coastguard Worker  %rem1 = srem i32 %b, %a
53*9880d681SAndroid Build Coastguard Worker; EABI: __aeabi_idivmod
54*9880d681SAndroid Build Coastguard Worker; DARWIN: __modsi3
55*9880d681SAndroid Build Coastguard Worker  %add = add nsw i32 %rem, %div
56*9880d681SAndroid Build Coastguard Worker  %add2 = add nsw i32 %add, %rem1
57*9880d681SAndroid Build Coastguard Worker; EABI: add r0{{.*}}r1
58*9880d681SAndroid Build Coastguard Worker; DARWIN: add r0{{.*}}[[sum]]
59*9880d681SAndroid Build Coastguard Worker  ret i32 %add2
60*9880d681SAndroid Build Coastguard Worker}
61*9880d681SAndroid Build Coastguard Worker
62*9880d681SAndroid Build Coastguard Workerdefine i32 @uf(i32 %a, i32 %b) {
63*9880d681SAndroid Build Coastguard Worker; EABI-LABEL: uf:
64*9880d681SAndroid Build Coastguard Worker; DARWIN-LABEL: uf:
65*9880d681SAndroid Build Coastguard Workerentry:
66*9880d681SAndroid Build Coastguard Worker  %div = udiv i32 %a, %b
67*9880d681SAndroid Build Coastguard Worker  %rem = urem i32 %a, %b
68*9880d681SAndroid Build Coastguard Worker; EABI: __aeabi_uidivmod
69*9880d681SAndroid Build Coastguard Worker; DARWIN: ___udivsi3
70*9880d681SAndroid Build Coastguard Worker; DARWIN: mov [[sum:r[0-9]+]], r0
71*9880d681SAndroid Build Coastguard Worker; DARWIN: __umodsi3
72*9880d681SAndroid Build Coastguard Worker; DARWIN: add [[sum]]{{.*}}r0
73*9880d681SAndroid Build Coastguard Worker  %rem1 = urem i32 %b, %a
74*9880d681SAndroid Build Coastguard Worker; EABI: __aeabi_uidivmod
75*9880d681SAndroid Build Coastguard Worker; DARWIN: __umodsi3
76*9880d681SAndroid Build Coastguard Worker  %add = add nuw i32 %rem, %div
77*9880d681SAndroid Build Coastguard Worker  %add2 = add nuw i32 %add, %rem1
78*9880d681SAndroid Build Coastguard Worker; EABI: add r0{{.*}}r1
79*9880d681SAndroid Build Coastguard Worker; DARWIN: add r0{{.*}}[[sum]]
80*9880d681SAndroid Build Coastguard Worker  ret i32 %add2
81*9880d681SAndroid Build Coastguard Worker}
82*9880d681SAndroid Build Coastguard Worker
83*9880d681SAndroid Build Coastguard Workerdefine i64 @longf(i64 %a, i64 %b) {
84*9880d681SAndroid Build Coastguard Worker; EABI-LABEL: longf:
85*9880d681SAndroid Build Coastguard Worker; DARWIN-LABEL: longf:
86*9880d681SAndroid Build Coastguard Workerentry:
87*9880d681SAndroid Build Coastguard Worker  %div = sdiv i64 %a, %b
88*9880d681SAndroid Build Coastguard Worker  %rem = srem i64 %a, %b
89*9880d681SAndroid Build Coastguard Worker; EABI: __aeabi_ldivmod
90*9880d681SAndroid Build Coastguard Worker; EABI-NEXT: adds r0
91*9880d681SAndroid Build Coastguard Worker; EABI-NEXT: adc r1
92*9880d681SAndroid Build Coastguard Worker; EABI-NOT: __aeabi_ldivmod
93*9880d681SAndroid Build Coastguard Worker; DARWIN: ___divdi3
94*9880d681SAndroid Build Coastguard Worker; DARWIN: mov [[div1:r[0-9]+]], r0
95*9880d681SAndroid Build Coastguard Worker; DARWIN: mov [[div2:r[0-9]+]], r1
96*9880d681SAndroid Build Coastguard Worker; DARWIN: __moddi3
97*9880d681SAndroid Build Coastguard Worker  %add = add nsw i64 %rem, %div
98*9880d681SAndroid Build Coastguard Worker; DARWIN: adds r0{{.*}}[[div1]]
99*9880d681SAndroid Build Coastguard Worker; DARWIN: adc r1{{.*}}[[div2]]
100*9880d681SAndroid Build Coastguard Worker  ret i64 %add
101*9880d681SAndroid Build Coastguard Worker}
102*9880d681SAndroid Build Coastguard Worker
103*9880d681SAndroid Build Coastguard Workerdefine i16 @shortf(i16 %a, i16 %b) {
104*9880d681SAndroid Build Coastguard Worker; EABI-LABEL: shortf:
105*9880d681SAndroid Build Coastguard Worker; DARWIN-LABEL: shortf:
106*9880d681SAndroid Build Coastguard Workerentry:
107*9880d681SAndroid Build Coastguard Worker  %div = sdiv i16 %a, %b
108*9880d681SAndroid Build Coastguard Worker  %rem = srem i16 %a, %b
109*9880d681SAndroid Build Coastguard Worker; EABI: __aeabi_idivmod
110*9880d681SAndroid Build Coastguard Worker; DARWIN: ___divsi3
111*9880d681SAndroid Build Coastguard Worker; DARWIN: mov [[div1:r[0-9]+]], r0
112*9880d681SAndroid Build Coastguard Worker; DARWIN: __modsi3
113*9880d681SAndroid Build Coastguard Worker  %add = add nsw i16 %rem, %div
114*9880d681SAndroid Build Coastguard Worker; DARWIN: add r0{{.*}}[[div1]]
115*9880d681SAndroid Build Coastguard Worker  ret i16 %add
116*9880d681SAndroid Build Coastguard Worker}
117*9880d681SAndroid Build Coastguard Worker
118*9880d681SAndroid Build Coastguard Workerdefine i32 @g1(i32 %a, i32 %b) {
119*9880d681SAndroid Build Coastguard Worker; EABI-LABEL: g1:
120*9880d681SAndroid Build Coastguard Worker; DARWIN-LABEL: g1:
121*9880d681SAndroid Build Coastguard Workerentry:
122*9880d681SAndroid Build Coastguard Worker  %div = sdiv i32 %a, %b
123*9880d681SAndroid Build Coastguard Worker  %rem = srem i32 %a, %b
124*9880d681SAndroid Build Coastguard Worker; EABI: __aeabi_idivmod
125*9880d681SAndroid Build Coastguard Worker; DARWIN: ___divsi3
126*9880d681SAndroid Build Coastguard Worker; DARWIN: mov [[sum:r[0-9]+]], r0
127*9880d681SAndroid Build Coastguard Worker; DARWIN: __modsi3
128*9880d681SAndroid Build Coastguard Worker  %add = add nsw i32 %rem, %div
129*9880d681SAndroid Build Coastguard Worker; EABI:	add	r0{{.*}}r1
130*9880d681SAndroid Build Coastguard Worker; DARWIN: add r0{{.*}}[[sum]]
131*9880d681SAndroid Build Coastguard Worker  ret i32 %add
132*9880d681SAndroid Build Coastguard Worker}
133*9880d681SAndroid Build Coastguard Worker
134*9880d681SAndroid Build Coastguard Worker; On both Darwin and Gnu, this is just a call to __modsi3
135*9880d681SAndroid Build Coastguard Workerdefine i32 @g2(i32 %a, i32 %b) {
136*9880d681SAndroid Build Coastguard Worker; EABI-LABEL: g2:
137*9880d681SAndroid Build Coastguard Worker; DARWIN-LABEL: g2:
138*9880d681SAndroid Build Coastguard Workerentry:
139*9880d681SAndroid Build Coastguard Worker  %rem = srem i32 %a, %b
140*9880d681SAndroid Build Coastguard Worker; EABI: __aeabi_idivmod
141*9880d681SAndroid Build Coastguard Worker; DARWIN: __modsi3
142*9880d681SAndroid Build Coastguard Worker  ret i32 %rem
143*9880d681SAndroid Build Coastguard Worker; EABI:	mov	r0, r1
144*9880d681SAndroid Build Coastguard Worker}
145*9880d681SAndroid Build Coastguard Worker
146*9880d681SAndroid Build Coastguard Workerdefine i32 @g3(i32 %a, i32 %b) {
147*9880d681SAndroid Build Coastguard Worker; EABI-LABEL: g3:
148*9880d681SAndroid Build Coastguard Worker; DARWIN-LABEL: g3:
149*9880d681SAndroid Build Coastguard Workerentry:
150*9880d681SAndroid Build Coastguard Worker  %rem = srem i32 %a, %b
151*9880d681SAndroid Build Coastguard Worker; EABI: __aeabi_idivmod
152*9880d681SAndroid Build Coastguard Worker; EABI: mov [[mod:r[0-9]+]], r1
153*9880d681SAndroid Build Coastguard Worker; DARWIN: __modsi3
154*9880d681SAndroid Build Coastguard Worker; DARWIN: mov [[sum:r[0-9]+]], r0
155*9880d681SAndroid Build Coastguard Worker  %rem1 = srem i32 %b, %rem
156*9880d681SAndroid Build Coastguard Worker; EABI: __aeabi_idivmod
157*9880d681SAndroid Build Coastguard Worker; DARWIN: __modsi3
158*9880d681SAndroid Build Coastguard Worker  %add = add nsw i32 %rem1, %rem
159*9880d681SAndroid Build Coastguard Worker; EABI: add r0, r1, [[mod]]
160*9880d681SAndroid Build Coastguard Worker; DARWIN: add r0{{.*}}[[sum]]
161*9880d681SAndroid Build Coastguard Worker  ret i32 %add
162*9880d681SAndroid Build Coastguard Worker}
163*9880d681SAndroid Build Coastguard Worker
164*9880d681SAndroid Build Coastguard Workerdefine i32 @g4(i32 %a, i32 %b) {
165*9880d681SAndroid Build Coastguard Worker; EABI-LABEL: g4:
166*9880d681SAndroid Build Coastguard Worker; DARWIN-LABEL: g4:
167*9880d681SAndroid Build Coastguard Workerentry:
168*9880d681SAndroid Build Coastguard Worker  %div = sdiv i32 %a, %b
169*9880d681SAndroid Build Coastguard Worker; EABI: __aeabi_idiv{{$}}
170*9880d681SAndroid Build Coastguard Worker; EABI: mov [[div:r[0-9]+]], r0
171*9880d681SAndroid Build Coastguard Worker; DARWIN: ___divsi3
172*9880d681SAndroid Build Coastguard Worker; DARWIN: mov [[sum:r[0-9]+]], r0
173*9880d681SAndroid Build Coastguard Worker  %rem = srem i32 %b, %div
174*9880d681SAndroid Build Coastguard Worker; EABI: __aeabi_idivmod
175*9880d681SAndroid Build Coastguard Worker; DARWIN: __modsi3
176*9880d681SAndroid Build Coastguard Worker  %add = add nsw i32 %rem, %div
177*9880d681SAndroid Build Coastguard Worker; EABI: add r0, r1, [[div]]
178*9880d681SAndroid Build Coastguard Worker; DARWIN: add r0{{.*}}[[sum]]
179*9880d681SAndroid Build Coastguard Worker  ret i32 %add
180*9880d681SAndroid Build Coastguard Worker}
181