void PrintTraceHex(unsigned char x);
-
+void PrintTraceLL(ullong_t num);
void PrintTraceMemDump(unsigned char * start, int n);
* This ends up being the most efficient "calling
* convention" on x86.
*/
-#define do_div(n,base) ({ \
- unsigned long __upper, __low, __high, __mod, __base; \
- __base = (base); \
- asm("":"=a" (__low), "=d" (__high):"A" (n)); \
- __upper = __high; \
- if (__high) { \
- __upper = __high % (__base); \
- __high = __high / (__base); \
- } \
- asm("divl %2":"=a" (__low), "=d" (__mod):"rm" (__base), "0" (__low), "1" (__upper)); \
- asm("":"=A" (n):"a" (__low),"d" (__high)); \
- __mod; \
-})
+#define do_div(n,base) ({ \
+ unsigned long __upper, __low, __high, __mod, __base; \
+ __base = (base); \
+ asm("":"=a" (__low), "=d" (__high):"A" (n)); \
+ __upper = __high; \
+ if (__high) { \
+ __upper = __high % (__base); \
+ __high = __high / (__base); \
+ } \
+ asm("divl %2":"=a" (__low), "=d" (__mod):"rm" (__base), "0" (__low), "1" (__upper)); \
+ asm("":"=A" (n):"a" (__low),"d" (__high)); \
+ __mod; \
+ })
+
+
+
+/* This divides two 64bit unsigned ints
+ * The previous version only allows 32 bit bases(?)...
+ *
+ * NOTE: This absolutely sucks... there has to be a better way....
+ */
+#define do_divll(n, base) ({ \
+ ullong_t __rem = 0; \
+ ullong_t __num = 0; \
+ while (n > base) { \
+ __num++; \
+ n -= base; \
+ } \
+ __rem = n; \
+ n = __num; \
+ __rem; \
+ })
#endif
+
+
#endif