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 903e12c5d1SDavid du Colombier unimp(ulong inst) 913e12c5d1SDavid du Colombier { 923e12c5d1SDavid du Colombier print("op %d\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 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 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 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 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 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 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 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 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 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 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'; 322*219b2ee8SDavid 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 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'; 354*219b2ee8SDavid 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 3633e12c5d1SDavid du Colombier Icvtw(ulong ir) 3643e12c5d1SDavid du Colombier { 365*219b2ee8SDavid 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); 377*219b2ee8SDavid 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); 382*219b2ee8SDavid du Colombier v = reg.fd[fs>>1]; 3833e12c5d1SDavid du Colombier break; 3843e12c5d1SDavid du Colombier case 4: 3853e12c5d1SDavid du Colombier fmt = 'w'; 386*219b2ee8SDavid du Colombier v = reg.di[fs]; 3873e12c5d1SDavid du Colombier break; 3883e12c5d1SDavid du Colombier } 389*219b2ee8SDavid du Colombier reg.di[fd] = v; 3903e12c5d1SDavid du Colombier reg.ft[fd] = FPmemory; 3913e12c5d1SDavid du Colombier if(trace) 392*219b2ee8SDavid du Colombier itrace("cvt.w.%c\tf%d,f%d", fmt, fd, fs); 3933e12c5d1SDavid du Colombier } 3943e12c5d1SDavid du Colombier 3953e12c5d1SDavid du Colombier void 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 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 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 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 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 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 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 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 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