1; RUN: llc -mtriple armv7-none-eabi %s -o - | FileCheck %s --check-prefix=EABI
2; RUN: llc -mtriple armv7-linux-gnueabi %s -o - | FileCheck %s --check-prefix=GNU
3; RUN: llc -mtriple armv7-apple-darwin %s -o - | FileCheck %s --check-prefix=DARWIN
4
5define signext i16 @f16(i16 signext %a, i16 signext %b) {
6; EABI-LABEL: f16:
7; GNU-LABEL: f16:
8; DARWIN-LABEL: f16:
9entry:
10  %conv = sext i16 %a to i32
11  %conv1 = sext i16 %b to i32
12  %div = sdiv i32 %conv, %conv1
13  %rem = srem i32 %conv, %conv1
14; EABI: __aeabi_idivmod
15; EABI: mov [[div:r[0-9]+]], r0
16; EABI: mov [[rem:r[0-9]+]], r1
17; GNU: __aeabi_idiv
18; GNU: mov [[sum:r[0-9]+]], r0
19; GNU: __modsi3
20; GNU: add [[sum]]{{.*}}r0
21; DARWIN: ___divsi3
22; DARWIN: mov [[sum:r[0-9]+]], r0
23; DARWIN: __modsi3
24; DARWIN: add [[sum]]{{.*}}r0
25  %rem8 = srem i32 %conv1, %conv
26; EABI: __aeabi_idivmod
27; GNU: __modsi3
28; DARWIN: __modsi3
29  %add = add nsw i32 %rem, %div
30  %add13 = add nsw i32 %add, %rem8
31  %conv14 = trunc i32 %add13 to i16
32; EABI: add r0{{.*}}r1
33; EABI: sxth r0, r0
34; GNU: add r0{{.*}}[[sum]]
35; GNU: sxth r0, r0
36; DARWIN: add r0{{.*}}[[sum]]
37; DARWIN: sxth r0, r0
38  ret i16 %conv14
39}
40
41define i32 @f32(i32 %a, i32 %b) {
42; EABI-LABEL: f32:
43; GNU-LABEL: f32:
44; DARWIN-LABEL: f32:
45entry:
46  %div = sdiv i32 %a, %b
47  %rem = srem i32 %a, %b
48; EABI: __aeabi_idivmod
49; EABI: mov [[div:r[0-9]+]], r0
50; EABI: mov [[rem:r[0-9]+]], r1
51; GNU: __aeabi_idiv
52; GNU: mov [[sum:r[0-9]+]], r0
53; GNU: __modsi3
54; GNU: add [[sum]]{{.*}}r0
55; DARWIN: ___divsi3
56; DARWIN: mov [[sum:r[0-9]+]], r0
57; DARWIN: __modsi3
58; DARWIN: add [[sum]]{{.*}}r0
59  %rem1 = srem i32 %b, %a
60; EABI: __aeabi_idivmod
61; GNU: __modsi3
62; DARWIN: __modsi3
63  %add = add nsw i32 %rem, %div
64  %add2 = add nsw i32 %add, %rem1
65; EABI: add r0{{.*}}r1
66; GNU: add r0{{.*}}[[sum]]
67; DARWIN: add r0{{.*}}[[sum]]
68  ret i32 %add2
69}
70
71define i32 @uf(i32 %a, i32 %b) {
72; EABI-LABEL: uf:
73; GNU-LABEL: uf:
74; DARWIN-LABEL: uf:
75entry:
76  %div = udiv i32 %a, %b
77  %rem = urem i32 %a, %b
78; EABI: __aeabi_uidivmod
79; GNU: __aeabi_uidiv
80; GNU: mov [[sum:r[0-9]+]], r0
81; GNU: __umodsi3
82; GNU: add [[sum]]{{.*}}r0
83; DARWIN: ___udivsi3
84; DARWIN: mov [[sum:r[0-9]+]], r0
85; DARWIN: __umodsi3
86; DARWIN: add [[sum]]{{.*}}r0
87  %rem1 = urem i32 %b, %a
88; EABI: __aeabi_uidivmod
89; GNU: __umodsi3
90; DARWIN: __umodsi3
91  %add = add nuw i32 %rem, %div
92  %add2 = add nuw i32 %add, %rem1
93; EABI: add r0{{.*}}r1
94; GNU: add r0{{.*}}[[sum]]
95; DARWIN: add r0{{.*}}[[sum]]
96  ret i32 %add2
97}
98
99; FIXME: AEABI is not lowering long u/srem into u/ldivmod
100define i64 @longf(i64 %a, i64 %b) {
101; EABI-LABEL: longf:
102; GNU-LABEL: longf:
103; DARWIN-LABEL: longf:
104entry:
105  %div = sdiv i64 %a, %b
106  %rem = srem i64 %a, %b
107; EABI: __aeabi_ldivmod
108; GNU: __aeabi_ldivmod
109; GNU: mov [[div1:r[0-9]+]], r0
110; GNU: mov [[div2:r[0-9]+]], r1
111; DARWIN: ___divdi3
112; DARWIN: mov [[div1:r[0-9]+]], r0
113; DARWIN: mov [[div2:r[0-9]+]], r1
114; DARWIN: __moddi3
115  %add = add nsw i64 %rem, %div
116; GNU: adds r0{{.*}}[[div1]]
117; GNU: adc r1{{.*}}[[div2]]
118; DARWIN: adds r0{{.*}}[[div1]]
119; DARWIN: adc r1{{.*}}[[div2]]
120  ret i64 %add
121}
122
123define i32 @g1(i32 %a, i32 %b) {
124; EABI-LABEL: g1:
125; GNU-LABEL: g1:
126; DARWIN-LABEL: g1:
127entry:
128  %div = sdiv i32 %a, %b
129  %rem = srem i32 %a, %b
130; EABI: __aeabi_idivmod
131; GNU: __aeabi_idiv
132; GNU: mov [[sum:r[0-9]+]], r0
133; GNU: __modsi3
134; DARWIN: ___divsi3
135; DARWIN: mov [[sum:r[0-9]+]], r0
136; DARWIN: __modsi3
137  %add = add nsw i32 %rem, %div
138; EABI:	add	r0{{.*}}r1
139; GNU: add r0{{.*}}[[sum]]
140; DARWIN: add r0{{.*}}[[sum]]
141  ret i32 %add
142}
143
144; On both Darwin and Gnu, this is just a call to __modsi3
145define i32 @g2(i32 %a, i32 %b) {
146; EABI-LABEL: g2:
147; GNU-LABEL: g2:
148; DARWIN-LABEL: g2:
149entry:
150  %rem = srem i32 %a, %b
151; EABI: __aeabi_idivmod
152; GNU: __modsi3
153; DARWIN: __modsi3
154  ret i32 %rem
155; EABI:	mov	r0, r1
156}
157
158define i32 @g3(i32 %a, i32 %b) {
159; EABI-LABEL: g3:
160; GNU-LABEL: g3:
161; DARWIN-LABEL: g3:
162entry:
163  %rem = srem i32 %a, %b
164; EABI: __aeabi_idivmod
165; EABI: mov [[mod:r[0-9]+]], r1
166; GNU: __modsi3
167; GNU: mov [[sum:r[0-9]+]], r0
168; DARWIN: __modsi3
169; DARWIN: mov [[sum:r[0-9]+]], r0
170  %rem1 = srem i32 %b, %rem
171; EABI: __aeabi_idivmod
172; GNU: __modsi3
173; DARWIN: __modsi3
174  %add = add nsw i32 %rem1, %rem
175; EABI: add r0, r1, [[mod]]
176; GNU: add r0{{.*}}[[sum]]
177; DARWIN: add r0{{.*}}[[sum]]
178  ret i32 %add
179}
180
181define i32 @g4(i32 %a, i32 %b) {
182; EABI-LABEL: g4:
183; GNU-LABEL: g4:
184; DARWIN-LABEL: g4:
185entry:
186  %div = sdiv i32 %a, %b
187; EABI: __aeabi_idivmod
188; EABI: mov [[div:r[0-9]+]], r0
189; GNU __aeabi_idiv
190; GNU: mov [[sum:r[0-9]+]], r0
191; DARWIN: ___divsi3
192; DARWIN: mov [[sum:r[0-9]+]], r0
193  %rem = srem i32 %b, %div
194; EABI: __aeabi_idivmod
195; GNU: __modsi3
196; DARWIN: __modsi3
197  %add = add nsw i32 %rem, %div
198; EABI: add r0, r1, [[div]]
199; GNU: add r0{{.*}}[[sum]]
200; DARWIN: add r0{{.*}}[[sum]]
201  ret i32 %add
202}
203