| Index: src/mips64/disasm-mips64.cc
|
| diff --git a/src/mips64/disasm-mips64.cc b/src/mips64/disasm-mips64.cc
|
| index a6911daa86eb29e04a268d8eff73a337589249ab..2ebd0ead13d14d409ef2261e8a5e732a60743a1a 100644
|
| --- a/src/mips64/disasm-mips64.cc
|
| +++ b/src/mips64/disasm-mips64.cc
|
| @@ -92,6 +92,9 @@ class Decoder {
|
| void PrintSd(Instruction* instr);
|
| void PrintSs1(Instruction* instr);
|
| void PrintSs2(Instruction* instr);
|
| + void PrintSs3(Instruction* instr);
|
| + void PrintSs4(Instruction* instr);
|
| + void PrintSs5(Instruction* instr);
|
| void PrintBc(Instruction* instr);
|
| void PrintCc(Instruction* instr);
|
| void PrintFunction(Instruction* instr);
|
| @@ -289,20 +292,41 @@ void Decoder::PrintSd(Instruction* instr) {
|
| out_buffer_pos_ += SNPrintF(out_buffer_ + out_buffer_pos_, "%d", sd);
|
| }
|
|
|
| -
|
| -// Print the integer value of the rd field, when used as 'ext' size.
|
| +// Print the integer value of ext/dext/dextu size from the msbd field.
|
| void Decoder::PrintSs1(Instruction* instr) {
|
| - int ss = instr->RdValue();
|
| - out_buffer_pos_ += SNPrintF(out_buffer_ + out_buffer_pos_, "%d", ss + 1);
|
| + int msbd = instr->RdValue();
|
| + out_buffer_pos_ += SNPrintF(out_buffer_ + out_buffer_pos_, "%d", msbd + 1);
|
| }
|
|
|
| -
|
| -// Print the integer value of the rd field, when used as 'ins' size.
|
| +// Print the integer value of ins/dins/dinsu size from the msb and lsb fields
|
| +// (for dinsu it is msbminus32 and lsbminus32 fields).
|
| void Decoder::PrintSs2(Instruction* instr) {
|
| - int ss = instr->RdValue();
|
| - int pos = instr->SaValue();
|
| + int msb = instr->RdValue();
|
| + int lsb = instr->SaValue();
|
| out_buffer_pos_ +=
|
| - SNPrintF(out_buffer_ + out_buffer_pos_, "%d", ss - pos + 1);
|
| + SNPrintF(out_buffer_ + out_buffer_pos_, "%d", msb - lsb + 1);
|
| +}
|
| +
|
| +// Print the integer value of dextm size from the msbdminus32 field.
|
| +void Decoder::PrintSs3(Instruction* instr) {
|
| + int msbdminus32 = instr->RdValue();
|
| + out_buffer_pos_ +=
|
| + SNPrintF(out_buffer_ + out_buffer_pos_, "%d", msbdminus32 + 32 + 1);
|
| +}
|
| +
|
| +// Print the integer value of dinsm size from the msbminus32 and lsb fields.
|
| +void Decoder::PrintSs4(Instruction* instr) {
|
| + int msbminus32 = instr->RdValue();
|
| + int lsb = instr->SaValue();
|
| + out_buffer_pos_ +=
|
| + SNPrintF(out_buffer_ + out_buffer_pos_, "%d", msbminus32 + 32 - lsb + 1);
|
| +}
|
| +
|
| +// Print the integer value of dextu/dinsu pos from the lsbminus32 field.
|
| +void Decoder::PrintSs5(Instruction* instr) {
|
| + int lsbminus32 = instr->SaValue();
|
| + out_buffer_pos_ +=
|
| + SNPrintF(out_buffer_ + out_buffer_pos_, "%d", lsbminus32 + 32);
|
| }
|
|
|
|
|
| @@ -954,14 +978,22 @@ int Decoder::FormatOption(Instruction* instr, const char* format) {
|
| }
|
| case 's': {
|
| if (format[2] == '1') {
|
| - DCHECK(STRING_STARTS_WITH(format, "ss1")); /* ext size */
|
| - PrintSs1(instr);
|
| - return 3;
|
| + DCHECK(STRING_STARTS_WITH(format, "ss1")); // ext, dext, dextu size
|
| + PrintSs1(instr);
|
| + } else if (format[2] == '2') {
|
| + DCHECK(STRING_STARTS_WITH(format, "ss2")); // ins, dins, dinsu size
|
| + PrintSs2(instr);
|
| + } else if (format[2] == '3') {
|
| + DCHECK(STRING_STARTS_WITH(format, "ss3")); // dextm size
|
| + PrintSs3(instr);
|
| + } else if (format[2] == '4') {
|
| + DCHECK(STRING_STARTS_WITH(format, "ss4")); // dinsm size
|
| + PrintSs4(instr);
|
| } else {
|
| - DCHECK(STRING_STARTS_WITH(format, "ss2")); /* ins size */
|
| - PrintSs2(instr);
|
| - return 3;
|
| + DCHECK(STRING_STARTS_WITH(format, "ss5")); // dextu, dinsu pos
|
| + PrintSs5(instr);
|
| }
|
| + return 3;
|
| }
|
| }
|
| }
|
| @@ -1694,10 +1726,6 @@ void Decoder::DecodeTypeRegisterSPECIAL2(Instruction* instr) {
|
|
|
| void Decoder::DecodeTypeRegisterSPECIAL3(Instruction* instr) {
|
| switch (instr->FunctionFieldRaw()) {
|
| - case INS: {
|
| - Format(instr, "ins 'rt, 'rs, 'sa, 'ss2");
|
| - break;
|
| - }
|
| case EXT: {
|
| Format(instr, "ext 'rt, 'rs, 'sa, 'ss1");
|
| break;
|
| @@ -1707,11 +1735,27 @@ void Decoder::DecodeTypeRegisterSPECIAL3(Instruction* instr) {
|
| break;
|
| }
|
| case DEXTM: {
|
| - Format(instr, "dextm 'rt, 'rs, 'sa, 'ss1");
|
| + Format(instr, "dextm 'rt, 'rs, 'sa, 'ss3");
|
| break;
|
| }
|
| case DEXTU: {
|
| - Format(instr, "dextu 'rt, 'rs, 'sa, 'ss1");
|
| + Format(instr, "dextu 'rt, 'rs, 'ss5, 'ss1");
|
| + break;
|
| + }
|
| + case INS: {
|
| + Format(instr, "ins 'rt, 'rs, 'sa, 'ss2");
|
| + break;
|
| + }
|
| + case DINS: {
|
| + Format(instr, "dins 'rt, 'rs, 'sa, 'ss2");
|
| + break;
|
| + }
|
| + case DINSM: {
|
| + Format(instr, "dinsm 'rt, 'rs, 'sa, 'ss4");
|
| + break;
|
| + }
|
| + case DINSU: {
|
| + Format(instr, "dinsu 'rt, 'rs, 'ss5, 'ss2");
|
| break;
|
| }
|
| case BSHFL: {
|
| @@ -1749,10 +1793,6 @@ void Decoder::DecodeTypeRegisterSPECIAL3(Instruction* instr) {
|
| }
|
| break;
|
| }
|
| - case DINS: {
|
| - Format(instr, "dins 'rt, 'rs, 'sa, 'ss2");
|
| - break;
|
| - }
|
| case DBSHFL: {
|
| int sa = instr->SaFieldRaw() >> kSaShift;
|
| switch (sa) {
|
|
|