| Index: src/arm/disasm-arm.cc
|
| diff --git a/src/arm/disasm-arm.cc b/src/arm/disasm-arm.cc
|
| index 0abe35b9e22253f8906e4c3d91fa248aa5b4d2cf..2638409e853569fa72de0f6367b65461a69b69f1 100644
|
| --- a/src/arm/disasm-arm.cc
|
| +++ b/src/arm/disasm-arm.cc
|
| @@ -119,6 +119,7 @@ class Decoder {
|
| void DecodeType5(Instr* instr);
|
| void DecodeType6(Instr* instr);
|
| void DecodeType7(Instr* instr);
|
| + void DecodeUnconditional(Instr* instr);
|
|
|
| const disasm::NameConverter& converter_;
|
| v8::internal::Vector<char> out_buffer_;
|
| @@ -774,6 +775,67 @@ void Decoder::DecodeType7(Instr* instr) {
|
| }
|
|
|
|
|
| +void Decoder::DecodeUnconditional(Instr* instr) {
|
| + if (instr->Bits(7, 4) == 0xB && instr->Bits(27, 25) == 0 && instr->HasL()) {
|
| + Format(instr, "'memop'h'pu 'rd, ");
|
| + bool immediate = instr->HasB();
|
| + switch (instr->PUField()) {
|
| + case 0: {
|
| + // Post index, negative.
|
| + if (instr->HasW()) {
|
| + Unknown(instr);
|
| + break;
|
| + }
|
| + if (immediate) {
|
| + Format(instr, "['rn], #-'imm12");
|
| + } else {
|
| + Format(instr, "['rn], -'rm");
|
| + }
|
| + break;
|
| + }
|
| + case 1: {
|
| + // Post index, positive.
|
| + if (instr->HasW()) {
|
| + Unknown(instr);
|
| + break;
|
| + }
|
| + if (immediate) {
|
| + Format(instr, "['rn], #+'imm12");
|
| + } else {
|
| + Format(instr, "['rn], +'rm");
|
| + }
|
| + break;
|
| + }
|
| + case 2: {
|
| + // Pre index or offset, negative.
|
| + if (immediate) {
|
| + Format(instr, "['rn, #-'imm12]'w");
|
| + } else {
|
| + Format(instr, "['rn, -'rm]'w");
|
| + }
|
| + break;
|
| + }
|
| + case 3: {
|
| + // Pre index or offset, positive.
|
| + if (immediate) {
|
| + Format(instr, "['rn, #+'imm12]'w");
|
| + } else {
|
| + Format(instr, "['rn, +'rm]'w");
|
| + }
|
| + break;
|
| + }
|
| + default: {
|
| + // The PU field is a 2-bit field.
|
| + UNREACHABLE();
|
| + break;
|
| + }
|
| + }
|
| + return;
|
| + }
|
| + Format(instr, "break 'msg");
|
| +}
|
| +
|
| +
|
| // Disassemble the instruction at *instr_ptr into the output buffer.
|
| int Decoder::InstructionDecode(byte* instr_ptr) {
|
| Instr* instr = Instr::At(instr_ptr);
|
| @@ -782,7 +844,7 @@ int Decoder::InstructionDecode(byte* instr_ptr) {
|
| "%08x ",
|
| instr->InstructionBits());
|
| if (instr->ConditionField() == special_condition) {
|
| - Format(instr, "break 'msg");
|
| + DecodeUnconditional(instr);
|
| return Instr::kInstrSize;
|
| }
|
| switch (instr->TypeField()) {
|
|
|