blob: 64d093e768b5c99e43864df23af43c07e63432eb [file] [log] [blame]
Renato Golin87610692013-07-16 09:32:17 +00001; RUN: llc -mtriple armv7-none-eabi %s -o - | FileCheck %s --check-prefix=EABI
Joerg Sonnenberger8fe41b72013-12-16 18:51:28 +00002; RUN: llc -mtriple armv7-none-eabihf %s -o - | FileCheck %s --check-prefix=EABI
Renato Golin87610692013-07-16 09:32:17 +00003; 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
6define signext i16 @f16(i16 signext %a, i16 signext %b) {
Stephen Lin3e1f15a2013-07-18 18:35:22 +00007; EABI-LABEL: f16:
8; GNU-LABEL: f16:
9; DARWIN-LABEL: f16:
Renato Golin87610692013-07-16 09:32:17 +000010entry:
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
42define i32 @f32(i32 %a, i32 %b) {
Stephen Lin3e1f15a2013-07-18 18:35:22 +000043; EABI-LABEL: f32:
44; GNU-LABEL: f32:
45; DARWIN-LABEL: f32:
Renato Golin87610692013-07-16 09:32:17 +000046entry:
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
72define i32 @uf(i32 %a, i32 %b) {
Stephen Lin3e1f15a2013-07-18 18:35:22 +000073; EABI-LABEL: uf:
74; GNU-LABEL: uf:
75; DARWIN-LABEL: uf:
Renato Golin87610692013-07-16 09:32:17 +000076entry:
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
101define i64 @longf(i64 %a, i64 %b) {
Stephen Lin3e1f15a2013-07-18 18:35:22 +0000102; EABI-LABEL: longf:
103; GNU-LABEL: longf:
104; DARWIN-LABEL: longf:
Renato Golin87610692013-07-16 09:32:17 +0000105entry:
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
124define i32 @g1(i32 %a, i32 %b) {
Stephen Lin3e1f15a2013-07-18 18:35:22 +0000125; EABI-LABEL: g1:
126; GNU-LABEL: g1:
127; DARWIN-LABEL: g1:
Renato Golin87610692013-07-16 09:32:17 +0000128entry:
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
146define i32 @g2(i32 %a, i32 %b) {
Stephen Lin3e1f15a2013-07-18 18:35:22 +0000147; EABI-LABEL: g2:
148; GNU-LABEL: g2:
149; DARWIN-LABEL: g2:
Renato Golin87610692013-07-16 09:32:17 +0000150entry:
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
159define i32 @g3(i32 %a, i32 %b) {
Stephen Lin3e1f15a2013-07-18 18:35:22 +0000160; EABI-LABEL: g3:
161; GNU-LABEL: g3:
162; DARWIN-LABEL: g3:
Renato Golin87610692013-07-16 09:32:17 +0000163entry:
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
182define i32 @g4(i32 %a, i32 %b) {
Stephen Lin3e1f15a2013-07-18 18:35:22 +0000183; EABI-LABEL: g4:
184; GNU-LABEL: g4:
185; DARWIN-LABEL: g4:
Renato Golin87610692013-07-16 09:32:17 +0000186entry:
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}