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