Assembly code.
[jonesforth.git] / perf_dupdrop.c
diff --git a/perf_dupdrop.c b/perf_dupdrop.c
new file mode 100644 (file)
index 0000000..a1f3786
--- /dev/null
@@ -0,0 +1,33 @@
+/*     Ideal DUP DROP * 1000 assuming perfect inlining.
+       $Id: perf_dupdrop.c,v 1.1 2007-10-10 13:01:05 rich Exp $
+*/
+
+#include <stdio.h>
+#include <stdlib.h>
+
+#define DUP                                    \
+  asm volatile ("mov (%%esp),%%eax\n"          \
+               "\tpush %%eax"                  \
+               : : : "eax")
+#define DROP                                   \
+  asm volatile ("pop %%eax"                    \
+               : : : "eax")
+
+#define DUPDROP DUP; DROP;
+#define DUPDROP10 DUPDROP DUPDROP DUPDROP DUPDROP DUPDROP DUPDROP DUPDROP DUPDROP DUPDROP DUPDROP
+#define DUPDROP100 DUPDROP10 DUPDROP10 DUPDROP10 DUPDROP10 DUPDROP10 DUPDROP10 DUPDROP10 DUPDROP10 DUPDROP10 DUPDROP10
+#define DUPDROP1000 DUPDROP100 DUPDROP100 DUPDROP100 DUPDROP100 DUPDROP100 DUPDROP100 DUPDROP100 DUPDROP100 DUPDROP100 DUPDROP100
+
+int
+main (int argc, char *argv[])
+{
+  unsigned long long start_time, end_time;
+
+  asm volatile ("rdtsc" : "=A" (start_time));
+  DUPDROP1000
+  asm volatile ("rdtsc" : "=A" (end_time));
+
+  printf ("%llu\n", end_time - start_time);
+
+  exit (0);
+}