diff options
Diffstat (limited to 'sem3/algo/mm3/multiply.c')
-rw-r--r-- | sem3/algo/mm3/multiply.c | 67 |
1 files changed, 33 insertions, 34 deletions
diff --git a/sem3/algo/mm3/multiply.c b/sem3/algo/mm3/multiply.c index da8068c..d931000 100644 --- a/sem3/algo/mm3/multiply.c +++ b/sem3/algo/mm3/multiply.c @@ -5,54 +5,53 @@ uint64_t mult(uint64_t x, uint64_t y, unsigned int bits) { - /* Check if they expect more than 64 bits. */ - if ( bits > 64 ) { - printf("Sorry we cant handle higher than 64 bits\n"); - exit(1); - } else if (bits <= 1) { - return x && y; - } + /* Check if they expect more than 64 bits. */ + if (bits > 64) { + printf("Sorry we cant handle higher than 64 bits\n"); + exit(1); + } else if (bits <= 1) { + return x && y; + } - unsigned int newBits = bits >> 1; + unsigned int newBits = bits >> 1; #if DO_PRINT == 1 - printf("\n\n bits: %u, New bits: %u\n", bits, newBits); -#endif + printf("\n\n bits: %u, New bits: %u\n", bits, newBits); +#endif - /* Split up into to */ - uint32_t halvMask = ((uint64_t)1 << newBits) - 1; + /* Split up into to */ + uint32_t halvMask = ((uint64_t)1 << newBits) - 1; #if DO_PRINT == 1 - printf("Using mask 0x%08X\n", halvMask); -#endif - uint32_t a = (x >> (newBits)) & halvMask; - uint32_t b = x & halvMask; - uint32_t c = (y >> (newBits)) & halvMask; - uint32_t d = y & halvMask; + printf("Using mask 0x%08X\n", halvMask); +#endif + uint32_t a = (x >> (newBits)) & halvMask; + uint32_t b = x & halvMask; + uint32_t c = (y >> (newBits)) & halvMask; + uint32_t d = y & halvMask; #if DO_PRINT == 1 - printf("A: 0x%08X, B: 0x%08X, C: 0x%08X, D: 0x%08X\n", a, b, c, d); -#endif - - return (mult(a, c, newBits) << bits) + ((mult(a, d, newBits) + mult(b, c, newBits)) << newBits) + mult(b, d, newBits); + printf("A: 0x%08X, B: 0x%08X, C: 0x%08X, D: 0x%08X\n", a, b, c, d); +#endif + return (mult(a, c, newBits) << bits) + + ((mult(a, d, newBits) + mult(b, c, newBits)) << newBits) + + mult(b, d, newBits); } - int main(void) { + uint32_t a = 0xFFFFFF; + uint8_t b = 55; + uint64_t res; - uint32_t a = 0xFFFFFF; - uint8_t b = 55; - uint64_t res; + clock_t begin = clock(); + res = mult(a, b, 64); + clock_t end = clock(); - clock_t begin = clock(); - res = mult(a, b, 64); - clock_t end = clock(); + printf("Result: %lld\n", res); - printf("Result: %lld\n", res); + clock_t diff = end - begin; + printf("Took %d which is %f s\n", diff, (double)diff / CLOCKS_PER_SEC); - clock_t diff = end - begin; - printf("Took %d which is %f s\n", diff, (double)diff/CLOCKS_PER_SEC); - - return 0; + return 0; } |