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
6 define signext i16 @f16(i16 signext %a, i16 signext %b) {
11 %conv = sext i16 %a to i32
12 %conv1 = sext i16 %b to i32
13 %div = sdiv i32 %conv, %conv1
14 %rem = srem i32 %conv, %conv1
15 ; EABI: __aeabi_idivmod
16 ; EABI: mov [[div:r[0-9]+]], r0
17 ; EABI: mov [[rem:r[0-9]+]], r1
19 ; GNU: mov [[sum:r[0-9]+]], r0
21 ; GNU: add [[sum]]{{.*}}r0
23 ; DARWIN: mov [[sum:r[0-9]+]], r0
25 ; DARWIN: add [[sum]]{{.*}}r0
26 %rem8 = srem i32 %conv1, %conv
27 ; EABI: __aeabi_idivmod
30 %add = add nsw i32 %rem, %div
31 %add13 = add nsw i32 %add, %rem8
32 %conv14 = trunc i32 %add13 to i16
33 ; EABI: add r0{{.*}}r1
35 ; GNU: add r0{{.*}}[[sum]]
37 ; DARWIN: add r0{{.*}}[[sum]]
42 define i32 @f32(i32 %a, i32 %b) {
47 %div = sdiv i32 %a, %b
48 %rem = srem i32 %a, %b
49 ; EABI: __aeabi_idivmod
50 ; EABI: mov [[div:r[0-9]+]], r0
51 ; EABI: mov [[rem:r[0-9]+]], r1
53 ; GNU: mov [[sum:r[0-9]+]], r0
55 ; GNU: add [[sum]]{{.*}}r0
57 ; DARWIN: mov [[sum:r[0-9]+]], r0
59 ; DARWIN: add [[sum]]{{.*}}r0
60 %rem1 = srem i32 %b, %a
61 ; EABI: __aeabi_idivmod
64 %add = add nsw i32 %rem, %div
65 %add2 = add nsw i32 %add, %rem1
66 ; EABI: add r0{{.*}}r1
67 ; GNU: add r0{{.*}}[[sum]]
68 ; DARWIN: add r0{{.*}}[[sum]]
72 define i32 @uf(i32 %a, i32 %b) {
77 %div = udiv i32 %a, %b
78 %rem = urem i32 %a, %b
79 ; EABI: __aeabi_uidivmod
81 ; GNU: mov [[sum:r[0-9]+]], r0
83 ; GNU: add [[sum]]{{.*}}r0
85 ; DARWIN: mov [[sum:r[0-9]+]], r0
87 ; DARWIN: add [[sum]]{{.*}}r0
88 %rem1 = urem i32 %b, %a
89 ; EABI: __aeabi_uidivmod
92 %add = add nuw i32 %rem, %div
93 %add2 = add nuw i32 %add, %rem1
94 ; EABI: add r0{{.*}}r1
95 ; GNU: add r0{{.*}}[[sum]]
96 ; DARWIN: add r0{{.*}}[[sum]]
100 ; FIXME: AEABI is not lowering long u/srem into u/ldivmod
101 define i64 @longf(i64 %a, i64 %b) {
104 ; DARWIN-LABEL: longf:
106 %div = sdiv i64 %a, %b
107 %rem = srem i64 %a, %b
108 ; EABI: __aeabi_ldivmod
109 ; GNU: __aeabi_ldivmod
110 ; GNU: mov [[div1:r[0-9]+]], r0
111 ; GNU: mov [[div2:r[0-9]+]], r1
113 ; DARWIN: mov [[div1:r[0-9]+]], r0
114 ; DARWIN: mov [[div2:r[0-9]+]], r1
116 %add = add nsw i64 %rem, %div
117 ; GNU: adds r0{{.*}}[[div1]]
118 ; GNU: adc r1{{.*}}[[div2]]
119 ; DARWIN: adds r0{{.*}}[[div1]]
120 ; DARWIN: adc r1{{.*}}[[div2]]
124 define i32 @g1(i32 %a, i32 %b) {
129 %div = sdiv i32 %a, %b
130 %rem = srem i32 %a, %b
131 ; EABI: __aeabi_idivmod
133 ; GNU: mov [[sum:r[0-9]+]], r0
136 ; DARWIN: mov [[sum:r[0-9]+]], r0
138 %add = add nsw i32 %rem, %div
139 ; EABI: add r0{{.*}}r1
140 ; GNU: add r0{{.*}}[[sum]]
141 ; DARWIN: add r0{{.*}}[[sum]]
145 ; On both Darwin and Gnu, this is just a call to __modsi3
146 define i32 @g2(i32 %a, i32 %b) {
151 %rem = srem i32 %a, %b
152 ; EABI: __aeabi_idivmod
159 define i32 @g3(i32 %a, i32 %b) {
164 %rem = srem i32 %a, %b
165 ; EABI: __aeabi_idivmod
166 ; EABI: mov [[mod:r[0-9]+]], r1
168 ; GNU: mov [[sum:r[0-9]+]], r0
170 ; DARWIN: mov [[sum:r[0-9]+]], r0
171 %rem1 = srem i32 %b, %rem
172 ; EABI: __aeabi_idivmod
175 %add = add nsw i32 %rem1, %rem
176 ; EABI: add r0, r1, [[mod]]
177 ; GNU: add r0{{.*}}[[sum]]
178 ; DARWIN: add r0{{.*}}[[sum]]
182 define i32 @g4(i32 %a, i32 %b) {
187 %div = sdiv i32 %a, %b
188 ; EABI: __aeabi_idivmod
189 ; EABI: mov [[div:r[0-9]+]], r0
191 ; GNU: mov [[sum:r[0-9]+]], r0
193 ; DARWIN: mov [[sum:r[0-9]+]], r0
194 %rem = srem i32 %b, %div
195 ; EABI: __aeabi_idivmod
198 %add = add nsw i32 %rem, %div
199 ; EABI: add r0, r1, [[div]]
200 ; GNU: add r0{{.*}}[[sum]]
201 ; DARWIN: add r0{{.*}}[[sum]]