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 ; Both "none-eabi" and "androideabi" 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=GNU
6 ; RUN: llc -mtriple armv7-apple-darwin %s -o - | FileCheck %s --check-prefix=DARWIN
7 ; FIXME: long-term, we will use "-apple-macho" and won't need this exception:
8 ; RUN: llc -mtriple armv7-apple-darwin-eabi %s -o - | FileCheck %s --check-prefix=DARWIN
10 define signext i16 @f16(i16 signext %a, i16 signext %b) {
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
23 ; GNU: mov [[sum:r[0-9]+]], r0
25 ; GNU: add [[sum]]{{.*}}r0
27 ; DARWIN: mov [[sum:r[0-9]+]], r0
29 ; DARWIN: add [[sum]]{{.*}}r0
30 %rem8 = srem i32 %conv1, %conv
31 ; EABI: __aeabi_idivmod
34 %add = add nsw i32 %rem, %div
35 %add13 = add nsw i32 %add, %rem8
36 %conv14 = trunc i32 %add13 to i16
37 ; EABI: add r0{{.*}}r1
39 ; GNU: add r0{{.*}}[[sum]]
41 ; DARWIN: add r0{{.*}}[[sum]]
46 define i32 @f32(i32 %a, i32 %b) {
51 %div = sdiv i32 %a, %b
52 %rem = srem i32 %a, %b
53 ; EABI: __aeabi_idivmod
54 ; EABI: mov [[div:r[0-9]+]], r0
55 ; EABI: mov [[rem:r[0-9]+]], r1
57 ; GNU: mov [[sum:r[0-9]+]], r0
59 ; GNU: add [[sum]]{{.*}}r0
61 ; DARWIN: mov [[sum:r[0-9]+]], r0
63 ; DARWIN: add [[sum]]{{.*}}r0
64 %rem1 = srem i32 %b, %a
65 ; EABI: __aeabi_idivmod
68 %add = add nsw i32 %rem, %div
69 %add2 = add nsw i32 %add, %rem1
70 ; EABI: add r0{{.*}}r1
71 ; GNU: add r0{{.*}}[[sum]]
72 ; DARWIN: add r0{{.*}}[[sum]]
76 define i32 @uf(i32 %a, i32 %b) {
81 %div = udiv i32 %a, %b
82 %rem = urem i32 %a, %b
83 ; EABI: __aeabi_uidivmod
85 ; GNU: mov [[sum:r[0-9]+]], r0
87 ; GNU: add [[sum]]{{.*}}r0
89 ; DARWIN: mov [[sum:r[0-9]+]], r0
91 ; DARWIN: add [[sum]]{{.*}}r0
92 %rem1 = urem i32 %b, %a
93 ; EABI: __aeabi_uidivmod
96 %add = add nuw i32 %rem, %div
97 %add2 = add nuw i32 %add, %rem1
98 ; EABI: add r0{{.*}}r1
99 ; GNU: add r0{{.*}}[[sum]]
100 ; DARWIN: add r0{{.*}}[[sum]]
104 ; FIXME: AEABI is not lowering long u/srem into u/ldivmod
105 define i64 @longf(i64 %a, i64 %b) {
108 ; DARWIN-LABEL: longf:
110 %div = sdiv i64 %a, %b
111 %rem = srem i64 %a, %b
112 ; EABI: __aeabi_ldivmod
113 ; GNU: __aeabi_ldivmod
114 ; GNU: mov [[div1:r[0-9]+]], r0
115 ; GNU: mov [[div2:r[0-9]+]], r1
117 ; DARWIN: mov [[div1:r[0-9]+]], r0
118 ; DARWIN: mov [[div2:r[0-9]+]], r1
120 %add = add nsw i64 %rem, %div
121 ; GNU: adds r0{{.*}}[[div1]]
122 ; GNU: adc r1{{.*}}[[div2]]
123 ; DARWIN: adds r0{{.*}}[[div1]]
124 ; DARWIN: adc r1{{.*}}[[div2]]
128 define i32 @g1(i32 %a, i32 %b) {
133 %div = sdiv i32 %a, %b
134 %rem = srem i32 %a, %b
135 ; EABI: __aeabi_idivmod
137 ; GNU: mov [[sum:r[0-9]+]], r0
140 ; DARWIN: mov [[sum:r[0-9]+]], r0
142 %add = add nsw i32 %rem, %div
143 ; EABI: add r0{{.*}}r1
144 ; GNU: add r0{{.*}}[[sum]]
145 ; DARWIN: add r0{{.*}}[[sum]]
149 ; On both Darwin and Gnu, this is just a call to __modsi3
150 define i32 @g2(i32 %a, i32 %b) {
155 %rem = srem i32 %a, %b
156 ; EABI: __aeabi_idivmod
163 define i32 @g3(i32 %a, i32 %b) {
168 %rem = srem i32 %a, %b
169 ; EABI: __aeabi_idivmod
170 ; EABI: mov [[mod:r[0-9]+]], r1
172 ; GNU: mov [[sum:r[0-9]+]], r0
174 ; DARWIN: mov [[sum:r[0-9]+]], r0
175 %rem1 = srem i32 %b, %rem
176 ; EABI: __aeabi_idivmod
179 %add = add nsw i32 %rem1, %rem
180 ; EABI: add r0, r1, [[mod]]
181 ; GNU: add r0{{.*}}[[sum]]
182 ; DARWIN: add r0{{.*}}[[sum]]
186 define i32 @g4(i32 %a, i32 %b) {
191 %div = sdiv i32 %a, %b
192 ; EABI: __aeabi_idiv{{$}}
193 ; EABI: mov [[div:r[0-9]+]], r0
195 ; GNU: mov [[sum:r[0-9]+]], r0
197 ; DARWIN: mov [[sum:r[0-9]+]], r0
198 %rem = srem i32 %b, %div
199 ; EABI: __aeabi_idivmod
202 %add = add nsw i32 %rem, %div
203 ; EABI: add r0, r1, [[div]]
204 ; GNU: add r0{{.*}}[[sum]]
205 ; DARWIN: add r0{{.*}}[[sum]]