xref: /plan9/sys/src/cmd/vi/float.c (revision 7dd7cddf99dd7472612f1413b4da293630e6b1bc)
13e12c5d1SDavid du Colombier #include <u.h>
23e12c5d1SDavid du Colombier #include <libc.h>
33e12c5d1SDavid du Colombier #include <bio.h>
4bd389b36SDavid du Colombier #include <mach.h>
53e12c5d1SDavid du Colombier #define Extern extern
63e12c5d1SDavid du Colombier #include "mips.h"
73e12c5d1SDavid du Colombier 
83e12c5d1SDavid du Colombier void	unimp(ulong);
93e12c5d1SDavid du Colombier void	Ifcmp(ulong);
103e12c5d1SDavid du Colombier void	Ifdiv(ulong);
113e12c5d1SDavid du Colombier void	Ifmul(ulong);
123e12c5d1SDavid du Colombier void	Ifadd(ulong);
133e12c5d1SDavid du Colombier void	Ifsub(ulong);
143e12c5d1SDavid du Colombier void	Ifmov(ulong);
153e12c5d1SDavid du Colombier void	Icvtd(ulong);
163e12c5d1SDavid du Colombier void	Icvtw(ulong);
173e12c5d1SDavid du Colombier void	Icvts(ulong);
183e12c5d1SDavid du Colombier void	Ifabs(ulong);
193e12c5d1SDavid du Colombier void	Ifneg(ulong);
203e12c5d1SDavid du Colombier 
213e12c5d1SDavid du Colombier Inst cop1[] = {
223e12c5d1SDavid du Colombier 	{ Ifadd,	"add.f", Ifloat },
233e12c5d1SDavid du Colombier 	{ Ifsub,	"sub.f", Ifloat },
243e12c5d1SDavid du Colombier 	{ Ifmul,	"mul.f", Ifloat },
253e12c5d1SDavid du Colombier 	{ Ifdiv,	"div.f", Ifloat },
263e12c5d1SDavid du Colombier 	{ unimp,	"", },
273e12c5d1SDavid du Colombier 	{ Ifabs,	"abs.f", Ifloat },
283e12c5d1SDavid du Colombier 	{ Ifmov,	"mov.f", Ifloat },
293e12c5d1SDavid du Colombier 	{ Ifneg,	"neg.f", Ifloat },
303e12c5d1SDavid du Colombier 	{ unimp,	"", },
313e12c5d1SDavid du Colombier 	{ unimp,	"", },
323e12c5d1SDavid du Colombier 	{ unimp,	"", },
333e12c5d1SDavid du Colombier 	{ unimp,	"", },
343e12c5d1SDavid du Colombier 	{ unimp,	"", },
353e12c5d1SDavid du Colombier 	{ unimp,	"", },
363e12c5d1SDavid du Colombier 	{ unimp,	"", },
373e12c5d1SDavid du Colombier 	{ unimp,	"", },
383e12c5d1SDavid du Colombier 	{ unimp,	"", },
393e12c5d1SDavid du Colombier 	{ unimp,	"", },
403e12c5d1SDavid du Colombier 	{ unimp,	"", },
413e12c5d1SDavid du Colombier 	{ unimp,	"", },
423e12c5d1SDavid du Colombier 	{ unimp,	"", },
433e12c5d1SDavid du Colombier 	{ unimp,	"", },
443e12c5d1SDavid du Colombier 	{ unimp,	"", },
453e12c5d1SDavid du Colombier 	{ unimp,	"", },
463e12c5d1SDavid du Colombier 	{ unimp,	"", },
473e12c5d1SDavid du Colombier 	{ unimp,	"", },
483e12c5d1SDavid du Colombier 	{ unimp,	"", },
493e12c5d1SDavid du Colombier 	{ unimp,	"", },
503e12c5d1SDavid du Colombier 	{ unimp,	"", },
513e12c5d1SDavid du Colombier 	{ unimp,	"", },
523e12c5d1SDavid du Colombier 	{ unimp,	"", },
533e12c5d1SDavid du Colombier 	{ unimp,	"", },
543e12c5d1SDavid du Colombier 	{ Icvts,	"cvt.s", Ifloat },
553e12c5d1SDavid du Colombier 	{ Icvtd,	"cvt.d", Ifloat },
563e12c5d1SDavid du Colombier 	{ unimp,	"", },
573e12c5d1SDavid du Colombier 	{ unimp,	"", },
583e12c5d1SDavid du Colombier 	{ Icvtw,	"cvt.w", Ifloat },
593e12c5d1SDavid du Colombier 	{ unimp,	"", },
603e12c5d1SDavid du Colombier 	{ unimp,	"", },
613e12c5d1SDavid du Colombier 	{ unimp,	"", },
623e12c5d1SDavid du Colombier 	{ unimp,	"", },
633e12c5d1SDavid du Colombier 	{ unimp,	"", },
643e12c5d1SDavid du Colombier 	{ unimp,	"", },
653e12c5d1SDavid du Colombier 	{ unimp,	"", },
663e12c5d1SDavid du Colombier 	{ unimp,	"", },
673e12c5d1SDavid du Colombier 	{ unimp,	"", },
683e12c5d1SDavid du Colombier 	{ unimp,	"", },
693e12c5d1SDavid du Colombier 	{ unimp,	"", },
703e12c5d1SDavid du Colombier 	{ Ifcmp,	"c.f",	 Ifloat },
713e12c5d1SDavid du Colombier 	{ Ifcmp,	"c.un",  Ifloat },
723e12c5d1SDavid du Colombier 	{ Ifcmp,	"c.eq",  Ifloat },
733e12c5d1SDavid du Colombier 	{ Ifcmp,	"c.ueq", Ifloat },
743e12c5d1SDavid du Colombier 	{ Ifcmp,	"c.olt", Ifloat },
753e12c5d1SDavid du Colombier 	{ Ifcmp,	"c.ult", Ifloat },
763e12c5d1SDavid du Colombier 	{ Ifcmp,	"c.ole", Ifloat },
773e12c5d1SDavid du Colombier 	{ Ifcmp,	"c.ule", Ifloat },
783e12c5d1SDavid du Colombier 	{ Ifcmp,	"c,sf",  Ifloat },
793e12c5d1SDavid du Colombier 	{ Ifcmp,	"c.ngle",Ifloat },
803e12c5d1SDavid du Colombier 	{ Ifcmp,	"c.seq", Ifloat },
813e12c5d1SDavid du Colombier 	{ Ifcmp,	"c.ngl", Ifloat },
823e12c5d1SDavid du Colombier 	{ Ifcmp,	"c.lt",  Ifloat },
833e12c5d1SDavid du Colombier 	{ Ifcmp,	"c.nge", Ifloat },
843e12c5d1SDavid du Colombier 	{ Ifcmp,	"c.le",  Ifloat },
853e12c5d1SDavid du Colombier 	{ Ifcmp,	"c.ngt", Ifloat },
863e12c5d1SDavid du Colombier 	{ 0 }
873e12c5d1SDavid du Colombier };
883e12c5d1SDavid du Colombier 
893e12c5d1SDavid du Colombier void
unimp(ulong inst)903e12c5d1SDavid du Colombier unimp(ulong inst)
913e12c5d1SDavid du Colombier {
92*7dd7cddfSDavid du Colombier 	print("op %ld\n", inst&0x3f);
933e12c5d1SDavid du Colombier 	Bprint(bioout, "Unimplemented floating point Trap IR %.8lux\n", inst);
943e12c5d1SDavid du Colombier 	longjmp(errjmp, 0);
953e12c5d1SDavid du Colombier }
963e12c5d1SDavid du Colombier 
973e12c5d1SDavid du Colombier void
inval(ulong inst)983e12c5d1SDavid du Colombier inval(ulong inst)
993e12c5d1SDavid du Colombier {
1003e12c5d1SDavid du Colombier 	Bprint(bioout, "Invalid Operation Exception IR %.8lux\n", inst);
1013e12c5d1SDavid du Colombier 	longjmp(errjmp, 0);
1023e12c5d1SDavid du Colombier }
1033e12c5d1SDavid du Colombier 
1043e12c5d1SDavid du Colombier void
ifmt(int r)1053e12c5d1SDavid du Colombier ifmt(int r)
1063e12c5d1SDavid du Colombier {
1073e12c5d1SDavid du Colombier 	Bprint(bioout, "Invalid Floating Data Format f%d pc 0x%lux\n", r, reg.pc);
1083e12c5d1SDavid du Colombier 	longjmp(errjmp, 0);
1093e12c5d1SDavid du Colombier }
1103e12c5d1SDavid du Colombier 
1113e12c5d1SDavid du Colombier void
floatop(int dst,int s1,int s2)1123e12c5d1SDavid du Colombier floatop(int dst, int s1, int s2)
1133e12c5d1SDavid du Colombier {
1143e12c5d1SDavid du Colombier 	if(reg.ft[s1] == FPd && s1 != 24)
1153e12c5d1SDavid du Colombier 		ifmt(s1);
1163e12c5d1SDavid du Colombier 	if(reg.ft[s2] == FPd && s2 != 24)
1173e12c5d1SDavid du Colombier 		ifmt(s2);
1183e12c5d1SDavid du Colombier 	reg.ft[dst] = FPs;
1193e12c5d1SDavid du Colombier }
1203e12c5d1SDavid du Colombier 
1213e12c5d1SDavid du Colombier void
doubop(int dst,int s1,int s2)1223e12c5d1SDavid du Colombier doubop(int dst, int s1, int s2)
1233e12c5d1SDavid du Colombier {
1243e12c5d1SDavid du Colombier 	ulong l;
1253e12c5d1SDavid du Colombier 
1263e12c5d1SDavid du Colombier 	if(reg.ft[s1] != FPd) {
1273e12c5d1SDavid du Colombier 		if(reg.ft[s1] == FPs && s1 != 24)
1283e12c5d1SDavid du Colombier 			ifmt(s1);
1293e12c5d1SDavid du Colombier 		l = reg.di[s1];
1303e12c5d1SDavid du Colombier 		reg.di[s1] = reg.di[s1+1];
1313e12c5d1SDavid du Colombier 		reg.di[s1+1] = l;
1323e12c5d1SDavid du Colombier 		reg.ft[s1] = FPd;
1333e12c5d1SDavid du Colombier 	}
1343e12c5d1SDavid du Colombier 	if(reg.ft[s2] != FPd) {
1353e12c5d1SDavid du Colombier 		if(reg.ft[s2] == FPs && s2 != 24)
1363e12c5d1SDavid du Colombier 			ifmt(s2);
1373e12c5d1SDavid du Colombier 		l = reg.di[s2];
1383e12c5d1SDavid du Colombier 		reg.di[s2] = reg.di[s2+1];
1393e12c5d1SDavid du Colombier 		reg.di[s2+1] = l;
1403e12c5d1SDavid du Colombier 		reg.ft[s2] = FPd;
1413e12c5d1SDavid du Colombier 	}
1423e12c5d1SDavid du Colombier 	reg.ft[dst] = FPd;
1433e12c5d1SDavid du Colombier }
1443e12c5d1SDavid du Colombier 
1453e12c5d1SDavid du Colombier void
Iswc1(ulong inst)1463e12c5d1SDavid du Colombier Iswc1(ulong inst)
1473e12c5d1SDavid du Colombier {
1483e12c5d1SDavid du Colombier 	int off;
1493e12c5d1SDavid du Colombier 	ulong l;
1503e12c5d1SDavid du Colombier 	int rt, rb, ert;
1513e12c5d1SDavid du Colombier 
1523e12c5d1SDavid du Colombier 	Getrbrt(rb, rt, inst);
1533e12c5d1SDavid du Colombier 	off = (short)(inst&0xffff);
1543e12c5d1SDavid du Colombier 
1553e12c5d1SDavid du Colombier 	if(trace)
1563e12c5d1SDavid du Colombier 		itrace("swc1\tf%d,0x%x(r%d) ea=%lux", rt, off, rb, reg.r[rb]+off);
1573e12c5d1SDavid du Colombier 
1583e12c5d1SDavid du Colombier 	ert = rt&~1;
1593e12c5d1SDavid du Colombier 	if(reg.ft[ert] == FPd) {
1603e12c5d1SDavid du Colombier 		l = reg.di[ert];
1613e12c5d1SDavid du Colombier 		reg.di[ert] = reg.di[ert+1];
1623e12c5d1SDavid du Colombier 		reg.di[ert+1] = l;
1633e12c5d1SDavid du Colombier 		reg.ft[ert] = FPmemory;
1643e12c5d1SDavid du Colombier 	}
1653e12c5d1SDavid du Colombier 	putmem_w(reg.r[rb]+off, reg.di[rt]);
1663e12c5d1SDavid du Colombier }
1673e12c5d1SDavid du Colombier 
1683e12c5d1SDavid du Colombier void
Ifsub(ulong ir)1693e12c5d1SDavid du Colombier Ifsub(ulong ir)
1703e12c5d1SDavid du Colombier {
1713e12c5d1SDavid du Colombier 	char fmt;
1723e12c5d1SDavid du Colombier 	int fs, ft, fd;
1733e12c5d1SDavid du Colombier 
1743e12c5d1SDavid du Colombier 	Getf3(fs, ft, fd, ir);
1753e12c5d1SDavid du Colombier 
1763e12c5d1SDavid du Colombier 	switch((ir>>21)&0xf) {
1773e12c5d1SDavid du Colombier 	default:
1783e12c5d1SDavid du Colombier 		unimp(ir);
1793e12c5d1SDavid du Colombier 	case 0:	/* single */
1803e12c5d1SDavid du Colombier 		fmt = 's';
1813e12c5d1SDavid du Colombier 		floatop(fd, fs, ft);
1823e12c5d1SDavid du Colombier 		reg.fl[fd] = reg.fl[fs] - reg.fl[ft];
1833e12c5d1SDavid du Colombier 		break;
1843e12c5d1SDavid du Colombier 	case 1: /* double */
1853e12c5d1SDavid du Colombier 		fmt = 'd';
1863e12c5d1SDavid du Colombier 		doubop(fd, fs, ft);
1873e12c5d1SDavid du Colombier 		reg.fd[fd>>1] = reg.fd[fs>>1] - reg.fd[ft>>1];
1883e12c5d1SDavid du Colombier 		break;
1893e12c5d1SDavid du Colombier 	case 4:
1903e12c5d1SDavid du Colombier 		fmt = 'w';
1913e12c5d1SDavid du Colombier 		reg.di[fd] = reg.di[fs] - reg.di[ft];
1923e12c5d1SDavid du Colombier 		break;
1933e12c5d1SDavid du Colombier 	}
1943e12c5d1SDavid du Colombier 	if(trace)
1953e12c5d1SDavid du Colombier 		itrace("sub.%c\tf%d,f%d,f%d", fmt, fd, fs, ft);
1963e12c5d1SDavid du Colombier }
1973e12c5d1SDavid du Colombier 
1983e12c5d1SDavid du Colombier void
Ifmov(ulong ir)1993e12c5d1SDavid du Colombier Ifmov(ulong ir)
2003e12c5d1SDavid du Colombier {
2013e12c5d1SDavid du Colombier 	char fmt;
2023e12c5d1SDavid du Colombier 	int fs, fd;
2033e12c5d1SDavid du Colombier 
2043e12c5d1SDavid du Colombier 	Getf2(fs, fd, ir);
2053e12c5d1SDavid du Colombier 
2063e12c5d1SDavid du Colombier 	switch((ir>>21)&0xf) {
2073e12c5d1SDavid du Colombier 	default:
2083e12c5d1SDavid du Colombier 		unimp(ir);
2093e12c5d1SDavid du Colombier 	case 0:	/* single */
2103e12c5d1SDavid du Colombier 		fmt = 's';
2113e12c5d1SDavid du Colombier 		reg.fl[fd] = reg.fl[fs];
2123e12c5d1SDavid du Colombier 		reg.ft[fd] = reg.ft[fs];
2133e12c5d1SDavid du Colombier 		break;
2143e12c5d1SDavid du Colombier 	case 1: /* double */
2153e12c5d1SDavid du Colombier 		fmt = 'd';
2163e12c5d1SDavid du Colombier 		reg.fd[fd>>1] = reg.fd[fs>>1];
2173e12c5d1SDavid du Colombier 		reg.ft[fd] = reg.ft[fs];
2183e12c5d1SDavid du Colombier 		break;
2193e12c5d1SDavid du Colombier 	case 4:
2203e12c5d1SDavid du Colombier 		fmt = 'w';
2213e12c5d1SDavid du Colombier 		reg.di[fd] = reg.di[fs];
2223e12c5d1SDavid du Colombier 		reg.ft[fd] = reg.ft[fs];
2233e12c5d1SDavid du Colombier 		break;
2243e12c5d1SDavid du Colombier 	}
2253e12c5d1SDavid du Colombier 	if(trace)
2263e12c5d1SDavid du Colombier 		itrace("mov.%c\tf%d,f%d", fmt, fd, fs);
2273e12c5d1SDavid du Colombier }
2283e12c5d1SDavid du Colombier 
2293e12c5d1SDavid du Colombier void
Ifabs(ulong ir)2303e12c5d1SDavid du Colombier Ifabs(ulong ir)
2313e12c5d1SDavid du Colombier {
2323e12c5d1SDavid du Colombier 	char fmt;
2333e12c5d1SDavid du Colombier 	int fs, fd;
2343e12c5d1SDavid du Colombier 
2353e12c5d1SDavid du Colombier 	Getf2(fs, fd, ir);
2363e12c5d1SDavid du Colombier 
2373e12c5d1SDavid du Colombier 	switch((ir>>21)&0xf) {
2383e12c5d1SDavid du Colombier 	default:
2393e12c5d1SDavid du Colombier 		unimp(ir);
2403e12c5d1SDavid du Colombier 	case 0:	/* single */
2413e12c5d1SDavid du Colombier 		fmt = 's';
2423e12c5d1SDavid du Colombier 		floatop(fd, fs, fs);
2433e12c5d1SDavid du Colombier 		if(reg.fl[fs] < 0.0)
2443e12c5d1SDavid du Colombier 			reg.fl[fd] = -reg.fl[fs];
2453e12c5d1SDavid du Colombier 		else
2463e12c5d1SDavid du Colombier 			reg.fl[fd] = reg.fl[fs];
2473e12c5d1SDavid du Colombier 		break;
2483e12c5d1SDavid du Colombier 	case 1: /* double */
2493e12c5d1SDavid du Colombier 		fmt = 'd';
2503e12c5d1SDavid du Colombier 		doubop(fd, fs, fs);
2513e12c5d1SDavid du Colombier 		if(reg.fd[fs>>1] < 0.0)
2523e12c5d1SDavid du Colombier 			reg.fd[fd>>1] = -reg.fd[fs>>1];
2533e12c5d1SDavid du Colombier 		else
2543e12c5d1SDavid du Colombier 			reg.fd[fd>>1] = reg.fd[fs>>1];
2553e12c5d1SDavid du Colombier 		break;
2563e12c5d1SDavid du Colombier 	case 4:
2573e12c5d1SDavid du Colombier 		fmt = 'w';
2583e12c5d1SDavid du Colombier 		if((long)reg.di[fs] < 0)
2593e12c5d1SDavid du Colombier 			reg.di[fd] = -reg.di[fs];
2603e12c5d1SDavid du Colombier 		else
2613e12c5d1SDavid du Colombier 			reg.di[fd] = reg.di[fs];
2623e12c5d1SDavid du Colombier 		break;
2633e12c5d1SDavid du Colombier 	}
2643e12c5d1SDavid du Colombier 	if(trace)
2653e12c5d1SDavid du Colombier 		itrace("abs.%c\tf%d,f%d", fmt, fd, fs);
2663e12c5d1SDavid du Colombier }
2673e12c5d1SDavid du Colombier 
2683e12c5d1SDavid du Colombier void
Ifneg(ulong ir)2693e12c5d1SDavid du Colombier Ifneg(ulong ir)
2703e12c5d1SDavid du Colombier {
2713e12c5d1SDavid du Colombier 	char fmt;
2723e12c5d1SDavid du Colombier 	int fs, fd;
2733e12c5d1SDavid du Colombier 
2743e12c5d1SDavid du Colombier 	Getf2(fs, fd, ir);
2753e12c5d1SDavid du Colombier 
2763e12c5d1SDavid du Colombier 	switch((ir>>21)&0xf) {
2773e12c5d1SDavid du Colombier 	default:
2783e12c5d1SDavid du Colombier 		unimp(ir);
2793e12c5d1SDavid du Colombier 	case 0:	/* single */
2803e12c5d1SDavid du Colombier 		fmt = 's';
2813e12c5d1SDavid du Colombier 		floatop(fd, fs, fs);
2823e12c5d1SDavid du Colombier 		reg.fl[fd] = -reg.fl[fs];
2833e12c5d1SDavid du Colombier 		break;
2843e12c5d1SDavid du Colombier 	case 1: /* double */
2853e12c5d1SDavid du Colombier 		fmt = 'd';
2863e12c5d1SDavid du Colombier 		doubop(fd, fs, fs);
2873e12c5d1SDavid du Colombier 		reg.fd[fd>>1] = -reg.fd[fs>>1];
2883e12c5d1SDavid du Colombier 		break;
2893e12c5d1SDavid du Colombier 	case 4:
2903e12c5d1SDavid du Colombier 		fmt = 'w';
2913e12c5d1SDavid du Colombier 		reg.di[fd] = -reg.di[fs];
2923e12c5d1SDavid du Colombier 		break;
2933e12c5d1SDavid du Colombier 	}
2943e12c5d1SDavid du Colombier 	if(trace)
2953e12c5d1SDavid du Colombier 		itrace("neg.%c\tf%d,f%d", fmt, fd, fs);
2963e12c5d1SDavid du Colombier }
2973e12c5d1SDavid du Colombier 
2983e12c5d1SDavid du Colombier void
Icvtd(ulong ir)2993e12c5d1SDavid du Colombier Icvtd(ulong ir)
3003e12c5d1SDavid du Colombier {
3013e12c5d1SDavid du Colombier 	char fmt;
3023e12c5d1SDavid du Colombier 	int fs, fd;
3033e12c5d1SDavid du Colombier 
3043e12c5d1SDavid du Colombier 	Getf2(fs, fd, ir);
3053e12c5d1SDavid du Colombier 
3063e12c5d1SDavid du Colombier 	switch((ir>>21)&0xf) {
3073e12c5d1SDavid du Colombier 	default:
3083e12c5d1SDavid du Colombier 		unimp(ir);
3093e12c5d1SDavid du Colombier 	case 0:	/* single */
3103e12c5d1SDavid du Colombier 		fmt = 's';
3113e12c5d1SDavid du Colombier 		floatop(fs, fs, fs);
3123e12c5d1SDavid du Colombier 		reg.fd[fd>>1] = reg.fl[fs];
3133e12c5d1SDavid du Colombier 		reg.ft[fd] = FPd;
3143e12c5d1SDavid du Colombier 		break;
3153e12c5d1SDavid du Colombier 	case 1: /* double */
3163e12c5d1SDavid du Colombier 		fmt = 'd';
3173e12c5d1SDavid du Colombier 		doubop(fd, fs, fs);
3183e12c5d1SDavid du Colombier 		reg.fd[fd>>1] = reg.fd[fs>>1];
3193e12c5d1SDavid du Colombier 		break;
3203e12c5d1SDavid du Colombier 	case 4:
3213e12c5d1SDavid du Colombier 		fmt = 'w';
322219b2ee8SDavid du Colombier 		reg.fd[fd>>1] = (long)reg.di[fs];
3233e12c5d1SDavid du Colombier 		reg.ft[fd] = FPd;
3243e12c5d1SDavid du Colombier 		break;
3253e12c5d1SDavid du Colombier 	}
3263e12c5d1SDavid du Colombier 	if(trace)
3273e12c5d1SDavid du Colombier 		itrace("cvt.d.%c\tf%d,f%d", fmt, fd, fs);
3283e12c5d1SDavid du Colombier }
3293e12c5d1SDavid du Colombier 
3303e12c5d1SDavid du Colombier void
Icvts(ulong ir)3313e12c5d1SDavid du Colombier Icvts(ulong ir)
3323e12c5d1SDavid du Colombier {
3333e12c5d1SDavid du Colombier 	char fmt;
3343e12c5d1SDavid du Colombier 	int fs, fd;
3353e12c5d1SDavid du Colombier 
3363e12c5d1SDavid du Colombier 	Getf2(fs, fd, ir);
3373e12c5d1SDavid du Colombier 
3383e12c5d1SDavid du Colombier 	switch((ir>>21)&0xf) {
3393e12c5d1SDavid du Colombier 	default:
3403e12c5d1SDavid du Colombier 		unimp(ir);
3413e12c5d1SDavid du Colombier 	case 0:	/* single */
3423e12c5d1SDavid du Colombier 		fmt = 's';
3433e12c5d1SDavid du Colombier 		floatop(fd, fs, fs);
3443e12c5d1SDavid du Colombier 		reg.fl[fd] = reg.fl[fs];
3453e12c5d1SDavid du Colombier 		break;
3463e12c5d1SDavid du Colombier 	case 1: /* double */
3473e12c5d1SDavid du Colombier 		fmt = 'd';
3483e12c5d1SDavid du Colombier 		doubop(fs, fs, fs);
3493e12c5d1SDavid du Colombier 		reg.fl[fd] = reg.fd[fs>>1];
3503e12c5d1SDavid du Colombier 		reg.ft[fd] = FPs;
3513e12c5d1SDavid du Colombier 		break;
3523e12c5d1SDavid du Colombier 	case 4:
3533e12c5d1SDavid du Colombier 		fmt = 'w';
354219b2ee8SDavid du Colombier 		reg.fl[fd] = (long)reg.di[fs];
3553e12c5d1SDavid du Colombier 		reg.ft[fd] = FPs;
3563e12c5d1SDavid du Colombier 		break;
3573e12c5d1SDavid du Colombier 	}
3583e12c5d1SDavid du Colombier 	if(trace)
3593e12c5d1SDavid du Colombier 		itrace("cvt.s.%c\tf%d,f%d", fmt, fd, fs);
3603e12c5d1SDavid du Colombier }
3613e12c5d1SDavid du Colombier 
3623e12c5d1SDavid du Colombier void
Icvtw(ulong ir)3633e12c5d1SDavid du Colombier Icvtw(ulong ir)
3643e12c5d1SDavid du Colombier {
365219b2ee8SDavid du Colombier 	long v;
3663e12c5d1SDavid du Colombier 	char fmt;
3673e12c5d1SDavid du Colombier 	int fs, fd;
3683e12c5d1SDavid du Colombier 
3693e12c5d1SDavid du Colombier 	Getf2(fs, fd, ir);
3703e12c5d1SDavid du Colombier 
3713e12c5d1SDavid du Colombier 	switch((ir>>21)&0xf) {
3723e12c5d1SDavid du Colombier 	default:
3733e12c5d1SDavid du Colombier 		unimp(ir);
3743e12c5d1SDavid du Colombier 	case 0:	/* single */
3753e12c5d1SDavid du Colombier 		fmt = 's';
3763e12c5d1SDavid du Colombier 		floatop(fs, fs, fs);
377219b2ee8SDavid du Colombier 		v = reg.fl[fs];
3783e12c5d1SDavid du Colombier 		break;
3793e12c5d1SDavid du Colombier 	case 1: /* double */
3803e12c5d1SDavid du Colombier 		fmt = 'd';
3813e12c5d1SDavid du Colombier 		doubop(fs, fs, fs);
382219b2ee8SDavid du Colombier 		v = reg.fd[fs>>1];
3833e12c5d1SDavid du Colombier 		break;
3843e12c5d1SDavid du Colombier 	case 4:
3853e12c5d1SDavid du Colombier 		fmt = 'w';
386219b2ee8SDavid du Colombier 		v = reg.di[fs];
3873e12c5d1SDavid du Colombier 		break;
3883e12c5d1SDavid du Colombier 	}
389219b2ee8SDavid du Colombier 	reg.di[fd] = v;
3903e12c5d1SDavid du Colombier 	reg.ft[fd] = FPmemory;
3913e12c5d1SDavid du Colombier 	if(trace)
392219b2ee8SDavid du Colombier 		itrace("cvt.w.%c\tf%d,f%d", fmt, fd, fs);
3933e12c5d1SDavid du Colombier }
3943e12c5d1SDavid du Colombier 
3953e12c5d1SDavid du Colombier void
Ifadd(ulong ir)3963e12c5d1SDavid du Colombier Ifadd(ulong ir)
3973e12c5d1SDavid du Colombier {
3983e12c5d1SDavid du Colombier 	char fmt;
3993e12c5d1SDavid du Colombier 	int fs, ft, fd;
4003e12c5d1SDavid du Colombier 
4013e12c5d1SDavid du Colombier 	Getf3(fs, ft, fd, ir);
4023e12c5d1SDavid du Colombier 
4033e12c5d1SDavid du Colombier 	switch((ir>>21)&0xf) {
4043e12c5d1SDavid du Colombier 	default:
4053e12c5d1SDavid du Colombier 		unimp(ir);
4063e12c5d1SDavid du Colombier 	case 0:	/* single */
4073e12c5d1SDavid du Colombier 		fmt = 's';
4083e12c5d1SDavid du Colombier 		floatop(fd, fs, ft);
4093e12c5d1SDavid du Colombier 		reg.fl[fd] = reg.fl[fs] + reg.fl[ft];
4103e12c5d1SDavid du Colombier 		break;
4113e12c5d1SDavid du Colombier 	case 1: /* double */
4123e12c5d1SDavid du Colombier 		fmt = 'd';
4133e12c5d1SDavid du Colombier 		doubop(fd, fs, ft);
4143e12c5d1SDavid du Colombier 		reg.fd[fd>>1] = reg.fd[fs>>1] + reg.fd[ft>>1];
4153e12c5d1SDavid du Colombier 		break;
4163e12c5d1SDavid du Colombier 	case 4:
4173e12c5d1SDavid du Colombier 		fmt = 'w';
4183e12c5d1SDavid du Colombier 		reg.di[fd] = reg.di[fs] + reg.di[ft];
4193e12c5d1SDavid du Colombier 		break;
4203e12c5d1SDavid du Colombier 	}
4213e12c5d1SDavid du Colombier 	if(trace)
4223e12c5d1SDavid du Colombier 		itrace("add.%c\tf%d,f%d,f%d", fmt, fd, fs, ft);
4233e12c5d1SDavid du Colombier }
4243e12c5d1SDavid du Colombier 
4253e12c5d1SDavid du Colombier void
Ifmul(ulong ir)4263e12c5d1SDavid du Colombier Ifmul(ulong ir)
4273e12c5d1SDavid du Colombier {
4283e12c5d1SDavid du Colombier 	char fmt;
4293e12c5d1SDavid du Colombier 	int fs, ft, fd;
4303e12c5d1SDavid du Colombier 
4313e12c5d1SDavid du Colombier 	Getf3(fs, ft, fd, ir);
4323e12c5d1SDavid du Colombier 
4333e12c5d1SDavid du Colombier 	switch((ir>>21)&0xf) {
4343e12c5d1SDavid du Colombier 	default:
4353e12c5d1SDavid du Colombier 		unimp(ir);
4363e12c5d1SDavid du Colombier 	case 0:	/* single */
4373e12c5d1SDavid du Colombier 		fmt = 's';
4383e12c5d1SDavid du Colombier 		floatop(fd, fs, ft);
4393e12c5d1SDavid du Colombier 		reg.fl[fd] = reg.fl[fs] * reg.fl[ft];
4403e12c5d1SDavid du Colombier 		break;
4413e12c5d1SDavid du Colombier 	case 1: /* double */
4423e12c5d1SDavid du Colombier 		fmt = 'd';
4433e12c5d1SDavid du Colombier 		doubop(fd, fs, ft);
4443e12c5d1SDavid du Colombier 		reg.fd[fd>>1] = reg.fd[fs>>1] * reg.fd[ft>>1];
4453e12c5d1SDavid du Colombier 		break;
4463e12c5d1SDavid du Colombier 	case 4:
4473e12c5d1SDavid du Colombier 		fmt = 'w';
4483e12c5d1SDavid du Colombier 		reg.di[fd] = reg.di[fs] * reg.di[ft];
4493e12c5d1SDavid du Colombier 		break;
4503e12c5d1SDavid du Colombier 	}
4513e12c5d1SDavid du Colombier 	if(trace)
4523e12c5d1SDavid du Colombier 		itrace("mul.%c\tf%d,f%d,f%d", fmt, fd, fs, ft);
4533e12c5d1SDavid du Colombier }
4543e12c5d1SDavid du Colombier 
4553e12c5d1SDavid du Colombier void
Ifdiv(ulong ir)4563e12c5d1SDavid du Colombier Ifdiv(ulong ir)
4573e12c5d1SDavid du Colombier {
4583e12c5d1SDavid du Colombier 	char fmt;
4593e12c5d1SDavid du Colombier 	int fs, ft, fd;
4603e12c5d1SDavid du Colombier 
4613e12c5d1SDavid du Colombier 	Getf3(fs, ft, fd, ir);
4623e12c5d1SDavid du Colombier 
4633e12c5d1SDavid du Colombier 	switch((ir>>21)&0xf) {
4643e12c5d1SDavid du Colombier 	default:
4653e12c5d1SDavid du Colombier 		unimp(ir);
4663e12c5d1SDavid du Colombier 	case 0:	/* single */
4673e12c5d1SDavid du Colombier 		fmt = 's';
4683e12c5d1SDavid du Colombier 		floatop(fd, fs, ft);
4693e12c5d1SDavid du Colombier 		reg.fl[fd] = reg.fl[fs] / reg.fl[ft];
4703e12c5d1SDavid du Colombier 		break;
4713e12c5d1SDavid du Colombier 	case 1: /* double */
4723e12c5d1SDavid du Colombier 		fmt = 'd';
4733e12c5d1SDavid du Colombier 		doubop(fd, fs, ft);
4743e12c5d1SDavid du Colombier 		reg.fd[fd>>1] = reg.fd[fs>>1] / reg.fd[ft>>1];
4753e12c5d1SDavid du Colombier 		break;
4763e12c5d1SDavid du Colombier 	case 4:
4773e12c5d1SDavid du Colombier 		fmt = 'w';
4783e12c5d1SDavid du Colombier 		reg.di[fd] = reg.di[fs] / reg.di[ft];
4793e12c5d1SDavid du Colombier 		break;
4803e12c5d1SDavid du Colombier 	}
4813e12c5d1SDavid du Colombier 	if(trace)
4823e12c5d1SDavid du Colombier 		itrace("div.%c\tf%d,f%d,f%d", fmt, fd, fs, ft);
4833e12c5d1SDavid du Colombier }
4843e12c5d1SDavid du Colombier 
4853e12c5d1SDavid du Colombier void
Ilwc1(ulong inst)4863e12c5d1SDavid du Colombier Ilwc1(ulong inst)
4873e12c5d1SDavid du Colombier {
4883e12c5d1SDavid du Colombier 	int rt, rb;
4893e12c5d1SDavid du Colombier 	int off;
4903e12c5d1SDavid du Colombier 
4913e12c5d1SDavid du Colombier 	Getrbrt(rb, rt, inst);
4923e12c5d1SDavid du Colombier 	off = (short)(inst&0xffff);
4933e12c5d1SDavid du Colombier 
4943e12c5d1SDavid du Colombier 	if(trace)
4953e12c5d1SDavid du Colombier 		itrace("lwc1\tf%d,0x%x(r%d) ea=%lux", rt, off, rb, reg.r[rb]+off);
4963e12c5d1SDavid du Colombier 
4973e12c5d1SDavid du Colombier 	reg.di[rt] = getmem_w(reg.r[rb]+off);
4983e12c5d1SDavid du Colombier 	reg.ft[rt] = FPmemory;
4993e12c5d1SDavid du Colombier }
5003e12c5d1SDavid du Colombier 
5013e12c5d1SDavid du Colombier void
Ibcfbct(ulong inst)5023e12c5d1SDavid du Colombier Ibcfbct(ulong inst)
5033e12c5d1SDavid du Colombier {
5043e12c5d1SDavid du Colombier 	int takeit;
5053e12c5d1SDavid du Colombier 	int off;
5063e12c5d1SDavid du Colombier 	ulong npc;
5073e12c5d1SDavid du Colombier 
5083e12c5d1SDavid du Colombier 	off = (short)(inst&0xffff);
5093e12c5d1SDavid du Colombier 
5103e12c5d1SDavid du Colombier 	takeit = 0;
5113e12c5d1SDavid du Colombier 	npc = reg.pc + (off<<2) + 4;
5123e12c5d1SDavid du Colombier 	if(inst&(1<<16)) {
5133e12c5d1SDavid du Colombier 		if(trace)
5143e12c5d1SDavid du Colombier 			itrace("bc1t\t0x%lux", npc);
5153e12c5d1SDavid du Colombier 
5163e12c5d1SDavid du Colombier 		if(reg.fpsr&FP_CBIT)
5173e12c5d1SDavid du Colombier 			takeit = 1;
5183e12c5d1SDavid du Colombier 	}
5193e12c5d1SDavid du Colombier 	else {
5203e12c5d1SDavid du Colombier 		if(trace)
5213e12c5d1SDavid du Colombier 			itrace("bc1f\t0x%lux", npc);
5223e12c5d1SDavid du Colombier 
5233e12c5d1SDavid du Colombier 		if((reg.fpsr&FP_CBIT) == 0)
5243e12c5d1SDavid du Colombier 			takeit = 1;
5253e12c5d1SDavid du Colombier 	}
5263e12c5d1SDavid du Colombier 
5273e12c5d1SDavid du Colombier 	if(takeit) {
5283e12c5d1SDavid du Colombier 		/* Do the delay slot */
5293e12c5d1SDavid du Colombier 		reg.ir = ifetch(reg.pc+4);
5303e12c5d1SDavid du Colombier 		Statbra();
5313e12c5d1SDavid du Colombier 		Iexec(reg.ir);
5323e12c5d1SDavid du Colombier 		reg.pc = npc-4;
5333e12c5d1SDavid du Colombier 	}
5343e12c5d1SDavid du Colombier }
5353e12c5d1SDavid du Colombier 
5363e12c5d1SDavid du Colombier void
Imtct(ulong ir)5373e12c5d1SDavid du Colombier Imtct(ulong ir)
5383e12c5d1SDavid du Colombier {
5393e12c5d1SDavid du Colombier 	int rt, fs;
5403e12c5d1SDavid du Colombier 
5413e12c5d1SDavid du Colombier 	SpecialGetrtrd(rt, fs, ir);
5423e12c5d1SDavid du Colombier 	if(ir&(1<<22)) {			/* CT */
5433e12c5d1SDavid du Colombier 		if(trace)
5443e12c5d1SDavid du Colombier 			itrace("ctc1\tr%d,f%d", rt, fs);
5453e12c5d1SDavid du Colombier 	}
5463e12c5d1SDavid du Colombier 	else {					/* MT */
5473e12c5d1SDavid du Colombier 		if(trace)
5483e12c5d1SDavid du Colombier 			itrace("mtc1\tr%d,f%d", rt, fs);
5493e12c5d1SDavid du Colombier 
5503e12c5d1SDavid du Colombier 		reg.di[fs] = reg.r[rt];
5513e12c5d1SDavid du Colombier 		reg.ft[fs] = FPmemory;
5523e12c5d1SDavid du Colombier 	}
5533e12c5d1SDavid du Colombier }
5543e12c5d1SDavid du Colombier 
5553e12c5d1SDavid du Colombier void
Imfcf(ulong ir)5563e12c5d1SDavid du Colombier Imfcf(ulong ir)
5573e12c5d1SDavid du Colombier {
5583e12c5d1SDavid du Colombier 	int rt, fs;
5593e12c5d1SDavid du Colombier 
5603e12c5d1SDavid du Colombier 	SpecialGetrtrd(rt, fs, ir);
5613e12c5d1SDavid du Colombier 	if(ir&(1<<22)) {	/* CF */
5623e12c5d1SDavid du Colombier 		if(trace)
5633e12c5d1SDavid du Colombier 			itrace("cfc1\tr%d,f%d", rt, fs);
5643e12c5d1SDavid du Colombier 	}
5653e12c5d1SDavid du Colombier 	else {			/* MF */
5663e12c5d1SDavid du Colombier 		if(trace)
5673e12c5d1SDavid du Colombier 			itrace("mfc1\tr%d,f%d", rt, fs);
5683e12c5d1SDavid du Colombier 
5693e12c5d1SDavid du Colombier 		reg.r[rt] = reg.di[fs];
5703e12c5d1SDavid du Colombier 	}
5713e12c5d1SDavid du Colombier }
5723e12c5d1SDavid du Colombier 
5733e12c5d1SDavid du Colombier void
Icop1(ulong ir)5743e12c5d1SDavid du Colombier Icop1(ulong ir)
5753e12c5d1SDavid du Colombier {
5763e12c5d1SDavid du Colombier 	Inst *i;
5773e12c5d1SDavid du Colombier 
5783e12c5d1SDavid du Colombier 	switch((ir>>23)&7) {
5793e12c5d1SDavid du Colombier 	case 0:
5803e12c5d1SDavid du Colombier 		Imfcf(ir);
5813e12c5d1SDavid du Colombier 		break;
5823e12c5d1SDavid du Colombier 	case 1:
5833e12c5d1SDavid du Colombier 		Imtct(ir);
5843e12c5d1SDavid du Colombier 		break;
5853e12c5d1SDavid du Colombier 	case 2:
5863e12c5d1SDavid du Colombier 	case 3:
5873e12c5d1SDavid du Colombier 		Ibcfbct(ir);
5883e12c5d1SDavid du Colombier 		break;
5893e12c5d1SDavid du Colombier 	case 4:
5903e12c5d1SDavid du Colombier 	case 5:
5913e12c5d1SDavid du Colombier 	case 6:
5923e12c5d1SDavid du Colombier 	case 7:
5933e12c5d1SDavid du Colombier 		i = &cop1[ir&0x3f];
5943e12c5d1SDavid du Colombier 		i->count++;
5953e12c5d1SDavid du Colombier 		(*i->func)(ir);
5963e12c5d1SDavid du Colombier 	}
5973e12c5d1SDavid du Colombier }
5983e12c5d1SDavid du Colombier 
5993e12c5d1SDavid du Colombier void
Ifcmp(ulong ir)6003e12c5d1SDavid du Colombier Ifcmp(ulong ir)
6013e12c5d1SDavid du Colombier {
6023e12c5d1SDavid du Colombier 	char fmt;
6033e12c5d1SDavid du Colombier 	int fc;
6043e12c5d1SDavid du Colombier 	int ft, fs;
6053e12c5d1SDavid du Colombier 
6063e12c5d1SDavid du Colombier 	SpecialGetrtrd(ft, fs, ir);
6073e12c5d1SDavid du Colombier 
6083e12c5d1SDavid du Colombier 	SET(fc);
6093e12c5d1SDavid du Colombier 	switch((ir>>21)&0xf) {
6103e12c5d1SDavid du Colombier 	default:
6113e12c5d1SDavid du Colombier 		unimp(ir);
6123e12c5d1SDavid du Colombier 	case 0:	/* single */
6133e12c5d1SDavid du Colombier 		fmt = 's';
6143e12c5d1SDavid du Colombier 		floatop(fs, fs, ft);
6153e12c5d1SDavid du Colombier 		if(isNaN(reg.fl[fs]) || isNaN(reg.fl[ft])) {
6163e12c5d1SDavid du Colombier 			fc = FP_U;
6173e12c5d1SDavid du Colombier 			break;
6183e12c5d1SDavid du Colombier 		}
6193e12c5d1SDavid du Colombier 		if(reg.fl[fs] == reg.fl[ft]) {
6203e12c5d1SDavid du Colombier 			fc = FP_E;
6213e12c5d1SDavid du Colombier 			break;
6223e12c5d1SDavid du Colombier 		}
6233e12c5d1SDavid du Colombier 		if(reg.fl[fs] < reg.fl[ft]) {
6243e12c5d1SDavid du Colombier 			fc = FP_L;
6253e12c5d1SDavid du Colombier 			break;
6263e12c5d1SDavid du Colombier 		}
6273e12c5d1SDavid du Colombier 		if(reg.fl[fs] > reg.fl[ft]) {
6283e12c5d1SDavid du Colombier 			fc = FP_G;
6293e12c5d1SDavid du Colombier 			break;
6303e12c5d1SDavid du Colombier 		}
6313e12c5d1SDavid du Colombier 		print("vi: bad in fcmp");
6323e12c5d1SDavid du Colombier 		break;
6333e12c5d1SDavid du Colombier 	case 1: /* double */
6343e12c5d1SDavid du Colombier 		fmt = 'd';
6353e12c5d1SDavid du Colombier 		doubop(fs, fs, ft);
6363e12c5d1SDavid du Colombier 		if(isNaN(reg.fd[fs>>1]) || isNaN(reg.fd[ft>>1])) {
6373e12c5d1SDavid du Colombier 			fc = FP_U;
6383e12c5d1SDavid du Colombier 			break;
6393e12c5d1SDavid du Colombier 		}
6403e12c5d1SDavid du Colombier 		if(reg.fd[fs>>1] == reg.fd[ft>>1]) {
6413e12c5d1SDavid du Colombier 			fc = FP_E;
6423e12c5d1SDavid du Colombier 			break;
6433e12c5d1SDavid du Colombier 		}
6443e12c5d1SDavid du Colombier 		if(reg.fd[fs>>1] < reg.fd[ft>>1]) {
6453e12c5d1SDavid du Colombier 			fc = FP_L;
6463e12c5d1SDavid du Colombier 			break;
6473e12c5d1SDavid du Colombier 		}
6483e12c5d1SDavid du Colombier 		if(reg.fd[fs>>1] > reg.fd[ft>>1]) {
6493e12c5d1SDavid du Colombier 			fc = FP_G;
6503e12c5d1SDavid du Colombier 			break;
6513e12c5d1SDavid du Colombier 		}
6523e12c5d1SDavid du Colombier 		print("vi: bad in fcmp");
6533e12c5d1SDavid du Colombier 		break;
6543e12c5d1SDavid du Colombier 	case 4:
6553e12c5d1SDavid du Colombier 		fmt = 'w';
6563e12c5d1SDavid du Colombier 		if(reg.di[fs] == reg.di[ft]) {
6573e12c5d1SDavid du Colombier 			fc = FP_E;
6583e12c5d1SDavid du Colombier 			break;
6593e12c5d1SDavid du Colombier 		}
6603e12c5d1SDavid du Colombier 		if(reg.di[fs] < reg.di[ft]) {
6613e12c5d1SDavid du Colombier 			fc = FP_L;
6623e12c5d1SDavid du Colombier 			break;
6633e12c5d1SDavid du Colombier 		}
6643e12c5d1SDavid du Colombier 		if(reg.di[fs] > reg.di[ft]) {
6653e12c5d1SDavid du Colombier 			fc = FP_G;
6663e12c5d1SDavid du Colombier 			break;
6673e12c5d1SDavid du Colombier 		}
6683e12c5d1SDavid du Colombier 		break;
6693e12c5d1SDavid du Colombier 	}
6703e12c5d1SDavid du Colombier 
6713e12c5d1SDavid du Colombier 	reg.fpsr &= ~FP_CBIT;
6723e12c5d1SDavid du Colombier 	switch(ir&0xf) {
6733e12c5d1SDavid du Colombier 	case 0:
6743e12c5d1SDavid du Colombier 		if(trace)
6753e12c5d1SDavid du Colombier 			itrace("c.f.%c\tf%d,f%d", fmt, fs, ft);
6763e12c5d1SDavid du Colombier 		break;
6773e12c5d1SDavid du Colombier 	case 1:
6783e12c5d1SDavid du Colombier 		if(trace)
6793e12c5d1SDavid du Colombier 			itrace("c.un.%c\tf%d,f%d", fmt, fs, ft);
6803e12c5d1SDavid du Colombier 		if(fc == FP_U)
6813e12c5d1SDavid du Colombier 			reg.fpsr |= FP_CBIT;
6823e12c5d1SDavid du Colombier 		break;
6833e12c5d1SDavid du Colombier 	case 2:
6843e12c5d1SDavid du Colombier 		if(trace)
6853e12c5d1SDavid du Colombier 			itrace("c.eq.%c\tf%d,f%d", fmt, fs, ft);
6863e12c5d1SDavid du Colombier 		if(fc == FP_E)
6873e12c5d1SDavid du Colombier 			reg.fpsr |= FP_CBIT;
6883e12c5d1SDavid du Colombier 		break;
6893e12c5d1SDavid du Colombier 	case 3:
6903e12c5d1SDavid du Colombier 		if(trace)
6913e12c5d1SDavid du Colombier 			itrace("c.ueq.%c\tf%d,f%d", fmt, fs, ft);
6923e12c5d1SDavid du Colombier 		if(fc == FP_E || fc == FP_U)
6933e12c5d1SDavid du Colombier 			reg.fpsr |= FP_CBIT;
6943e12c5d1SDavid du Colombier 		break;
6953e12c5d1SDavid du Colombier  	case 4:
6963e12c5d1SDavid du Colombier 		if(trace)
6973e12c5d1SDavid du Colombier 			itrace("c.lt.%c\tf%d,f%d", fmt, fs, ft);
6983e12c5d1SDavid du Colombier 		if(fc == FP_L)
6993e12c5d1SDavid du Colombier 			reg.fpsr |= FP_CBIT;
7003e12c5d1SDavid du Colombier 		break;
7013e12c5d1SDavid du Colombier 	case 5:
7023e12c5d1SDavid du Colombier 		if(trace)
7033e12c5d1SDavid du Colombier 			itrace("c.ult.%c\tf%d,f%d", fmt, fs, ft);
7043e12c5d1SDavid du Colombier 		if(fc == FP_L || fc == FP_U)
7053e12c5d1SDavid du Colombier 			reg.fpsr |= FP_CBIT;
7063e12c5d1SDavid du Colombier 		break;
7073e12c5d1SDavid du Colombier 	case 6:
7083e12c5d1SDavid du Colombier 		if(trace)
7093e12c5d1SDavid du Colombier 			itrace("c.le.%c\tf%d,f%d", fmt, fs, ft);
7103e12c5d1SDavid du Colombier 		if(fc == FP_E || fc == FP_L)
7113e12c5d1SDavid du Colombier 			reg.fpsr |= FP_CBIT;
7123e12c5d1SDavid du Colombier 		break;
7133e12c5d1SDavid du Colombier 	case 7:
7143e12c5d1SDavid du Colombier 		if(trace)
7153e12c5d1SDavid du Colombier 			itrace("c.ule.%c\tf%d,f%d", fmt, fs, ft);
7163e12c5d1SDavid du Colombier 		if(fc == FP_E || fc == FP_L || fc == FP_U)
7173e12c5d1SDavid du Colombier 			reg.fpsr |= FP_CBIT;
7183e12c5d1SDavid du Colombier 		break;
7193e12c5d1SDavid du Colombier 	case 8:
7203e12c5d1SDavid du Colombier 		if(trace)
7213e12c5d1SDavid du Colombier 			itrace("c.sf.%c\tf%d,f%d", fmt, fs, ft);
7223e12c5d1SDavid du Colombier 		if(fc == FP_U)
7233e12c5d1SDavid du Colombier 			inval(ir);
7243e12c5d1SDavid du Colombier 		break;
7253e12c5d1SDavid du Colombier 	case 9:
7263e12c5d1SDavid du Colombier 		if(trace)
7273e12c5d1SDavid du Colombier 			itrace("c.ngle.%c\tf%d,f%d", fmt, fs, ft);
7283e12c5d1SDavid du Colombier 		if(fc == FP_U) {
7293e12c5d1SDavid du Colombier 			reg.fpsr |= FP_CBIT;
7303e12c5d1SDavid du Colombier 			inval(ir);
7313e12c5d1SDavid du Colombier 		}
7323e12c5d1SDavid du Colombier 		break;
7333e12c5d1SDavid du Colombier 	case 10:
7343e12c5d1SDavid du Colombier 		if(trace)
7353e12c5d1SDavid du Colombier 			itrace("c.seq.%c\tf%d,f%d", fmt, fs, ft);
7363e12c5d1SDavid du Colombier 		if(fc == FP_E)
7373e12c5d1SDavid du Colombier 			reg.fpsr |= FP_CBIT;
7383e12c5d1SDavid du Colombier 		if(fc == FP_U)
7393e12c5d1SDavid du Colombier 			inval(ir);
7403e12c5d1SDavid du Colombier 		break;
7413e12c5d1SDavid du Colombier 	case 11:
7423e12c5d1SDavid du Colombier 		if(trace)
7433e12c5d1SDavid du Colombier 			itrace("c.ngl.%c\tf%d,f%d", fmt, fs, ft);
7443e12c5d1SDavid du Colombier 		if(fc == FP_E || fc == FP_U)
7453e12c5d1SDavid du Colombier 			reg.fpsr |= FP_CBIT;
7463e12c5d1SDavid du Colombier 		if(fc == FP_U)
7473e12c5d1SDavid du Colombier 			inval(ir);
7483e12c5d1SDavid du Colombier 		break;
7493e12c5d1SDavid du Colombier  	case 12:
7503e12c5d1SDavid du Colombier 		if(trace)
7513e12c5d1SDavid du Colombier 			itrace("c.lt.%c\tf%d,f%d", fmt, fs, ft);
7523e12c5d1SDavid du Colombier 		if(fc == FP_L)
7533e12c5d1SDavid du Colombier 			reg.fpsr |= FP_CBIT;
7543e12c5d1SDavid du Colombier 		if(fc == FP_U)
7553e12c5d1SDavid du Colombier 			inval(ir);
7563e12c5d1SDavid du Colombier 		break;
7573e12c5d1SDavid du Colombier 	case 13:
7583e12c5d1SDavid du Colombier 		if(trace)
7593e12c5d1SDavid du Colombier 			itrace("c.nge.%c\tf%d,f%d", fmt, fs, ft);
7603e12c5d1SDavid du Colombier 		if(fc == FP_L || fc == FP_U)
7613e12c5d1SDavid du Colombier 			reg.fpsr |= FP_CBIT;
7623e12c5d1SDavid du Colombier 		if(fc == FP_U)
7633e12c5d1SDavid du Colombier 			inval(ir);
7643e12c5d1SDavid du Colombier 		break;
7653e12c5d1SDavid du Colombier 	case 14:
7663e12c5d1SDavid du Colombier 		if(trace)
7673e12c5d1SDavid du Colombier 			itrace("c.le.%c\tf%d,f%d", fmt, fs, ft);
7683e12c5d1SDavid du Colombier 		if(fc == FP_E || fc == FP_L)
7693e12c5d1SDavid du Colombier 			reg.fpsr |= FP_CBIT;
7703e12c5d1SDavid du Colombier 		if(fc == FP_U)
7713e12c5d1SDavid du Colombier 			inval(ir);
7723e12c5d1SDavid du Colombier 		break;
7733e12c5d1SDavid du Colombier 	case 15:
7743e12c5d1SDavid du Colombier 		if(trace)
7753e12c5d1SDavid du Colombier 			itrace("c.ngt.%c\tf%d,f%d", fmt, fs, ft);
7763e12c5d1SDavid du Colombier 		if(fc == FP_E || fc == FP_L || fc == FP_U)
7773e12c5d1SDavid du Colombier 			reg.fpsr |= FP_CBIT;
7783e12c5d1SDavid du Colombier 		if(fc == FP_U)
7793e12c5d1SDavid du Colombier 			inval(ir);
7803e12c5d1SDavid du Colombier 		break;
7813e12c5d1SDavid du Colombier 	}
7823e12c5d1SDavid du Colombier 	USED(fmt);
7833e12c5d1SDavid du Colombier }
784