177ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao#include "timing.h"
277ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao#include <stdio.h>
377ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
477ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao#define INPUT_TYPE int
577ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao#define INPUT_SIZE 512
677ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao#define FUNCTION_NAME __ashldi3
777ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
877ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao#ifndef LIBNAME
977ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao#define LIBNAME UNKNOWN
1077ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao#endif
1177ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
1277ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao#define LIBSTRING		LIBSTRINGX(LIBNAME)
1377ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao#define LIBSTRINGX(a)	LIBSTRINGXX(a)
1477ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao#define LIBSTRINGXX(a)	#a
1577ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
1677ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaoint64_t FUNCTION_NAME(int64_t input, INPUT_TYPE count);
1777ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
1877ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaoint main(int argc, char *argv[]) {
1977ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao	INPUT_TYPE input[INPUT_SIZE];
2077ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao	int i, j;
2177ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
2277ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao	srand(42);
2377ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
2477ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao	// Initialize the input array with data of various sizes.
2577ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao	for (i=0; i<INPUT_SIZE; ++i)
2677ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao		input[i] = rand() & 0x3f;
2777ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
2877ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao	int64_t fixedInput = INT64_C(0x1234567890ABCDEF);
2977ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
3077ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao	double bestTime = __builtin_inf();
3177ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao	void *dummyp;
3277ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao	for (j=0; j<1024; ++j) {
3377ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
3477ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao		uint64_t startTime = mach_absolute_time();
3577ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao		for (i=0; i<INPUT_SIZE; ++i)
3677ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao			FUNCTION_NAME(fixedInput, input[i]);
3777ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao		uint64_t endTime = mach_absolute_time();
3877ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
3977ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao		double thisTime = intervalInCycles(startTime, endTime);
4077ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao		bestTime = __builtin_fmin(thisTime, bestTime);
4177ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
4277ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao		// Move the stack alignment between trials to eliminate (mostly) aliasing effects
4377ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao		dummyp = alloca(1);
4477ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao	}
4577ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
4677ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao	printf("%16s: %f cycles.\n", LIBSTRING, bestTime / (double) INPUT_SIZE);
4777ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
4877ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao	return 0;
4977ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao}
50