Previous 199869 Revisions Next

r20788 Thursday 7th February, 2013 at 03:26:05 UTC by Ryan Holtz
arm7ops.c: Fix SMULW, SMLAW opcodes [MooglyGuy]
[src/emu/cpu/arm7]arm7drc.c arm7ops.c

trunk/src/emu/cpu/arm7/arm7drc.c
r20787r20788
24212421      UINT32 rdh = (insn>>16)&0xf;
24222422      UINT32 rdl = (insn>>12)&0xf;
24232423
2424      UML_MOV(block, I0, DRC_REG(rm));
2425      UML_MOV(block, I1, DRC_REG(rn));
2426
2427      // select top and bottom halves of src1/src2 and sign extend if necessary
2428      if (insn & 0x20)
2429      {
2430         UML_SHR(block, I0, I0, 16);
2431      }
2432      UML_SEXT(block, I0, I0, SIZE_WORD);
2433
2434      if (insn & 0x40)
2435      {
2436         UML_SHR(block, I1, I1, 16);
2437      }
2438      UML_SEXT(block, I0, I0, SIZE_WORD);
2439
2424      UML_DSEXT(block, I0, DRC_REG(rm), SIZE_DWORD);
2425      UML_DSEXT(block, I1, DRC_REG(rn), SIZE_DWORD);
24402426      // do the signed multiply
2441      UML_MULS(block, I0, I1, I0, I1);
2427      UML_DMULS(block, I2, I3, I0, I1);
24422428
2443      dst = (INT64)GET_REGISTER(arm, (insn>>12)&0xf);
2444      dst |= (INT64)GET_REGISTER(arm, (insn>>16)&0xf)<<32;
2445
2446      // do the multiply and accumulate
2447      dst += (INT64)src1 * (INT64)src2;
2448
2449      // write back the result
2450      SET_REGISTER(cpustart, (insn>>12)&0xf, (UINT32)(dst&0xffffffff));
2451      SET_REGISTER(cpustart, (insn>>16)&0xf, (UINT32)(dst>>32));
2429      UML_MOV(block, I0, DRC_REG(rdh));
2430      UML_MOV(block, I1, DRC_REG(rdl));
2431      UML_DSHL(block, I0, I0, 32);
2432      UML_DOR(block, I0, I0, I1);
2433      UML_DADD(block, I0, I0, I2);
2434      UML_MOV(block, DRC_REG(rdl), I0);
2435      UML_DSHR(block, I0, I0, 32);
2436      UML_MOV(block, DRC_REG(rdh), I0);
24522437   }
24532438   else if ((insn & 0x0ff00090) == 0x01600080) // SMULxy - v5
24542439   {
r20787r20788
24612446      {
24622447         src1 >>= 16;
24632448      }
2464      else
2449
2450      src1 &= 0xffff;
2451      if (src1 & 0x8000)
24652452      {
2466         src1 &= 0xffff;
2467         if (src1 & 0x8000)
2468         {
2469            src1 |= 0xffff;
2470         }
2453         src1 |= 0xffff0000;
24712454      }
24722455
24732456      if (insn & 0x40)
24742457      {
24752458         src2 >>= 16;
24762459      }
2477      else
2460
2461      src2 &= 0xffff;
2462      if (src2 & 0x8000)
24782463      {
2479         src2 &= 0xffff;
2480         if (src2 & 0x8000)
2481         {
2482            src2 |= 0xffff;
2483         }
2464         src2 |= 0xffff0000;
24842465      }
24852466
24862467      res = src1 * src2;
24872468      SET_REGISTER(cpustart, (insn>>16)&0xf, res);
2469      R15 += 4;
24882470   }
24892471   else if ((insn & 0x0ff000b0) == 0x012000a0) // SMULWy - v5
24902472   {
trunk/src/emu/cpu/arm7/arm7ops.c
r20787r20788
16611661      // write back the result
16621662      SET_REGISTER(cpustart, (insn>>12)&0xf, (UINT32)dst);
16631663      SET_REGISTER(cpustart, (insn>>16)&0xf, (UINT32)(dst >> 32));
1664      R15 += 4;
16641665   }
16651666   else if ((insn & 0x0ff00090) == 0x01600080) // SMULxy - v5
16661667   {
r20787r20788
16731674      {
16741675         src1 >>= 16;
16751676      }
1676      else
1677
1678      src1 &= 0xffff;
1679      if (src1 & 0x8000)
16771680      {
1678         src1 &= 0xffff;
1679         if (src1 & 0x8000)
1680         {
1681            src1 |= 0xffff;
1682         }
1681         src1 |= 0xffff0000;
16831682      }
16841683
16851684      if (insn & 0x40)
16861685      {
16871686         src2 >>= 16;
16881687      }
1689      else
1688
1689      src2 &= 0xffff;
1690      if (src2 & 0x8000)
16901691      {
1691         src2 &= 0xffff;
1692         if (src2 & 0x8000)
1693         {
1694            src2 |= 0xffff;
1695         }
1692         src2 |= 0xffff0000;
16961693      }
16971694
16981695      res = src1 * src2;
16991696      SET_REGISTER(cpustart, (insn>>16)&0xf, res);
1697      R15 += 4;
17001698   }
17011699   else if ((insn & 0x0ff000b0) == 0x012000a0) // SMULWy - v5
17021700   {
r20787r20788
17081706      {
17091707         src2 >>= 16;
17101708      }
1711      else
1709
1710      src2 &= 0xffff;
1711      if (src2 & 0x8000)
17121712      {
1713         src2 &= 0xffff;
1714         if (src2 & 0x8000)
1715         {
1716            src2 |= 0xffff;
1717         }
1713         src2 |= 0xffff0000;
17181714      }
17191715
17201716      res = (INT64)src1 * (INT64)src2;
17211717      res >>= 16;
17221718      SET_REGISTER(cpustart, (insn>>16)&0xf, (UINT32)res);
1719      R15 += 4;
17231720   }
17241721   else if ((insn & 0x0ff000b0) == 0x01200080) // SMLAWy - v5
17251722   {
r20787r20788
17321729      {
17331730         src2 >>= 16;
17341731      }
1735      else
1732
1733      src2 &= 0xffff;
1734      if (src2 & 0x8000)
17361735      {
1737         src2 &= 0xffff;
1738         if (src2 & 0x8000)
1739         {
1740            src2 |= 0xffff;
1741         }
1736         src2 |= 0xffff0000;
17421737      }
17431738
17441739      res = (INT64)src1 * (INT64)src2;
r20787r20788
17521747
17531748      // write the result back
17541749      SET_REGISTER(cpustart, (insn>>16)&0xf, (UINT32)res);
1750      R15 += 4;
17551751   }
17561752   else
17571753   /* Multiply OR Swap OR Half Word Data Transfer */

Previous 199869 Revisions Next


© 1997-2024 The MAME Team