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