| Index: runtime/vm/disassembler_arm64.cc
|
| diff --git a/runtime/vm/disassembler_arm64.cc b/runtime/vm/disassembler_arm64.cc
|
| index bf0787718f28639e8e1d616a963e2c553b89830d..a43925a33185cb7aca8d5872d14772919328000f 100644
|
| --- a/runtime/vm/disassembler_arm64.cc
|
| +++ b/runtime/vm/disassembler_arm64.cc
|
| @@ -334,6 +334,10 @@ int ARM64Decoder::FormatRegister(Instr* instr, const char* format) {
|
| int reg = instr->RaField();
|
| PrintRegister(reg, R31IsZR);
|
| return 2;
|
| + } else if (format[1] == 's') { // 'rs: Rs register
|
| + int reg = instr->RsField();
|
| + PrintRegister(reg, R31IsZR);
|
| + return 2;
|
| }
|
| UNREACHABLE();
|
| return -1;
|
| @@ -742,6 +746,26 @@ void ARM64Decoder::DecodeLoadRegLiteral(Instr* instr) {
|
| }
|
|
|
|
|
| +void ARM64Decoder::DecodeLoadStoreExclusive(Instr* instr) {
|
| + if ((instr->Bit(23) != 0) ||
|
| + (instr->Bit(21) != 0) ||
|
| + (instr->Bit(15) != 0)) {
|
| + Unknown(instr);
|
| + }
|
| + const int32_t size = instr->Bits(30, 2);
|
| + if (size != 3) {
|
| + Unknown(instr);
|
| + }
|
| +
|
| + const bool is_load = instr->Bit(22) == 1;
|
| + if (is_load) {
|
| + Format(instr, "ldxr 'rt, 'rn");
|
| + } else {
|
| + Format(instr, "stxr 'rs, 'rt, 'rn");
|
| + }
|
| +}
|
| +
|
| +
|
| void ARM64Decoder::DecodeAddSubImm(Instr* instr) {
|
| switch (instr->Bit(30)) {
|
| case 0: {
|
| @@ -950,6 +974,8 @@ void ARM64Decoder::DecodeLoadStore(Instr* instr) {
|
| DecodeLoadStoreRegPair(instr);
|
| } else if (instr->IsLoadRegLiteralOp()) {
|
| DecodeLoadRegLiteral(instr);
|
| + } else if (instr->IsLoadStoreExclusiveOp()) {
|
| + DecodeLoadStoreExclusive(instr);
|
| } else {
|
| Unknown(instr);
|
| }
|
|
|