diff options
| author | 2016-06-10 19:02:02 -0700 | |
|---|---|---|
| committer | 2016-06-12 01:54:45 -0700 | |
| commit | ca20b1f87d87bd7059c90cfe064b4da4eae33199 (patch) | |
| tree | d0435a5c4bb74316a6e71ff4ffb79f2d9e7de9e7 | |
| parent | arm_dyncom_interpreter: slightly change AllocBuffer to be intuitive (diff) | |
| download | yuzu-ca20b1f87d87bd7059c90cfe064b4da4eae33199.tar.gz yuzu-ca20b1f87d87bd7059c90cfe064b4da4eae33199.tar.xz yuzu-ca20b1f87d87bd7059c90cfe064b4da4eae33199.zip | |
Make arm_dyncom_trans* into a fully fledged compilation unit
Diffstat (limited to '')
| -rw-r--r-- | src/core/CMakeLists.txt | 2 | ||||
| -rw-r--r-- | src/core/arm/dyncom/arm_dyncom_interpreter.cpp | 48 | ||||
| -rw-r--r-- | src/core/arm/dyncom/arm_dyncom_trans.cpp (renamed from src/core/arm/dyncom/arm_dyncom_trans.inc) | 41 | ||||
| -rw-r--r-- | src/core/arm/dyncom/arm_dyncom_trans.h (renamed from src/core/arm/dyncom/arm_dyncom_trans_struct.inc) | 35 |
4 files changed, 73 insertions, 53 deletions
diff --git a/src/core/CMakeLists.txt b/src/core/CMakeLists.txt index e9b04098b..f356e4b48 100644 --- a/src/core/CMakeLists.txt +++ b/src/core/CMakeLists.txt | |||
| @@ -5,6 +5,7 @@ set(SRCS | |||
| 5 | arm/dyncom/arm_dyncom_dec.cpp | 5 | arm/dyncom/arm_dyncom_dec.cpp |
| 6 | arm/dyncom/arm_dyncom_interpreter.cpp | 6 | arm/dyncom/arm_dyncom_interpreter.cpp |
| 7 | arm/dyncom/arm_dyncom_thumb.cpp | 7 | arm/dyncom/arm_dyncom_thumb.cpp |
| 8 | arm/dyncom/arm_dyncom_trans.cpp | ||
| 8 | arm/skyeye_common/armstate.cpp | 9 | arm/skyeye_common/armstate.cpp |
| 9 | arm/skyeye_common/armsupp.cpp | 10 | arm/skyeye_common/armsupp.cpp |
| 10 | arm/skyeye_common/vfp/vfp.cpp | 11 | arm/skyeye_common/vfp/vfp.cpp |
| @@ -140,6 +141,7 @@ set(HEADERS | |||
| 140 | arm/dyncom/arm_dyncom_interpreter.h | 141 | arm/dyncom/arm_dyncom_interpreter.h |
| 141 | arm/dyncom/arm_dyncom_run.h | 142 | arm/dyncom/arm_dyncom_run.h |
| 142 | arm/dyncom/arm_dyncom_thumb.h | 143 | arm/dyncom/arm_dyncom_thumb.h |
| 144 | arm/dyncom/arm_dyncom_trans.h | ||
| 143 | arm/skyeye_common/arm_regformat.h | 145 | arm/skyeye_common/arm_regformat.h |
| 144 | arm/skyeye_common/armstate.h | 146 | arm/skyeye_common/armstate.h |
| 145 | arm/skyeye_common/armsupp.h | 147 | arm/skyeye_common/armsupp.h |
diff --git a/src/core/arm/dyncom/arm_dyncom_interpreter.cpp b/src/core/arm/dyncom/arm_dyncom_interpreter.cpp index 68d6572aa..01d5d478e 100644 --- a/src/core/arm/dyncom/arm_dyncom_interpreter.cpp +++ b/src/core/arm/dyncom/arm_dyncom_interpreter.cpp | |||
| @@ -7,7 +7,6 @@ | |||
| 7 | #include <algorithm> | 7 | #include <algorithm> |
| 8 | #include <cstdio> | 8 | #include <cstdio> |
| 9 | 9 | ||
| 10 | #include "common/assert.h" | ||
| 11 | #include "common/common_types.h" | 10 | #include "common/common_types.h" |
| 12 | #include "common/logging/log.h" | 11 | #include "common/logging/log.h" |
| 13 | #include "common/microprofile.h" | 12 | #include "common/microprofile.h" |
| @@ -18,6 +17,7 @@ | |||
| 18 | #include "core/arm/dyncom/arm_dyncom_dec.h" | 17 | #include "core/arm/dyncom/arm_dyncom_dec.h" |
| 19 | #include "core/arm/dyncom/arm_dyncom_interpreter.h" | 18 | #include "core/arm/dyncom/arm_dyncom_interpreter.h" |
| 20 | #include "core/arm/dyncom/arm_dyncom_thumb.h" | 19 | #include "core/arm/dyncom/arm_dyncom_thumb.h" |
| 20 | #include "core/arm/dyncom/arm_dyncom_trans.h" | ||
| 21 | #include "core/arm/dyncom/arm_dyncom_run.h" | 21 | #include "core/arm/dyncom/arm_dyncom_run.h" |
| 22 | #include "core/arm/skyeye_common/armstate.h" | 22 | #include "core/arm/skyeye_common/armstate.h" |
| 23 | #include "core/arm/skyeye_common/armsupp.h" | 23 | #include "core/arm/skyeye_common/armsupp.h" |
| @@ -25,18 +25,6 @@ | |||
| 25 | 25 | ||
| 26 | #include "core/gdbstub/gdbstub.h" | 26 | #include "core/gdbstub/gdbstub.h" |
| 27 | 27 | ||
| 28 | enum class TransExtData { | ||
| 29 | COND = (1 << 0), | ||
| 30 | NON_BRANCH = (1 << 1), | ||
| 31 | DIRECT_BRANCH = (1 << 2), | ||
| 32 | INDIRECT_BRANCH = (1 << 3), | ||
| 33 | CALL = (1 << 4), | ||
| 34 | RET = (1 << 5), | ||
| 35 | END_OF_PAGE = (1 << 6), | ||
| 36 | THUMB = (1 << 7), | ||
| 37 | SINGLE_STEP = (1 << 8) | ||
| 38 | }; | ||
| 39 | |||
| 40 | #define RM BITS(sht_oper, 0, 3) | 28 | #define RM BITS(sht_oper, 0, 3) |
| 41 | #define RS BITS(sht_oper, 8, 11) | 29 | #define RS BITS(sht_oper, 8, 11) |
| 42 | 30 | ||
| @@ -47,8 +35,6 @@ enum class TransExtData { | |||
| 47 | #define ROTATE_RIGHT_32(n, i) ROTATE_RIGHT(n, i, 32) | 35 | #define ROTATE_RIGHT_32(n, i) ROTATE_RIGHT(n, i, 32) |
| 48 | #define ROTATE_LEFT_32(n, i) ROTATE_LEFT(n, i, 32) | 36 | #define ROTATE_LEFT_32(n, i) ROTATE_LEFT(n, i, 32) |
| 49 | 37 | ||
| 50 | typedef unsigned int (*shtop_fp_t)(ARMul_State* cpu, unsigned int sht_oper); | ||
| 51 | |||
| 52 | static bool CondPassed(const ARMul_State* cpu, unsigned int cond) { | 38 | static bool CondPassed(const ARMul_State* cpu, unsigned int cond) { |
| 53 | const bool n_flag = cpu->NFlag != 0; | 39 | const bool n_flag = cpu->NFlag != 0; |
| 54 | const bool z_flag = cpu->ZFlag != 0; | 40 | const bool z_flag = cpu->ZFlag != 0; |
| @@ -246,12 +232,6 @@ static unsigned int DPO(RotateRightByRegister)(ARMul_State* cpu, unsigned int sh | |||
| 246 | return shifter_operand; | 232 | return shifter_operand; |
| 247 | } | 233 | } |
| 248 | 234 | ||
| 249 | typedef void (*get_addr_fp_t)(ARMul_State *cpu, unsigned int inst, unsigned int &virt_addr); | ||
| 250 | |||
| 251 | struct ldst_inst { | ||
| 252 | unsigned int inst; | ||
| 253 | get_addr_fp_t get_addr; | ||
| 254 | }; | ||
| 255 | #define DEBUG_MSG LOG_DEBUG(Core_ARM11, "inst is %x", inst); CITRA_IGNORE_EXIT(0) | 235 | #define DEBUG_MSG LOG_DEBUG(Core_ARM11, "inst is %x", inst); CITRA_IGNORE_EXIT(0) |
| 256 | 236 | ||
| 257 | #define LnSWoUB(s) glue(LnSWoUB, s) | 237 | #define LnSWoUB(s) glue(LnSWoUB, s) |
| @@ -669,23 +649,7 @@ static void LnSWoUB(ScaledRegisterOffset)(ARMul_State* cpu, unsigned int inst, u | |||
| 669 | virt_addr = addr; | 649 | virt_addr = addr; |
| 670 | } | 650 | } |
| 671 | 651 | ||
| 672 | #include "arm_dyncom_trans_struct.inc" | 652 | shtop_fp_t GetShifterOp(unsigned int inst) { |
| 673 | |||
| 674 | typedef arm_inst * ARM_INST_PTR; | ||
| 675 | |||
| 676 | #define TRANS_CACHE_SIZE (64 * 1024 * 2000) | ||
| 677 | static char trans_cache_buf[TRANS_CACHE_SIZE]; | ||
| 678 | static size_t trans_cache_buf_top = 0; | ||
| 679 | |||
| 680 | static void* AllocBuffer(size_t size) { | ||
| 681 | size_t start = trans_cache_buf_top; | ||
| 682 | trans_cache_buf_top += size; | ||
| 683 | ASSERT_MSG(trans_cache_buf_top <= TRANS_CACHE_SIZE, "Translation cache is full!"); | ||
| 684 | return static_cast<void*>(&trans_cache_buf[start]); | ||
| 685 | } | ||
| 686 | |||
| 687 | |||
| 688 | static shtop_fp_t GetShifterOp(unsigned int inst) { | ||
| 689 | if (BIT(inst, 25)) { | 653 | if (BIT(inst, 25)) { |
| 690 | return DPO(Immediate); | 654 | return DPO(Immediate); |
| 691 | } else if (BITS(inst, 4, 11) == 0) { | 655 | } else if (BITS(inst, 4, 11) == 0) { |
| @@ -710,7 +674,7 @@ static shtop_fp_t GetShifterOp(unsigned int inst) { | |||
| 710 | return nullptr; | 674 | return nullptr; |
| 711 | } | 675 | } |
| 712 | 676 | ||
| 713 | static get_addr_fp_t GetAddressingOp(unsigned int inst) { | 677 | get_addr_fp_t GetAddressingOp(unsigned int inst) { |
| 714 | if (BITS(inst, 24, 27) == 5 && BIT(inst, 21) == 0) { | 678 | if (BITS(inst, 24, 27) == 5 && BIT(inst, 21) == 0) { |
| 715 | return LnSWoUB(ImmediateOffset); | 679 | return LnSWoUB(ImmediateOffset); |
| 716 | } else if (BITS(inst, 24, 27) == 7 && BIT(inst, 21) == 0 && BITS(inst, 4, 11) == 0) { | 680 | } else if (BITS(inst, 24, 27) == 7 && BIT(inst, 21) == 0 && BITS(inst, 4, 11) == 0) { |
| @@ -768,10 +732,6 @@ get_addr_fp_t GetAddressingOpLoadStoreT(unsigned int inst) { | |||
| 768 | return nullptr; | 732 | return nullptr; |
| 769 | } | 733 | } |
| 770 | 734 | ||
| 771 | typedef ARM_INST_PTR (*transop_fp_t)(unsigned int, int); | ||
| 772 | |||
| 773 | #include "arm_dyncom_trans.inc" | ||
| 774 | |||
| 775 | enum { | 735 | enum { |
| 776 | FETCH_SUCCESS, | 736 | FETCH_SUCCESS, |
| 777 | FETCH_FAILURE | 737 | FETCH_FAILURE |
| @@ -782,7 +742,7 @@ static ThumbDecodeStatus DecodeThumbInstruction(u32 inst, u32 addr, u32* arm_ins | |||
| 782 | ThumbDecodeStatus ret = TranslateThumbInstruction (addr, inst, arm_inst, inst_size); | 742 | ThumbDecodeStatus ret = TranslateThumbInstruction (addr, inst, arm_inst, inst_size); |
| 783 | if (ret == ThumbDecodeStatus::BRANCH) { | 743 | if (ret == ThumbDecodeStatus::BRANCH) { |
| 784 | int inst_index; | 744 | int inst_index; |
| 785 | int table_length = sizeof(arm_instruction_trans) / sizeof(transop_fp_t); | 745 | int table_length = arm_instruction_trans_len; |
| 786 | u32 tinstr = GetThumbInstruction(inst, addr); | 746 | u32 tinstr = GetThumbInstruction(inst, addr); |
| 787 | 747 | ||
| 788 | switch ((tinstr & 0xF800) >> 11) { | 748 | switch ((tinstr & 0xF800) >> 11) { |
diff --git a/src/core/arm/dyncom/arm_dyncom_trans.inc b/src/core/arm/dyncom/arm_dyncom_trans.cpp index 48c6f81e7..00b42c246 100644 --- a/src/core/arm/dyncom/arm_dyncom_trans.inc +++ b/src/core/arm/dyncom/arm_dyncom_trans.cpp | |||
| @@ -1,5 +1,31 @@ | |||
| 1 | #include <cstdlib> | ||
| 2 | |||
| 3 | #include "common/assert.h" | ||
| 4 | #include "common/common_types.h" | ||
| 5 | |||
| 6 | #include "core/arm/dyncom/arm_dyncom_interpreter.h" | ||
| 7 | #include "core/arm/dyncom/arm_dyncom_trans.h" | ||
| 8 | #include "core/arm/skyeye_common/armstate.h" | ||
| 9 | #include "core/arm/skyeye_common/armsupp.h" | ||
| 10 | #include "core/arm/skyeye_common/vfp/vfp.h" | ||
| 11 | |||
| 12 | char trans_cache_buf[TRANS_CACHE_SIZE]; | ||
| 13 | size_t trans_cache_buf_top = 0; | ||
| 14 | |||
| 15 | static void* AllocBuffer(size_t size) { | ||
| 16 | size_t start = trans_cache_buf_top; | ||
| 17 | trans_cache_buf_top += size; | ||
| 18 | ASSERT_MSG(trans_cache_buf_top <= TRANS_CACHE_SIZE, "Translation cache is full!"); | ||
| 19 | return static_cast<void*>(&trans_cache_buf[start]); | ||
| 20 | } | ||
| 21 | |||
| 22 | #define glue(x, y) x ## y | ||
| 1 | #define INTERPRETER_TRANSLATE(s) glue(InterpreterTranslate_, s) | 23 | #define INTERPRETER_TRANSLATE(s) glue(InterpreterTranslate_, s) |
| 2 | 24 | ||
| 25 | shtop_fp_t GetShifterOp(unsigned int inst); | ||
| 26 | get_addr_fp_t GetAddressingOp(unsigned int inst); | ||
| 27 | get_addr_fp_t GetAddressingOpLoadStoreT(unsigned int inst); | ||
| 28 | |||
| 3 | static ARM_INST_PTR INTERPRETER_TRANSLATE(adc)(unsigned int inst, int index) | 29 | static ARM_INST_PTR INTERPRETER_TRANSLATE(adc)(unsigned int inst, int index) |
| 4 | { | 30 | { |
| 5 | arm_inst *inst_base = (arm_inst *)AllocBuffer(sizeof(arm_inst) + sizeof(adc_inst)); | 31 | arm_inst *inst_base = (arm_inst *)AllocBuffer(sizeof(arm_inst) + sizeof(adc_inst)); |
| @@ -73,7 +99,7 @@ static ARM_INST_PTR INTERPRETER_TRANSLATE(bbl)(unsigned int inst, int index) | |||
| 73 | 99 | ||
| 74 | inst_base->cond = BITS(inst, 28, 31); | 100 | inst_base->cond = BITS(inst, 28, 31); |
| 75 | inst_base->idx = index; | 101 | inst_base->idx = index; |
| 76 | inst_base->br = TransExtData::DIRECT_BRANCH; | 102 | inst_base->br = TransExtData::DIRECT_BRANCH; |
| 77 | 103 | ||
| 78 | if (BIT(inst, 24)) | 104 | if (BIT(inst, 24)) |
| 79 | inst_base->br = TransExtData::CALL; | 105 | inst_base->br = TransExtData::CALL; |
| @@ -1763,7 +1789,7 @@ static ARM_INST_PTR INTERPRETER_TRANSLATE(b_2_thumb)(unsigned int tinst, int ind | |||
| 1763 | inst_cream->imm = ((tinst & 0x3FF) << 1) | ((tinst & (1 << 10)) ? 0xFFFFF800 : 0); | 1789 | inst_cream->imm = ((tinst & 0x3FF) << 1) | ((tinst & (1 << 10)) ? 0xFFFFF800 : 0); |
| 1764 | 1790 | ||
| 1765 | inst_base->idx = index; | 1791 | inst_base->idx = index; |
| 1766 | inst_base->br = TransExtData::DIRECT_BRANCH; | 1792 | inst_base->br = TransExtData::DIRECT_BRANCH; |
| 1767 | 1793 | ||
| 1768 | return inst_base; | 1794 | return inst_base; |
| 1769 | } | 1795 | } |
| @@ -1776,7 +1802,7 @@ static ARM_INST_PTR INTERPRETER_TRANSLATE(b_cond_thumb)(unsigned int tinst, int | |||
| 1776 | inst_cream->imm = (((tinst & 0x7F) << 1) | ((tinst & (1 << 7)) ? 0xFFFFFF00 : 0)); | 1802 | inst_cream->imm = (((tinst & 0x7F) << 1) | ((tinst & (1 << 7)) ? 0xFFFFFF00 : 0)); |
| 1777 | inst_cream->cond = ((tinst >> 8) & 0xf); | 1803 | inst_cream->cond = ((tinst >> 8) & 0xf); |
| 1778 | inst_base->idx = index; | 1804 | inst_base->idx = index; |
| 1779 | inst_base->br = TransExtData::DIRECT_BRANCH; | 1805 | inst_base->br = TransExtData::DIRECT_BRANCH; |
| 1780 | 1806 | ||
| 1781 | return inst_base; | 1807 | return inst_base; |
| 1782 | } | 1808 | } |
| @@ -1800,7 +1826,7 @@ static ARM_INST_PTR INTERPRETER_TRANSLATE(bl_2_thumb)(unsigned int tinst, int in | |||
| 1800 | inst_cream->imm = (tinst & 0x07FF) << 1; | 1826 | inst_cream->imm = (tinst & 0x07FF) << 1; |
| 1801 | 1827 | ||
| 1802 | inst_base->idx = index; | 1828 | inst_base->idx = index; |
| 1803 | inst_base->br = TransExtData::DIRECT_BRANCH; | 1829 | inst_base->br = TransExtData::DIRECT_BRANCH; |
| 1804 | return inst_base; | 1830 | return inst_base; |
| 1805 | } | 1831 | } |
| 1806 | static ARM_INST_PTR INTERPRETER_TRANSLATE(blx_1_thumb)(unsigned int tinst, int index) | 1832 | static ARM_INST_PTR INTERPRETER_TRANSLATE(blx_1_thumb)(unsigned int tinst, int index) |
| @@ -1812,7 +1838,7 @@ static ARM_INST_PTR INTERPRETER_TRANSLATE(blx_1_thumb)(unsigned int tinst, int i | |||
| 1812 | inst_cream->instr = tinst; | 1838 | inst_cream->instr = tinst; |
| 1813 | 1839 | ||
| 1814 | inst_base->idx = index; | 1840 | inst_base->idx = index; |
| 1815 | inst_base->br = TransExtData::DIRECT_BRANCH; | 1841 | inst_base->br = TransExtData::DIRECT_BRANCH; |
| 1816 | return inst_base; | 1842 | return inst_base; |
| 1817 | } | 1843 | } |
| 1818 | 1844 | ||
| @@ -1937,7 +1963,6 @@ static ARM_INST_PTR INTERPRETER_TRANSLATE(yield)(unsigned int inst, int index) | |||
| 1937 | } | 1963 | } |
| 1938 | 1964 | ||
| 1939 | // Floating point VFPv3 instructions | 1965 | // Floating point VFPv3 instructions |
| 1940 | |||
| 1941 | #define VFP_INTERPRETER_TRANS | 1966 | #define VFP_INTERPRETER_TRANS |
| 1942 | #include "core/arm/skyeye_common/vfp/vfpinstr.cpp" | 1967 | #include "core/arm/skyeye_common/vfp/vfpinstr.cpp" |
| 1943 | #undef VFP_INTERPRETER_TRANS | 1968 | #undef VFP_INTERPRETER_TRANS |
| @@ -2148,4 +2173,6 @@ const transop_fp_t arm_instruction_trans[] = { | |||
| 2148 | INTERPRETER_TRANSLATE(bl_1_thumb), | 2173 | INTERPRETER_TRANSLATE(bl_1_thumb), |
| 2149 | INTERPRETER_TRANSLATE(bl_2_thumb), | 2174 | INTERPRETER_TRANSLATE(bl_2_thumb), |
| 2150 | INTERPRETER_TRANSLATE(blx_1_thumb) | 2175 | INTERPRETER_TRANSLATE(blx_1_thumb) |
| 2151 | }; \ No newline at end of file | 2176 | }; |
| 2177 | |||
| 2178 | const size_t arm_instruction_trans_len = sizeof(arm_instruction_trans) / sizeof(transop_fp_t); | ||
diff --git a/src/core/arm/dyncom/arm_dyncom_trans_struct.inc b/src/core/arm/dyncom/arm_dyncom_trans.h index 05139f00f..7af71f4e3 100644 --- a/src/core/arm/dyncom/arm_dyncom_trans_struct.inc +++ b/src/core/arm/dyncom/arm_dyncom_trans.h | |||
| @@ -1,3 +1,18 @@ | |||
| 1 | struct ARMul_State; | ||
| 2 | typedef unsigned int (*shtop_fp_t)(ARMul_State* cpu, unsigned int sht_oper); | ||
| 3 | |||
| 4 | enum class TransExtData { | ||
| 5 | COND = (1 << 0), | ||
| 6 | NON_BRANCH = (1 << 1), | ||
| 7 | DIRECT_BRANCH = (1 << 2), | ||
| 8 | INDIRECT_BRANCH = (1 << 3), | ||
| 9 | CALL = (1 << 4), | ||
| 10 | RET = (1 << 5), | ||
| 11 | END_OF_PAGE = (1 << 6), | ||
| 12 | THUMB = (1 << 7), | ||
| 13 | SINGLE_STEP = (1 << 8) | ||
| 14 | }; | ||
| 15 | |||
| 1 | struct arm_inst { | 16 | struct arm_inst { |
| 2 | unsigned int idx; | 17 | unsigned int idx; |
| 3 | unsigned int cond; | 18 | unsigned int cond; |
| @@ -456,7 +471,23 @@ struct pkh_inst { | |||
| 456 | }; | 471 | }; |
| 457 | 472 | ||
| 458 | // Floating point VFPv3 structures | 473 | // Floating point VFPv3 structures |
| 459 | |||
| 460 | #define VFP_INTERPRETER_STRUCT | 474 | #define VFP_INTERPRETER_STRUCT |
| 461 | #include "core/arm/skyeye_common/vfp/vfpinstr.cpp" | 475 | #include "core/arm/skyeye_common/vfp/vfpinstr.cpp" |
| 462 | #undef VFP_INTERPRETER_STRUCT \ No newline at end of file | 476 | #undef VFP_INTERPRETER_STRUCT |
| 477 | |||
| 478 | typedef void (*get_addr_fp_t)(ARMul_State *cpu, unsigned int inst, unsigned int &virt_addr); | ||
| 479 | |||
| 480 | struct ldst_inst { | ||
| 481 | unsigned int inst; | ||
| 482 | get_addr_fp_t get_addr; | ||
| 483 | }; | ||
| 484 | |||
| 485 | typedef arm_inst* ARM_INST_PTR; | ||
| 486 | typedef ARM_INST_PTR (*transop_fp_t)(unsigned int, int); | ||
| 487 | |||
| 488 | extern const transop_fp_t arm_instruction_trans[]; | ||
| 489 | extern const size_t arm_instruction_trans_len; | ||
| 490 | |||
| 491 | #define TRANS_CACHE_SIZE (64 * 1024 * 2000) | ||
| 492 | extern char trans_cache_buf[TRANS_CACHE_SIZE]; | ||
| 493 | extern size_t trans_cache_buf_top; | ||