| Index: runtime/vm/disassembler_arm64.cc
|
| ===================================================================
|
| --- runtime/vm/disassembler_arm64.cc (revision 34712)
|
| +++ runtime/vm/disassembler_arm64.cc (working copy)
|
| @@ -30,7 +30,7 @@
|
| void Print(const char* str);
|
|
|
| // Printing of common values.
|
| - void PrintRegister(int reg);
|
| + void PrintRegister(int reg, R31Type r31t);
|
| void PrintShiftExtendRm(Instr* instr);
|
| void PrintS(Instr* instr);
|
|
|
| @@ -89,10 +89,15 @@
|
|
|
|
|
| // Print the register name according to the active name converter.
|
| -void ARM64Decoder::PrintRegister(int reg) {
|
| +void ARM64Decoder::PrintRegister(int reg, R31Type r31t) {
|
| ASSERT(0 <= reg);
|
| ASSERT(reg < kNumberOfCpuRegisters);
|
| - Print(reg_names[reg]);
|
| + if ((reg == 31)) {
|
| + const char* rstr = (r31t == R31IsZR) ? "zr" : "sp";
|
| + Print(rstr);
|
| + } else {
|
| + Print(reg_names[reg]);
|
| + }
|
| }
|
|
|
|
|
| @@ -118,7 +123,7 @@
|
| Extend extend = instr->ExtendTypeField();
|
| int extend_shift_amount = instr->ExtShiftAmountField();
|
|
|
| - PrintRegister(rm);
|
| + PrintRegister(rm, R31IsZR);
|
|
|
| if (instr->IsShift() && (shift == LSL) && (shift_amount == 0)) {
|
| // Special case for using rm only.
|
| @@ -127,14 +132,14 @@
|
| if (instr->IsShift()) {
|
| // by immediate
|
| if ((shift == ROR) && (shift_amount == 0)) {
|
| - Print(", RRX");
|
| + Print(" RRX");
|
| return;
|
| } else if (((shift == LSR) || (shift == ASR)) && (shift_amount == 0)) {
|
| shift_amount = 32;
|
| }
|
| buffer_pos_ += OS::SNPrint(current_position_in_buffer(),
|
| remaining_size_in_buffer(),
|
| - ", %s #%d",
|
| + " %s #%d",
|
| shift_names[shift],
|
| shift_amount);
|
| } else {
|
| @@ -142,7 +147,7 @@
|
| // by register
|
| buffer_pos_ += OS::SNPrint(current_position_in_buffer(),
|
| remaining_size_in_buffer(),
|
| - ", %s",
|
| + " %s",
|
| extend_names[extend]);
|
| if (((instr->SFField() == 1) && (extend == UXTX)) ||
|
| ((instr->SFField() == 0) && (extend == UXTW))) {
|
| @@ -162,15 +167,15 @@
|
| ASSERT(format[0] == 'r');
|
| if (format[1] == 'n') { // 'rn: Rn register
|
| int reg = instr->RnField();
|
| - PrintRegister(reg);
|
| + PrintRegister(reg, instr->RnMode());
|
| return 2;
|
| } else if (format[1] == 'd') { // 'rd: Rd register
|
| int reg = instr->RdField();
|
| - PrintRegister(reg);
|
| + PrintRegister(reg, instr->RdMode());
|
| return 2;
|
| } else if (format[1] == 'm') { // 'rm: Rm register
|
| int reg = instr->RmField();
|
| - PrintRegister(reg);
|
| + PrintRegister(reg, R31IsZR);
|
| return 2;
|
| }
|
| UNREACHABLE();
|
| @@ -237,6 +242,17 @@
|
| case 'r': {
|
| return FormatRegister(instr, format);
|
| }
|
| + case 'h': {
|
| + ASSERT(STRING_STARTS_WITH(format, "hw"));
|
| + const int shift = instr->HWField() << 4;
|
| + if (shift != 0) {
|
| + buffer_pos_ += OS::SNPrint(current_position_in_buffer(),
|
| + remaining_size_in_buffer(),
|
| + "lsl %d",
|
| + shift);
|
| + }
|
| + return 2;
|
| + }
|
| default: {
|
| UNREACHABLE();
|
| break;
|
| @@ -274,13 +290,13 @@
|
| void ARM64Decoder::DecodeMoveWide(Instr* instr) {
|
| switch (instr->Bits(29, 2)) {
|
| case 0:
|
| - Format(instr, "movn'sf 'rd, 'imm16");
|
| + Format(instr, "movn'sf 'rd, 'imm16 'hw");
|
| break;
|
| case 2:
|
| - Format(instr, "movz'sf 'rd, 'imm16");
|
| + Format(instr, "movz'sf 'rd, 'imm16 'hw");
|
| break;
|
| case 3:
|
| - Format(instr, "movk'sf 'rd, 'imm16");
|
| + Format(instr, "movk'sf 'rd, 'imm16 'hw");
|
| break;
|
| default:
|
| Unknown(instr);
|
|
|