Skip to content
This repository was archived by the owner on Mar 28, 2020. It is now read-only.

Commit 866cc2a

Browse files
committed
[ARM] Move GNUEABI divmod to __aeabi_divmod*
The GNU toolchain emits __aeabi_divmod for soft-divide on ARM cores which happens to be a lot faster than __divsi3/__modsi3 when the core has hardware divide instructions. Do the same here. Fixes PR26450. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@259657 91177308-0d34-0410-b5e6-96231b3b80d8
1 parent ccdf189 commit 866cc2a

File tree

2 files changed

+6
-49
lines changed

2 files changed

+6
-49
lines changed

lib/Target/ARM/ARMISelLowering.cpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -784,7 +784,8 @@ ARMTargetLowering::ARMTargetLowering(const TargetMachine &TM,
784784
setOperationAction(ISD::SREM, MVT::i32, Expand);
785785
setOperationAction(ISD::UREM, MVT::i32, Expand);
786786
// Register based DivRem for AEABI (RTABI 4.2)
787-
if (Subtarget->isTargetAEABI() || Subtarget->isTargetAndroid()) {
787+
if (Subtarget->isTargetAEABI() || Subtarget->isTargetAndroid() ||
788+
Subtarget->isTargetGNUAEABI()) {
788789
setOperationAction(ISD::SREM, MVT::i64, Custom);
789790
setOperationAction(ISD::UREM, MVT::i64, Custom);
790791

@@ -11642,7 +11643,8 @@ static TargetLowering::ArgListTy getDivRemArgList(
1164211643
}
1164311644

1164411645
SDValue ARMTargetLowering::LowerDivRem(SDValue Op, SelectionDAG &DAG) const {
11645-
assert((Subtarget->isTargetAEABI() || Subtarget->isTargetAndroid()) &&
11646+
assert((Subtarget->isTargetAEABI() || Subtarget->isTargetAndroid() ||
11647+
Subtarget->isTargetGNUAEABI()) &&
1164611648
"Register-based DivRem lowering only");
1164711649
unsigned Opcode = Op->getOpcode();
1164811650
assert((Opcode == ISD::SDIVREM || Opcode == ISD::UDIVREM) &&

test/CodeGen/ARM/divmod-eabi.ll

Lines changed: 2 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,14 @@
11
; RUN: llc -mtriple armv7-none-eabi %s -o - | FileCheck %s --check-prefix=EABI
22
; RUN: llc -mtriple armv7-none-eabihf %s -o - | FileCheck %s --check-prefix=EABI
3-
; Both "none-eabi" and "androideabi" must lower SREM/UREM to __aeabi_{u,i}divmod
3+
; All "eabi" (Bare, GNU and Android) must lower SREM/UREM to __aeabi_{u,i}divmod
44
; RUN: llc -mtriple armv7-linux-androideabi %s -o - | FileCheck %s --check-prefix=EABI
5-
; RUN: llc -mtriple armv7-linux-gnueabi %s -o - | FileCheck %s --check-prefix=GNU
5+
; RUN: llc -mtriple armv7-linux-gnueabi %s -o - | FileCheck %s --check-prefix=EABI
66
; RUN: llc -mtriple armv7-apple-darwin %s -o - | FileCheck %s --check-prefix=DARWIN
77
; FIXME: long-term, we will use "-apple-macho" and won't need this exception:
88
; RUN: llc -mtriple armv7-apple-darwin-eabi %s -o - | FileCheck %s --check-prefix=DARWIN
99

1010
define signext i16 @f16(i16 signext %a, i16 signext %b) {
1111
; EABI-LABEL: f16:
12-
; GNU-LABEL: f16:
1312
; DARWIN-LABEL: f16:
1413
entry:
1514
%conv = sext i16 %a to i32
@@ -19,189 +18,145 @@ entry:
1918
; EABI: __aeabi_idivmod
2019
; EABI: mov [[div:r[0-9]+]], r0
2120
; EABI: mov [[rem:r[0-9]+]], r1
22-
; GNU: __aeabi_idiv
23-
; GNU: mov [[sum:r[0-9]+]], r0
24-
; GNU: __modsi3
25-
; GNU: add [[sum]]{{.*}}r0
2621
; DARWIN: ___divsi3
2722
; DARWIN: mov [[sum:r[0-9]+]], r0
2823
; DARWIN: __modsi3
2924
; DARWIN: add [[sum]]{{.*}}r0
3025
%rem8 = srem i32 %conv1, %conv
3126
; EABI: __aeabi_idivmod
32-
; GNU: __modsi3
3327
; DARWIN: __modsi3
3428
%add = add nsw i32 %rem, %div
3529
%add13 = add nsw i32 %add, %rem8
3630
%conv14 = trunc i32 %add13 to i16
3731
; EABI: add r0{{.*}}r1
3832
; EABI: sxth r0, r0
39-
; GNU: add r0{{.*}}[[sum]]
40-
; GNU: sxth r0, r0
4133
; DARWIN: add r0{{.*}}[[sum]]
4234
; DARWIN: sxth r0, r0
4335
ret i16 %conv14
4436
}
4537

4638
define i32 @f32(i32 %a, i32 %b) {
4739
; EABI-LABEL: f32:
48-
; GNU-LABEL: f32:
4940
; DARWIN-LABEL: f32:
5041
entry:
5142
%div = sdiv i32 %a, %b
5243
%rem = srem i32 %a, %b
5344
; EABI: __aeabi_idivmod
5445
; EABI: mov [[div:r[0-9]+]], r0
5546
; EABI: mov [[rem:r[0-9]+]], r1
56-
; GNU: __aeabi_idiv
57-
; GNU: mov [[sum:r[0-9]+]], r0
58-
; GNU: __modsi3
59-
; GNU: add [[sum]]{{.*}}r0
6047
; DARWIN: ___divsi3
6148
; DARWIN: mov [[sum:r[0-9]+]], r0
6249
; DARWIN: __modsi3
6350
; DARWIN: add [[sum]]{{.*}}r0
6451
%rem1 = srem i32 %b, %a
6552
; EABI: __aeabi_idivmod
66-
; GNU: __modsi3
6753
; DARWIN: __modsi3
6854
%add = add nsw i32 %rem, %div
6955
%add2 = add nsw i32 %add, %rem1
7056
; EABI: add r0{{.*}}r1
71-
; GNU: add r0{{.*}}[[sum]]
7257
; DARWIN: add r0{{.*}}[[sum]]
7358
ret i32 %add2
7459
}
7560

7661
define i32 @uf(i32 %a, i32 %b) {
7762
; EABI-LABEL: uf:
78-
; GNU-LABEL: uf:
7963
; DARWIN-LABEL: uf:
8064
entry:
8165
%div = udiv i32 %a, %b
8266
%rem = urem i32 %a, %b
8367
; EABI: __aeabi_uidivmod
84-
; GNU: __aeabi_uidiv
85-
; GNU: mov [[sum:r[0-9]+]], r0
86-
; GNU: __umodsi3
87-
; GNU: add [[sum]]{{.*}}r0
8868
; DARWIN: ___udivsi3
8969
; DARWIN: mov [[sum:r[0-9]+]], r0
9070
; DARWIN: __umodsi3
9171
; DARWIN: add [[sum]]{{.*}}r0
9272
%rem1 = urem i32 %b, %a
9373
; EABI: __aeabi_uidivmod
94-
; GNU: __umodsi3
9574
; DARWIN: __umodsi3
9675
%add = add nuw i32 %rem, %div
9776
%add2 = add nuw i32 %add, %rem1
9877
; EABI: add r0{{.*}}r1
99-
; GNU: add r0{{.*}}[[sum]]
10078
; DARWIN: add r0{{.*}}[[sum]]
10179
ret i32 %add2
10280
}
10381

10482
; FIXME: AEABI is not lowering long u/srem into u/ldivmod
10583
define i64 @longf(i64 %a, i64 %b) {
10684
; EABI-LABEL: longf:
107-
; GNU-LABEL: longf:
10885
; DARWIN-LABEL: longf:
10986
entry:
11087
%div = sdiv i64 %a, %b
11188
%rem = srem i64 %a, %b
11289
; EABI: __aeabi_ldivmod
113-
; GNU: __aeabi_ldivmod
114-
; GNU: mov [[div1:r[0-9]+]], r0
115-
; GNU: mov [[div2:r[0-9]+]], r1
11690
; DARWIN: ___divdi3
11791
; DARWIN: mov [[div1:r[0-9]+]], r0
11892
; DARWIN: mov [[div2:r[0-9]+]], r1
11993
; DARWIN: __moddi3
12094
%add = add nsw i64 %rem, %div
121-
; GNU: adds r0{{.*}}[[div1]]
122-
; GNU: adc r1{{.*}}[[div2]]
12395
; DARWIN: adds r0{{.*}}[[div1]]
12496
; DARWIN: adc r1{{.*}}[[div2]]
12597
ret i64 %add
12698
}
12799

128100
define i32 @g1(i32 %a, i32 %b) {
129101
; EABI-LABEL: g1:
130-
; GNU-LABEL: g1:
131102
; DARWIN-LABEL: g1:
132103
entry:
133104
%div = sdiv i32 %a, %b
134105
%rem = srem i32 %a, %b
135106
; EABI: __aeabi_idivmod
136-
; GNU: __aeabi_idiv
137-
; GNU: mov [[sum:r[0-9]+]], r0
138-
; GNU: __modsi3
139107
; DARWIN: ___divsi3
140108
; DARWIN: mov [[sum:r[0-9]+]], r0
141109
; DARWIN: __modsi3
142110
%add = add nsw i32 %rem, %div
143111
; EABI: add r0{{.*}}r1
144-
; GNU: add r0{{.*}}[[sum]]
145112
; DARWIN: add r0{{.*}}[[sum]]
146113
ret i32 %add
147114
}
148115

149116
; On both Darwin and Gnu, this is just a call to __modsi3
150117
define i32 @g2(i32 %a, i32 %b) {
151118
; EABI-LABEL: g2:
152-
; GNU-LABEL: g2:
153119
; DARWIN-LABEL: g2:
154120
entry:
155121
%rem = srem i32 %a, %b
156122
; EABI: __aeabi_idivmod
157-
; GNU: __modsi3
158123
; DARWIN: __modsi3
159124
ret i32 %rem
160125
; EABI: mov r0, r1
161126
}
162127

163128
define i32 @g3(i32 %a, i32 %b) {
164129
; EABI-LABEL: g3:
165-
; GNU-LABEL: g3:
166130
; DARWIN-LABEL: g3:
167131
entry:
168132
%rem = srem i32 %a, %b
169133
; EABI: __aeabi_idivmod
170134
; EABI: mov [[mod:r[0-9]+]], r1
171-
; GNU: __modsi3
172-
; GNU: mov [[sum:r[0-9]+]], r0
173135
; DARWIN: __modsi3
174136
; DARWIN: mov [[sum:r[0-9]+]], r0
175137
%rem1 = srem i32 %b, %rem
176138
; EABI: __aeabi_idivmod
177-
; GNU: __modsi3
178139
; DARWIN: __modsi3
179140
%add = add nsw i32 %rem1, %rem
180141
; EABI: add r0, r1, [[mod]]
181-
; GNU: add r0{{.*}}[[sum]]
182142
; DARWIN: add r0{{.*}}[[sum]]
183143
ret i32 %add
184144
}
185145

186146
define i32 @g4(i32 %a, i32 %b) {
187147
; EABI-LABEL: g4:
188-
; GNU-LABEL: g4:
189148
; DARWIN-LABEL: g4:
190149
entry:
191150
%div = sdiv i32 %a, %b
192151
; EABI: __aeabi_idiv{{$}}
193152
; EABI: mov [[div:r[0-9]+]], r0
194-
; GNU: __aeabi_idiv
195-
; GNU: mov [[sum:r[0-9]+]], r0
196153
; DARWIN: ___divsi3
197154
; DARWIN: mov [[sum:r[0-9]+]], r0
198155
%rem = srem i32 %b, %div
199156
; EABI: __aeabi_idivmod
200-
; GNU: __modsi3
201157
; DARWIN: __modsi3
202158
%add = add nsw i32 %rem, %div
203159
; EABI: add r0, r1, [[div]]
204-
; GNU: add r0{{.*}}[[sum]]
205160
; DARWIN: add r0{{.*}}[[sum]]
206161
ret i32 %add
207162
}

0 commit comments

Comments
 (0)