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 */
|