emuspeed.c revision 1.2
11.2Sperry/*	$NetBSD: emuspeed.c,v 1.2 1998/01/09 08:03:56 perry Exp $	*/
21.2Sperry
31.1Sis#include <setjmp.h>
41.1Sis#include <signal.h>
51.1Sis#include <stdlib.h>
61.1Sis#include <stdio.h>
71.1Sis#include <time.h>
81.1Sis#include <unistd.h>
91.1Sis
101.1Sis#include "speed.h"
111.1Sis
121.1Sisconst struct test {
131.1Sis	char *name;
141.1Sis	void (*func)__P((int));
151.1Sis	char *comment;
161.1Sis	int count;
171.1Sis} testlist[] = {
181.1Sis	{"Illegal", illegal, "(test: unimplemented)", 1},
191.1Sis	{"mulsl Da,Db", mul32sreg, "(test: should be native)", 200000000},
201.1Sis	{"mulsl sp@(8),Da", mul32smem, "(test: should be native)\n",
211.1Sis	    200000000},
221.1Sis
231.1Sis	{"mulsl Dn,Da:Db", mul64sreg, "emulated on 68060", 2000000},
241.1Sis	{"mulul Dn,Da:Db", mul64ureg, "\t\"", 2000000},
251.1Sis	{"mulsl sp@(8),Da:Db", mul64smem, "\t\"", 1000000},
261.1Sis	{"mulul sp@(8),Da:Db", mul64umem, "\t\"\n", 1000000},
271.1Sis
281.1Sis	{"divsl Da:Db,Dn", div64sreg, "\t\"", 500000},
291.1Sis	{"divul Da:Db,Dn", div64ureg, "\t\"", 500000},
301.1Sis	{"divsl Da:Db,sp@(8)", div64smem, "\t\"", 300000},
311.1Sis	{"divul Da:Db,sp@(8)", div64umem, "\t\"\n", 300000},
321.1Sis
331.1Sis	{NULL, NULL, NULL}
341.1Sis};
351.1Sis
361.1Sisjmp_buf jbuf;
371.1Sisvoid illhand (int);
381.1Sis
391.1Sisint
401.1Sismain(argc, argv)
411.1Sis	int argc;
421.1Sis	char *argv[];
431.1Sis{
441.1Sis	const struct test *t;
451.1Sis	clock_t start, stop;
461.1Sis
471.1Sis
481.1Sis	if (signal(SIGILL, &illhand))
491.1Sis		warn("%s: can't install illegal instruction handler.",
501.1Sis		    argv[0]);
511.1Sis
521.1Sis	printf("Speed of instructions which are emulated on some cpus:\n\n");
531.1Sis	(void)sleep(1);
541.1Sis	for (t=testlist; t->name; t++) {
551.1Sis		printf("%-20s", t->name);
561.1Sis		fflush(stdout);
571.1Sis
581.1Sis		if (setjmp(jbuf)) {
591.1Sis			printf("%15s    %s\n", "[unimplemented]", t->comment);
601.1Sis			continue;
611.1Sis		}
621.1Sis
631.1Sis		start = clock();
641.1Sis		t->func(t->count);
651.1Sis		stop = clock();
661.1Sis		printf("%13d/s    %s\n",
671.1Sis		    CLOCKS_PER_SEC*(t->count /(stop - start)),
681.1Sis		    t->comment);
691.1Sis	}
701.1Sis	exit (0);
711.1Sis}
721.1Sis
731.1Sisvoid
741.1Sisillhand(int i)
751.1Sis{
761.1Sis	longjmp(jbuf, 1);
771.1Sis}
78