diff options
author | Martin Storsjo <martin@martin.st> | 2016-10-07 13:28:53 +0000 |
---|---|---|
committer | Martin Storsjo <martin@martin.st> | 2016-10-07 13:28:53 +0000 |
commit | 04864f45b2f24e1268640cbde9203a7f769b6a79 (patch) | |
tree | 5eb71c7f126d00c6b7fbad7e5e43032ea4767437 /llvm/test/CodeGen/ARM/divmod-eabi.ll | |
parent | 12d6baf5e40ac16d70bd588d0b62ad53b945fe7e (diff) | |
download | bcm5719-llvm-04864f45b2f24e1268640cbde9203a7f769b6a79.tar.gz bcm5719-llvm-04864f45b2f24e1268640cbde9203a7f769b6a79.zip |
[ARM] Reapply: Use __rt_div functions for divrem on Windows
Reapplying r283383 after revert in r283442. The additional fix
is a getting rid of a stray space in a function name, in the
refactoring part of the commit.
This avoids falling back to calling out to the GCC rem functions
(__moddi3, __umoddi3) when targeting Windows.
The __rt_div functions have flipped the two arguments compared
to the __aeabi_divmod functions. To match MSVC, we emit a
check for division by zero before actually calling the library
function (even if the library function itself also might do
the same check).
Not all calls to __rt_div functions for division are currently
merged with calls to the same function with the same parameters
for the remainder. This is more wasteful than a div + mls as before,
but avoids calls to __moddi3.
Differential Revision: https://reviews.llvm.org/D25332
llvm-svn: 283550
Diffstat (limited to 'llvm/test/CodeGen/ARM/divmod-eabi.ll')
-rw-r--r-- | llvm/test/CodeGen/ARM/divmod-eabi.ll | 56 |
1 files changed, 22 insertions, 34 deletions
diff --git a/llvm/test/CodeGen/ARM/divmod-eabi.ll b/llvm/test/CodeGen/ARM/divmod-eabi.ll index 1e4c8fc336d..ce5a1df05e3 100644 --- a/llvm/test/CodeGen/ARM/divmod-eabi.ll +++ b/llvm/test/CodeGen/ARM/divmod-eabi.ll @@ -42,15 +42,13 @@ entry: ; DARWIN-DEFAULT: add [[sum:r[0-9]+]], r0, [[div]] ; DARWIN-O0: mov [[rem:r[0-9]+]], r0 ; WINDOWS: __rt_sdiv -; WINDOWS-DEFAULT: mls [[rem:r[0-9]+]], r0, -; WINDOWS-DEFAULT: adds [[sum:r[0-9]+]], [[rem]], r0 -; WINDOWS-O0: mov [[div:r[0-9]+]], r0 -; WINDOWS-O0: mls [[rem:r[0-9]+]], [[div]], +; WINDOWS: __rt_sdiv +; WINDOWS-DEFAULT: add [[sum:r[0-9]+]], r1 +; WINDOWS-O0: mov [[rem:r[0-9]+]], r1 %rem8 = srem i32 %conv1, %conv ; EABI: __aeabi_idivmod ; DARWIN: __modsi3 ; WINDOWS: __rt_sdiv -; WINDOWS: mls [[rem1:r[0-9]+]], r0, %add = add nsw i32 %rem, %div %add13 = add nsw i32 %add, %rem8 %conv14 = trunc i32 %add13 to i16 @@ -60,9 +58,10 @@ entry: ; DARWIN-O0: add [[sum:r[0-9]+]], [[rem]], [[div]] ; DARWIN-O0: add [[res:r[0-9]+]], [[sum]], r0 ; DARWIN: sxth r0, [[res]] -; WINDOWS-O0: adds [[sum:r[0-9]+]], [[rem]], [[div]] -; WINDOWS: add [[rem1]], [[sum]] -; WINDOWS: sxth [[res:r[0-9]+]], [[rem1]] +; WINDOWS-DEFAULT: adds [[sum1:r[0-9]+]], [[sum]], r1 +; WINDOWS-O0: adds [[sum:r[0-9]+]], [[rem]], +; WINDOWS-O0: add [[sum1:r[0-9]+]], r1 +; WINDOWS: sxth [[res:r[0-9]+]], [[sum1]] ret i16 %conv14 } @@ -84,22 +83,20 @@ entry: ; WINDOWS: __rt_sdiv ; WINDOWS: mov [[div:r[0-9]+]], r0 ; WINDOWS: __rt_sdiv -; WINDOWS: mls [[rem:r[0-9]+]], r0, -; WINDOWS-DEFAULT: add [[div]], [[rem]] +; WINDOWS-DEFAULT: add [[div]], r1 %rem1 = srem i32 %b, %a ; EABI: __aeabi_idivmod ; DARWIN: __modsi3 ; WINDOWS: __rt_sdiv -; WINDOWS: mls [[rem1:r[0-9]+]], r0, %add = add nsw i32 %rem, %div %add2 = add nsw i32 %add, %rem1 ; EABI: add r0{{.*}}r1 ; DARWIN-DEFAULT: add r0, [[sum]], r0 ; DARWIN-O0: add [[sum:r[0-9]+]], [[rem]], [[div]] ; DARWIN-O0: add [[res:r[0-9]+]], [[sum]], r0 -; WINDOWS-DEFAULT: add [[rem1]], [[div]] +; WINDOWS-DEFAULT: adds r0, [[div]], r1 ; WINDOWS-O0: adds [[sum:r[0-9]+]], [[rem]], [[div]] -; WINDOWS-O0: add [[rem1]], [[sum]] +; WINDOWS-O0: add [[sum]], r1 ret i32 %add2 } @@ -119,22 +116,20 @@ entry: ; WINDOWS: __rt_udiv ; WINDOWS: mov [[div:r[0-9]+]], r0 ; WINDOWS: __rt_udiv -; WINDOWS: mls [[rem:r[0-9]+]], r0, -; WINDOWS-DEFAULT: add [[div]], [[rem]] +; WINDOWS-DEFAULT: add [[div]], r1 %rem1 = urem i32 %b, %a ; EABI: __aeabi_uidivmod ; DARWIN: __umodsi3 ; WINDOWS: __rt_udiv -; WINDOWS: mls [[rem1:r[0-9]+]], r0, %add = add nuw i32 %rem, %div %add2 = add nuw i32 %add, %rem1 ; EABI: add r0{{.*}}r1 ; DARWIN-DEFAULT: add r0, [[sum]], r0 ; DARWIN-O0: add [[sum:r[0-9]+]], [[rem]], [[div]] ; DARWIN-O0: add [[res:r[0-9]+]], [[sum]], r0 -; WINDOWS-DEFAULT: add [[rem1]], [[div]] -; WINDOWS-O0: adds [[sum:r[0-9]+]], [[rem]], [[div]] -; WINDOWS-O0: add [[rem1]], [[sum]] +; WINDOWS-DEFAULT: adds [[sum:r[0-9]+]], [[div]], r1 +; WINDOWS-O0: adds [[sum:r[0-9]+]], +; WINDOWS-O0: add [[sum]], r1 ret i32 %add2 } @@ -154,14 +149,11 @@ entry: ; DARWIN: mov [[div2:r[0-9]+]], r1 ; DARWIN: __moddi3 ; WINDOWS: __rt_sdiv64 -; WINDOWS: mov [[div1:r[0-9]+]], r0 -; WINDOWS: mov [[div2:r[0-9]+]], r1 -; WINDOWS: __moddi3 %add = add nsw i64 %rem, %div ; DARWIN: adds r0{{.*}}[[div1]] ; DARWIN: adc r1{{.*}}[[div2]] -; WINDOWS: adds.w r0, r0, [[div1]] -; WINDOWS: adc.w r1, r1, [[div2]] +; WINDOWS: adds r0, r0, r2 +; WINDOWS: adcs r1, r3 ret i64 %add } @@ -179,11 +171,10 @@ entry: ; WINDOWS: __rt_sdiv ; WINDOWS: mov [[div:r[0-9]+]], r0 ; WINDOWS: __rt_sdiv -; WINDOWS: mls [[rem:r[0-9]+]], r0, %add = add nsw i16 %rem, %div ; EABI: add r0, r1 ; DARWIN: add r0{{.*}}[[div1]] -; WINDOWS: add [[rem]], [[div]] +; WINDOWS: adds r0, r1, [[div]] ret i16 %add } @@ -201,11 +192,10 @@ entry: ; WINDOWS: __rt_sdiv ; WINDOWS: mov [[div:r[0-9]+]], r0 ; WINDOWS: __rt_sdiv -; WINDOWS: mls [[rem:r[0-9]+]], r0, %add = add nsw i32 %rem, %div ; EABI: add r0{{.*}}r1 ; DARWIN: add r0{{.*}}[[sum]] -; WINDOWS: add [[rem]], [[div]] +; WINDOWS: adds r0, r1, [[div]] ret i32 %add } @@ -221,7 +211,7 @@ entry: ; WINDOWS: __rt_sdiv ret i32 %rem ; EABI: mov r0, r1 -; WINDOWS: mls r0, r0, +; WINDOWS: mov r0, r1 } define i32 @g3(i32 %a, i32 %b) { @@ -235,16 +225,15 @@ entry: ; DARWIN: __modsi3 ; DARWIN: mov [[sum:r[0-9]+]], r0 ; WINDOWS: __rt_sdiv -; WINDOWS: mls [[rem:r[0-9]+]], r0, +; WINDOWS: mov [[rem:r[0-9]+]], r1 %rem1 = srem i32 %b, %rem ; EABI: __aeabi_idivmod ; DARWIN: __modsi3 ; WINDOWS: __rt_sdiv -; WINDOWS: mls [[rem1:r[0-9]+]], r0, %add = add nsw i32 %rem1, %rem ; EABI: add r0, r1, [[mod]] ; DARWIN: add r0{{.*}}[[sum]] -; WINDOWS: add [[rem1]], [[rem]] +; WINDOWS: adds r0, r1, [[rem]] ret i32 %add } @@ -264,10 +253,9 @@ entry: ; EABI: __aeabi_idivmod ; DARWIN: __modsi3 ; WINDOWS: __rt_sdiv -; WINDOWS: mls [[rem:r[0-9]+]], r0, %add = add nsw i32 %rem, %div ; EABI: add r0, r1, [[div]] ; DARWIN: add r0{{.*}}[[sum]] -; WINDOWS: add [[rem]], [[div]] +; WINDOWS: adds r0, r1, [[div]] ret i32 %add } |