summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorbunnei <bunneidev@gmail.com>2015-01-07 22:49:30 +0100
committerbunnei <bunneidev@gmail.com>2015-01-07 22:49:30 +0100
commit4c583732f2eff967e4ac5e717a4ed4d8b5a0000f (patch)
tree58438c25a42562b758aa523f9683aa3d0bb6bbba
parentMerge pull request #425 from Subv/coretiming (diff)
parentdyncom: Fix SMULWB/SMULWT (diff)
downloadyuzu-4c583732f2eff967e4ac5e717a4ed4d8b5a0000f.tar
yuzu-4c583732f2eff967e4ac5e717a4ed4d8b5a0000f.tar.gz
yuzu-4c583732f2eff967e4ac5e717a4ed4d8b5a0000f.tar.bz2
yuzu-4c583732f2eff967e4ac5e717a4ed4d8b5a0000f.tar.lz
yuzu-4c583732f2eff967e4ac5e717a4ed4d8b5a0000f.tar.xz
yuzu-4c583732f2eff967e4ac5e717a4ed4d8b5a0000f.tar.zst
yuzu-4c583732f2eff967e4ac5e717a4ed4d8b5a0000f.zip
-rw-r--r--src/core/arm/dyncom/arm_dyncom_interpreter.cpp17
1 files changed, 7 insertions, 10 deletions
diff --git a/src/core/arm/dyncom/arm_dyncom_interpreter.cpp b/src/core/arm/dyncom/arm_dyncom_interpreter.cpp
index 426fc6474..7c710ccde 100644
--- a/src/core/arm/dyncom/arm_dyncom_interpreter.cpp
+++ b/src/core/arm/dyncom/arm_dyncom_interpreter.cpp
@@ -5891,16 +5891,13 @@ unsigned InterpreterMainLoop(ARMul_State* state) {
SMULW_INST:
{
- if ((inst_base->cond == 0xe) || CondPassed(cpu, inst_base->cond)) {
- smlad_inst *inst_cream = (smlad_inst *)inst_base->component;
- int64_t rm = RM;
- int64_t rn = RN;
- if (inst_cream->m)
- rm = BITS(rm, 16, 31);
- else
- rm = BITS(rm, 0, 15);
- int64_t rst = rm * rn;
- RD = BITS(rst, 16, 47);
+ if (inst_base->cond == 0xE || CondPassed(cpu, inst_base->cond)) {
+ smlad_inst* const inst_cream = (smlad_inst*)inst_base->component;
+
+ s16 rm = (inst_cream->m == 1) ? ((RM >> 16) & 0xFFFF) : (RM & 0xFFFF);
+
+ s64 result = (s64)rm * (s64)(s32)RN;
+ RD = BITS(result, 16, 47);
}
cpu->Reg[15] += GET_INST_SIZE(cpu);
INC_PC(sizeof(smlad_inst));