1743968520a8a6c1e23212d4ed155d053891f630aLogan Chien#include "timing.h" 2c72c4ddfcd79c74f70713da91a69569451b5c19eZonr Chang#include <stdio.h> 3743968520a8a6c1e23212d4ed155d053891f630aLogan Chien 4743968520a8a6c1e23212d4ed155d053891f630aLogan Chien#define INPUT_TYPE int 5743968520a8a6c1e23212d4ed155d053891f630aLogan Chien#define INPUT_SIZE 512 6743968520a8a6c1e23212d4ed155d053891f630aLogan Chien#define FUNCTION_NAME __lshrdi3 7743968520a8a6c1e23212d4ed155d053891f630aLogan Chien 8743968520a8a6c1e23212d4ed155d053891f630aLogan Chien#ifndef LIBNAME 9743968520a8a6c1e23212d4ed155d053891f630aLogan Chien#define LIBNAME UNKNOWN 10743968520a8a6c1e23212d4ed155d053891f630aLogan Chien#endif 11743968520a8a6c1e23212d4ed155d053891f630aLogan Chien 12743968520a8a6c1e23212d4ed155d053891f630aLogan Chien#define LIBSTRING LIBSTRINGX(LIBNAME) 13743968520a8a6c1e23212d4ed155d053891f630aLogan Chien#define LIBSTRINGX(a) LIBSTRINGXX(a) 14743968520a8a6c1e23212d4ed155d053891f630aLogan Chien#define LIBSTRINGXX(a) #a 15743968520a8a6c1e23212d4ed155d053891f630aLogan Chien 16743968520a8a6c1e23212d4ed155d053891f630aLogan Chienint64_t FUNCTION_NAME(int64_t input, INPUT_TYPE count); 17743968520a8a6c1e23212d4ed155d053891f630aLogan Chien 18743968520a8a6c1e23212d4ed155d053891f630aLogan Chienint main(int argc, char *argv[]) { 19743968520a8a6c1e23212d4ed155d053891f630aLogan Chien INPUT_TYPE input[INPUT_SIZE]; 20743968520a8a6c1e23212d4ed155d053891f630aLogan Chien int i, j; 21e198abec6c5e3eab380ccf6897b0a0b9c2dd92ddStephen Hines 22743968520a8a6c1e23212d4ed155d053891f630aLogan Chien srand(42); 23743968520a8a6c1e23212d4ed155d053891f630aLogan Chien 24c72c4ddfcd79c74f70713da91a69569451b5c19eZonr Chang // Initialize the input array with data of various sizes. 25c72c4ddfcd79c74f70713da91a69569451b5c19eZonr Chang for (i=0; i<INPUT_SIZE; ++i) 26c72c4ddfcd79c74f70713da91a69569451b5c19eZonr Chang input[i] = rand() & 0x3f; 27c72c4ddfcd79c74f70713da91a69569451b5c19eZonr Chang 28c72c4ddfcd79c74f70713da91a69569451b5c19eZonr Chang int64_t fixedInput = INT64_C(0x1234567890ABCDEF); 29c72c4ddfcd79c74f70713da91a69569451b5c19eZonr Chang 30c72c4ddfcd79c74f70713da91a69569451b5c19eZonr Chang double bestTime = __builtin_inf(); 31c72c4ddfcd79c74f70713da91a69569451b5c19eZonr Chang void *dummyp; 32c72c4ddfcd79c74f70713da91a69569451b5c19eZonr Chang for (j=0; j<1024; ++j) { 33c72c4ddfcd79c74f70713da91a69569451b5c19eZonr Chang 34743968520a8a6c1e23212d4ed155d053891f630aLogan Chien uint64_t startTime = mach_absolute_time(); 35743968520a8a6c1e23212d4ed155d053891f630aLogan Chien for (i=0; i<INPUT_SIZE; ++i) 36e198abec6c5e3eab380ccf6897b0a0b9c2dd92ddStephen Hines FUNCTION_NAME(fixedInput, input[i]); 37743968520a8a6c1e23212d4ed155d053891f630aLogan Chien uint64_t endTime = mach_absolute_time(); 38743968520a8a6c1e23212d4ed155d053891f630aLogan Chien 39743968520a8a6c1e23212d4ed155d053891f630aLogan Chien double thisTime = intervalInCycles(startTime, endTime); 40743968520a8a6c1e23212d4ed155d053891f630aLogan Chien bestTime = __builtin_fmin(thisTime, bestTime); 41e198abec6c5e3eab380ccf6897b0a0b9c2dd92ddStephen Hines 42743968520a8a6c1e23212d4ed155d053891f630aLogan Chien // Move the stack alignment between trials to eliminate (mostly) aliasing effects 43743968520a8a6c1e23212d4ed155d053891f630aLogan Chien dummyp = alloca(1); 44ddf5661793de8fb4e16906b7f7822972fcb13c6dZonr Chang } 45c72c4ddfcd79c74f70713da91a69569451b5c19eZonr Chang 46743968520a8a6c1e23212d4ed155d053891f630aLogan Chien printf("%16s: %f cycles.\n", LIBSTRING, bestTime / (double) INPUT_SIZE); 47ddf5661793de8fb4e16906b7f7822972fcb13c6dZonr Chang 48ddf5661793de8fb4e16906b7f7822972fcb13c6dZonr Chang return 0; 49ddf5661793de8fb4e16906b7f7822972fcb13c6dZonr Chang} 50743968520a8a6c1e23212d4ed155d053891f630aLogan Chien