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