Add explicit -mtriple=arm-unknown to llvm/test/CodeGen/ARM/disable-tail-calls.ll...
[oota-llvm.git] / test / CodeGen / ARM / divmod-eabi.ll
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
7
8 define signext i16 @f16(i16 signext %a, i16 signext %b) {
9 ; EABI-LABEL: f16:
10 ; GNU-LABEL: f16:
11 ; DARWIN-LABEL: f16:
12 entry:
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_idiv
21 ; GNU: mov [[sum:r[0-9]+]], r0
22 ; GNU: __modsi3
23 ; GNU: add [[sum]]{{.*}}r0
24 ; DARWIN: ___divsi3
25 ; DARWIN: mov [[sum:r[0-9]+]], r0
26 ; DARWIN: __modsi3
27 ; DARWIN: add [[sum]]{{.*}}r0
28   %rem8 = srem i32 %conv1, %conv
29 ; EABI: __aeabi_idivmod
30 ; GNU: __modsi3
31 ; DARWIN: __modsi3
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
36 ; EABI: sxth r0, r0
37 ; GNU: add r0{{.*}}[[sum]]
38 ; GNU: sxth r0, r0
39 ; DARWIN: add r0{{.*}}[[sum]]
40 ; DARWIN: sxth r0, r0
41   ret i16 %conv14
42 }
43
44 define i32 @f32(i32 %a, i32 %b) {
45 ; EABI-LABEL: f32:
46 ; GNU-LABEL: f32:
47 ; DARWIN-LABEL: f32:
48 entry:
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
54 ; GNU: __aeabi_idiv
55 ; GNU: mov [[sum:r[0-9]+]], r0
56 ; GNU: __modsi3
57 ; GNU: add [[sum]]{{.*}}r0
58 ; DARWIN: ___divsi3
59 ; DARWIN: mov [[sum:r[0-9]+]], r0
60 ; DARWIN: __modsi3
61 ; DARWIN: add [[sum]]{{.*}}r0
62   %rem1 = srem i32 %b, %a
63 ; EABI: __aeabi_idivmod
64 ; GNU: __modsi3
65 ; DARWIN: __modsi3
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]]
71   ret i32 %add2
72 }
73
74 define i32 @uf(i32 %a, i32 %b) {
75 ; EABI-LABEL: uf:
76 ; GNU-LABEL: uf:
77 ; DARWIN-LABEL: uf:
78 entry:
79   %div = udiv i32 %a, %b
80   %rem = urem i32 %a, %b
81 ; EABI: __aeabi_uidivmod
82 ; GNU: __aeabi_uidiv
83 ; GNU: mov [[sum:r[0-9]+]], r0
84 ; GNU: __umodsi3
85 ; GNU: add [[sum]]{{.*}}r0
86 ; DARWIN: ___udivsi3
87 ; DARWIN: mov [[sum:r[0-9]+]], r0
88 ; DARWIN: __umodsi3
89 ; DARWIN: add [[sum]]{{.*}}r0
90   %rem1 = urem i32 %b, %a
91 ; EABI: __aeabi_uidivmod
92 ; GNU: __umodsi3
93 ; DARWIN: __umodsi3
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]]
99   ret i32 %add2
100 }
101
102 ; FIXME: AEABI is not lowering long u/srem into u/ldivmod
103 define i64 @longf(i64 %a, i64 %b) {
104 ; EABI-LABEL: longf:
105 ; GNU-LABEL: longf:
106 ; DARWIN-LABEL: longf:
107 entry:
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
114 ; DARWIN: ___divdi3
115 ; DARWIN: mov [[div1:r[0-9]+]], r0
116 ; DARWIN: mov [[div2:r[0-9]+]], r1
117 ; DARWIN: __moddi3
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]]
123   ret i64 %add
124 }
125
126 define i32 @g1(i32 %a, i32 %b) {
127 ; EABI-LABEL: g1:
128 ; GNU-LABEL: g1:
129 ; DARWIN-LABEL: g1:
130 entry:
131   %div = sdiv i32 %a, %b
132   %rem = srem i32 %a, %b
133 ; EABI: __aeabi_idivmod
134 ; GNU: __aeabi_idiv
135 ; GNU: mov [[sum:r[0-9]+]], r0
136 ; GNU: __modsi3
137 ; DARWIN: ___divsi3
138 ; DARWIN: mov [[sum:r[0-9]+]], r0
139 ; DARWIN: __modsi3
140   %add = add nsw i32 %rem, %div
141 ; EABI: add     r0{{.*}}r1
142 ; GNU: add r0{{.*}}[[sum]]
143 ; DARWIN: add r0{{.*}}[[sum]]
144   ret i32 %add
145 }
146
147 ; On both Darwin and Gnu, this is just a call to __modsi3
148 define i32 @g2(i32 %a, i32 %b) {
149 ; EABI-LABEL: g2:
150 ; GNU-LABEL: g2:
151 ; DARWIN-LABEL: g2:
152 entry:
153   %rem = srem i32 %a, %b
154 ; EABI: __aeabi_idivmod
155 ; GNU: __modsi3
156 ; DARWIN: __modsi3
157   ret i32 %rem
158 ; EABI: mov     r0, r1
159 }
160
161 define i32 @g3(i32 %a, i32 %b) {
162 ; EABI-LABEL: g3:
163 ; GNU-LABEL: g3:
164 ; DARWIN-LABEL: g3:
165 entry:
166   %rem = srem i32 %a, %b
167 ; EABI: __aeabi_idivmod
168 ; EABI: mov [[mod:r[0-9]+]], r1
169 ; GNU: __modsi3
170 ; GNU: mov [[sum:r[0-9]+]], r0
171 ; DARWIN: __modsi3
172 ; DARWIN: mov [[sum:r[0-9]+]], r0
173   %rem1 = srem i32 %b, %rem
174 ; EABI: __aeabi_idivmod
175 ; GNU: __modsi3
176 ; DARWIN: __modsi3
177   %add = add nsw i32 %rem1, %rem
178 ; EABI: add r0, r1, [[mod]]
179 ; GNU: add r0{{.*}}[[sum]]
180 ; DARWIN: add r0{{.*}}[[sum]]
181   ret i32 %add
182 }
183
184 define i32 @g4(i32 %a, i32 %b) {
185 ; EABI-LABEL: g4:
186 ; GNU-LABEL: g4:
187 ; DARWIN-LABEL: g4:
188 entry:
189   %div = sdiv i32 %a, %b
190 ; EABI: __aeabi_idivmod
191 ; EABI: mov [[div:r[0-9]+]], r0
192 ; GNU: __aeabi_idiv
193 ; GNU: mov [[sum:r[0-9]+]], r0
194 ; DARWIN: ___divsi3
195 ; DARWIN: mov [[sum:r[0-9]+]], r0
196   %rem = srem i32 %b, %div
197 ; EABI: __aeabi_idivmod
198 ; GNU: __modsi3
199 ; DARWIN: __modsi3
200   %add = add nsw i32 %rem, %div
201 ; EABI: add r0, r1, [[div]]
202 ; GNU: add r0{{.*}}[[sum]]
203 ; DARWIN: add r0{{.*}}[[sum]]
204   ret i32 %add
205 }