diff options
author | arbee <rb6502@users.noreply.github.com> | 2018-05-16 13:35:06 -0400 |
---|---|---|
committer | arbee <rb6502@users.noreply.github.com> | 2018-05-16 13:35:06 -0400 |
commit | 523df415fa5c31ff036645a13afdc45fa1b22198 (patch) | |
tree | 739fef83eb83b9d8cc07da1cd2c7853faf3be372 /src/devices | |
parent | 59686860c97ca6a7140a61d15972fd3f7f24ae6b (diff) |
sh4drc: optimize FPU CMP instructions (nw)
Diffstat (limited to 'src/devices')
-rw-r--r-- | src/devices/cpu/sh/sh4.cpp | 28 |
1 files changed, 8 insertions, 20 deletions
diff --git a/src/devices/cpu/sh/sh4.cpp b/src/devices/cpu/sh/sh4.cpp index 0fc6713bfab..d99fb0bbc7b 100644 --- a/src/devices/cpu/sh/sh4.cpp +++ b/src/devices/cpu/sh/sh4.cpp @@ -3517,26 +3517,20 @@ 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, I1, SH_T); - UML_OR(block, I0, I0, I1); - UML_MOV(block, uml::mem(&m_sh2_state->sr), I0); + UML_SETc(block, COND_Z, I0); + UML_ROLINS(block, uml::mem(&m_sh2_state->sr), I0, T_SHIFT, SH_T); UML_JMP(block, compiler.labelnum+1); UML_LABEL(block, compiler.labelnum++); // labelnum: - UML_AND(block, I0, uml::mem(&m_sh2_state->sr), ~SH_T); UML_FSCMP(block, FPS32(Rm), FPS32(Rn)); - 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_SETc(block, COND_Z, I0); + UML_ROLINS(block, uml::mem(&m_sh2_state->sr), I0, T_SHIFT, SH_T); UML_LABEL(block, compiler.labelnum++); // labelnum+1: return true; @@ -3544,26 +3538,20 @@ 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, I1, SH_T); - UML_OR(block, I0, I0, I1); - UML_MOV(block, uml::mem(&m_sh2_state->sr), I0); + UML_SETc(block, COND_C, I0); + UML_ROLINS(block, uml::mem(&m_sh2_state->sr), I0, T_SHIFT, SH_T); UML_JMP(block, compiler.labelnum+1); UML_LABEL(block, compiler.labelnum++); // labelnum: - UML_AND(block, I0, uml::mem(&m_sh2_state->sr), ~SH_T); UML_FSCMP(block, FPS32(Rm), FPS32(Rn)); - 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_SETc(block, COND_C, I0); + UML_ROLINS(block, uml::mem(&m_sh2_state->sr), I0, T_SHIFT, SH_T); UML_LABEL(block, compiler.labelnum++); // labelnum+1: return true; |