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