From: Dave A. <ai...@us...> - 2003-05-11 07:49:47
|
Update of /cvsroot/linux-vax/kernel-2.4/include/asm-vax In directory sc8-pr-cvs1:/tmp/cvs-serv5694 Modified Files: div64.h Log Message: DA: this didn't work for printing long longs with printk, pissed me off no end :-) Index: div64.h =================================================================== RCS file: /cvsroot/linux-vax/kernel-2.4/include/asm-vax/div64.h,v retrieving revision 1.1 retrieving revision 1.2 diff -u -r1.1 -r1.2 --- div64.h 18 Jan 2001 18:49:49 -0000 1.1 +++ div64.h 11 May 2003 07:49:42 -0000 1.2 @@ -1,13 +1,38 @@ -#ifndef __VAX_DIV64 -#define __VAX_DIV64 +#ifndef __ASM_VAX_DIV64 +#define __ASM_VAX_DIV64 -/* atp jan 2001. Take from asm-s390. - * FIXME: replace by quadword divide */ +/* + * DA: stolen from parisc port - probably can be optimized a lot beter + */ + +/* + * unsigned long long division. Yuck Yuck! What is Linux coming to? + * This is 100% disgusting + */ +#define do_div(n,base) \ +({ \ + unsigned long __low, __low2, __high, __rem; \ + __low = (n) & 0xffffffff; \ + __high = (n) >> 32; \ + if (__high) { \ + __rem = __high % (unsigned long)base; \ + __high = __high / (unsigned long)base; \ + __low2 = __low >> 16; \ + __low2 += __rem << 16; \ + __rem = __low2 % (unsigned long)base; \ + __low2 = __low2 / (unsigned long)base; \ + __low = __low & 0xffff; \ + __low += __rem << 16; \ + __rem = __low % (unsigned long)base; \ + __low = __low / (unsigned long)base; \ + n = __low + ((long long)__low2 << 16) + \ + ((long long) __high << 32); \ + } else { \ + __rem = __low % (unsigned long)base; \ + n = (__low / (unsigned long)base); \ + } \ + __rem; \ +}) +#endif -#define do_div(n,base) ({ \ -int __res; \ -__res = ((unsigned long) n) % (unsigned) base; \ -n = ((unsigned long) n) / (unsigned) base; \ -__res; }) -#endif /* __ASM_VAX_DIV64_H */ |