X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=Kernel%2Farch%2Farm7%2Flib.c;h=94c1a3af3c6416f84bfadb661eacdeb696af987a;hb=5e9042e320d0a24d1691bcd6845936879238e812;hp=e8eb7d3bf6e5b1099822e6d5e04f35b72972c942;hpb=0823932d2ca869dc5dc972ac76261e1b264e70a0;p=tpg%2Facess2.git diff --git a/Kernel/arch/arm7/lib.c b/Kernel/arch/arm7/lib.c index e8eb7d3b..94c1a3af 100644 --- a/Kernel/arch/arm7/lib.c +++ b/Kernel/arch/arm7/lib.c @@ -6,6 +6,7 @@ #include // === PROTOTYPES === +Uint64 __divmod64(Uint64 Num, Uint64 Den, Uint64 *Rem); Uint64 __udivdi3(Uint64 Num, Uint64 Den); Uint64 __umoddi3(Uint64 Num, Uint64 Den); Uint32 __udivsi3(Uint32 Num, Uint32 Den); @@ -112,6 +113,36 @@ void *memset(void *_dest, int _value, size_t _length) return _dest; } +Uint64 __divmod64(Uint64 Num, Uint64 Den, Uint64 *Rem) +{ + Uint64 ret, add; + + ret = 0; + add = 1; + + // Find what power of two times Den is > Num + while( Num >= Den ) + { + Den <<= 1; + add <<= 1; + } + + // Search backwards + while( add > 1 ) + { + add >>= 1; + Den >>= 1; + // If the numerator is > Den, subtract and add to return value + if( Num > Den ) + { + ret += add; + Num -= Den; + } + } + if(Rem) *Rem = Num; + return ret; +} + Uint64 DivMod64U(Uint64 Num, Uint64 Den, Uint64 *Rem) { Uint64 ret; @@ -132,6 +163,10 @@ Uint64 DivMod64U(Uint64 Num, Uint64 Den, Uint64 *Rem) if(Rem) *Rem = Num & 0xF; return Num >> 4; } + if(Den == 32) { + if(Rem) *Rem = Num & 0x1F; + return Num >> 5; + } if(Den == 0x1000) { if(Rem) *Rem = Num & 0xFFF; return Num >> 12; @@ -156,11 +191,16 @@ Uint64 DivMod64U(Uint64 Num, Uint64 Den, Uint64 *Rem) Den >>= 1; tmp >>= 1; while( } - #else + if(Rem) *Rem = Num; + return ret; + #elif 0 for( ret = 0; Num > Den; ret ++, Num -= Den) ; - #endif if(Rem) *Rem = Num; return ret; + #else + ret = __divmod64(Num, Den, Rem); + return ret; + #endif } // Unsigned Divide 64-bit Integer