| Index: src/mips64/simulator-mips64.cc
|
| diff --git a/src/mips64/simulator-mips64.cc b/src/mips64/simulator-mips64.cc
|
| index 2440770b19aad0c1c4583b739dd2b81b59937426..fc0ae0cb6f0e44c00cc747377abf79cd4c7d4bc0 100644
|
| --- a/src/mips64/simulator-mips64.cc
|
| +++ b/src/mips64/simulator-mips64.cc
|
| @@ -3696,7 +3696,19 @@ void Simulator::DecodeTypeRegisterSPECIAL2() {
|
| void Simulator::DecodeTypeRegisterSPECIAL3() {
|
| int64_t alu_out;
|
| switch (get_instr()->FunctionFieldRaw()) {
|
| - case INS: { // Mips32r2 instruction.
|
| + case INS: { // Mips64r2 instruction.
|
| + // Interpret rd field as 5-bit msb of insert.
|
| + uint16_t msb = rd_reg();
|
| + // Interpret sa field as 5-bit lsb of insert.
|
| + uint16_t lsb = sa();
|
| + uint16_t size = msb - lsb + 1;
|
| + uint64_t mask = (1ULL << size) - 1;
|
| + alu_out = static_cast<int32_t>((rt_u() & ~(mask << lsb)) |
|
| + ((rs_u() & mask) << lsb));
|
| + SetResult(rt_reg(), alu_out);
|
| + break;
|
| + }
|
| + case DINS: { // Mips64r2 instruction.
|
| // Interpret rd field as 5-bit msb of insert.
|
| uint16_t msb = rd_reg();
|
| // Interpret sa field as 5-bit lsb of insert.
|
| @@ -3707,7 +3719,7 @@ void Simulator::DecodeTypeRegisterSPECIAL3() {
|
| SetResult(rt_reg(), alu_out);
|
| break;
|
| }
|
| - case EXT: { // Mips32r2 instruction.
|
| + case EXT: { // Mips64r2 instruction.
|
| // Interpret rd field as 5-bit msb of extract.
|
| uint16_t msb = rd_reg();
|
| // Interpret sa field as 5-bit lsb of extract.
|
| @@ -3718,7 +3730,7 @@ void Simulator::DecodeTypeRegisterSPECIAL3() {
|
| SetResult(rt_reg(), alu_out);
|
| break;
|
| }
|
| - case DEXT: { // Mips32r2 instruction.
|
| + case DEXT: { // Mips64r2 instruction.
|
| // Interpret rd field as 5-bit msb of extract.
|
| uint16_t msb = rd_reg();
|
| // Interpret sa field as 5-bit lsb of extract.
|
|
|