#include /* * Verification test for div64_s64. */ #ifndef abs64 #define abs64(x) ({ \ s64 __x = (x); \ (__x < 0) ? -__x : __x; \ }) #endif int div64_s64_test(void) { s64 u, v, q, r; int n, i, j, k, errors = 0; const s64 tabs[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 1000, 2003, 32765, 32766, 32767, 32768, 32769, 32760, 65533, 65534, 65535, 65536, 65537, 65538, 0x7ffffffeLL, 0x7fffffffLL, 0x80000000LL, 0x80000001LL, 0x7000000000000000LL, 0x7000000080000000LL, 0x7000000080000001LL, 0x7fffffffffffffffLL, 0x7fffffff8fffffffLL, 0x7fffffff8ffffff1LL, 0x7fffffff00000000LL, 0x7fffffff80000000LL, 0x7fffffff00000001LL, 0x0123456789abcdefLL, 0x00000000abcdef01LL, 0x0000000012345678LL, }; printk("%s", "Testing signed 64-bit division.\n"); n = sizeof(tabs) / sizeof(tabs[0]); for (i = 0; i < n; i++) { for (j = 1; j < n; j++) { for (k = 0; k <= 3; k++) { u = (k & 1) ? -tabs[i] : tabs[i]; v = (k >= 2) ? -tabs[j] : tabs[j]; q = div64_s64(u, v); r = u - q * v; if (abs64(q) > abs64(u) || abs64(r) >= abs64(v) || (r != 0 && (r ^ u) < 0)) { printk("%016llx/%016llx != %016llx " "rem %016llx\n", u, v, q, r); errors++; } } } } if (errors) { printk("Failed %d/%d tests\n", errors, n * (n - 1)); } else { printk("Passed all %d tests\n", n * (n - 1)); } return 0; } void div64_s64_exit(void) { } module_init(div64_s64_test); module_exit(div64_s64_exit);