1 /*	Ideal DUP DROP * 1000 assuming perfect inlining.
     
2 	$Id: perf_dupdrop.c,v 1.1 2007-10-10 13:01:05 rich Exp $
     
3 */
     
4 
     5 #include <stdio.h>
     
6 #include <stdlib.h>
     
7 
     8 #define DUP					\
     
9   asm volatile ("mov (%%esp),%%eax\n"		\
    
10 		"\tpush %%eax"			\
    
11 		: : : "eax")
    
12 #define DROP					\
    
13   asm volatile ("pop %%eax"			\
    
14 		: : : "eax")
    
15 
    16 #define DUPDROP DUP; DROP;
    
17 #define DUPDROP10 DUPDROP DUPDROP DUPDROP DUPDROP DUPDROP DUPDROP DUPDROP DUPDROP DUPDROP DUPDROP
    
18 #define DUPDROP100 DUPDROP10 DUPDROP10 DUPDROP10 DUPDROP10 DUPDROP10 DUPDROP10 DUPDROP10 DUPDROP10 DUPDROP10 DUPDROP10
    
19 #define DUPDROP1000 DUPDROP100 DUPDROP100 DUPDROP100 DUPDROP100 DUPDROP100 DUPDROP100 DUPDROP100 DUPDROP100 DUPDROP100 DUPDROP100
    
20 
    21 int
    
22 main (int argc, char *argv[])
    
23 {
    
24   unsigned long long start_time, end_time;
    
25 
    26   asm volatile ("rdtsc" : "=A" (start_time));
    
27   DUPDROP1000
    
28   asm volatile ("rdtsc" : "=A" (end_time));
    
29 
    30   printf ("%llu\n", end_time - start_time);
    
31 
    32   exit (0);
    
33 }