trunk/src/emu/cpu/arm7/arm7drc.c
| r20787 | r20788 | |
| 2421 | 2421 | UINT32 rdh = (insn>>16)&0xf; |
| 2422 | 2422 | UINT32 rdl = (insn>>12)&0xf; |
| 2423 | 2423 | |
| 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); |
| 2440 | 2426 | // do the signed multiply |
| 2441 | | UML_MULS(block, I0, I1, I0, I1); |
| 2427 | UML_DMULS(block, I2, I3, I0, I1); |
| 2442 | 2428 | |
| 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); |
| 2452 | 2437 | } |
| 2453 | 2438 | else if ((insn & 0x0ff00090) == 0x01600080) // SMULxy - v5 |
| 2454 | 2439 | { |
| r20787 | r20788 | |
| 2461 | 2446 | { |
| 2462 | 2447 | src1 >>= 16; |
| 2463 | 2448 | } |
| 2464 | | else |
| 2449 | |
| 2450 | src1 &= 0xffff; |
| 2451 | if (src1 & 0x8000) |
| 2465 | 2452 | { |
| 2466 | | src1 &= 0xffff; |
| 2467 | | if (src1 & 0x8000) |
| 2468 | | { |
| 2469 | | src1 |= 0xffff; |
| 2470 | | } |
| 2453 | src1 |= 0xffff0000; |
| 2471 | 2454 | } |
| 2472 | 2455 | |
| 2473 | 2456 | if (insn & 0x40) |
| 2474 | 2457 | { |
| 2475 | 2458 | src2 >>= 16; |
| 2476 | 2459 | } |
| 2477 | | else |
| 2460 | |
| 2461 | src2 &= 0xffff; |
| 2462 | if (src2 & 0x8000) |
| 2478 | 2463 | { |
| 2479 | | src2 &= 0xffff; |
| 2480 | | if (src2 & 0x8000) |
| 2481 | | { |
| 2482 | | src2 |= 0xffff; |
| 2483 | | } |
| 2464 | src2 |= 0xffff0000; |
| 2484 | 2465 | } |
| 2485 | 2466 | |
| 2486 | 2467 | res = src1 * src2; |
| 2487 | 2468 | SET_REGISTER(cpustart, (insn>>16)&0xf, res); |
| 2469 | R15 += 4; |
| 2488 | 2470 | } |
| 2489 | 2471 | else if ((insn & 0x0ff000b0) == 0x012000a0) // SMULWy - v5 |
| 2490 | 2472 | { |
trunk/src/emu/cpu/arm7/arm7ops.c
| r20787 | r20788 | |
| 1661 | 1661 | // write back the result |
| 1662 | 1662 | SET_REGISTER(cpustart, (insn>>12)&0xf, (UINT32)dst); |
| 1663 | 1663 | SET_REGISTER(cpustart, (insn>>16)&0xf, (UINT32)(dst >> 32)); |
| 1664 | R15 += 4; |
| 1664 | 1665 | } |
| 1665 | 1666 | else if ((insn & 0x0ff00090) == 0x01600080) // SMULxy - v5 |
| 1666 | 1667 | { |
| r20787 | r20788 | |
| 1673 | 1674 | { |
| 1674 | 1675 | src1 >>= 16; |
| 1675 | 1676 | } |
| 1676 | | else |
| 1677 | |
| 1678 | src1 &= 0xffff; |
| 1679 | if (src1 & 0x8000) |
| 1677 | 1680 | { |
| 1678 | | src1 &= 0xffff; |
| 1679 | | if (src1 & 0x8000) |
| 1680 | | { |
| 1681 | | src1 |= 0xffff; |
| 1682 | | } |
| 1681 | src1 |= 0xffff0000; |
| 1683 | 1682 | } |
| 1684 | 1683 | |
| 1685 | 1684 | if (insn & 0x40) |
| 1686 | 1685 | { |
| 1687 | 1686 | src2 >>= 16; |
| 1688 | 1687 | } |
| 1689 | | else |
| 1688 | |
| 1689 | src2 &= 0xffff; |
| 1690 | if (src2 & 0x8000) |
| 1690 | 1691 | { |
| 1691 | | src2 &= 0xffff; |
| 1692 | | if (src2 & 0x8000) |
| 1693 | | { |
| 1694 | | src2 |= 0xffff; |
| 1695 | | } |
| 1692 | src2 |= 0xffff0000; |
| 1696 | 1693 | } |
| 1697 | 1694 | |
| 1698 | 1695 | res = src1 * src2; |
| 1699 | 1696 | SET_REGISTER(cpustart, (insn>>16)&0xf, res); |
| 1697 | R15 += 4; |
| 1700 | 1698 | } |
| 1701 | 1699 | else if ((insn & 0x0ff000b0) == 0x012000a0) // SMULWy - v5 |
| 1702 | 1700 | { |
| r20787 | r20788 | |
| 1708 | 1706 | { |
| 1709 | 1707 | src2 >>= 16; |
| 1710 | 1708 | } |
| 1711 | | else |
| 1709 | |
| 1710 | src2 &= 0xffff; |
| 1711 | if (src2 & 0x8000) |
| 1712 | 1712 | { |
| 1713 | | src2 &= 0xffff; |
| 1714 | | if (src2 & 0x8000) |
| 1715 | | { |
| 1716 | | src2 |= 0xffff; |
| 1717 | | } |
| 1713 | src2 |= 0xffff0000; |
| 1718 | 1714 | } |
| 1719 | 1715 | |
| 1720 | 1716 | res = (INT64)src1 * (INT64)src2; |
| 1721 | 1717 | res >>= 16; |
| 1722 | 1718 | SET_REGISTER(cpustart, (insn>>16)&0xf, (UINT32)res); |
| 1719 | R15 += 4; |
| 1723 | 1720 | } |
| 1724 | 1721 | else if ((insn & 0x0ff000b0) == 0x01200080) // SMLAWy - v5 |
| 1725 | 1722 | { |
| r20787 | r20788 | |
| 1732 | 1729 | { |
| 1733 | 1730 | src2 >>= 16; |
| 1734 | 1731 | } |
| 1735 | | else |
| 1732 | |
| 1733 | src2 &= 0xffff; |
| 1734 | if (src2 & 0x8000) |
| 1736 | 1735 | { |
| 1737 | | src2 &= 0xffff; |
| 1738 | | if (src2 & 0x8000) |
| 1739 | | { |
| 1740 | | src2 |= 0xffff; |
| 1741 | | } |
| 1736 | src2 |= 0xffff0000; |
| 1742 | 1737 | } |
| 1743 | 1738 | |
| 1744 | 1739 | res = (INT64)src1 * (INT64)src2; |
| r20787 | r20788 | |
| 1752 | 1747 | |
| 1753 | 1748 | // write the result back |
| 1754 | 1749 | SET_REGISTER(cpustart, (insn>>16)&0xf, (UINT32)res); |
| 1750 | R15 += 4; |
| 1755 | 1751 | } |
| 1756 | 1752 | else |
| 1757 | 1753 | /* Multiply OR Swap OR Half Word Data Transfer */ |