The MIPS has a floating point coprocessor (numbered 1) that operates on single precision (32-bit) and double precision (64-bit) floating point numbers. This coprocessor has its own registers, which are numbered $f0-$f31. Because these registers are only 32-bits wide, two of them are required to hold doubles. To simplify matters, floating point operations only use even-numbered registers--including instructions that operate on single floats.
Values are moved in or out of these registers a word (32-bits) at a time by lwc1, swc1, mtc1, and mfc1 instructions described above or by the l.s, l.d, s.s, and s.d pseudoinstructions described below. The flag set by floating point comparison operations is read by the CPU with its bc1t and bc1f instructions.
In all instructions below, FRdest, FRsrc1, FRsrc2, and FRsrc are floating point registers (e.g., $f2).
abs.d FRdest, FRsrc | Floating Point Absolute Value Double |
abs.s FRdest, FRsrc | Floating Point Absolute Value Single |
add.d FRdest, FRsrc1, FRsrc2 | Floating Point Addition Double |
add.s FRdest, FRsrc1, FRsrc2 | Floating Point Addition Single |
c.eq.d FRsrc1, FRsrc2 | Compare Equal Double |
c.eq.s FRsrc1, FRsrc2 | Compare Equal Single |
c.le.d FRsrc1, FRsrc2 | Compare Less Than Equal Double |
c.le.s FRsrc1, FRsrc2 | Compare Less Than Equal Single |
c.lt.d FRsrc1, FRsrc2 | Compare Less Than Double |
c.lt.s FRsrc1, FRsrc2 | Compare Less Than Single |
cvt.d.s FRdest, FRsrc | Convert Single to Double |
cvt.d.w FRdest, FRsrc | Convert Integer to Double |
cvt.s.d FRdest, FRsrc | Convert Double to Single |
cvt.s.w FRdest, FRsrc | Convert Integer to Single |
cvt.w.d FRdest, FRsrc | Convert Double to Integer |
cvt.w.s FRdest, FRsrc | Convert Single to Integer |
div.d FRdest, FRsrc1, FRsrc2 | Floating Point Divide Double |
div.s FRdest, FRsrc1, FRsrc2 | Floating Point Divide Single |
l.d FRdest, address | Load Floating Point Double |
l.s FRdest, address | Load Floating Point Single |
mov.d FRdest, FRsrc | Move Floating Point Double |
mov.s FRdest, FRsrc | Move Floating Point Single |
mul.d FRdest, FRsrc1, FRsrc2 | Floating Point Multiply Double |
mul.s FRdest, FRsrc1, FRsrc2 | Floating Point Multiply Single |
neg.d FRdest, FRsrc | Negate Double |
neg.s FRdest, FRsrc | Negate Single |
s.d FRdest, address | Store Floating Point Double |
s.s FRdest, address | Store Floating Point Single |
sub.d FRdest, FRsrc1, FRsrc2 | Floating Point Subtract Double |
sub.s FRdest, FRsrc1, FRsrc2 | Floating Point Subtract Single |