/*
 * time trials.
 * 
 * Use of Intel cycle counting register
 */
#define FREEBSD

static __inline unsigned long long
rdtsc(void)
{
        unsigned long long rv;
        
        __asm __volatile(".byte 0x0f, 0x31" : "=A" (rv));
        return (rv);
}

main()
{
	unsigned long long ticks;
	unsigned long long ticks2;

	
	sleep_loop();

	/* test 2. getpid system call
	*/
    	ticks = rdtsc(); 
	getpid();
    	ticks2 = rdtsc(); 
	printf("getpid: %llu\n", ticks2-ticks);

	/* freebsd only version of above
	*/
#ifdef FREEBSD
	ticks = rdtsc(); 
        usleep(1000000);
        ticks2 = rdtsc(); 
        printf("usleep 1 sec: %llu\n", ticks2-ticks);
	ticks = rdtsc(); 
        usleep(1);
        ticks2 = rdtsc(); 
        printf("usleep 1 usec: %llu\n", ticks2-ticks);
#endif

	/* test 3. function call
	*/
    	ticks = rdtsc(); 
	foo();
    	ticks2 = rdtsc(); 
	printf("function call: %llu\n", ticks2-ticks);

	/* test 4. printf
	*/
    	ticks = rdtsc(); 
	printf("hello world\n");
    	ticks2 = rdtsc(); 
	printf("printf: %llu\n", ticks2-ticks);

	/* test 5. fork
	*/
    	ticks = rdtsc(); 
	if (fork() == 0) {
    		ticks2 = rdtsc(); 
		printf("fork: printf: %llu\n", ticks2-ticks);
		exit(0);
	}
	wait();
}

foo()
{
}

sleep_loop()
{
	int i;
	unsigned long long ticks;
	unsigned long long ticks2;

	for (i = 0; i < 10; i++) {
		ticks = rdtsc(); 
		sleep(1);
		ticks2 = rdtsc(); 
		printf("sleep[%d]: %llu\n", i, ticks2-ticks);
	}
}
