Kernel/arch - Fix common division macro to handle numerators around datatype max
authorJohn Hodge <[email protected]>
Sat, 10 May 2014 07:40:29 +0000 (15:40 +0800)
committerJohn Hodge <[email protected]>
Sat, 10 May 2014 07:40:29 +0000 (15:40 +0800)
KernelLand/Kernel/arch/helpers.h

index 4d85fcb..b478031 100644 (file)
 //  > 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;\
+       while(N/2>=D&&add) {D<<=1;add<<=1;}\
+       while(add>0){\
                if(N>=D){ret+=add;N-=D;}\
+               add>>=1;D>>=1;\
        }\
        if(Rem)*Rem = N;\
        return ret;\

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