summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar archshift2016-06-10 19:02:02 -0700
committerGravatar archshift2016-06-12 01:54:45 -0700
commitca20b1f87d87bd7059c90cfe064b4da4eae33199 (patch)
treed0435a5c4bb74316a6e71ff4ffb79f2d9e7de9e7
parentarm_dyncom_interpreter: slightly change AllocBuffer to be intuitive (diff)
downloadyuzu-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.txt2
-rw-r--r--src/core/arm/dyncom/arm_dyncom_interpreter.cpp48
-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
28enum 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
50typedef unsigned int (*shtop_fp_t)(ARMul_State* cpu, unsigned int sht_oper);
51
52static bool CondPassed(const ARMul_State* cpu, unsigned int cond) { 38static 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
249typedef void (*get_addr_fp_t)(ARMul_State *cpu, unsigned int inst, unsigned int &virt_addr);
250
251struct 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" 652shtop_fp_t GetShifterOp(unsigned int inst) {
673
674typedef arm_inst * ARM_INST_PTR;
675
676#define TRANS_CACHE_SIZE (64 * 1024 * 2000)
677static char trans_cache_buf[TRANS_CACHE_SIZE];
678static size_t trans_cache_buf_top = 0;
679
680static 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
688static 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
713static get_addr_fp_t GetAddressingOp(unsigned int inst) { 677get_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
771typedef ARM_INST_PTR (*transop_fp_t)(unsigned int, int);
772
773#include "arm_dyncom_trans.inc"
774
775enum { 735enum {
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
12char trans_cache_buf[TRANS_CACHE_SIZE];
13size_t trans_cache_buf_top = 0;
14
15static 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
25shtop_fp_t GetShifterOp(unsigned int inst);
26get_addr_fp_t GetAddressingOp(unsigned int inst);
27get_addr_fp_t GetAddressingOpLoadStoreT(unsigned int inst);
28
3static ARM_INST_PTR INTERPRETER_TRANSLATE(adc)(unsigned int inst, int index) 29static 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}
1806static ARM_INST_PTR INTERPRETER_TRANSLATE(blx_1_thumb)(unsigned int tinst, int index) 1832static 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
2178const 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 @@
1struct ARMul_State;
2typedef unsigned int (*shtop_fp_t)(ARMul_State* cpu, unsigned int sht_oper);
3
4enum 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
1struct arm_inst { 16struct 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
478typedef void (*get_addr_fp_t)(ARMul_State *cpu, unsigned int inst, unsigned int &virt_addr);
479
480struct ldst_inst {
481 unsigned int inst;
482 get_addr_fp_t get_addr;
483};
484
485typedef arm_inst* ARM_INST_PTR;
486typedef ARM_INST_PTR (*transop_fp_t)(unsigned int, int);
487
488extern const transop_fp_t arm_instruction_trans[];
489extern const size_t arm_instruction_trans_len;
490
491#define TRANS_CACHE_SIZE (64 * 1024 * 2000)
492extern char trans_cache_buf[TRANS_CACHE_SIZE];
493extern size_t trans_cache_buf_top;