X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=Kernel%2Farch%2Farmv7%2Flib.c;h=5a6928e7cd916262e1e97df4d6fa589884462b97;hb=1389dd6a77cfe0f01ae941f6f696bd5eda22e959;hp=c0feab6c21a10169f6dc5af5f1cb8676d265cfb1;hpb=6a590915c73bf34116724ee15aa9c6d13c8bc404;p=tpg%2Facess2.git diff --git a/Kernel/arch/armv7/lib.c b/Kernel/arch/armv7/lib.c index c0feab6c..5a6928e7 100644 --- a/Kernel/arch/armv7/lib.c +++ b/Kernel/arch/armv7/lib.c @@ -4,10 +4,12 @@ * lib.c - Library Functions */ #include +#include "../helpers.h" // === IMPORTS === extern void __memcpy_align4(void *_dest, const void *_src, size_t _length); extern void __memcpy_byte(void *_dest, const void *_src, size_t _length); +extern Uint32 __divmod32_asm(Uint32 Num, Uint32 Den, Uint32 *Rem); // === PROTOTYPES === Uint64 __divmod64(Uint64 Num, Uint64 Den, Uint64 *Rem); @@ -41,7 +43,7 @@ void *memcpy(void *_dest, const void *_src, size_t _length) // Force alignment while( (tVAddr)dst8 & 3 ) *dst8 ++ = *src8++, _length --; - __memcpy_align32(dst8, src8, _length); + __memcpy_align4(dst8, src8, _length); return _dest; } @@ -113,29 +115,17 @@ void *memset(void *_dest, int _value, size_t _length) return _dest; } -// Divide -// - Find what power of two times Den is > Num -// - Iterate down in bit significance -// > If the `N` value is greater than `D`, we can set this bit -#define DEF_DIVMOD(s) Uint##s __divmod##s(Uint##s N, Uint##s D, Uint##s*Rem){\ - Uint##s ret=0,add=1;\ - while(N>=D&&add) {D<<=1;add<<=1;}\ - while(add>1){\ - add>>=1;D>>=1;\ - if(N>=D){ret+=add;N-=D;}\ - }\ - if(Rem)*Rem = N;\ - return ret;\ -} - DEF_DIVMOD(64) DEF_DIVMOD(32) - Uint64 DivMod64U(Uint64 Num, Uint64 Den, Uint64 *Rem) { Uint64 ret; if(Den == 0) return 0; // TODO: #div0 + if(Num < Den) { + if(Rem) *Rem = Num; + return 0; + } if(Num == 0) { if(Rem) *Rem = 0; return 0; @@ -160,6 +150,11 @@ Uint64 DivMod64U(Uint64 Num, Uint64 Den, Uint64 *Rem) if(Rem) *Rem = Num & 0xFFF; return Num >> 12; } + + if( !(Den >> 32) && !(Num >> 32) ) { + if(Rem) *Rem = 0; // Clear high bits + return __divmod32_asm(Num, Den, (Uint32*)Rem); + } ret = __divmod64(Num, Den, Rem); return ret; @@ -181,13 +176,13 @@ Uint64 __umoddi3(Uint64 Num, Uint64 Den) Uint32 __udivsi3(Uint32 Num, Uint32 Den) { - return __divmod32(Num, Den, NULL); + return __divmod32_asm(Num, Den, NULL); } Uint32 __umodsi3(Uint32 Num, Uint32 Den) { Uint32 rem; - __divmod32(Num, Den, &rem); + __divmod32_asm(Num, Den, &rem); return rem; }