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
5 define signext i16 @f16(i16 signext %a, i16 signext %b) {
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
18 ; GNU: mov [[sum:r[0-9]+]], r0
20 ; GNU: add [[sum]]{{.*}}r0
22 ; DARWIN: mov [[sum:r[0-9]+]], r0
24 ; DARWIN: add [[sum]]{{.*}}r0
25 %rem8 = srem i32 %conv1, %conv
26 ; EABI: __aeabi_idivmod
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
34 ; GNU: add r0{{.*}}[[sum]]
36 ; DARWIN: add r0{{.*}}[[sum]]
41 define i32 @f32(i32 %a, i32 %b) {
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
52 ; GNU: mov [[sum:r[0-9]+]], r0
54 ; GNU: add [[sum]]{{.*}}r0
56 ; DARWIN: mov [[sum:r[0-9]+]], r0
58 ; DARWIN: add [[sum]]{{.*}}r0
59 %rem1 = srem i32 %b, %a
60 ; EABI: __aeabi_idivmod
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]]
71 define i32 @uf(i32 %a, i32 %b) {
76 %div = udiv i32 %a, %b
77 %rem = urem i32 %a, %b
78 ; EABI: __aeabi_uidivmod
80 ; GNU: mov [[sum:r[0-9]+]], r0
82 ; GNU: add [[sum]]{{.*}}r0
84 ; DARWIN: mov [[sum:r[0-9]+]], r0
86 ; DARWIN: add [[sum]]{{.*}}r0
87 %rem1 = urem i32 %b, %a
88 ; EABI: __aeabi_uidivmod
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]]
99 ; FIXME: AEABI is not lowering long u/srem into u/ldivmod
100 define i64 @longf(i64 %a, i64 %b) {
103 ; DARWIN-LABEL: longf:
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
112 ; DARWIN: mov [[div1:r[0-9]+]], r0
113 ; DARWIN: mov [[div2:r[0-9]+]], r1
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]]
123 define i32 @g1(i32 %a, i32 %b) {
128 %div = sdiv i32 %a, %b
129 %rem = srem i32 %a, %b
130 ; EABI: __aeabi_idivmod
132 ; GNU: mov [[sum:r[0-9]+]], r0
135 ; DARWIN: mov [[sum:r[0-9]+]], r0
137 %add = add nsw i32 %rem, %div
138 ; EABI: add r0{{.*}}r1
139 ; GNU: add r0{{.*}}[[sum]]
140 ; DARWIN: add r0{{.*}}[[sum]]
144 ; On both Darwin and Gnu, this is just a call to __modsi3
145 define i32 @g2(i32 %a, i32 %b) {
150 %rem = srem i32 %a, %b
151 ; EABI: __aeabi_idivmod
158 define i32 @g3(i32 %a, i32 %b) {
163 %rem = srem i32 %a, %b
164 ; EABI: __aeabi_idivmod
165 ; EABI: mov [[mod:r[0-9]+]], r1
167 ; GNU: mov [[sum:r[0-9]+]], r0
169 ; DARWIN: mov [[sum:r[0-9]+]], r0
170 %rem1 = srem i32 %b, %rem
171 ; EABI: __aeabi_idivmod
174 %add = add nsw i32 %rem1, %rem
175 ; EABI: add r0, r1, [[mod]]
176 ; GNU: add r0{{.*}}[[sum]]
177 ; DARWIN: add r0{{.*}}[[sum]]
181 define i32 @g4(i32 %a, i32 %b) {
186 %div = sdiv i32 %a, %b
187 ; EABI: __aeabi_idivmod
188 ; EABI: mov [[div:r[0-9]+]], r0
190 ; GNU: mov [[sum:r[0-9]+]], r0
192 ; DARWIN: mov [[sum:r[0-9]+]], r0
193 %rem = srem i32 %b, %div
194 ; EABI: __aeabi_idivmod
197 %add = add nsw i32 %rem, %div
198 ; EABI: add r0, r1, [[div]]
199 ; GNU: add r0{{.*}}[[sum]]
200 ; DARWIN: add r0{{.*}}[[sum]]