| #include "timing.h" |
| #include <stdio.h> |
| |
| #define INPUT_TYPE uint64_t |
| #define INPUT_SIZE 256 |
| #define FUNCTION_NAME __umoddi3 |
| |
| #ifndef LIBNAME |
| #define LIBNAME UNKNOWN |
| #endif |
| |
| #define LIBSTRING LIBSTRINGX(LIBNAME) |
| #define LIBSTRINGX(a) LIBSTRINGXX(a) |
| #define LIBSTRINGXX(a) #a |
| |
| INPUT_TYPE FUNCTION_NAME(INPUT_TYPE input1, INPUT_TYPE input2); |
| |
| int main(int argc, char *argv[]) { |
| INPUT_TYPE input1[INPUT_SIZE]; |
| INPUT_TYPE input2[INPUT_SIZE]; |
| int i, j; |
| |
| srand(42); |
| |
| // Initialize the input array with data of various sizes. |
| for (i=0; i<INPUT_SIZE; ++i) { |
| input1[i] = (((uint64_t)rand() << 36) | (uint64_t)rand()) >> (rand() & 63); |
| input2[i] = ((((uint64_t)rand() << 36) | (uint64_t)rand()) >> (rand() & 63)) + 1LL; |
| } |
| |
| int64_t fixedInput = INT64_C(0x1234567890ABCDEF); |
| |
| double bestTime = __builtin_inf(); |
| void *dummyp; |
| for (j=0; j<1024; ++j) { |
| |
| uint64_t startTime = mach_absolute_time(); |
| for (i=0; i<INPUT_SIZE; ++i) |
| FUNCTION_NAME(input1[i], input2[i]); |
| uint64_t endTime = mach_absolute_time(); |
| |
| double thisTime = intervalInCycles(startTime, endTime); |
| bestTime = __builtin_fmin(thisTime, bestTime); |
| |
| // Move the stack alignment between trials to eliminate (mostly) aliasing effects |
| dummyp = alloca(1); |
| } |
| |
| printf("%16s: %f cycles.\n", LIBSTRING, bestTime / (double) INPUT_SIZE); |
| |
| return 0; |
| } |