summaryrefslogtreecommitdiff
path: root/regress/sys/arch/m68k/emuspeed/emuspeed.c
diff options
context:
space:
mode:
Diffstat (limited to 'regress/sys/arch/m68k/emuspeed/emuspeed.c')
-rw-r--r--regress/sys/arch/m68k/emuspeed/emuspeed.c82
1 files changed, 82 insertions, 0 deletions
diff --git a/regress/sys/arch/m68k/emuspeed/emuspeed.c b/regress/sys/arch/m68k/emuspeed/emuspeed.c
new file mode 100644
index 00000000000..092ec595be7
--- /dev/null
+++ b/regress/sys/arch/m68k/emuspeed/emuspeed.c
@@ -0,0 +1,82 @@
+/* $NetBSD: emuspeed.c,v 1.3 1998/06/15 14:43:25 is Exp $ */
+
+#include <setjmp.h>
+#include <signal.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <time.h>
+#include <unistd.h>
+
+#include "speed.h"
+
+#define PRECISION 500
+
+const struct test {
+ char *name;
+ void (*func)__P((int));
+ char *comment;
+} testlist[] = {
+ {"Illegal", illegal, "(test: unimplemented)"},
+ {"mulsl Da,Db", mul32sreg, "(test: should be native)"},
+ {"mulsl sp@(8),Da", mul32smem, "(test: should be native)\n"},
+
+ {"mulsl Dn,Da:Db", mul64sreg, "emulated on 68060"},
+ {"mulul Dn,Da:Db", mul64ureg, "\t\""},
+ {"mulsl sp@(8),Da:Db", mul64smem, "\t\""},
+ {"mulul sp@(8),Da:Db", mul64umem, "\t\"\n"},
+
+ {"divsl Da:Db,Dn", div64sreg, "\t\""},
+ {"divul Da:Db,Dn", div64ureg, "\t\""},
+ {"divsl Da:Db,sp@(8)", div64smem, "\t\""},
+ {"divul Da:Db,sp@(8)", div64umem, "\t\"\n"},
+
+ {NULL, NULL, NULL}
+};
+
+jmp_buf jbuf;
+void illhand (int);
+
+int
+main(argc, argv)
+ int argc;
+ char *argv[];
+{
+ const struct test *t;
+ clock_t start, stop;
+ int count;
+
+
+ if (signal(SIGILL, &illhand))
+ warn("%s: can't install illegal instruction handler.",
+ argv[0]);
+
+ printf("Speed of instructions which are emulated on some cpus:\n\n");
+ (void)sleep(1);
+ for (t=testlist; t->name; t++) {
+ printf("%-20s", t->name);
+ fflush(stdout);
+
+ if (setjmp(jbuf)) {
+ printf("%15s %s\n", "[unimplemented]", t->comment);
+ continue;
+ }
+
+ count = 1000;
+ do {
+ count *= 2;
+ start = clock();
+ t->func(count);
+ stop = clock();
+ } while ((stop - start) < PRECISION);
+ printf("%13d/s %s\n",
+ CLOCKS_PER_SEC*(count /(stop - start)),
+ t->comment);
+ }
+ exit (0);
+}
+
+void
+illhand(int i)
+{
+ longjmp(jbuf, 1);
+}