22 { Ifadd, "add.f", Ifloat },
23 { Ifsub, "sub.f", Ifloat },
24 { Ifmul, "mul.f", Ifloat },
25 { Ifdiv, "div.f", Ifloat },
27 { Ifabs, "abs.f", Ifloat },
28 { Ifmov, "mov.f", Ifloat },
29 { Ifneg, "neg.f", Ifloat },
54 { Icvts, "cvt.s", Ifloat },
55 { Icvtd, "cvt.d", Ifloat },
58 { Icvtw, "cvt.w", Ifloat },
70 { Ifcmp, "c.f", Ifloat },
71 { Ifcmp, "c.un", Ifloat },
72 { Ifcmp, "c.eq", Ifloat },
73 { Ifcmp, "c.ueq", Ifloat },
74 { Ifcmp, "c.olt", Ifloat },
75 { Ifcmp, "c.ult", Ifloat },
76 { Ifcmp, "c.ole", Ifloat },
77 { Ifcmp, "c.ule", Ifloat },
78 { Ifcmp, "c,sf", Ifloat },
79 { Ifcmp, "c.ngle",Ifloat },
80 { Ifcmp, "c.seq", Ifloat },
81 { Ifcmp, "c.ngl", Ifloat },
82 { Ifcmp, "c.lt", Ifloat },
83 { Ifcmp, "c.nge", Ifloat },
84 { Ifcmp, "c.le", Ifloat },
85 { Ifcmp, "c.ngt", Ifloat },
92 print("op %ld\n", inst&0x3f);
93 Bprint(bioout, "Unimplemented floating point Trap IR %.8lux\n", inst);
100 Bprint(bioout, "Invalid Operation Exception IR %.8lux\n", inst);
107 Bprint(bioout, "Invalid Floating Data Format f%d pc 0x%lux\n", r, reg.pc);
112 floatop(int dst, int s1, int s2)
114 if(reg.ft[s1] == FPd && s1 != 24)
116 if(reg.ft[s2] == FPd && s2 != 24)
122 doubop(int dst, int s1, int s2)
126 if(reg.ft[s1] != FPd) {
127 if(reg.ft[s1] == FPs && s1 != 24)
130 reg.di[s1] = reg.di[s1+1];
134 if(reg.ft[s2] != FPd) {
135 if(reg.ft[s2] == FPs && s2 != 24)
138 reg.di[s2] = reg.di[s2+1];
152 Getrbrt(rb, rt, inst);
153 off = (short)(inst&0xffff);
156 itrace("swc1\tf%d,0x%x(r%d) ea=%lux", rt, off, rb, reg.r[rb]+off);
159 if(reg.ft[ert] == FPd) {
161 reg.di[ert] = reg.di[ert+1];
163 reg.ft[ert] = FPmemory;
165 putmem_w(reg.r[rb]+off, reg.di[rt]);
174 Getf3(fs, ft, fd, ir);
176 switch((ir>>21)&0xf) {
182 reg.fl[fd] = reg.fl[fs] - reg.fl[ft];
187 reg.fd[fd>>1] = reg.fd[fs>>1] - reg.fd[ft>>1];
191 reg.di[fd] = reg.di[fs] - reg.di[ft];
195 itrace("sub.%c\tf%d,f%d,f%d", fmt, fd, fs, ft);
206 switch((ir>>21)&0xf) {
211 reg.fl[fd] = reg.fl[fs];
212 reg.ft[fd] = reg.ft[fs];
216 reg.fd[fd>>1] = reg.fd[fs>>1];
217 reg.ft[fd] = reg.ft[fs];
221 reg.di[fd] = reg.di[fs];
222 reg.ft[fd] = reg.ft[fs];
226 itrace("mov.%c\tf%d,f%d", fmt, fd, fs);
237 switch((ir>>21)&0xf) {
244 reg.fl[fd] = -reg.fl[fs];
246 reg.fl[fd] = reg.fl[fs];
251 if(reg.fd[fs>>1] < 0.0)
252 reg.fd[fd>>1] = -reg.fd[fs>>1];
254 reg.fd[fd>>1] = reg.fd[fs>>1];
258 if((long)reg.di[fs] < 0)
259 reg.di[fd] = -reg.di[fs];
261 reg.di[fd] = reg.di[fs];
265 itrace("abs.%c\tf%d,f%d", fmt, fd, fs);
276 switch((ir>>21)&0xf) {
282 reg.fl[fd] = -reg.fl[fs];
287 reg.fd[fd>>1] = -reg.fd[fs>>1];
291 reg.di[fd] = -reg.di[fs];
295 itrace("neg.%c\tf%d,f%d", fmt, fd, fs);
306 switch((ir>>21)&0xf) {
312 reg.fd[fd>>1] = reg.fl[fs];
318 reg.fd[fd>>1] = reg.fd[fs>>1];
322 reg.fd[fd>>1] = (long)reg.di[fs];
327 itrace("cvt.d.%c\tf%d,f%d", fmt, fd, fs);
338 switch((ir>>21)&0xf) {
344 reg.fl[fd] = reg.fl[fs];
349 reg.fl[fd] = reg.fd[fs>>1];
354 reg.fl[fd] = (long)reg.di[fs];
359 itrace("cvt.s.%c\tf%d,f%d", fmt, fd, fs);
371 switch((ir>>21)&0xf) {
390 reg.ft[fd] = FPmemory;
392 itrace("cvt.w.%c\tf%d,f%d", fmt, fd, fs);
401 Getf3(fs, ft, fd, ir);
403 switch((ir>>21)&0xf) {
409 reg.fl[fd] = reg.fl[fs] + reg.fl[ft];
414 reg.fd[fd>>1] = reg.fd[fs>>1] + reg.fd[ft>>1];
418 reg.di[fd] = reg.di[fs] + reg.di[ft];
422 itrace("add.%c\tf%d,f%d,f%d", fmt, fd, fs, ft);
431 Getf3(fs, ft, fd, ir);
433 switch((ir>>21)&0xf) {
439 reg.fl[fd] = reg.fl[fs] * reg.fl[ft];
444 reg.fd[fd>>1] = reg.fd[fs>>1] * reg.fd[ft>>1];
448 reg.di[fd] = reg.di[fs] * reg.di[ft];
452 itrace("mul.%c\tf%d,f%d,f%d", fmt, fd, fs, ft);
461 Getf3(fs, ft, fd, ir);
463 switch((ir>>21)&0xf) {
469 reg.fl[fd] = reg.fl[fs] / reg.fl[ft];
474 reg.fd[fd>>1] = reg.fd[fs>>1] / reg.fd[ft>>1];
478 reg.di[fd] = reg.di[fs] / reg.di[ft];
482 itrace("div.%c\tf%d,f%d,f%d", fmt, fd, fs, ft);
491 Getrbrt(rb, rt, inst);
492 off = (short)(inst&0xffff);
495 itrace("lwc1\tf%d,0x%x(r%d) ea=%lux", rt, off, rb, reg.r[rb]+off);
497 reg.di[rt] = getmem_w(reg.r[rb]+off);
498 reg.ft[rt] = FPmemory;
508 off = (short)(inst&0xffff);
511 npc = reg.pc + (off<<2) + 4;
514 itrace("bc1t\t0x%lux", npc);
521 itrace("bc1f\t0x%lux", npc);
523 if((reg.fpsr&FP_CBIT) == 0)
528 /* Do the delay slot */
529 reg.ir = ifetch(reg.pc+4);
541 SpecialGetrtrd(rt, fs, ir);
542 if(ir&(1<<22)) { /* CT */
544 itrace("ctc1\tr%d,f%d", rt, fs);
548 itrace("mtc1\tr%d,f%d", rt, fs);
550 reg.di[fs] = reg.r[rt];
551 reg.ft[fs] = FPmemory;
560 SpecialGetrtrd(rt, fs, ir);
561 if(ir&(1<<22)) { /* CF */
563 itrace("cfc1\tr%d,f%d", rt, fs);
567 itrace("mfc1\tr%d,f%d", rt, fs);
569 reg.r[rt] = reg.di[fs];
606 SpecialGetrtrd(ft, fs, ir);
609 switch((ir>>21)&0xf) {
615 if(isNaN(reg.fl[fs]) || isNaN(reg.fl[ft])) {
619 if(reg.fl[fs] == reg.fl[ft]) {
623 if(reg.fl[fs] < reg.fl[ft]) {
627 if(reg.fl[fs] > reg.fl[ft]) {
631 print("vi: bad in fcmp");
636 if(isNaN(reg.fd[fs>>1]) || isNaN(reg.fd[ft>>1])) {
640 if(reg.fd[fs>>1] == reg.fd[ft>>1]) {
644 if(reg.fd[fs>>1] < reg.fd[ft>>1]) {
648 if(reg.fd[fs>>1] > reg.fd[ft>>1]) {
652 print("vi: bad in fcmp");
656 if(reg.di[fs] == reg.di[ft]) {
660 if(reg.di[fs] < reg.di[ft]) {
664 if(reg.di[fs] > reg.di[ft]) {
671 reg.fpsr &= ~FP_CBIT;
675 itrace("c.f.%c\tf%d,f%d", fmt, fs, ft);
679 itrace("c.un.%c\tf%d,f%d", fmt, fs, ft);
685 itrace("c.eq.%c\tf%d,f%d", fmt, fs, ft);
691 itrace("c.ueq.%c\tf%d,f%d", fmt, fs, ft);
692 if(fc == FP_E || fc == FP_U)
697 itrace("c.lt.%c\tf%d,f%d", fmt, fs, ft);
703 itrace("c.ult.%c\tf%d,f%d", fmt, fs, ft);
704 if(fc == FP_L || fc == FP_U)
709 itrace("c.le.%c\tf%d,f%d", fmt, fs, ft);
710 if(fc == FP_E || fc == FP_L)
715 itrace("c.ule.%c\tf%d,f%d", fmt, fs, ft);
716 if(fc == FP_E || fc == FP_L || fc == FP_U)
721 itrace("c.sf.%c\tf%d,f%d", fmt, fs, ft);
727 itrace("c.ngle.%c\tf%d,f%d", fmt, fs, ft);
735 itrace("c.seq.%c\tf%d,f%d", fmt, fs, ft);
743 itrace("c.ngl.%c\tf%d,f%d", fmt, fs, ft);
744 if(fc == FP_E || fc == FP_U)
751 itrace("c.lt.%c\tf%d,f%d", fmt, fs, ft);
759 itrace("c.nge.%c\tf%d,f%d", fmt, fs, ft);
760 if(fc == FP_L || fc == FP_U)
767 itrace("c.le.%c\tf%d,f%d", fmt, fs, ft);
768 if(fc == FP_E || fc == FP_L)
775 itrace("c.ngt.%c\tf%d,f%d", fmt, fs, ft);
776 if(fc == FP_E || fc == FP_L || fc == FP_U)