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
20 ; GNU: __aeabi_idivmod
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
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
51 ; GNU: __aeabi_idivmod
53 ; DARWIN: mov [[sum:r[0-9]+]], r0
55 ; DARWIN: add [[sum]]{{.*}}r0
56 %rem1 = srem i32 %b, %a
57 ; EABI: __aeabi_idivmod
60 %add = add nsw i32 %rem, %div
61 %add2 = add nsw i32 %add, %rem1
62 ; EABI: add r0{{.*}}r1
64 ; DARWIN: add r0{{.*}}[[sum]]
68 define i32 @uf(i32 %a, i32 %b) {
73 %div = udiv i32 %a, %b
74 %rem = urem i32 %a, %b
75 ; EABI: __aeabi_uidivmod
76 ; GNU: __aeabi_uidivmod
78 ; DARWIN: mov [[sum:r[0-9]+]], r0
80 ; DARWIN: add [[sum]]{{.*}}r0
81 %rem1 = urem i32 %b, %a
82 ; EABI: __aeabi_uidivmod
85 %add = add nuw i32 %rem, %div
86 %add2 = add nuw i32 %add, %rem1
87 ; EABI: add r0{{.*}}r1
89 ; DARWIN: add r0{{.*}}[[sum]]
93 ; FIXME: AEABI is not lowering long u/srem into u/ldivmod
94 define i64 @longf(i64 %a, i64 %b) {
97 ; DARWIN-LABEL: longf:
99 %div = sdiv i64 %a, %b
100 %rem = srem i64 %a, %b
101 ; EABI: __aeabi_ldivmod
102 ; GNU: __aeabi_ldivmod
103 ; GNU: mov [[div1:r[0-9]+]], r0
104 ; GNU: mov [[div2:r[0-9]+]], r1
106 ; DARWIN: mov [[div1:r[0-9]+]], r0
107 ; DARWIN: mov [[div2:r[0-9]+]], r1
109 %add = add nsw i64 %rem, %div
110 ; GNU: adds r0{{.*}}[[div1]]
111 ; GNU: adc r1{{.*}}[[div2]]
112 ; DARWIN: adds r0{{.*}}[[div1]]
113 ; DARWIN: adc r1{{.*}}[[div2]]
117 define i32 @g1(i32 %a, i32 %b) {
122 %div = sdiv i32 %a, %b
123 %rem = srem i32 %a, %b
124 ; EABI: __aeabi_idivmod
125 ; GNU: __aeabi_idivmod
127 ; DARWIN: mov [[sum:r[0-9]+]], r0
129 %add = add nsw i32 %rem, %div
130 ; EABI: add r0{{.*}}r1
131 ; GNU: add r0{{.*}}r1
132 ; DARWIN: add r0{{.*}}[[sum]]
136 ; On both Darwin and Gnu, this is just a call to __modsi3
137 define i32 @g2(i32 %a, i32 %b) {
142 %rem = srem i32 %a, %b
143 ; EABI: __aeabi_idivmod
150 define i32 @g3(i32 %a, i32 %b) {
155 %rem = srem i32 %a, %b
156 ; EABI: __aeabi_idivmod
157 ; EABI: mov [[mod:r[0-9]+]], r1
159 ; GNU: mov [[sum:r[0-9]+]], r0
161 ; DARWIN: mov [[sum:r[0-9]+]], r0
162 %rem1 = srem i32 %b, %rem
163 ; EABI: __aeabi_idivmod
166 %add = add nsw i32 %rem1, %rem
167 ; EABI: add r0, r1, [[mod]]
168 ; GNU: add r0{{.*}}[[sum]]
169 ; DARWIN: add r0{{.*}}[[sum]]
173 define i32 @g4(i32 %a, i32 %b) {
178 %div = sdiv i32 %a, %b
179 ; EABI: __aeabi_idivmod
180 ; EABI: mov [[div:r[0-9]+]], r0
182 ; GNU: mov [[sum:r[0-9]+]], r0
184 ; DARWIN: mov [[sum:r[0-9]+]], r0
185 %rem = srem i32 %b, %div
186 ; EABI: __aeabi_idivmod
189 %add = add nsw i32 %rem, %div
190 ; EABI: add r0, r1, [[div]]
191 ; GNU: add r0{{.*}}[[sum]]
192 ; DARWIN: add r0{{.*}}[[sum]]