diff options
Diffstat (limited to 'include/asm-parisc/div64.h')
-rw-r--r-- | include/asm-parisc/div64.h | 54 |
1 files changed, 54 insertions, 0 deletions
diff --git a/include/asm-parisc/div64.h b/include/asm-parisc/div64.h new file mode 100644 index 000000000..e86e35e8a --- /dev/null +++ b/include/asm-parisc/div64.h @@ -0,0 +1,54 @@ +#ifndef __ASM_PARISC_DIV64 +#define __ASM_PARISC_DIV64 + +#ifdef __LP64__ + +/* + * Copyright (C) 1999 Hewlett-Packard Co + * Copyright (C) 1999 David Mosberger-Tang <davidm@hpl.hp.com> + * + * vsprintf uses this to divide a 64-bit integer N by a small integer BASE. + * This is incredibly hard on IA-64 and HPPA + */ + +#define do_div(n,base) \ +({ \ + int _res; \ + _res = ((unsigned long) (n)) % (unsigned) (base); \ + (n) = ((unsigned long) (n)) / (unsigned) (base); \ + _res; \ +}) + +#else +/* + * 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 + +#endif + |