summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGravatar Lioncash2015-05-14 15:14:02 -0400
committerGravatar Lioncash2015-05-14 16:24:51 -0400
commit699b67d7cfacb48c65df3a6f7e5adc55aebd4c2a (patch)
treef26d957672a829890d6dec8a16a255666b1681d1 /src
parentdyncom: Move exclusive load/stores above bbl and swi in the decoding table (diff)
downloadyuzu-699b67d7cfacb48c65df3a6f7e5adc55aebd4c2a.tar.gz
yuzu-699b67d7cfacb48c65df3a6f7e5adc55aebd4c2a.tar.xz
yuzu-699b67d7cfacb48c65df3a6f7e5adc55aebd4c2a.zip
dyncom: Handle some MSR variants individually
This is necessary, as hint instructions will be recognized as MSR, which is pretty bad.
Diffstat (limited to 'src')
-rw-r--r--src/core/arm/dyncom/arm_dyncom_dec.cpp10
-rw-r--r--src/core/arm/dyncom/arm_dyncom_interpreter.cpp55
2 files changed, 41 insertions, 24 deletions
diff --git a/src/core/arm/dyncom/arm_dyncom_dec.cpp b/src/core/arm/dyncom/arm_dyncom_dec.cpp
index 411850f0f..d0d37bea0 100644
--- a/src/core/arm/dyncom/arm_dyncom_dec.cpp
+++ b/src/core/arm/dyncom/arm_dyncom_dec.cpp
@@ -181,7 +181,11 @@ const ISEITEM arm_instruction[] = {
181 { "ldrt", 3, 0, 26, 27, 0x00000001, 24, 24, 0x00000000, 20, 22, 0x00000003 }, 181 { "ldrt", 3, 0, 26, 27, 0x00000001, 24, 24, 0x00000000, 20, 22, 0x00000003 },
182 { "mrc", 3, 6, 24, 27, 0x0000000e, 20, 20, 0x00000001, 4, 4, 0x00000001 }, 182 { "mrc", 3, 6, 24, 27, 0x0000000e, 20, 20, 0x00000001, 4, 4, 0x00000001 },
183 { "mcr", 3, 0, 24, 27, 0x0000000e, 20, 20, 0x00000000, 4, 4, 0x00000001 }, 183 { "mcr", 3, 0, 24, 27, 0x0000000e, 20, 20, 0x00000000, 4, 4, 0x00000001 },
184 { "msr", 2, 0, 23, 27, 0x00000006, 20, 21, 0x00000002 }, 184 { "msr", 3, 0, 23, 27, 0x00000006, 20, 21, 0x00000002, 22, 22, 0x00000001 },
185 { "msr", 4, 0, 23, 27, 0x00000006, 20, 21, 0x00000002, 22, 22, 0x00000000, 16, 19, 0x00000004 },
186 { "msr", 5, 0, 23, 27, 0x00000006, 20, 21, 0x00000002, 22, 22, 0x00000000, 19, 19, 0x00000001, 16, 17, 0x00000000 },
187 { "msr", 4, 0, 23, 27, 0x00000006, 20, 21, 0x00000002, 22, 22, 0x00000000, 16, 17, 0x00000001 },
188 { "msr", 4, 0, 23, 27, 0x00000006, 20, 21, 0x00000002, 22, 22, 0x00000000, 17, 17, 0x00000001 },
185 { "ldrb", 3, 0, 26, 27, 0x00000001, 22, 22, 0x00000001, 20, 20, 0x00000001 }, 189 { "ldrb", 3, 0, 26, 27, 0x00000001, 22, 22, 0x00000001, 20, 20, 0x00000001 },
186 { "strb", 3, 0, 26, 27, 0x00000001, 22, 22, 0x00000001, 20, 20, 0x00000000 }, 190 { "strb", 3, 0, 26, 27, 0x00000001, 22, 22, 0x00000001, 20, 20, 0x00000000 },
187 { "ldr", 4, 0, 28, 31, 0x0000000e, 26, 27, 0x00000001, 22, 22, 0x00000000, 20, 20, 0x00000001 }, 191 { "ldr", 4, 0, 28, 31, 0x0000000e, 26, 27, 0x00000001, 22, 22, 0x00000000, 20, 20, 0x00000001 },
@@ -375,6 +379,10 @@ const ISEITEM arm_exclusion_code[] = {
375 { "mrc", 0, 6, 0 }, 379 { "mrc", 0, 6, 0 },
376 { "mcr", 0, 0, 0 }, 380 { "mcr", 0, 0, 0 },
377 { "msr", 0, 0, 0 }, 381 { "msr", 0, 0, 0 },
382 { "msr", 0, 0, 0 },
383 { "msr", 0, 0, 0 },
384 { "msr", 0, 0, 0 },
385 { "msr", 0, 0, 0 },
378 { "ldrb", 0, 0, 0 }, 386 { "ldrb", 0, 0, 0 },
379 { "strb", 0, 0, 0 }, 387 { "strb", 0, 0, 0 },
380 { "ldr", 0, 0, 0 }, 388 { "ldr", 0, 0, 0 },
diff --git a/src/core/arm/dyncom/arm_dyncom_interpreter.cpp b/src/core/arm/dyncom/arm_dyncom_interpreter.cpp
index 8de46294b..7e8032b30 100644
--- a/src/core/arm/dyncom/arm_dyncom_interpreter.cpp
+++ b/src/core/arm/dyncom/arm_dyncom_interpreter.cpp
@@ -3536,6 +3536,10 @@ const transop_fp_t arm_instruction_trans[] = {
3536 INTERPRETER_TRANSLATE(mrc), 3536 INTERPRETER_TRANSLATE(mrc),
3537 INTERPRETER_TRANSLATE(mcr), 3537 INTERPRETER_TRANSLATE(mcr),
3538 INTERPRETER_TRANSLATE(msr), 3538 INTERPRETER_TRANSLATE(msr),
3539 INTERPRETER_TRANSLATE(msr),
3540 INTERPRETER_TRANSLATE(msr),
3541 INTERPRETER_TRANSLATE(msr),
3542 INTERPRETER_TRANSLATE(msr),
3539 INTERPRETER_TRANSLATE(ldrb), 3543 INTERPRETER_TRANSLATE(ldrb),
3540 INTERPRETER_TRANSLATE(strb), 3544 INTERPRETER_TRANSLATE(strb),
3541 INTERPRETER_TRANSLATE(ldr), 3545 INTERPRETER_TRANSLATE(ldr),
@@ -3912,28 +3916,32 @@ unsigned InterpreterMainLoop(ARMul_State* cpu) {
3912 case 172: goto MRC_INST; \ 3916 case 172: goto MRC_INST; \
3913 case 173: goto MCR_INST; \ 3917 case 173: goto MCR_INST; \
3914 case 174: goto MSR_INST; \ 3918 case 174: goto MSR_INST; \
3915 case 175: goto LDRB_INST; \ 3919 case 175: goto MSR_INST; \
3916 case 176: goto STRB_INST; \ 3920 case 176: goto MSR_INST; \
3917 case 177: goto LDR_INST; \ 3921 case 177: goto MSR_INST; \
3918 case 178: goto LDRCOND_INST ; \ 3922 case 178: goto MSR_INST; \
3919 case 179: goto STR_INST; \ 3923 case 179: goto LDRB_INST; \
3920 case 180: goto CDP_INST; \ 3924 case 180: goto STRB_INST; \
3921 case 181: goto STC_INST; \ 3925 case 181: goto LDR_INST; \
3922 case 182: goto LDC_INST; \ 3926 case 182: goto LDRCOND_INST ; \
3923 case 183: goto LDREXD_INST; \ 3927 case 183: goto STR_INST; \
3924 case 184: goto STREXD_INST; \ 3928 case 184: goto CDP_INST; \
3925 case 185: goto LDREXH_INST; \ 3929 case 185: goto STC_INST; \
3926 case 186: goto STREXH_INST; \ 3930 case 186: goto LDC_INST; \
3927 case 187: goto SWI_INST; \ 3931 case 187: goto LDREXD_INST; \
3928 case 188: goto BBL_INST; \ 3932 case 188: goto STREXD_INST; \
3929 case 189: goto B_2_THUMB ; \ 3933 case 189: goto LDREXH_INST; \
3930 case 190: goto B_COND_THUMB ; \ 3934 case 190: goto STREXH_INST; \
3931 case 191: goto BL_1_THUMB ; \ 3935 case 191: goto SWI_INST; \
3932 case 192: goto BL_2_THUMB ; \ 3936 case 192: goto BBL_INST; \
3933 case 193: goto BLX_1_THUMB ; \ 3937 case 193: goto B_2_THUMB ; \
3934 case 194: goto DISPATCH; \ 3938 case 194: goto B_COND_THUMB ; \
3935 case 195: goto INIT_INST_LENGTH; \ 3939 case 195: goto BL_1_THUMB ; \
3936 case 196: goto END; \ 3940 case 196: goto BL_2_THUMB ; \
3941 case 197: goto BLX_1_THUMB ; \
3942 case 198: goto DISPATCH; \
3943 case 199: goto INIT_INST_LENGTH; \
3944 case 200: goto END; \
3937 } 3945 }
3938#endif 3946#endif
3939 3947
@@ -3979,7 +3987,8 @@ unsigned InterpreterMainLoop(ARMul_State* cpu) {
3979 &&MCRR_INST,&&MRRC_INST,&&CMP_INST,&&TST_INST,&&TEQ_INST,&&CMN_INST,&&SMULL_INST,&&UMULL_INST,&&UMLAL_INST,&&SMLAL_INST,&&MUL_INST, 3987 &&MCRR_INST,&&MRRC_INST,&&CMP_INST,&&TST_INST,&&TEQ_INST,&&CMN_INST,&&SMULL_INST,&&UMULL_INST,&&UMLAL_INST,&&SMLAL_INST,&&MUL_INST,
3980 &&MLA_INST,&&SSAT_INST,&&USAT_INST,&&MRS_INST,&&MSR_INST,&&AND_INST,&&BIC_INST,&&LDM_INST,&&EOR_INST,&&ADD_INST,&&RSB_INST,&&RSC_INST, 3988 &&MLA_INST,&&SSAT_INST,&&USAT_INST,&&MRS_INST,&&MSR_INST,&&AND_INST,&&BIC_INST,&&LDM_INST,&&EOR_INST,&&ADD_INST,&&RSB_INST,&&RSC_INST,
3981 &&SBC_INST,&&ADC_INST,&&SUB_INST,&&ORR_INST,&&MVN_INST,&&MOV_INST,&&STM_INST,&&LDM_INST,&&LDRSH_INST,&&STM_INST,&&LDM_INST,&&LDRSB_INST, 3989 &&SBC_INST,&&ADC_INST,&&SUB_INST,&&ORR_INST,&&MVN_INST,&&MOV_INST,&&STM_INST,&&LDM_INST,&&LDRSH_INST,&&STM_INST,&&LDM_INST,&&LDRSB_INST,
3982 &&STRD_INST,&&LDRH_INST,&&STRH_INST,&&LDRD_INST,&&STRT_INST,&&STRBT_INST,&&LDRBT_INST,&&LDRT_INST,&&MRC_INST,&&MCR_INST,&&MSR_INST, 3990 &&STRD_INST,&&LDRH_INST,&&STRH_INST,&&LDRD_INST,&&STRT_INST,&&STRBT_INST,&&LDRBT_INST,&&LDRT_INST,&&MRC_INST,&&MCR_INST,
3991 &&MSR_INST, &&MSR_INST, &&MSR_INST, &&MSR_INST, &&MSR_INST,
3983 &&LDRB_INST,&&STRB_INST,&&LDR_INST,&&LDRCOND_INST, &&STR_INST,&&CDP_INST,&&STC_INST,&&LDC_INST, &&LDREXD_INST, 3992 &&LDRB_INST,&&STRB_INST,&&LDR_INST,&&LDRCOND_INST, &&STR_INST,&&CDP_INST,&&STC_INST,&&LDC_INST, &&LDREXD_INST,
3984 &&STREXD_INST,&&LDREXH_INST,&&STREXH_INST, &&SWI_INST,&&BBL_INST, 3993 &&STREXD_INST,&&LDREXH_INST,&&STREXH_INST, &&SWI_INST,&&BBL_INST,
3985 &&B_2_THUMB, &&B_COND_THUMB,&&BL_1_THUMB, &&BL_2_THUMB, &&BLX_1_THUMB, &&DISPATCH, 3994 &&B_2_THUMB, &&B_COND_THUMB,&&BL_1_THUMB, &&BL_2_THUMB, &&BLX_1_THUMB, &&DISPATCH,