Usermode/AxWin3 - More WM IPC messages implemented
[tpg/acess2.git] / Kernel / arch / armv7 / lib.c
index c0feab6..5a6928e 100644 (file)
@@ -4,10 +4,12 @@
  * lib.c - Library Functions
  */
 #include <acess.h>
+#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;
 }
 

UCC git Repository :: git.ucc.asn.au