COP0 010000 |
MT 00100 |
rt |
rd |
0 0000 000 |
sel |
6 |
5 |
5 |
5 |
8 |
3 |
MTC0 rt, rd, sel |
MIPS32 |
Move to Coprocessor 0 |
Move to Coprocessor 0
To move the contents of a general register to a coprocessor 0 register.
CPR[0, rd, sel] = GPR[rt]
The contents of general register rt are loaded into the coprocessor 0 register specified by the combination of rd and
sel. Not all coprocessor 0 registers support the sel field. In those instances, the sel field must be set to zero.
When the CP0 destination register specified is the EntryLo0 or the EntryLo1 register, bits 31:30 appear in the RI/XI fields of the destination register. This feature supports MIPS32 backward compatibility on a MIPS64 implementation.
In Release 5, for a 32-bit processor, the MTC0 instruction writes all zeroes to the high-order bits of selected CP0 registers that have been extended beyond 32 bits. This is required for compatibility with legacy software that does not use MTHC0, yet has hardware support for extended CP0 registers (such as for Extended Physical Addressing (XPA)).
Because MTC0 overwrites the result of MTHC0, software must first read the high-order bits before writing the loworder bits, then write the high-order bits back either modified or unmodified. For initialization of an extended register, software may first write the low-order bits, then the high-order bits, without first reading the high-order bits.
Pre-Release 6: The results are UNDEFINED if coprocessor 0 does not contain a register as specified by rd and sel.
Release 6: Writes to a register that is reserved or not defined for the current core configuration are ignored.
data = GPR[rt] reg = rd if IsCoprocessorRegisterImplemented (0, reg, sel) then if (reg,sel = EntryLo1 or EntryLo0) then CPR[0,reg,sel]29..0 = data29..0 CPR[0,reg,sel]63 = data31 CPR[0,reg,sel]62 = data30 CPR[0,reg,sel]61:30 = 032 elseif (Width(CPR[0,reg,sel]) = 64) then CPR[0,reg,sel] = data else CPR[0,reg,sel] = data31..0 if (Config5XPA = 1) then // The most-significant bit may vary by register. Only supported // bits should be written 0. Extended LLAddr is not written with 0s, // as it is a read-only register. BadVAddr is not written with 0s, as // it is read-only if (Config3LPA = 1) then if (reg,sel = EntryLo0 or EntryLo1) then CPR[0,reg,sel]63:32 = 032 endif if (reg,sel = MAAR) then CPR[0,reg,sel]63:32 = 032 endif // TagLo is zeroed only if the implementation-dependent bits // are writeable if (reg,sel = TagLo) then CPR[0,reg,sel]63:32 = 032 endif if (Config3VZ = 1) then if (reg,sel = EntryHi) then CPR[0,reg,sel]63:32 = 032 endif endif endif endif endif else if ArchitectureRevision() >= 6 then // nop (no exceptions, coprocessor state not modified) else UNDEFINED endif endif
Coprocessor Unusable, Reserved Instruction