summaryrefslogtreecommitdiffstatshomepage
path: root/src/emu/cpu/arm7/arm7drc.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/emu/cpu/arm7/arm7drc.c')
-rw-r--r--src/emu/cpu/arm7/arm7drc.c58
1 files changed, 20 insertions, 38 deletions
diff --git a/src/emu/cpu/arm7/arm7drc.c b/src/emu/cpu/arm7/arm7drc.c
index 38cbe42c261..858173f88a5 100644
--- a/src/emu/cpu/arm7/arm7drc.c
+++ b/src/emu/cpu/arm7/arm7drc.c
@@ -2421,34 +2421,19 @@ const bool drcarm7ops_0123(arm_state *arm, drcuml_block *block, compiler_state *
UINT32 rdh = (insn>>16)&0xf;
UINT32 rdl = (insn>>12)&0xf;
- UML_MOV(block, I0, DRC_REG(rm));
- UML_MOV(block, I1, DRC_REG(rn));
-
- // select top and bottom halves of src1/src2 and sign extend if necessary
- if (insn & 0x20)
- {
- UML_SHR(block, I0, I0, 16);
- }
- UML_SEXT(block, I0, I0, SIZE_WORD);
-
- if (insn & 0x40)
- {
- UML_SHR(block, I1, I1, 16);
- }
- UML_SEXT(block, I0, I0, SIZE_WORD);
-
+ UML_DSEXT(block, I0, DRC_REG(rm), SIZE_DWORD);
+ UML_DSEXT(block, I1, DRC_REG(rn), SIZE_DWORD);
// do the signed multiply
- UML_MULS(block, I0, I1, I0, I1);
-
- dst = (INT64)GET_REGISTER(arm, (insn>>12)&0xf);
- dst |= (INT64)GET_REGISTER(arm, (insn>>16)&0xf)<<32;
+ UML_DMULS(block, I2, I3, I0, I1);
- // do the multiply and accumulate
- dst += (INT64)src1 * (INT64)src2;
-
- // write back the result
- SET_REGISTER(cpustart, (insn>>12)&0xf, (UINT32)(dst&0xffffffff));
- SET_REGISTER(cpustart, (insn>>16)&0xf, (UINT32)(dst>>32));
+ UML_MOV(block, I0, DRC_REG(rdh));
+ UML_MOV(block, I1, DRC_REG(rdl));
+ UML_DSHL(block, I0, I0, 32);
+ UML_DOR(block, I0, I0, I1);
+ UML_DADD(block, I0, I0, I2);
+ UML_MOV(block, DRC_REG(rdl), I0);
+ UML_DSHR(block, I0, I0, 32);
+ UML_MOV(block, DRC_REG(rdh), I0);
}
else if ((insn & 0x0ff00090) == 0x01600080) // SMULxy - v5
{
@@ -2461,30 +2446,27 @@ const bool drcarm7ops_0123(arm_state *arm, drcuml_block *block, compiler_state *
{
src1 >>= 16;
}
- else
+
+ src1 &= 0xffff;
+ if (src1 & 0x8000)
{
- src1 &= 0xffff;
- if (src1 & 0x8000)
- {
- src1 |= 0xffff;
- }
+ src1 |= 0xffff0000;
}
if (insn & 0x40)
{
src2 >>= 16;
}
- else
+
+ src2 &= 0xffff;
+ if (src2 & 0x8000)
{
- src2 &= 0xffff;
- if (src2 & 0x8000)
- {
- src2 |= 0xffff;
- }
+ src2 |= 0xffff0000;
}
res = src1 * src2;
SET_REGISTER(cpustart, (insn>>16)&0xf, res);
+ R15 += 4;
}
else if ((insn & 0x0ff000b0) == 0x012000a0) // SMULWy - v5
{