summaryrefslogtreecommitdiff
path: root/src/core/arm/disassembler
diff options
context:
space:
mode:
authorGravatar Emmanuel Gil Peyrot2015-08-11 22:32:39 +0100
committerGravatar Emmanuel Gil Peyrot2015-08-11 22:38:44 +0100
commit5115d0177ed9f77b091adbbbfd22f2f0a568a4bb (patch)
tree3a243eee2146980bcbd708a552ca082d172eeda7 /src/core/arm/disassembler
parentMerge pull request #1028 from aroulin/arm-disas-media-instr (diff)
downloadyuzu-5115d0177ed9f77b091adbbbfd22f2f0a568a4bb.tar.gz
yuzu-5115d0177ed9f77b091adbbbfd22f2f0a568a4bb.tar.xz
yuzu-5115d0177ed9f77b091adbbbfd22f2f0a568a4bb.zip
ARM Core, Video Core, CitraQt, Citrace: Use CommonTypes types instead of the standard u?int*_t types.
Diffstat (limited to 'src/core/arm/disassembler')
-rw-r--r--src/core/arm/disassembler/arm_disasm.cpp472
-rw-r--r--src/core/arm/disassembler/arm_disasm.h85
2 files changed, 280 insertions, 277 deletions
diff --git a/src/core/arm/disassembler/arm_disasm.cpp b/src/core/arm/disassembler/arm_disasm.cpp
index 1d40ae030..77af10b54 100644
--- a/src/core/arm/disassembler/arm_disasm.cpp
+++ b/src/core/arm/disassembler/arm_disasm.cpp
@@ -3,7 +3,9 @@
3#include <string> 3#include <string>
4#include <unordered_set> 4#include <unordered_set>
5 5
6#include "common/common_types.h"
6#include "common/string_util.h" 7#include "common/string_util.h"
8
7#include "core/arm/disassembler/arm_disasm.h" 9#include "core/arm/disassembler/arm_disasm.h"
8#include "core/arm/skyeye_common/armsupp.h" 10#include "core/arm/skyeye_common/armsupp.h"
9 11
@@ -215,11 +217,11 @@ static const char *shift_names[] = {
215 "ROR" 217 "ROR"
216}; 218};
217 219
218static const char* cond_to_str(uint32_t cond) { 220static const char* cond_to_str(u32 cond) {
219 return cond_names[cond]; 221 return cond_names[cond];
220} 222}
221 223
222std::string ARM_Disasm::Disassemble(uint32_t addr, uint32_t insn) 224std::string ARM_Disasm::Disassemble(u32 addr, u32 insn)
223{ 225{
224 Opcode opcode = Decode(insn); 226 Opcode opcode = Decode(insn);
225 switch (opcode) { 227 switch (opcode) {
@@ -400,22 +402,22 @@ std::string ARM_Disasm::Disassemble(uint32_t addr, uint32_t insn)
400 return NULL; 402 return NULL;
401} 403}
402 404
403std::string ARM_Disasm::DisassembleALU(Opcode opcode, uint32_t insn) 405std::string ARM_Disasm::DisassembleALU(Opcode opcode, u32 insn)
404{ 406{
405 static const uint8_t kNoOperand1 = 1; 407 static const u8 kNoOperand1 = 1;
406 static const uint8_t kNoDest = 2; 408 static const u8 kNoDest = 2;
407 static const uint8_t kNoSbit = 4; 409 static const u8 kNoSbit = 4;
408 410
409 std::string rn_str; 411 std::string rn_str;
410 std::string rd_str; 412 std::string rd_str;
411 413
412 uint8_t flags = 0; 414 u8 flags = 0;
413 uint8_t cond = (insn >> 28) & 0xf; 415 u8 cond = (insn >> 28) & 0xf;
414 uint8_t is_immed = (insn >> 25) & 0x1; 416 u8 is_immed = (insn >> 25) & 0x1;
415 uint8_t bit_s = (insn >> 20) & 1; 417 u8 bit_s = (insn >> 20) & 1;
416 uint8_t rn = (insn >> 16) & 0xf; 418 u8 rn = (insn >> 16) & 0xf;
417 uint8_t rd = (insn >> 12) & 0xf; 419 u8 rd = (insn >> 12) & 0xf;
418 uint8_t immed = insn & 0xff; 420 u8 immed = insn & 0xff;
419 421
420 const char* opname = opcode_names[opcode]; 422 const char* opname = opcode_names[opcode];
421 switch (opcode) { 423 switch (opcode) {
@@ -455,14 +457,14 @@ std::string ARM_Disasm::DisassembleALU(Opcode opcode, uint32_t insn)
455 opname, cond_to_str(cond), sbit_str, rd_str.c_str(), rn_str.c_str(), immed, immed); 457 opname, cond_to_str(cond), sbit_str, rd_str.c_str(), rn_str.c_str(), immed, immed);
456 } 458 }
457 459
458 uint8_t shift_is_reg = (insn >> 4) & 1; 460 u8 shift_is_reg = (insn >> 4) & 1;
459 uint8_t rotate = (insn >> 8) & 0xf; 461 u8 rotate = (insn >> 8) & 0xf;
460 uint8_t rm = insn & 0xf; 462 u8 rm = insn & 0xf;
461 uint8_t shift_type = (insn >> 5) & 0x3; 463 u8 shift_type = (insn >> 5) & 0x3;
462 uint8_t rs = (insn >> 8) & 0xf; 464 u8 rs = (insn >> 8) & 0xf;
463 uint8_t shift_amount = (insn >> 7) & 0x1f; 465 u8 shift_amount = (insn >> 7) & 0x1f;
464 uint32_t rotated_val = immed; 466 u32 rotated_val = immed;
465 uint8_t rotate2 = rotate << 1; 467 u8 rotate2 = rotate << 1;
466 rotated_val = (rotated_val >> rotate2) | (rotated_val << (32 - rotate2)); 468 rotated_val = (rotated_val >> rotate2) | (rotated_val << (32 - rotate2));
467 469
468 if (!shift_is_reg && shift_type == 0 && shift_amount == 0) { 470 if (!shift_is_reg && shift_type == 0 && shift_amount == 0) {
@@ -488,10 +490,10 @@ std::string ARM_Disasm::DisassembleALU(Opcode opcode, uint32_t insn)
488 shift_name, shift_amount); 490 shift_name, shift_amount);
489} 491}
490 492
491std::string ARM_Disasm::DisassembleBranch(uint32_t addr, Opcode opcode, uint32_t insn) 493std::string ARM_Disasm::DisassembleBranch(u32 addr, Opcode opcode, u32 insn)
492{ 494{
493 uint8_t cond = (insn >> 28) & 0xf; 495 u8 cond = (insn >> 28) & 0xf;
494 uint32_t offset = insn & 0xffffff; 496 u32 offset = insn & 0xffffff;
495 // Sign-extend the 24-bit offset 497 // Sign-extend the 24-bit offset
496 if ((offset >> 23) & 1) 498 if ((offset >> 23) & 1)
497 offset |= 0xff000000; 499 offset |= 0xff000000;
@@ -504,35 +506,35 @@ std::string ARM_Disasm::DisassembleBranch(uint32_t addr, Opcode opcode, uint32_t
504 return Common::StringFromFormat("%s%s\t0x%x", opname, cond_to_str(cond), addr); 506 return Common::StringFromFormat("%s%s\t0x%x", opname, cond_to_str(cond), addr);
505} 507}
506 508
507std::string ARM_Disasm::DisassembleBX(uint32_t insn) 509std::string ARM_Disasm::DisassembleBX(u32 insn)
508{ 510{
509 uint8_t cond = (insn >> 28) & 0xf; 511 u8 cond = (insn >> 28) & 0xf;
510 uint8_t rn = insn & 0xf; 512 u8 rn = insn & 0xf;
511 return Common::StringFromFormat("bx%s\tr%d", cond_to_str(cond), rn); 513 return Common::StringFromFormat("bx%s\tr%d", cond_to_str(cond), rn);
512} 514}
513 515
514std::string ARM_Disasm::DisassembleBKPT(uint32_t insn) 516std::string ARM_Disasm::DisassembleBKPT(u32 insn)
515{ 517{
516 uint8_t cond = (insn >> 28) & 0xf; 518 u8 cond = (insn >> 28) & 0xf;
517 uint32_t immed = (((insn >> 8) & 0xfff) << 4) | (insn & 0xf); 519 u32 immed = (((insn >> 8) & 0xfff) << 4) | (insn & 0xf);
518 return Common::StringFromFormat("bkpt%s\t#%d", cond_to_str(cond), immed); 520 return Common::StringFromFormat("bkpt%s\t#%d", cond_to_str(cond), immed);
519} 521}
520 522
521std::string ARM_Disasm::DisassembleCLZ(uint32_t insn) 523std::string ARM_Disasm::DisassembleCLZ(u32 insn)
522{ 524{
523 uint8_t cond = (insn >> 28) & 0xf; 525 u8 cond = (insn >> 28) & 0xf;
524 uint8_t rd = (insn >> 12) & 0xf; 526 u8 rd = (insn >> 12) & 0xf;
525 uint8_t rm = insn & 0xf; 527 u8 rm = insn & 0xf;
526 return Common::StringFromFormat("clz%s\tr%d, r%d", cond_to_str(cond), rd, rm); 528 return Common::StringFromFormat("clz%s\tr%d, r%d", cond_to_str(cond), rd, rm);
527} 529}
528 530
529std::string ARM_Disasm::DisassembleMediaMulDiv(Opcode opcode, uint32_t insn) { 531std::string ARM_Disasm::DisassembleMediaMulDiv(Opcode opcode, u32 insn) {
530 uint32_t cond = BITS(insn, 28, 31); 532 u32 cond = BITS(insn, 28, 31);
531 uint32_t rd = BITS(insn, 16, 19); 533 u32 rd = BITS(insn, 16, 19);
532 uint32_t ra = BITS(insn, 12, 15); 534 u32 ra = BITS(insn, 12, 15);
533 uint32_t rm = BITS(insn, 8, 11); 535 u32 rm = BITS(insn, 8, 11);
534 uint32_t m = BIT(insn, 5); 536 u32 m = BIT(insn, 5);
535 uint32_t rn = BITS(insn, 0, 3); 537 u32 rn = BITS(insn, 0, 3);
536 538
537 std::string cross = ""; 539 std::string cross = "";
538 if (m) { 540 if (m) {
@@ -558,17 +560,17 @@ std::string ARM_Disasm::DisassembleMediaMulDiv(Opcode opcode, uint32_t insn) {
558 ext_reg.c_str()); 560 ext_reg.c_str());
559} 561}
560 562
561std::string ARM_Disasm::DisassembleMemblock(Opcode opcode, uint32_t insn) 563std::string ARM_Disasm::DisassembleMemblock(Opcode opcode, u32 insn)
562{ 564{
563 std::string tmp_list; 565 std::string tmp_list;
564 566
565 uint8_t cond = (insn >> 28) & 0xf; 567 u8 cond = (insn >> 28) & 0xf;
566 uint8_t write_back = (insn >> 21) & 0x1; 568 u8 write_back = (insn >> 21) & 0x1;
567 uint8_t bit_s = (insn >> 22) & 0x1; 569 u8 bit_s = (insn >> 22) & 0x1;
568 uint8_t is_up = (insn >> 23) & 0x1; 570 u8 is_up = (insn >> 23) & 0x1;
569 uint8_t is_pre = (insn >> 24) & 0x1; 571 u8 is_pre = (insn >> 24) & 0x1;
570 uint8_t rn = (insn >> 16) & 0xf; 572 u8 rn = (insn >> 16) & 0xf;
571 uint16_t reg_list = insn & 0xffff; 573 u16 reg_list = insn & 0xffff;
572 574
573 const char *opname = opcode_names[opcode]; 575 const char *opname = opcode_names[opcode];
574 576
@@ -608,18 +610,18 @@ std::string ARM_Disasm::DisassembleMemblock(Opcode opcode, uint32_t insn)
608 opname, cond_to_str(cond), addr_mode, rn, bang, tmp_list.c_str(), carret); 610 opname, cond_to_str(cond), addr_mode, rn, bang, tmp_list.c_str(), carret);
609} 611}
610 612
611std::string ARM_Disasm::DisassembleMem(uint32_t insn) 613std::string ARM_Disasm::DisassembleMem(u32 insn)
612{ 614{
613 uint8_t cond = (insn >> 28) & 0xf; 615 u8 cond = (insn >> 28) & 0xf;
614 uint8_t is_reg = (insn >> 25) & 0x1; 616 u8 is_reg = (insn >> 25) & 0x1;
615 uint8_t is_load = (insn >> 20) & 0x1; 617 u8 is_load = (insn >> 20) & 0x1;
616 uint8_t write_back = (insn >> 21) & 0x1; 618 u8 write_back = (insn >> 21) & 0x1;
617 uint8_t is_byte = (insn >> 22) & 0x1; 619 u8 is_byte = (insn >> 22) & 0x1;
618 uint8_t is_up = (insn >> 23) & 0x1; 620 u8 is_up = (insn >> 23) & 0x1;
619 uint8_t is_pre = (insn >> 24) & 0x1; 621 u8 is_pre = (insn >> 24) & 0x1;
620 uint8_t rn = (insn >> 16) & 0xf; 622 u8 rn = (insn >> 16) & 0xf;
621 uint8_t rd = (insn >> 12) & 0xf; 623 u8 rd = (insn >> 12) & 0xf;
622 uint16_t offset = insn & 0xfff; 624 u16 offset = insn & 0xfff;
623 625
624 const char *opname = "ldr"; 626 const char *opname = "ldr";
625 if (!is_load) 627 if (!is_load)
@@ -656,9 +658,9 @@ std::string ARM_Disasm::DisassembleMem(uint32_t insn)
656 } 658 }
657 } 659 }
658 660
659 uint8_t rm = insn & 0xf; 661 u8 rm = insn & 0xf;
660 uint8_t shift_type = (insn >> 5) & 0x3; 662 u8 shift_type = (insn >> 5) & 0x3;
661 uint8_t shift_amount = (insn >> 7) & 0x1f; 663 u8 shift_amount = (insn >> 7) & 0x1f;
662 664
663 const char *shift_name = shift_names[shift_type]; 665 const char *shift_name = shift_names[shift_type];
664 666
@@ -700,19 +702,19 @@ std::string ARM_Disasm::DisassembleMem(uint32_t insn)
700 shift_name, shift_amount); 702 shift_name, shift_amount);
701} 703}
702 704
703std::string ARM_Disasm::DisassembleMemHalf(uint32_t insn) 705std::string ARM_Disasm::DisassembleMemHalf(u32 insn)
704{ 706{
705 uint8_t cond = (insn >> 28) & 0xf; 707 u8 cond = (insn >> 28) & 0xf;
706 uint8_t is_load = (insn >> 20) & 0x1; 708 u8 is_load = (insn >> 20) & 0x1;
707 uint8_t write_back = (insn >> 21) & 0x1; 709 u8 write_back = (insn >> 21) & 0x1;
708 uint8_t is_immed = (insn >> 22) & 0x1; 710 u8 is_immed = (insn >> 22) & 0x1;
709 uint8_t is_up = (insn >> 23) & 0x1; 711 u8 is_up = (insn >> 23) & 0x1;
710 uint8_t is_pre = (insn >> 24) & 0x1; 712 u8 is_pre = (insn >> 24) & 0x1;
711 uint8_t rn = (insn >> 16) & 0xf; 713 u8 rn = (insn >> 16) & 0xf;
712 uint8_t rd = (insn >> 12) & 0xf; 714 u8 rd = (insn >> 12) & 0xf;
713 uint8_t bits_65 = (insn >> 5) & 0x3; 715 u8 bits_65 = (insn >> 5) & 0x3;
714 uint8_t rm = insn & 0xf; 716 u8 rm = insn & 0xf;
715 uint8_t offset = (((insn >> 8) & 0xf) << 4) | (insn & 0xf); 717 u8 offset = (((insn >> 8) & 0xf) << 4) | (insn & 0xf);
716 718
717 const char *opname = "ldr"; 719 const char *opname = "ldr";
718 if (is_load == 0) 720 if (is_load == 0)
@@ -756,78 +758,78 @@ std::string ARM_Disasm::DisassembleMemHalf(uint32_t insn)
756 } 758 }
757} 759}
758 760
759std::string ARM_Disasm::DisassembleMCR(Opcode opcode, uint32_t insn) 761std::string ARM_Disasm::DisassembleMCR(Opcode opcode, u32 insn)
760{ 762{
761 uint8_t cond = (insn >> 28) & 0xf; 763 u8 cond = (insn >> 28) & 0xf;
762 uint8_t crn = (insn >> 16) & 0xf; 764 u8 crn = (insn >> 16) & 0xf;
763 uint8_t crd = (insn >> 12) & 0xf; 765 u8 crd = (insn >> 12) & 0xf;
764 uint8_t cpnum = (insn >> 8) & 0xf; 766 u8 cpnum = (insn >> 8) & 0xf;
765 uint8_t opcode2 = (insn >> 5) & 0x7; 767 u8 opcode2 = (insn >> 5) & 0x7;
766 uint8_t crm = insn & 0xf; 768 u8 crm = insn & 0xf;
767 769
768 const char *opname = opcode_names[opcode]; 770 const char *opname = opcode_names[opcode];
769 return Common::StringFromFormat("%s%s\t%d, 0, r%d, cr%d, cr%d, {%d}", 771 return Common::StringFromFormat("%s%s\t%d, 0, r%d, cr%d, cr%d, {%d}",
770 opname, cond_to_str(cond), cpnum, crd, crn, crm, opcode2); 772 opname, cond_to_str(cond), cpnum, crd, crn, crm, opcode2);
771} 773}
772 774
773std::string ARM_Disasm::DisassembleMLA(Opcode opcode, uint32_t insn) 775std::string ARM_Disasm::DisassembleMLA(Opcode opcode, u32 insn)
774{ 776{
775 uint8_t cond = (insn >> 28) & 0xf; 777 u8 cond = (insn >> 28) & 0xf;
776 uint8_t rd = (insn >> 16) & 0xf; 778 u8 rd = (insn >> 16) & 0xf;
777 uint8_t rn = (insn >> 12) & 0xf; 779 u8 rn = (insn >> 12) & 0xf;
778 uint8_t rs = (insn >> 8) & 0xf; 780 u8 rs = (insn >> 8) & 0xf;
779 uint8_t rm = insn & 0xf; 781 u8 rm = insn & 0xf;
780 uint8_t bit_s = (insn >> 20) & 1; 782 u8 bit_s = (insn >> 20) & 1;
781 783
782 const char *opname = opcode_names[opcode]; 784 const char *opname = opcode_names[opcode];
783 return Common::StringFromFormat("%s%s%s\tr%d, r%d, r%d, r%d", 785 return Common::StringFromFormat("%s%s%s\tr%d, r%d, r%d, r%d",
784 opname, cond_to_str(cond), bit_s ? "s" : "", rd, rm, rs, rn); 786 opname, cond_to_str(cond), bit_s ? "s" : "", rd, rm, rs, rn);
785} 787}
786 788
787std::string ARM_Disasm::DisassembleUMLAL(Opcode opcode, uint32_t insn) 789std::string ARM_Disasm::DisassembleUMLAL(Opcode opcode, u32 insn)
788{ 790{
789 uint8_t cond = (insn >> 28) & 0xf; 791 u8 cond = (insn >> 28) & 0xf;
790 uint8_t rdhi = (insn >> 16) & 0xf; 792 u8 rdhi = (insn >> 16) & 0xf;
791 uint8_t rdlo = (insn >> 12) & 0xf; 793 u8 rdlo = (insn >> 12) & 0xf;
792 uint8_t rs = (insn >> 8) & 0xf; 794 u8 rs = (insn >> 8) & 0xf;
793 uint8_t rm = insn & 0xf; 795 u8 rm = insn & 0xf;
794 uint8_t bit_s = (insn >> 20) & 1; 796 u8 bit_s = (insn >> 20) & 1;
795 797
796 const char *opname = opcode_names[opcode]; 798 const char *opname = opcode_names[opcode];
797 return Common::StringFromFormat("%s%s%s\tr%d, r%d, r%d, r%d", 799 return Common::StringFromFormat("%s%s%s\tr%d, r%d, r%d, r%d",
798 opname, cond_to_str(cond), bit_s ? "s" : "", rdlo, rdhi, rm, rs); 800 opname, cond_to_str(cond), bit_s ? "s" : "", rdlo, rdhi, rm, rs);
799} 801}
800 802
801std::string ARM_Disasm::DisassembleMUL(Opcode opcode, uint32_t insn) 803std::string ARM_Disasm::DisassembleMUL(Opcode opcode, u32 insn)
802{ 804{
803 uint8_t cond = (insn >> 28) & 0xf; 805 u8 cond = (insn >> 28) & 0xf;
804 uint8_t rd = (insn >> 16) & 0xf; 806 u8 rd = (insn >> 16) & 0xf;
805 uint8_t rs = (insn >> 8) & 0xf; 807 u8 rs = (insn >> 8) & 0xf;
806 uint8_t rm = insn & 0xf; 808 u8 rm = insn & 0xf;
807 uint8_t bit_s = (insn >> 20) & 1; 809 u8 bit_s = (insn >> 20) & 1;
808 810
809 const char *opname = opcode_names[opcode]; 811 const char *opname = opcode_names[opcode];
810 return Common::StringFromFormat("%s%s%s\tr%d, r%d, r%d", 812 return Common::StringFromFormat("%s%s%s\tr%d, r%d, r%d",
811 opname, cond_to_str(cond), bit_s ? "s" : "", rd, rm, rs); 813 opname, cond_to_str(cond), bit_s ? "s" : "", rd, rm, rs);
812} 814}
813 815
814std::string ARM_Disasm::DisassembleMRS(uint32_t insn) 816std::string ARM_Disasm::DisassembleMRS(u32 insn)
815{ 817{
816 uint8_t cond = (insn >> 28) & 0xf; 818 u8 cond = (insn >> 28) & 0xf;
817 uint8_t rd = (insn >> 12) & 0xf; 819 u8 rd = (insn >> 12) & 0xf;
818 uint8_t ps = (insn >> 22) & 1; 820 u8 ps = (insn >> 22) & 1;
819 821
820 return Common::StringFromFormat("mrs%s\tr%d, %s", cond_to_str(cond), rd, ps ? "spsr" : "cpsr"); 822 return Common::StringFromFormat("mrs%s\tr%d, %s", cond_to_str(cond), rd, ps ? "spsr" : "cpsr");
821} 823}
822 824
823std::string ARM_Disasm::DisassembleMSR(uint32_t insn) 825std::string ARM_Disasm::DisassembleMSR(u32 insn)
824{ 826{
825 char flags[8]; 827 char flags[8];
826 int flag_index = 0; 828 int flag_index = 0;
827 uint8_t cond = (insn >> 28) & 0xf; 829 u8 cond = (insn >> 28) & 0xf;
828 uint8_t is_immed = (insn >> 25) & 0x1; 830 u8 is_immed = (insn >> 25) & 0x1;
829 uint8_t pd = (insn >> 22) & 1; 831 u8 pd = (insn >> 22) & 1;
830 uint8_t mask = (insn >> 16) & 0xf; 832 u8 mask = (insn >> 16) & 0xf;
831 833
832 if (mask & 1) 834 if (mask & 1)
833 flags[flag_index++] = 'c'; 835 flags[flag_index++] = 'c';
@@ -840,44 +842,44 @@ std::string ARM_Disasm::DisassembleMSR(uint32_t insn)
840 flags[flag_index] = 0; 842 flags[flag_index] = 0;
841 843
842 if (is_immed) { 844 if (is_immed) {
843 uint32_t immed = insn & 0xff; 845 u32 immed = insn & 0xff;
844 uint8_t rotate = (insn >> 8) & 0xf; 846 u8 rotate = (insn >> 8) & 0xf;
845 uint8_t rotate2 = rotate << 1; 847 u8 rotate2 = rotate << 1;
846 uint32_t rotated_val = (immed >> rotate2) | (immed << (32 - rotate2)); 848 u32 rotated_val = (immed >> rotate2) | (immed << (32 - rotate2));
847 return Common::StringFromFormat("msr%s\t%s_%s, #0x%x", 849 return Common::StringFromFormat("msr%s\t%s_%s, #0x%x",
848 cond_to_str(cond), pd ? "spsr" : "cpsr", flags, rotated_val); 850 cond_to_str(cond), pd ? "spsr" : "cpsr", flags, rotated_val);
849 } 851 }
850 852
851 uint8_t rm = insn & 0xf; 853 u8 rm = insn & 0xf;
852 854
853 return Common::StringFromFormat("msr%s\t%s_%s, r%d", 855 return Common::StringFromFormat("msr%s\t%s_%s, r%d",
854 cond_to_str(cond), pd ? "spsr" : "cpsr", flags, rm); 856 cond_to_str(cond), pd ? "spsr" : "cpsr", flags, rm);
855} 857}
856 858
857std::string ARM_Disasm::DisassembleNoOperands(Opcode opcode, uint32_t insn) 859std::string ARM_Disasm::DisassembleNoOperands(Opcode opcode, u32 insn)
858{ 860{
859 uint32_t cond = BITS(insn, 28, 31); 861 u32 cond = BITS(insn, 28, 31);
860 return Common::StringFromFormat("%s%s", opcode_names[opcode], cond_to_str(cond)); 862 return Common::StringFromFormat("%s%s", opcode_names[opcode], cond_to_str(cond));
861} 863}
862 864
863std::string ARM_Disasm::DisassembleParallelAddSub(Opcode opcode, uint32_t insn) { 865std::string ARM_Disasm::DisassembleParallelAddSub(Opcode opcode, u32 insn) {
864 uint32_t cond = BITS(insn, 28, 31); 866 u32 cond = BITS(insn, 28, 31);
865 uint32_t rn = BITS(insn, 16, 19); 867 u32 rn = BITS(insn, 16, 19);
866 uint32_t rd = BITS(insn, 12, 15); 868 u32 rd = BITS(insn, 12, 15);
867 uint32_t rm = BITS(insn, 0, 3); 869 u32 rm = BITS(insn, 0, 3);
868 870
869 return Common::StringFromFormat("%s%s\tr%u, r%u, r%u", opcode_names[opcode], cond_to_str(cond), 871 return Common::StringFromFormat("%s%s\tr%u, r%u, r%u", opcode_names[opcode], cond_to_str(cond),
870 rd, rn, rm); 872 rd, rn, rm);
871} 873}
872 874
873std::string ARM_Disasm::DisassemblePKH(uint32_t insn) 875std::string ARM_Disasm::DisassemblePKH(u32 insn)
874{ 876{
875 uint32_t cond = BITS(insn, 28, 31); 877 u32 cond = BITS(insn, 28, 31);
876 uint32_t rn = BITS(insn, 16, 19); 878 u32 rn = BITS(insn, 16, 19);
877 uint32_t rd = BITS(insn, 12, 15); 879 u32 rd = BITS(insn, 12, 15);
878 uint32_t imm5 = BITS(insn, 7, 11); 880 u32 imm5 = BITS(insn, 7, 11);
879 uint32_t tb = BIT(insn, 6); 881 u32 tb = BIT(insn, 6);
880 uint32_t rm = BITS(insn, 0, 3); 882 u32 rm = BITS(insn, 0, 3);
881 883
882 std::string suffix = tb ? "tb" : "bt"; 884 std::string suffix = tb ? "tb" : "bt";
883 std::string shift = ""; 885 std::string shift = "";
@@ -894,22 +896,22 @@ std::string ARM_Disasm::DisassemblePKH(uint32_t insn)
894 rd, rn, rm, shift.c_str()); 896 rd, rn, rm, shift.c_str());
895} 897}
896 898
897std::string ARM_Disasm::DisassemblePLD(uint32_t insn) 899std::string ARM_Disasm::DisassemblePLD(u32 insn)
898{ 900{
899 uint8_t is_reg = (insn >> 25) & 0x1; 901 u8 is_reg = (insn >> 25) & 0x1;
900 uint8_t is_up = (insn >> 23) & 0x1; 902 u8 is_up = (insn >> 23) & 0x1;
901 uint8_t rn = (insn >> 16) & 0xf; 903 u8 rn = (insn >> 16) & 0xf;
902 904
903 const char *minus = ""; 905 const char *minus = "";
904 if (is_up == 0) 906 if (is_up == 0)
905 minus = "-"; 907 minus = "-";
906 908
907 if (is_reg) { 909 if (is_reg) {
908 uint8_t rm = insn & 0xf; 910 u8 rm = insn & 0xf;
909 return Common::StringFromFormat("pld\t[r%d, %sr%d]", rn, minus, rm); 911 return Common::StringFromFormat("pld\t[r%d, %sr%d]", rn, minus, rm);
910 } 912 }
911 913
912 uint16_t offset = insn & 0xfff; 914 u16 offset = insn & 0xfff;
913 if (offset == 0) { 915 if (offset == 0) {
914 return Common::StringFromFormat("pld\t[r%d]", rn); 916 return Common::StringFromFormat("pld\t[r%d]", rn);
915 } else { 917 } else {
@@ -917,20 +919,20 @@ std::string ARM_Disasm::DisassemblePLD(uint32_t insn)
917 } 919 }
918} 920}
919 921
920std::string ARM_Disasm::DisassembleREV(Opcode opcode, uint32_t insn) { 922std::string ARM_Disasm::DisassembleREV(Opcode opcode, u32 insn) {
921 uint32_t cond = BITS(insn, 28, 31); 923 u32 cond = BITS(insn, 28, 31);
922 uint32_t rd = BITS(insn, 12, 15); 924 u32 rd = BITS(insn, 12, 15);
923 uint32_t rm = BITS(insn, 0, 3); 925 u32 rm = BITS(insn, 0, 3);
924 926
925 return Common::StringFromFormat("%s%s\tr%u, r%u", opcode_names[opcode], cond_to_str(cond), 927 return Common::StringFromFormat("%s%s\tr%u, r%u", opcode_names[opcode], cond_to_str(cond),
926 rd, rm); 928 rd, rm);
927} 929}
928 930
929std::string ARM_Disasm::DisassembleREX(Opcode opcode, uint32_t insn) { 931std::string ARM_Disasm::DisassembleREX(Opcode opcode, u32 insn) {
930 uint32_t rn = BITS(insn, 16, 19); 932 u32 rn = BITS(insn, 16, 19);
931 uint32_t rd = BITS(insn, 12, 15); 933 u32 rd = BITS(insn, 12, 15);
932 uint32_t rt = BITS(insn, 0, 3); 934 u32 rt = BITS(insn, 0, 3);
933 uint32_t cond = BITS(insn, 28, 31); 935 u32 cond = BITS(insn, 28, 31);
934 936
935 switch (opcode) { 937 switch (opcode) {
936 case OP_STREX: 938 case OP_STREX:
@@ -956,13 +958,13 @@ std::string ARM_Disasm::DisassembleREX(Opcode opcode, uint32_t insn) {
956 } 958 }
957} 959}
958 960
959std::string ARM_Disasm::DisassembleSAT(Opcode opcode, uint32_t insn) { 961std::string ARM_Disasm::DisassembleSAT(Opcode opcode, u32 insn) {
960 uint32_t cond = BITS(insn, 28, 31); 962 u32 cond = BITS(insn, 28, 31);
961 uint32_t sat_imm = BITS(insn, 16, 20); 963 u32 sat_imm = BITS(insn, 16, 20);
962 uint32_t rd = BITS(insn, 12, 15); 964 u32 rd = BITS(insn, 12, 15);
963 uint32_t imm5 = BITS(insn, 7, 11); 965 u32 imm5 = BITS(insn, 7, 11);
964 uint32_t sh = BIT(insn, 6); 966 u32 sh = BIT(insn, 6);
965 uint32_t rn = BITS(insn, 0, 3); 967 u32 rn = BITS(insn, 0, 3);
966 968
967 std::string shift_part = ""; 969 std::string shift_part = "";
968 bool opcode_has_shift = (opcode == OP_SSAT) || (opcode == OP_USAT); 970 bool opcode_has_shift = (opcode == OP_SSAT) || (opcode == OP_USAT);
@@ -984,42 +986,42 @@ std::string ARM_Disasm::DisassembleSAT(Opcode opcode, uint32_t insn) {
984 sat_imm, rn, shift_part.c_str()); 986 sat_imm, rn, shift_part.c_str());
985} 987}
986 988
987std::string ARM_Disasm::DisassembleSEL(uint32_t insn) { 989std::string ARM_Disasm::DisassembleSEL(u32 insn) {
988 uint32_t cond = BITS(insn, 28, 31); 990 u32 cond = BITS(insn, 28, 31);
989 uint32_t rn = BITS(insn, 16, 19); 991 u32 rn = BITS(insn, 16, 19);
990 uint32_t rd = BITS(insn, 12, 15); 992 u32 rd = BITS(insn, 12, 15);
991 uint32_t rm = BITS(insn, 0, 3); 993 u32 rm = BITS(insn, 0, 3);
992 994
993 return Common::StringFromFormat("%s%s\tr%u, r%u, r%u", opcode_names[OP_SEL], cond_to_str(cond), 995 return Common::StringFromFormat("%s%s\tr%u, r%u, r%u", opcode_names[OP_SEL], cond_to_str(cond),
994 rd, rn, rm); 996 rd, rn, rm);
995} 997}
996 998
997std::string ARM_Disasm::DisassembleSWI(uint32_t insn) 999std::string ARM_Disasm::DisassembleSWI(u32 insn)
998{ 1000{
999 uint8_t cond = (insn >> 28) & 0xf; 1001 u8 cond = (insn >> 28) & 0xf;
1000 uint32_t sysnum = insn & 0x00ffffff; 1002 u32 sysnum = insn & 0x00ffffff;
1001 1003
1002 return Common::StringFromFormat("swi%s 0x%x", cond_to_str(cond), sysnum); 1004 return Common::StringFromFormat("swi%s 0x%x", cond_to_str(cond), sysnum);
1003} 1005}
1004 1006
1005std::string ARM_Disasm::DisassembleSWP(Opcode opcode, uint32_t insn) 1007std::string ARM_Disasm::DisassembleSWP(Opcode opcode, u32 insn)
1006{ 1008{
1007 uint8_t cond = (insn >> 28) & 0xf; 1009 u8 cond = (insn >> 28) & 0xf;
1008 uint8_t rn = (insn >> 16) & 0xf; 1010 u8 rn = (insn >> 16) & 0xf;
1009 uint8_t rd = (insn >> 12) & 0xf; 1011 u8 rd = (insn >> 12) & 0xf;
1010 uint8_t rm = insn & 0xf; 1012 u8 rm = insn & 0xf;
1011 1013
1012 const char *opname = opcode_names[opcode]; 1014 const char *opname = opcode_names[opcode];
1013 return Common::StringFromFormat("%s%s\tr%d, r%d, [r%d]", opname, cond_to_str(cond), rd, rm, rn); 1015 return Common::StringFromFormat("%s%s\tr%d, r%d, [r%d]", opname, cond_to_str(cond), rd, rm, rn);
1014} 1016}
1015 1017
1016std::string ARM_Disasm::DisassembleXT(Opcode opcode, uint32_t insn) 1018std::string ARM_Disasm::DisassembleXT(Opcode opcode, u32 insn)
1017{ 1019{
1018 uint32_t cond = BITS(insn, 28, 31); 1020 u32 cond = BITS(insn, 28, 31);
1019 uint32_t rn = BITS(insn, 16, 19); 1021 u32 rn = BITS(insn, 16, 19);
1020 uint32_t rd = BITS(insn, 12, 15); 1022 u32 rd = BITS(insn, 12, 15);
1021 uint32_t rotate = BITS(insn, 10, 11); 1023 u32 rotate = BITS(insn, 10, 11);
1022 uint32_t rm = BITS(insn, 0, 3); 1024 u32 rm = BITS(insn, 0, 3);
1023 1025
1024 std::string rn_part = ""; 1026 std::string rn_part = "";
1025 static std::unordered_set<Opcode, std::hash<int>> extend_with_add = { 1027 static std::unordered_set<Opcode, std::hash<int>> extend_with_add = {
@@ -1037,8 +1039,8 @@ std::string ARM_Disasm::DisassembleXT(Opcode opcode, uint32_t insn)
1037 rd, rn_part.c_str(), rm, rotate_part.c_str()); 1039 rd, rn_part.c_str(), rm, rotate_part.c_str());
1038} 1040}
1039 1041
1040Opcode ARM_Disasm::Decode(uint32_t insn) { 1042Opcode ARM_Disasm::Decode(u32 insn) {
1041 uint32_t bits27_26 = (insn >> 26) & 0x3; 1043 u32 bits27_26 = (insn >> 26) & 0x3;
1042 switch (bits27_26) { 1044 switch (bits27_26) {
1043 case 0x0: 1045 case 0x0:
1044 return Decode00(insn); 1046 return Decode00(insn);
@@ -1052,9 +1054,9 @@ Opcode ARM_Disasm::Decode(uint32_t insn) {
1052 return OP_INVALID; 1054 return OP_INVALID;
1053} 1055}
1054 1056
1055Opcode ARM_Disasm::Decode00(uint32_t insn) { 1057Opcode ARM_Disasm::Decode00(u32 insn) {
1056 uint8_t bit25 = (insn >> 25) & 0x1; 1058 u8 bit25 = (insn >> 25) & 0x1;
1057 uint8_t bit4 = (insn >> 4) & 0x1; 1059 u8 bit4 = (insn >> 4) & 0x1;
1058 if (bit25 == 0 && bit4 == 1) { 1060 if (bit25 == 0 && bit4 == 1) {
1059 if ((insn & 0x0ffffff0) == 0x012fff10) { 1061 if ((insn & 0x0ffffff0) == 0x012fff10) {
1060 // Bx instruction 1062 // Bx instruction
@@ -1068,9 +1070,9 @@ Opcode ARM_Disasm::Decode00(uint32_t insn) {
1068 // Bkpt instruction 1070 // Bkpt instruction
1069 return OP_BKPT; 1071 return OP_BKPT;
1070 } 1072 }
1071 uint32_t bits7_4 = (insn >> 4) & 0xf; 1073 u32 bits7_4 = (insn >> 4) & 0xf;
1072 if (bits7_4 == 0x9) { 1074 if (bits7_4 == 0x9) {
1073 uint32_t bit24 = BIT(insn, 24); 1075 u32 bit24 = BIT(insn, 24);
1074 if (bit24) { 1076 if (bit24) {
1075 return DecodeSyncPrimitive(insn); 1077 return DecodeSyncPrimitive(insn);
1076 } 1078 }
@@ -1078,14 +1080,14 @@ Opcode ARM_Disasm::Decode00(uint32_t insn) {
1078 return DecodeMUL(insn); 1080 return DecodeMUL(insn);
1079 } 1081 }
1080 1082
1081 uint8_t bit7 = (insn >> 7) & 0x1; 1083 u8 bit7 = (insn >> 7) & 0x1;
1082 if (bit7 == 1) { 1084 if (bit7 == 1) {
1083 // One of the load/store halfword/byte instructions 1085 // One of the load/store halfword/byte instructions
1084 return DecodeLDRH(insn); 1086 return DecodeLDRH(insn);
1085 } 1087 }
1086 } 1088 }
1087 1089
1088 uint32_t op1 = BITS(insn, 20, 24); 1090 u32 op1 = BITS(insn, 20, 24);
1089 if (bit25 && (op1 == 0x12 || op1 == 0x16)) { 1091 if (bit25 && (op1 == 0x12 || op1 == 0x16)) {
1090 // One of the MSR (immediate) and hints instructions 1092 // One of the MSR (immediate) and hints instructions
1091 return DecodeMSRImmAndHints(insn); 1093 return DecodeMSRImmAndHints(insn);
@@ -1095,13 +1097,13 @@ Opcode ARM_Disasm::Decode00(uint32_t insn) {
1095 return DecodeALU(insn); 1097 return DecodeALU(insn);
1096} 1098}
1097 1099
1098Opcode ARM_Disasm::Decode01(uint32_t insn) { 1100Opcode ARM_Disasm::Decode01(u32 insn) {
1099 uint8_t is_reg = (insn >> 25) & 0x1; 1101 u8 is_reg = (insn >> 25) & 0x1;
1100 uint8_t bit4 = (insn >> 4) & 0x1; 1102 u8 bit4 = (insn >> 4) & 0x1;
1101 if (is_reg == 1 && bit4 == 1) 1103 if (is_reg == 1 && bit4 == 1)
1102 return DecodeMedia(insn); 1104 return DecodeMedia(insn);
1103 uint8_t is_load = (insn >> 20) & 0x1; 1105 u8 is_load = (insn >> 20) & 0x1;
1104 uint8_t is_byte = (insn >> 22) & 0x1; 1106 u8 is_byte = (insn >> 22) & 0x1;
1105 if ((insn & 0xfd70f000) == 0xf550f000) { 1107 if ((insn & 0xfd70f000) == 0xf550f000) {
1106 // Pre-load 1108 // Pre-load
1107 return OP_PLD; 1109 return OP_PLD;
@@ -1126,11 +1128,11 @@ Opcode ARM_Disasm::Decode01(uint32_t insn) {
1126 return OP_STR; 1128 return OP_STR;
1127} 1129}
1128 1130
1129Opcode ARM_Disasm::Decode10(uint32_t insn) { 1131Opcode ARM_Disasm::Decode10(u32 insn) {
1130 uint8_t bit25 = (insn >> 25) & 0x1; 1132 u8 bit25 = (insn >> 25) & 0x1;
1131 if (bit25 == 0) { 1133 if (bit25 == 0) {
1132 // LDM/STM 1134 // LDM/STM
1133 uint8_t is_load = (insn >> 20) & 0x1; 1135 u8 is_load = (insn >> 20) & 0x1;
1134 if (is_load) 1136 if (is_load)
1135 return OP_LDM; 1137 return OP_LDM;
1136 return OP_STM; 1138 return OP_STM;
@@ -1143,11 +1145,11 @@ Opcode ARM_Disasm::Decode10(uint32_t insn) {
1143 return OP_B; 1145 return OP_B;
1144} 1146}
1145 1147
1146Opcode ARM_Disasm::Decode11(uint32_t insn) { 1148Opcode ARM_Disasm::Decode11(u32 insn) {
1147 uint8_t bit25 = (insn >> 25) & 0x1; 1149 u8 bit25 = (insn >> 25) & 0x1;
1148 if (bit25 == 0) { 1150 if (bit25 == 0) {
1149 // LDC, SDC 1151 // LDC, SDC
1150 uint8_t is_load = (insn >> 20) & 0x1; 1152 u8 is_load = (insn >> 20) & 0x1;
1151 if (is_load) { 1153 if (is_load) {
1152 // LDC 1154 // LDC
1153 return OP_LDC; 1155 return OP_LDC;
@@ -1156,18 +1158,18 @@ Opcode ARM_Disasm::Decode11(uint32_t insn) {
1156 return OP_STC; 1158 return OP_STC;
1157 } 1159 }
1158 1160
1159 uint8_t bit24 = (insn >> 24) & 0x1; 1161 u8 bit24 = (insn >> 24) & 0x1;
1160 if (bit24 == 0x1) { 1162 if (bit24 == 0x1) {
1161 // SWI 1163 // SWI
1162 return OP_SWI; 1164 return OP_SWI;
1163 } 1165 }
1164 1166
1165 uint8_t bit4 = (insn >> 4) & 0x1; 1167 u8 bit4 = (insn >> 4) & 0x1;
1166 uint8_t cpnum = (insn >> 8) & 0xf; 1168 u8 cpnum = (insn >> 8) & 0xf;
1167 1169
1168 if (cpnum == 15) { 1170 if (cpnum == 15) {
1169 // Special case for coprocessor 15 1171 // Special case for coprocessor 15
1170 uint8_t opcode = (insn >> 21) & 0x7; 1172 u8 opcode = (insn >> 21) & 0x7;
1171 if (bit4 == 0 || opcode != 0) { 1173 if (bit4 == 0 || opcode != 0) {
1172 // This is an unexpected bit pattern. Create an undefined 1174 // This is an unexpected bit pattern. Create an undefined
1173 // instruction in case this is ever executed. 1175 // instruction in case this is ever executed.
@@ -1175,7 +1177,7 @@ Opcode ARM_Disasm::Decode11(uint32_t insn) {
1175 } 1177 }
1176 1178
1177 // MRC, MCR 1179 // MRC, MCR
1178 uint8_t is_mrc = (insn >> 20) & 0x1; 1180 u8 is_mrc = (insn >> 20) & 0x1;
1179 if (is_mrc) 1181 if (is_mrc)
1180 return OP_MRC; 1182 return OP_MRC;
1181 return OP_MCR; 1183 return OP_MCR;
@@ -1186,15 +1188,15 @@ Opcode ARM_Disasm::Decode11(uint32_t insn) {
1186 return OP_CDP; 1188 return OP_CDP;
1187 } 1189 }
1188 // MRC, MCR 1190 // MRC, MCR
1189 uint8_t is_mrc = (insn >> 20) & 0x1; 1191 u8 is_mrc = (insn >> 20) & 0x1;
1190 if (is_mrc) 1192 if (is_mrc)
1191 return OP_MRC; 1193 return OP_MRC;
1192 return OP_MCR; 1194 return OP_MCR;
1193} 1195}
1194 1196
1195Opcode ARM_Disasm::DecodeSyncPrimitive(uint32_t insn) { 1197Opcode ARM_Disasm::DecodeSyncPrimitive(u32 insn) {
1196 uint32_t op = BITS(insn, 20, 23); 1198 u32 op = BITS(insn, 20, 23);
1197 uint32_t bit22 = BIT(insn, 22); 1199 u32 bit22 = BIT(insn, 22);
1198 switch (op) { 1200 switch (op) {
1199 case 0x0: 1201 case 0x0:
1200 if (bit22) 1202 if (bit22)
@@ -1221,10 +1223,10 @@ Opcode ARM_Disasm::DecodeSyncPrimitive(uint32_t insn) {
1221 } 1223 }
1222} 1224}
1223 1225
1224Opcode ARM_Disasm::DecodeParallelAddSub(uint32_t insn) { 1226Opcode ARM_Disasm::DecodeParallelAddSub(u32 insn) {
1225 uint32_t op1 = BITS(insn, 20, 21); 1227 u32 op1 = BITS(insn, 20, 21);
1226 uint32_t op2 = BITS(insn, 5, 7); 1228 u32 op2 = BITS(insn, 5, 7);
1227 uint32_t is_unsigned = BIT(insn, 22); 1229 u32 is_unsigned = BIT(insn, 22);
1228 1230
1229 if (op1 == 0x0 || op2 == 0x5 || op2 == 0x6) 1231 if (op1 == 0x0 || op2 == 0x5 || op2 == 0x6)
1230 return OP_UNDEFINED; 1232 return OP_UNDEFINED;
@@ -1260,14 +1262,14 @@ Opcode ARM_Disasm::DecodeParallelAddSub(uint32_t insn) {
1260 OP_SHSUB8, OP_UHSUB8 1262 OP_SHSUB8, OP_UHSUB8
1261 }; 1263 };
1262 1264
1263 uint32_t opcode_index = op1 * 12 + op2 * 2 + is_unsigned; 1265 u32 opcode_index = op1 * 12 + op2 * 2 + is_unsigned;
1264 return opcodes[opcode_index]; 1266 return opcodes[opcode_index];
1265} 1267}
1266 1268
1267Opcode ARM_Disasm::DecodePackingSaturationReversal(uint32_t insn) { 1269Opcode ARM_Disasm::DecodePackingSaturationReversal(u32 insn) {
1268 uint32_t op1 = BITS(insn, 20, 22); 1270 u32 op1 = BITS(insn, 20, 22);
1269 uint32_t a = BITS(insn, 16, 19); 1271 u32 a = BITS(insn, 16, 19);
1270 uint32_t op2 = BITS(insn, 5, 7); 1272 u32 op2 = BITS(insn, 5, 7);
1271 1273
1272 switch (op1) { 1274 switch (op1) {
1273 case 0x0: 1275 case 0x0:
@@ -1335,16 +1337,16 @@ Opcode ARM_Disasm::DecodePackingSaturationReversal(uint32_t insn) {
1335 return OP_UNDEFINED; 1337 return OP_UNDEFINED;
1336} 1338}
1337 1339
1338Opcode ARM_Disasm::DecodeMUL(uint32_t insn) { 1340Opcode ARM_Disasm::DecodeMUL(u32 insn) {
1339 uint8_t bit24 = (insn >> 24) & 0x1; 1341 u8 bit24 = (insn >> 24) & 0x1;
1340 if (bit24 != 0) { 1342 if (bit24 != 0) {
1341 // This is an unexpected bit pattern. Create an undefined 1343 // This is an unexpected bit pattern. Create an undefined
1342 // instruction in case this is ever executed. 1344 // instruction in case this is ever executed.
1343 return OP_UNDEFINED; 1345 return OP_UNDEFINED;
1344 } 1346 }
1345 uint8_t bit23 = (insn >> 23) & 0x1; 1347 u8 bit23 = (insn >> 23) & 0x1;
1346 uint8_t bit22_U = (insn >> 22) & 0x1; 1348 u8 bit22_U = (insn >> 22) & 0x1;
1347 uint8_t bit21_A = (insn >> 21) & 0x1; 1349 u8 bit21_A = (insn >> 21) & 0x1;
1348 if (bit23 == 0) { 1350 if (bit23 == 0) {
1349 // 32-bit multiply 1351 // 32-bit multiply
1350 if (bit22_U != 0) { 1352 if (bit22_U != 0) {
@@ -1369,10 +1371,10 @@ Opcode ARM_Disasm::DecodeMUL(uint32_t insn) {
1369 return OP_SMLAL; 1371 return OP_SMLAL;
1370} 1372}
1371 1373
1372Opcode ARM_Disasm::DecodeMSRImmAndHints(uint32_t insn) { 1374Opcode ARM_Disasm::DecodeMSRImmAndHints(u32 insn) {
1373 uint32_t op = BIT(insn, 22); 1375 u32 op = BIT(insn, 22);
1374 uint32_t op1 = BITS(insn, 16, 19); 1376 u32 op1 = BITS(insn, 16, 19);
1375 uint32_t op2 = BITS(insn, 0, 7); 1377 u32 op2 = BITS(insn, 0, 7);
1376 1378
1377 if (op == 0 && op1 == 0) { 1379 if (op == 0 && op1 == 0) {
1378 switch (op2) { 1380 switch (op2) {
@@ -1394,10 +1396,10 @@ Opcode ARM_Disasm::DecodeMSRImmAndHints(uint32_t insn) {
1394 return OP_MSR; 1396 return OP_MSR;
1395} 1397}
1396 1398
1397Opcode ARM_Disasm::DecodeMediaMulDiv(uint32_t insn) { 1399Opcode ARM_Disasm::DecodeMediaMulDiv(u32 insn) {
1398 uint32_t op1 = BITS(insn, 20, 22); 1400 u32 op1 = BITS(insn, 20, 22);
1399 uint32_t op2_h = BITS(insn, 6, 7); 1401 u32 op2_h = BITS(insn, 6, 7);
1400 uint32_t a = BITS(insn, 12, 15); 1402 u32 a = BITS(insn, 12, 15);
1401 1403
1402 switch (op1) { 1404 switch (op1) {
1403 case 0x0: 1405 case 0x0:
@@ -1436,10 +1438,10 @@ Opcode ARM_Disasm::DecodeMediaMulDiv(uint32_t insn) {
1436 return OP_UNDEFINED; 1438 return OP_UNDEFINED;
1437} 1439}
1438 1440
1439Opcode ARM_Disasm::DecodeMedia(uint32_t insn) { 1441Opcode ARM_Disasm::DecodeMedia(u32 insn) {
1440 uint32_t op1 = BITS(insn, 20, 24); 1442 u32 op1 = BITS(insn, 20, 24);
1441 uint32_t rd = BITS(insn, 12, 15); 1443 u32 rd = BITS(insn, 12, 15);
1442 uint32_t op2 = BITS(insn, 5, 7); 1444 u32 op2 = BITS(insn, 5, 7);
1443 1445
1444 switch (BITS(op1, 3, 4)) { 1446 switch (BITS(op1, 3, 4)) {
1445 case 0x0: 1447 case 0x0:
@@ -1464,9 +1466,9 @@ Opcode ARM_Disasm::DecodeMedia(uint32_t insn) {
1464 return OP_UNDEFINED; 1466 return OP_UNDEFINED;
1465} 1467}
1466 1468
1467Opcode ARM_Disasm::DecodeLDRH(uint32_t insn) { 1469Opcode ARM_Disasm::DecodeLDRH(u32 insn) {
1468 uint8_t is_load = (insn >> 20) & 0x1; 1470 u8 is_load = (insn >> 20) & 0x1;
1469 uint8_t bits_65 = (insn >> 5) & 0x3; 1471 u8 bits_65 = (insn >> 5) & 0x3;
1470 if (is_load) { 1472 if (is_load) {
1471 if (bits_65 == 0x1) { 1473 if (bits_65 == 0x1) {
1472 // Load unsigned halfword 1474 // Load unsigned halfword
@@ -1494,12 +1496,12 @@ Opcode ARM_Disasm::DecodeLDRH(uint32_t insn) {
1494 return OP_STRH; 1496 return OP_STRH;
1495} 1497}
1496 1498
1497Opcode ARM_Disasm::DecodeALU(uint32_t insn) { 1499Opcode ARM_Disasm::DecodeALU(u32 insn) {
1498 uint8_t is_immed = (insn >> 25) & 0x1; 1500 u8 is_immed = (insn >> 25) & 0x1;
1499 uint8_t opcode = (insn >> 21) & 0xf; 1501 u8 opcode = (insn >> 21) & 0xf;
1500 uint8_t bit_s = (insn >> 20) & 1; 1502 u8 bit_s = (insn >> 20) & 1;
1501 uint8_t shift_is_reg = (insn >> 4) & 1; 1503 u8 shift_is_reg = (insn >> 4) & 1;
1502 uint8_t bit7 = (insn >> 7) & 1; 1504 u8 bit7 = (insn >> 7) & 1;
1503 if (!is_immed && shift_is_reg && (bit7 != 0)) { 1505 if (!is_immed && shift_is_reg && (bit7 != 0)) {
1504 // This is an unexpected bit pattern. Create an undefined 1506 // This is an unexpected bit pattern. Create an undefined
1505 // instruction in case this is ever executed. 1507 // instruction in case this is ever executed.
diff --git a/src/core/arm/disassembler/arm_disasm.h b/src/core/arm/disassembler/arm_disasm.h
index 259a77861..53d9c6a74 100644
--- a/src/core/arm/disassembler/arm_disasm.h
+++ b/src/core/arm/disassembler/arm_disasm.h
@@ -2,9 +2,10 @@
2 2
3#pragma once 3#pragma once
4 4
5#include <cstdint>
6#include <string> 5#include <string>
7 6
7#include "common/common_types.h"
8
8// Note: this list of opcodes must match the list used to initialize 9// Note: this list of opcodes must match the list used to initialize
9// the opflags[] array in opcode.cpp. 10// the opflags[] array in opcode.cpp.
10enum Opcode { 11enum Opcode {
@@ -191,48 +192,48 @@ enum Opcode {
191 192
192class ARM_Disasm { 193class ARM_Disasm {
193 public: 194 public:
194 static std::string Disassemble(uint32_t addr, uint32_t insn); 195 static std::string Disassemble(u32 addr, u32 insn);
195 static Opcode Decode(uint32_t insn); 196 static Opcode Decode(u32 insn);
196 197
197 private: 198 private:
198 static Opcode Decode00(uint32_t insn); 199 static Opcode Decode00(u32 insn);
199 static Opcode Decode01(uint32_t insn); 200 static Opcode Decode01(u32 insn);
200 static Opcode Decode10(uint32_t insn); 201 static Opcode Decode10(u32 insn);
201 static Opcode Decode11(uint32_t insn); 202 static Opcode Decode11(u32 insn);
202 static Opcode DecodeSyncPrimitive(uint32_t insn); 203 static Opcode DecodeSyncPrimitive(u32 insn);
203 static Opcode DecodeParallelAddSub(uint32_t insn); 204 static Opcode DecodeParallelAddSub(u32 insn);
204 static Opcode DecodePackingSaturationReversal(uint32_t insn); 205 static Opcode DecodePackingSaturationReversal(u32 insn);
205 static Opcode DecodeMUL(uint32_t insn); 206 static Opcode DecodeMUL(u32 insn);
206 static Opcode DecodeMSRImmAndHints(uint32_t insn); 207 static Opcode DecodeMSRImmAndHints(u32 insn);
207 static Opcode DecodeMediaMulDiv(uint32_t insn); 208 static Opcode DecodeMediaMulDiv(u32 insn);
208 static Opcode DecodeMedia(uint32_t insn); 209 static Opcode DecodeMedia(u32 insn);
209 static Opcode DecodeLDRH(uint32_t insn); 210 static Opcode DecodeLDRH(u32 insn);
210 static Opcode DecodeALU(uint32_t insn); 211 static Opcode DecodeALU(u32 insn);
211 212
212 static std::string DisassembleALU(Opcode opcode, uint32_t insn); 213 static std::string DisassembleALU(Opcode opcode, u32 insn);
213 static std::string DisassembleBranch(uint32_t addr, Opcode opcode, uint32_t insn); 214 static std::string DisassembleBranch(u32 addr, Opcode opcode, u32 insn);
214 static std::string DisassembleBX(uint32_t insn); 215 static std::string DisassembleBX(u32 insn);
215 static std::string DisassembleBKPT(uint32_t insn); 216 static std::string DisassembleBKPT(u32 insn);
216 static std::string DisassembleCLZ(uint32_t insn); 217 static std::string DisassembleCLZ(u32 insn);
217 static std::string DisassembleMediaMulDiv(Opcode opcode, uint32_t insn); 218 static std::string DisassembleMediaMulDiv(Opcode opcode, u32 insn);
218 static std::string DisassembleMemblock(Opcode opcode, uint32_t insn); 219 static std::string DisassembleMemblock(Opcode opcode, u32 insn);
219 static std::string DisassembleMem(uint32_t insn); 220 static std::string DisassembleMem(u32 insn);
220 static std::string DisassembleMemHalf(uint32_t insn); 221 static std::string DisassembleMemHalf(u32 insn);
221 static std::string DisassembleMCR(Opcode opcode, uint32_t insn); 222 static std::string DisassembleMCR(Opcode opcode, u32 insn);
222 static std::string DisassembleMLA(Opcode opcode, uint32_t insn); 223 static std::string DisassembleMLA(Opcode opcode, u32 insn);
223 static std::string DisassembleUMLAL(Opcode opcode, uint32_t insn); 224 static std::string DisassembleUMLAL(Opcode opcode, u32 insn);
224 static std::string DisassembleMUL(Opcode opcode, uint32_t insn); 225 static std::string DisassembleMUL(Opcode opcode, u32 insn);
225 static std::string DisassembleMRS(uint32_t insn); 226 static std::string DisassembleMRS(u32 insn);
226 static std::string DisassembleMSR(uint32_t insn); 227 static std::string DisassembleMSR(u32 insn);
227 static std::string DisassembleNoOperands(Opcode opcode, uint32_t insn); 228 static std::string DisassembleNoOperands(Opcode opcode, u32 insn);
228 static std::string DisassembleParallelAddSub(Opcode opcode, uint32_t insn); 229 static std::string DisassembleParallelAddSub(Opcode opcode, u32 insn);
229 static std::string DisassemblePKH(uint32_t insn); 230 static std::string DisassemblePKH(u32 insn);
230 static std::string DisassemblePLD(uint32_t insn); 231 static std::string DisassemblePLD(u32 insn);
231 static std::string DisassembleREV(Opcode opcode, uint32_t insn); 232 static std::string DisassembleREV(Opcode opcode, u32 insn);
232 static std::string DisassembleREX(Opcode opcode, uint32_t insn); 233 static std::string DisassembleREX(Opcode opcode, u32 insn);
233 static std::string DisassembleSAT(Opcode opcode, uint32_t insn); 234 static std::string DisassembleSAT(Opcode opcode, u32 insn);
234 static std::string DisassembleSEL(uint32_t insn); 235 static std::string DisassembleSEL(u32 insn);
235 static std::string DisassembleSWI(uint32_t insn); 236 static std::string DisassembleSWI(u32 insn);
236 static std::string DisassembleSWP(Opcode opcode, uint32_t insn); 237 static std::string DisassembleSWP(Opcode opcode, u32 insn);
237 static std::string DisassembleXT(Opcode opcode, uint32_t insn); 238 static std::string DisassembleXT(Opcode opcode, u32 insn);
238}; 239};