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 ; RUN: llc -mtriple armv7-linux-gnueabi %s -o - | FileCheck %s --check-prefix=GNU
4 ; RUN: llc -mtriple armv7-apple-darwin %s -o - | FileCheck %s --check-prefix=DARWIN
5 ; FIXME: long-term, we will use "-apple-macho" and won't need this exception:
6 ; RUN: llc -mtriple armv7-apple-darwin-eabi %s -o - | FileCheck %s --check-prefix=DARWIN
8 define signext i16 @f16(i16 signext %a, i16 signext %b) {
13 %conv = sext i16 %a to i32
14 %conv1 = sext i16 %b to i32
15 %div = sdiv i32 %conv, %conv1
16 %rem = srem i32 %conv, %conv1
17 ; EABI: __aeabi_idivmod
18 ; EABI: mov [[div:r[0-9]+]], r0
19 ; EABI: mov [[rem:r[0-9]+]], r1
21 ; GNU: mov [[sum:r[0-9]+]], r0
23 ; GNU: add [[sum]]{{.*}}r0
25 ; DARWIN: mov [[sum:r[0-9]+]], r0
27 ; DARWIN: add [[sum]]{{.*}}r0
28 %rem8 = srem i32 %conv1, %conv
29 ; EABI: __aeabi_idivmod
32 %add = add nsw i32 %rem, %div
33 %add13 = add nsw i32 %add, %rem8
34 %conv14 = trunc i32 %add13 to i16
35 ; EABI: add r0{{.*}}r1
37 ; GNU: add r0{{.*}}[[sum]]
39 ; DARWIN: add r0{{.*}}[[sum]]
44 define i32 @f32(i32 %a, i32 %b) {
49 %div = sdiv i32 %a, %b
50 %rem = srem i32 %a, %b
51 ; EABI: __aeabi_idivmod
52 ; EABI: mov [[div:r[0-9]+]], r0
53 ; EABI: mov [[rem:r[0-9]+]], r1
55 ; GNU: mov [[sum:r[0-9]+]], r0
57 ; GNU: add [[sum]]{{.*}}r0
59 ; DARWIN: mov [[sum:r[0-9]+]], r0
61 ; DARWIN: add [[sum]]{{.*}}r0
62 %rem1 = srem i32 %b, %a
63 ; EABI: __aeabi_idivmod
66 %add = add nsw i32 %rem, %div
67 %add2 = add nsw i32 %add, %rem1
68 ; EABI: add r0{{.*}}r1
69 ; GNU: add r0{{.*}}[[sum]]
70 ; DARWIN: add r0{{.*}}[[sum]]
74 define i32 @uf(i32 %a, i32 %b) {
79 %div = udiv i32 %a, %b
80 %rem = urem i32 %a, %b
81 ; EABI: __aeabi_uidivmod
83 ; GNU: mov [[sum:r[0-9]+]], r0
85 ; GNU: add [[sum]]{{.*}}r0
87 ; DARWIN: mov [[sum:r[0-9]+]], r0
89 ; DARWIN: add [[sum]]{{.*}}r0
90 %rem1 = urem i32 %b, %a
91 ; EABI: __aeabi_uidivmod
94 %add = add nuw i32 %rem, %div
95 %add2 = add nuw i32 %add, %rem1
96 ; EABI: add r0{{.*}}r1
97 ; GNU: add r0{{.*}}[[sum]]
98 ; DARWIN: add r0{{.*}}[[sum]]
102 ; FIXME: AEABI is not lowering long u/srem into u/ldivmod
103 define i64 @longf(i64 %a, i64 %b) {
106 ; DARWIN-LABEL: longf:
108 %div = sdiv i64 %a, %b
109 %rem = srem i64 %a, %b
110 ; EABI: __aeabi_ldivmod
111 ; GNU: __aeabi_ldivmod
112 ; GNU: mov [[div1:r[0-9]+]], r0
113 ; GNU: mov [[div2:r[0-9]+]], r1
115 ; DARWIN: mov [[div1:r[0-9]+]], r0
116 ; DARWIN: mov [[div2:r[0-9]+]], r1
118 %add = add nsw i64 %rem, %div
119 ; GNU: adds r0{{.*}}[[div1]]
120 ; GNU: adc r1{{.*}}[[div2]]
121 ; DARWIN: adds r0{{.*}}[[div1]]
122 ; DARWIN: adc r1{{.*}}[[div2]]
126 define i32 @g1(i32 %a, i32 %b) {
131 %div = sdiv i32 %a, %b
132 %rem = srem i32 %a, %b
133 ; EABI: __aeabi_idivmod
135 ; GNU: mov [[sum:r[0-9]+]], r0
138 ; DARWIN: mov [[sum:r[0-9]+]], r0
140 %add = add nsw i32 %rem, %div
141 ; EABI: add r0{{.*}}r1
142 ; GNU: add r0{{.*}}[[sum]]
143 ; DARWIN: add r0{{.*}}[[sum]]
147 ; On both Darwin and Gnu, this is just a call to __modsi3
148 define i32 @g2(i32 %a, i32 %b) {
153 %rem = srem i32 %a, %b
154 ; EABI: __aeabi_idivmod
161 define i32 @g3(i32 %a, i32 %b) {
166 %rem = srem i32 %a, %b
167 ; EABI: __aeabi_idivmod
168 ; EABI: mov [[mod:r[0-9]+]], r1
170 ; GNU: mov [[sum:r[0-9]+]], r0
172 ; DARWIN: mov [[sum:r[0-9]+]], r0
173 %rem1 = srem i32 %b, %rem
174 ; EABI: __aeabi_idivmod
177 %add = add nsw i32 %rem1, %rem
178 ; EABI: add r0, r1, [[mod]]
179 ; GNU: add r0{{.*}}[[sum]]
180 ; DARWIN: add r0{{.*}}[[sum]]
184 define i32 @g4(i32 %a, i32 %b) {
189 %div = sdiv i32 %a, %b
190 ; EABI: __aeabi_idivmod
191 ; EABI: mov [[div:r[0-9]+]], r0
193 ; GNU: mov [[sum:r[0-9]+]], r0
195 ; DARWIN: mov [[sum:r[0-9]+]], r0
196 %rem = srem i32 %b, %div
197 ; EABI: __aeabi_idivmod
200 %add = add nsw i32 %rem, %div
201 ; EABI: add r0, r1, [[div]]
202 ; GNU: add r0{{.*}}[[sum]]
203 ; DARWIN: add r0{{.*}}[[sum]]