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