| OLD | NEW |
| 1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file |
| 2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
| 3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
| 4 | 4 |
| 5 #include "vm/disassembler.h" | 5 #include "vm/disassembler.h" |
| 6 | 6 |
| 7 #include "vm/globals.h" // Needed here to get TARGET_ARCH_ARM64. | 7 #include "vm/globals.h" // Needed here to get TARGET_ARCH_ARM64. |
| 8 #if defined(TARGET_ARCH_ARM64) | 8 #if defined(TARGET_ARCH_ARM64) |
| 9 #include "platform/assert.h" | 9 #include "platform/assert.h" |
| 10 | 10 |
| (...skipping 316 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 327 PrintRegister(reg, R31IsZR); | 327 PrintRegister(reg, R31IsZR); |
| 328 return 2; | 328 return 2; |
| 329 } else if (format[1] == 't') { // 'rt: Rt register | 329 } else if (format[1] == 't') { // 'rt: Rt register |
| 330 int reg = instr->RtField(); | 330 int reg = instr->RtField(); |
| 331 PrintRegister(reg, R31IsZR); | 331 PrintRegister(reg, R31IsZR); |
| 332 return 2; | 332 return 2; |
| 333 } else if (format[1] == 'a') { // 'ra: Ra register | 333 } else if (format[1] == 'a') { // 'ra: Ra register |
| 334 int reg = instr->RaField(); | 334 int reg = instr->RaField(); |
| 335 PrintRegister(reg, R31IsZR); | 335 PrintRegister(reg, R31IsZR); |
| 336 return 2; | 336 return 2; |
| 337 } else if (format[1] == 's') { // 'rs: Rs register |
| 338 int reg = instr->RsField(); |
| 339 PrintRegister(reg, R31IsZR); |
| 340 return 2; |
| 337 } | 341 } |
| 338 UNREACHABLE(); | 342 UNREACHABLE(); |
| 339 return -1; | 343 return -1; |
| 340 } | 344 } |
| 341 | 345 |
| 342 | 346 |
| 343 int ARM64Decoder::FormatVRegister(Instr* instr, const char* format) { | 347 int ARM64Decoder::FormatVRegister(Instr* instr, const char* format) { |
| 344 ASSERT(format[0] == 'v'); | 348 ASSERT(format[0] == 'v'); |
| 345 if (format[1] == 'd') { | 349 if (format[1] == 'd') { |
| 346 int reg = instr->VdField(); | 350 int reg = instr->VdField(); |
| (...skipping 388 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 735 Unknown(instr); | 739 Unknown(instr); |
| 736 } | 740 } |
| 737 if (instr->Bit(30)) { | 741 if (instr->Bit(30)) { |
| 738 Format(instr, "ldrx 'rt, 'pcldr"); | 742 Format(instr, "ldrx 'rt, 'pcldr"); |
| 739 } else { | 743 } else { |
| 740 Format(instr, "ldrw 'rt, 'pcldr"); | 744 Format(instr, "ldrw 'rt, 'pcldr"); |
| 741 } | 745 } |
| 742 } | 746 } |
| 743 | 747 |
| 744 | 748 |
| 749 void ARM64Decoder::DecodeLoadStoreExclusive(Instr* instr) { |
| 750 if ((instr->Bit(23) != 0) || |
| 751 (instr->Bit(21) != 0) || |
| 752 (instr->Bit(15) != 0)) { |
| 753 Unknown(instr); |
| 754 } |
| 755 const int32_t size = instr->Bits(30, 2); |
| 756 if (size != 3) { |
| 757 Unknown(instr); |
| 758 } |
| 759 |
| 760 const bool is_load = instr->Bit(22) == 1; |
| 761 if (is_load) { |
| 762 Format(instr, "ldxr 'rt, 'rn"); |
| 763 } else { |
| 764 Format(instr, "stxr 'rs, 'rt, 'rn"); |
| 765 } |
| 766 } |
| 767 |
| 768 |
| 745 void ARM64Decoder::DecodeAddSubImm(Instr* instr) { | 769 void ARM64Decoder::DecodeAddSubImm(Instr* instr) { |
| 746 switch (instr->Bit(30)) { | 770 switch (instr->Bit(30)) { |
| 747 case 0: { | 771 case 0: { |
| 748 if ((instr->RdField() == R31) && (instr->SField() == 1)) { | 772 if ((instr->RdField() == R31) && (instr->SField() == 1)) { |
| 749 Format(instr, "cmni'sf 'rn, 'imm12s"); | 773 Format(instr, "cmni'sf 'rn, 'imm12s"); |
| 750 } else { | 774 } else { |
| 751 if (((instr->RdField() == R31) || (instr->RnField() == R31)) && | 775 if (((instr->RdField() == R31) || (instr->RnField() == R31)) && |
| 752 (instr->Imm12Field() == 0) && (instr->Bit(29) == 0)) { | 776 (instr->Imm12Field() == 0) && (instr->Bit(29) == 0)) { |
| 753 Format(instr, "mov'sf 'rd, 'rn"); | 777 Format(instr, "mov'sf 'rd, 'rn"); |
| 754 } else { | 778 } else { |
| (...skipping 188 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 943 } | 967 } |
| 944 | 968 |
| 945 | 969 |
| 946 void ARM64Decoder::DecodeLoadStore(Instr* instr) { | 970 void ARM64Decoder::DecodeLoadStore(Instr* instr) { |
| 947 if (instr->IsLoadStoreRegOp()) { | 971 if (instr->IsLoadStoreRegOp()) { |
| 948 DecodeLoadStoreReg(instr); | 972 DecodeLoadStoreReg(instr); |
| 949 } else if (instr->IsLoadStoreRegPairOp()) { | 973 } else if (instr->IsLoadStoreRegPairOp()) { |
| 950 DecodeLoadStoreRegPair(instr); | 974 DecodeLoadStoreRegPair(instr); |
| 951 } else if (instr->IsLoadRegLiteralOp()) { | 975 } else if (instr->IsLoadRegLiteralOp()) { |
| 952 DecodeLoadRegLiteral(instr); | 976 DecodeLoadRegLiteral(instr); |
| 977 } else if (instr->IsLoadStoreExclusiveOp()) { |
| 978 DecodeLoadStoreExclusive(instr); |
| 953 } else { | 979 } else { |
| 954 Unknown(instr); | 980 Unknown(instr); |
| 955 } | 981 } |
| 956 } | 982 } |
| 957 | 983 |
| 958 | 984 |
| 959 void ARM64Decoder::DecodeAddSubShiftExt(Instr* instr) { | 985 void ARM64Decoder::DecodeAddSubShiftExt(Instr* instr) { |
| 960 switch (instr->Bit(30)) { | 986 switch (instr->Bit(30)) { |
| 961 case 0: { | 987 case 0: { |
| 962 if ((instr->RdField() == R31) && (instr->SFField())) { | 988 if ((instr->RdField() == R31) && (instr->SFField())) { |
| (...skipping 502 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1465 if (out_instr_size) { | 1491 if (out_instr_size) { |
| 1466 *out_instr_size = Instr::kInstrSize; | 1492 *out_instr_size = Instr::kInstrSize; |
| 1467 } | 1493 } |
| 1468 } | 1494 } |
| 1469 | 1495 |
| 1470 #endif // !PRODUCT | 1496 #endif // !PRODUCT |
| 1471 | 1497 |
| 1472 } // namespace dart | 1498 } // namespace dart |
| 1473 | 1499 |
| 1474 #endif // defined TARGET_ARCH_ARM | 1500 #endif // defined TARGET_ARCH_ARM |
| OLD | NEW |