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