X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=Kernel%2Farch%2Fx86%2Flib.c;h=8f8abe67ad3d956825d5aafac74c0f1ac7d39300;hb=6e41a8a3aa767cd5aeddbad393ce4f637a47a367;hp=0d493bb19fcd6a70b83e11d4d775113e409e5c15;hpb=0f8226381e0a19e8e8e11eafbf4589532e45d430;p=tpg%2Facess2.git diff --git a/Kernel/arch/x86/lib.c b/Kernel/arch/x86/lib.c index 0d493bb1..8f8abe67 100644 --- a/Kernel/arch/x86/lib.c +++ b/Kernel/arch/x86/lib.c @@ -1,6 +1,8 @@ /* - * AcessOS Microkernel Version - * lib.c + * Acess2 + * + * arch/x86/lib.c + * - General arch-specific stuff */ #include #include @@ -343,6 +345,25 @@ void *memcpyd(void *Dest, const void *Src, size_t Num) return Dest; } +Uint64 DivMod64U(Uint64 Num, Uint64 Div, Uint64 *Rem) +{ + Uint64 ret; + if( Div < 0x100000000ULL && Num < 0xFFFFFFFF * Div ) { + Uint32 rem, ret_32; + __asm__ __volatile__( + "div %4" + : "=a" (ret_32), "=d" (rem) + : "a" ( (Uint32)(Num & 0xFFFFFFFF) ), "d" ((Uint32)(Num >> 32)), "r" (Div) + ); + if(Rem) *Rem = rem; + return ret_32; + } + + ret = __udivdi3(Num, Div); + if(Rem) *Rem = __umoddi3(Num, Div); + return ret; +} + /** * \fn Uint64 __udivdi3(Uint64 Num, Uint64 Den) * \brief Divide two 64-bit integers