1 #include "timing.h" 2 #include <stdio.h> 3 4 #define INPUT_TYPE int64_t 5 #define INPUT_SIZE 256 6 #define FUNCTION_NAME __negdi2 7 8 #ifndef LIBNAME 9 #define LIBNAME UNKNOWN 10 #endif 11 12 #define LIBSTRING LIBSTRINGX(LIBNAME) 13 #define LIBSTRINGX(a) LIBSTRINGXX(a) 14 #define LIBSTRINGXX(a) #a 15 16 INPUT_TYPE FUNCTION_NAME(INPUT_TYPE input); 17 18 int main(int argc, char *argv[]) { 19 INPUT_TYPE input[INPUT_SIZE]; 20 int i, j; 21 22 srand(42); 23 24 // Initialize the input array with data of various sizes. 25 for (i=0; i<INPUT_SIZE; ++i) { 26 input[i] = (((int64_t)rand() << 36) | (uint64_t)rand()) >> (rand() & 63); 27 } 28 29 int64_t fixedInput = INT64_C(0x1234567890ABCDEF); 30 31 double bestTime = __builtin_inf(); 32 void *dummyp; 33 for (j=0; j<1024; ++j) { 34 35 uint64_t startTime = mach_absolute_time(); 36 for (i=0; i<INPUT_SIZE; ++i) 37 FUNCTION_NAME(input[i]); 38 uint64_t endTime = mach_absolute_time(); 39 40 double thisTime = intervalInCycles(startTime, endTime); 41 bestTime = __builtin_fmin(thisTime, bestTime); 42 43 // Move the stack alignment between trials to eliminate (mostly) aliasing effects 44 dummyp = alloca(1); 45 } 46 47 printf("%16s: %f cycles.\n", LIBSTRING, bestTime / (double) INPUT_SIZE); 48 49 return 0; 50 } 51