Redirect all divisions to grub_divmod64.

This commit is contained in:
Vladimir Serbinenko 2013-11-13 00:53:53 +01:00
parent f649a6a8fd
commit 16057d6bbb
6 changed files with 97 additions and 29 deletions

View file

@ -30,6 +30,26 @@
.align 2
.macro division parent
stmfd sp!, {lr}
sub sp, sp, #12
mov r2, r1
add r1, sp, #4
str r1, [sp, #0]
mov r1, #0
mov r3, #0
bl \parent
ldr r1, [sp, #4]
add sp, sp, #12
ldmfd sp!, {lr}
bx lr
.endm
FUNCTION(__aeabi_uidivmod)
division grub_divmod64
/*
* Null divide-by-zero handler
*/

View file

@ -596,6 +596,49 @@ grub_divmod64 (grub_uint64_t n, grub_uint64_t d, grub_uint64_t *r)
return q;
}
#if defined (__arm__)
grub_uint32_t
__udivsi3 (grub_uint32_t a, grub_uint32_t b)
{
return grub_divmod64 (a, b, 0);
}
grub_uint32_t
__umodsi3 (grub_uint32_t a, grub_uint32_t b)
{
grub_uint64_t ret;
grub_divmod64 (a, b, &ret);
return ret;
}
#endif
#ifdef __arm__
grub_uint32_t
__aeabi_uidiv (grub_uint32_t a, grub_uint32_t b)
__attribute__ ((alias ("__udivsi3")));
#endif
#if defined (__ia64__)
grub_uint64_t
__udivdi3 (grub_uint64_t a, grub_uint64_t b)
{
return grub_divmod64 (a, b, 0);
}
grub_uint64_t
__umoddi3 (grub_uint64_t a, grub_uint64_t b)
{
grub_uint64_t ret;
grub_divmod64 (a, b, &ret);
return ret;
}
#endif
/* Convert a long long value to a string. This function avoids 64-bit
modular arithmetic or divisions. */
static char *