diff options
author | Charles Baylis <charles.baylis@linaro.org> | 2014-06-18 15:42:53 +0000 |
---|---|---|
committer | Charles Baylis <cbaylis@gcc.gnu.org> | 2014-06-18 15:42:53 +0000 |
commit | 1338118928aa7368a01be65e40a95e7c4ba270d0 (patch) | |
tree | c02777dfb8b43a15090da4da1005bdf6493100fc | |
parent | f493def153699c9bc2c90c1d636cbef490f5b70f (diff) | |
download | gcc-1338118928aa7368a01be65e40a95e7c4ba270d0.zip gcc-1338118928aa7368a01be65e40a95e7c4ba270d0.tar.gz gcc-1338118928aa7368a01be65e40a95e7c4ba270d0.tar.bz2 |
bpabi.S (__aeabi_ldivmod): Perform division using __udivmoddi4, and fixups for negative operands.
2014-06-18 Charles Baylis <charles.baylis@linaro.org>
* config/arm/bpabi.S (__aeabi_ldivmod): Perform division using
__udivmoddi4, and fixups for negative operands.
From-SVN: r211794
-rw-r--r-- | gcc/ChangeLog | 5 | ||||
-rw-r--r-- | libgcc/config/arm/bpabi.S | 41 |
2 files changed, 45 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index fec83a5..3d46032 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,10 @@ 2014-06-18 Charles Baylis <charles.baylis@linaro.org> + * config/arm/bpabi.S (__aeabi_ldivmod): Perform division using + __udivmoddi4, and fixups for negative operands. + +2014-06-18 Charles Baylis <charles.baylis@linaro.org> + * config/arm/bpabi.S (__aeabi_ldivmod): Optimise stack manipulation. 2014-06-18 Charles Baylis <charles.baylis@linaro.org> diff --git a/libgcc/config/arm/bpabi.S b/libgcc/config/arm/bpabi.S index 3f9ece5..c044167 100644 --- a/libgcc/config/arm/bpabi.S +++ b/libgcc/config/arm/bpabi.S @@ -175,10 +175,49 @@ ARM_FUNC_START aeabi_ldivmod test_div_by_zero signed push_for_divide __aeabi_ldivmod + cmp xxh, #0 + blt 1f + cmp yyh, #0 + blt 2f + /* arguments in (r0:r1), (r2:r3) and *sp */ + bl SYM(__udivmoddi4) __PLT__ + pop_for_divide + RET + +1: /* xxh:xxl is negative */ + negs xxl, xxl + sbc xxh, xxh, xxh, lsl #1 /* Thumb-2 has no RSC, so use X - 2X */ + cmp yyh, #0 + blt 3f + /* arguments in (r0:r1), (r2:r3) and *sp */ + bl SYM(__udivmoddi4) __PLT__ + pop_for_divide + negs xxl, xxl + sbc xxh, xxh, xxh, lsl #1 /* Thumb-2 has no RSC, so use X - 2X */ + negs yyl, yyl + sbc yyh, yyh, yyh, lsl #1 /* Thumb-2 has no RSC, so use X - 2X */ + RET + +2: /* only yyh:yyl is negative */ + negs yyl, yyl + sbc yyh, yyh, yyh, lsl #1 /* Thumb-2 has no RSC, so use X - 2X */ + /* arguments in (r0:r1), (r2:r3) and *sp */ + bl SYM(__udivmoddi4) __PLT__ + pop_for_divide + negs xxl, xxl + sbc xxh, xxh, xxh, lsl #1 /* Thumb-2 has no RSC, so use X - 2X */ + RET + +3: /* both xxh:xxl and yyh:yyl are negative */ + negs yyl, yyl + sbc yyh, yyh, yyh, lsl #1 /* Thumb-2 has no RSC, so use X - 2X */ /* arguments in (r0:r1), (r2:r3) and *sp */ - bl SYM(__gnu_ldivmod_helper) __PLT__ + bl SYM(__udivmoddi4) __PLT__ pop_for_divide + negs yyl, yyl + sbc yyh, yyh, yyh, lsl #1 /* Thumb-2 has no RSC, so use X - 2X */ RET + cfi_end LSYM(Lend_aeabi_ldivmod) #endif /* L_aeabi_ldivmod */ |