From 732119afb29378e9db8bcacf4e466ec57ecd6b12 Mon Sep 17 00:00:00 2001 From: arbee Date: Tue, 15 May 2018 21:55:18 -0400 Subject: sh4drc: fix SR damage in new CMP implementations (nw) --- src/devices/cpu/sh/sh4.cpp | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/src/devices/cpu/sh/sh4.cpp b/src/devices/cpu/sh/sh4.cpp index b6293ea04c8..0fc6713bfab 100644 --- a/src/devices/cpu/sh/sh4.cpp +++ b/src/devices/cpu/sh/sh4.cpp @@ -3517,12 +3517,15 @@ bool sh34_base_device::generate_group_15_FDIV(drcuml_block &block, compiler_stat bool sh34_base_device::generate_group_15_FCMP_EQ(drcuml_block &block, compiler_state &compiler, const opcode_desc *desc, uint16_t opcode, int in_delay_slot, uint32_t ovrpc) { + UML_MOV(block, I1, 0); + UML_TEST(block, uml::mem(&m_sh2_state->m_fpu_pr), 0); UML_JMPc(block, COND_Z, compiler.labelnum); UML_AND(block, I0, uml::mem(&m_sh2_state->sr), ~SH_T); UML_FDCMP(block, FPD32(Rm & 14), FPD32(Rn & 14)); - UML_MOVc(block, COND_Z, I0, SH_T); + UML_MOVc(block, COND_Z, I1, SH_T); + UML_OR(block, I0, I0, I1); UML_MOV(block, uml::mem(&m_sh2_state->sr), I0); UML_JMP(block, compiler.labelnum+1); @@ -3531,7 +3534,8 @@ bool sh34_base_device::generate_group_15_FCMP_EQ(drcuml_block &block, compiler_s UML_AND(block, I0, uml::mem(&m_sh2_state->sr), ~SH_T); UML_FSCMP(block, FPS32(Rm), FPS32(Rn)); - UML_MOVc(block, COND_Z, I0, SH_T); + UML_MOVc(block, COND_Z, I1, SH_T); + UML_OR(block, I0, I0, I1); UML_MOV(block, uml::mem(&m_sh2_state->sr), I0); UML_LABEL(block, compiler.labelnum++); // labelnum+1: @@ -3540,12 +3544,15 @@ bool sh34_base_device::generate_group_15_FCMP_EQ(drcuml_block &block, compiler_s bool sh34_base_device::generate_group_15_FCMP_GT(drcuml_block &block, compiler_state &compiler, const opcode_desc *desc, uint16_t opcode, int in_delay_slot, uint32_t ovrpc) { + UML_MOV(block, I1, 0); + UML_TEST(block, uml::mem(&m_sh2_state->m_fpu_pr), 0); UML_JMPc(block, COND_Z, compiler.labelnum); UML_AND(block, I0, uml::mem(&m_sh2_state->sr), ~SH_T); UML_FDCMP(block, FPD32(Rm & 14), FPD32(Rn & 14)); - UML_MOVc(block, COND_C, I0, SH_T); + UML_MOVc(block, COND_C, I1, SH_T); + UML_OR(block, I0, I0, I1); UML_MOV(block, uml::mem(&m_sh2_state->sr), I0); UML_JMP(block, compiler.labelnum+1); @@ -3554,7 +3561,8 @@ bool sh34_base_device::generate_group_15_FCMP_GT(drcuml_block &block, compiler_s UML_AND(block, I0, uml::mem(&m_sh2_state->sr), ~SH_T); UML_FSCMP(block, FPS32(Rm), FPS32(Rn)); - UML_MOVc(block, COND_C, I0, SH_T); + UML_MOVc(block, COND_C, I1, SH_T); + UML_OR(block, I0, I0, I1); UML_MOV(block, uml::mem(&m_sh2_state->sr), I0); UML_LABEL(block, compiler.labelnum++); // labelnum+1: -- cgit v1.2.3