Commit d03ef5116bb436437aef6054a284ebfd922612a2
1 parent
f4b147f6
target-ppc: convert rotation instructions to TCG
Also fix rlwimi and rldimi for corner cases. Signed-off-by: Aurelien Jarno <aurelien@aurel32.net> git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@5555 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
2 changed files
with
138 additions
and
159 deletions
target-ppc/op.c
| ... | ... | @@ -752,63 +752,7 @@ void OPPROTO op_subfzeo_64 (void) |
| 752 | 752 | } |
| 753 | 753 | #endif |
| 754 | 754 | |
| 755 | -/*** Integer logical ***/ | |
| 756 | -/* or */ | |
| 757 | -void OPPROTO op_or (void) | |
| 758 | -{ | |
| 759 | - T0 |= T1; | |
| 760 | - RETURN(); | |
| 761 | -} | |
| 762 | - | |
| 763 | -/*** Integer rotate ***/ | |
| 764 | -void OPPROTO op_rotl32_T0_T1 (void) | |
| 765 | -{ | |
| 766 | - T0 = rotl32(T0, T1 & 0x1F); | |
| 767 | - RETURN(); | |
| 768 | -} | |
| 769 | - | |
| 770 | -void OPPROTO op_rotli32_T0 (void) | |
| 771 | -{ | |
| 772 | - T0 = rotl32(T0, PARAM1); | |
| 773 | - RETURN(); | |
| 774 | -} | |
| 775 | - | |
| 776 | -#if defined(TARGET_PPC64) | |
| 777 | -void OPPROTO op_rotl64_T0_T1 (void) | |
| 778 | -{ | |
| 779 | - T0 = rotl64(T0, T1 & 0x3F); | |
| 780 | - RETURN(); | |
| 781 | -} | |
| 782 | - | |
| 783 | -void OPPROTO op_rotli64_T0 (void) | |
| 784 | -{ | |
| 785 | - T0 = rotl64(T0, PARAM1); | |
| 786 | - RETURN(); | |
| 787 | -} | |
| 788 | -#endif | |
| 789 | - | |
| 790 | 755 | /*** Integer shift ***/ |
| 791 | -/* shift right word */ | |
| 792 | -void OPPROTO op_sli_T0 (void) | |
| 793 | -{ | |
| 794 | - T0 = T0 << PARAM1; | |
| 795 | - RETURN(); | |
| 796 | -} | |
| 797 | - | |
| 798 | -void OPPROTO op_srli_T0 (void) | |
| 799 | -{ | |
| 800 | - T0 = (uint32_t)T0 >> PARAM1; | |
| 801 | - RETURN(); | |
| 802 | -} | |
| 803 | - | |
| 804 | -#if defined(TARGET_PPC64) | |
| 805 | -void OPPROTO op_srli_T0_64 (void) | |
| 806 | -{ | |
| 807 | - T0 = (uint64_t)T0 >> PARAM1; | |
| 808 | - RETURN(); | |
| 809 | -} | |
| 810 | -#endif | |
| 811 | - | |
| 812 | 756 | void OPPROTO op_srli_T1 (void) |
| 813 | 757 | { |
| 814 | 758 | T1 = (uint32_t)T1 >> PARAM1; | ... | ... |
target-ppc/translate.c
| ... | ... | @@ -1488,40 +1488,40 @@ GEN_HANDLER(cntlzd, 0x1F, 0x1A, 0x01, 0x00000000, PPC_64B) |
| 1488 | 1488 | /* rlwimi & rlwimi. */ |
| 1489 | 1489 | GEN_HANDLER(rlwimi, 0x14, 0xFF, 0xFF, 0x00000000, PPC_INTEGER) |
| 1490 | 1490 | { |
| 1491 | - target_ulong mask; | |
| 1492 | 1491 | uint32_t mb, me, sh; |
| 1493 | 1492 | |
| 1494 | 1493 | mb = MB(ctx->opcode); |
| 1495 | 1494 | me = ME(ctx->opcode); |
| 1496 | 1495 | sh = SH(ctx->opcode); |
| 1497 | - if (likely(sh == 0)) { | |
| 1498 | - if (likely(mb == 0 && me == 31)) { | |
| 1499 | - tcg_gen_mov_tl(cpu_T[0], cpu_gpr[rS(ctx->opcode)]); | |
| 1500 | - goto do_store; | |
| 1501 | - } else if (likely(mb == 31 && me == 0)) { | |
| 1502 | - tcg_gen_mov_tl(cpu_T[0], cpu_gpr[rA(ctx->opcode)]); | |
| 1503 | - goto do_store; | |
| 1496 | + if (likely(sh == 0 && mb == 0 && me == 31)) { | |
| 1497 | + tcg_gen_ext32u_tl(cpu_gpr[rA(ctx->opcode)], cpu_gpr[rS(ctx->opcode)]); | |
| 1498 | + } else { | |
| 1499 | + TCGv t0, t1; | |
| 1500 | + target_ulong mask; | |
| 1501 | + | |
| 1502 | + t0 = tcg_temp_new(TCG_TYPE_TL); | |
| 1503 | + t1 = tcg_temp_new(TCG_TYPE_TL); | |
| 1504 | + if (likely(sh == 0)) { | |
| 1505 | + tcg_gen_mov_tl(t0, cpu_gpr[rS(ctx->opcode)]); | |
| 1506 | + } else { | |
| 1507 | + tcg_gen_ext32u_tl(t1, cpu_gpr[rS(ctx->opcode)]); | |
| 1508 | + tcg_gen_shli_tl(t0, t1, sh); | |
| 1509 | + tcg_gen_shri_tl(t1, t1, 32 - sh); | |
| 1510 | + tcg_gen_or_tl(t0, t0, t1); | |
| 1504 | 1511 | } |
| 1505 | - tcg_gen_mov_tl(cpu_T[0], cpu_gpr[rS(ctx->opcode)]); | |
| 1506 | - tcg_gen_mov_tl(cpu_T[1], cpu_gpr[rA(ctx->opcode)]); | |
| 1507 | - goto do_mask; | |
| 1508 | - } | |
| 1509 | - tcg_gen_mov_tl(cpu_T[0], cpu_gpr[rS(ctx->opcode)]); | |
| 1510 | - tcg_gen_mov_tl(cpu_T[1], cpu_gpr[rA(ctx->opcode)]); | |
| 1511 | - gen_op_rotli32_T0(SH(ctx->opcode)); | |
| 1512 | - do_mask: | |
| 1513 | 1512 | #if defined(TARGET_PPC64) |
| 1514 | - mb += 32; | |
| 1515 | - me += 32; | |
| 1516 | -#endif | |
| 1517 | - mask = MASK(mb, me); | |
| 1518 | - tcg_gen_andi_tl(cpu_T[0], cpu_T[0], mask); | |
| 1519 | - tcg_gen_andi_tl(cpu_T[1], cpu_T[1], ~mask); | |
| 1520 | - gen_op_or(); | |
| 1521 | - do_store: | |
| 1522 | - tcg_gen_mov_tl(cpu_gpr[rA(ctx->opcode)], cpu_T[0]); | |
| 1513 | + mb += 32; | |
| 1514 | + me += 32; | |
| 1515 | +#endif | |
| 1516 | + mask = MASK(mb, me); | |
| 1517 | + tcg_gen_andi_tl(t0, t0, mask); | |
| 1518 | + tcg_gen_andi_tl(t1, cpu_gpr[rA(ctx->opcode)], ~mask); | |
| 1519 | + tcg_gen_or_tl(cpu_gpr[rA(ctx->opcode)], t0, t1); | |
| 1520 | + tcg_temp_free(t0); | |
| 1521 | + tcg_temp_free(t1); | |
| 1522 | + } | |
| 1523 | 1523 | if (unlikely(Rc(ctx->opcode) != 0)) |
| 1524 | - gen_set_Rc0(ctx, cpu_T[0]); | |
| 1524 | + gen_set_Rc0(ctx, cpu_gpr[rA(ctx->opcode)]); | |
| 1525 | 1525 | } |
| 1526 | 1526 | /* rlwinm & rlwinm. */ |
| 1527 | 1527 | GEN_HANDLER(rlwinm, 0x15, 0xFF, 0xFF, 0x00000000, PPC_INTEGER) |
| ... | ... | @@ -1531,56 +1531,78 @@ GEN_HANDLER(rlwinm, 0x15, 0xFF, 0xFF, 0x00000000, PPC_INTEGER) |
| 1531 | 1531 | sh = SH(ctx->opcode); |
| 1532 | 1532 | mb = MB(ctx->opcode); |
| 1533 | 1533 | me = ME(ctx->opcode); |
| 1534 | - tcg_gen_mov_tl(cpu_T[0], cpu_gpr[rS(ctx->opcode)]); | |
| 1535 | - if (likely(sh == 0)) { | |
| 1536 | - goto do_mask; | |
| 1537 | - } | |
| 1538 | - if (likely(mb == 0)) { | |
| 1539 | - if (likely(me == 31)) { | |
| 1540 | - gen_op_rotli32_T0(sh); | |
| 1541 | - goto do_store; | |
| 1542 | - } else if (likely(me == (31 - sh))) { | |
| 1543 | - gen_op_sli_T0(sh); | |
| 1544 | - goto do_store; | |
| 1534 | + | |
| 1535 | + if (likely(mb == 0 && me == (31 - sh))) { | |
| 1536 | + if (likely(sh == 0)) { | |
| 1537 | + tcg_gen_ext32u_tl(cpu_gpr[rA(ctx->opcode)], cpu_gpr[rS(ctx->opcode)]); | |
| 1538 | + } else { | |
| 1539 | + TCGv t0 = tcg_temp_new(TCG_TYPE_TL); | |
| 1540 | + tcg_gen_ext32u_tl(t0, cpu_gpr[rS(ctx->opcode)]); | |
| 1541 | + tcg_gen_shli_tl(t0, t0, sh); | |
| 1542 | + tcg_gen_ext32u_tl(cpu_gpr[rA(ctx->opcode)], t0); | |
| 1543 | + tcg_temp_free(t0); | |
| 1545 | 1544 | } |
| 1546 | - } else if (likely(me == 31)) { | |
| 1547 | - if (likely(sh == (32 - mb))) { | |
| 1548 | - gen_op_srli_T0(mb); | |
| 1549 | - goto do_store; | |
| 1545 | + } else if (likely(sh != 0 && me == 31 && sh == (32 - mb))) { | |
| 1546 | + TCGv t0 = tcg_temp_new(TCG_TYPE_TL); | |
| 1547 | + tcg_gen_ext32u_tl(t0, cpu_gpr[rS(ctx->opcode)]); | |
| 1548 | + tcg_gen_shri_tl(t0, t0, mb); | |
| 1549 | + tcg_gen_ext32u_tl(cpu_gpr[rA(ctx->opcode)], t0); | |
| 1550 | + tcg_temp_free(t0); | |
| 1551 | + } else { | |
| 1552 | + TCGv t0 = tcg_temp_new(TCG_TYPE_TL); | |
| 1553 | + if (likely(sh != 0)) { | |
| 1554 | + TCGv t1 = tcg_temp_new(TCG_TYPE_TL); | |
| 1555 | + tcg_gen_ext32u_tl(t0, cpu_gpr[rS(ctx->opcode)]); | |
| 1556 | + tcg_gen_shli_tl(t1, t0, sh); | |
| 1557 | + tcg_gen_shri_tl(t0, t0, 32 - sh); | |
| 1558 | + tcg_gen_or_tl(t0, t0, t1); | |
| 1559 | + tcg_temp_free(t1); | |
| 1560 | + } else { | |
| 1561 | + tcg_gen_mov_tl(t0, cpu_gpr[rS(ctx->opcode)]); | |
| 1550 | 1562 | } |
| 1551 | - } | |
| 1552 | - gen_op_rotli32_T0(sh); | |
| 1553 | - do_mask: | |
| 1554 | 1563 | #if defined(TARGET_PPC64) |
| 1555 | - mb += 32; | |
| 1556 | - me += 32; | |
| 1564 | + mb += 32; | |
| 1565 | + me += 32; | |
| 1557 | 1566 | #endif |
| 1558 | - tcg_gen_andi_tl(cpu_T[0], cpu_T[0], MASK(mb, me)); | |
| 1559 | - do_store: | |
| 1560 | - tcg_gen_mov_tl(cpu_gpr[rA(ctx->opcode)], cpu_T[0]); | |
| 1567 | + tcg_gen_andi_tl(cpu_gpr[rA(ctx->opcode)], t0, MASK(mb, me)); | |
| 1568 | + tcg_temp_free(t0); | |
| 1569 | + } | |
| 1561 | 1570 | if (unlikely(Rc(ctx->opcode) != 0)) |
| 1562 | - gen_set_Rc0(ctx, cpu_T[0]); | |
| 1571 | + gen_set_Rc0(ctx, cpu_gpr[rA(ctx->opcode)]); | |
| 1563 | 1572 | } |
| 1564 | 1573 | /* rlwnm & rlwnm. */ |
| 1565 | 1574 | GEN_HANDLER(rlwnm, 0x17, 0xFF, 0xFF, 0x00000000, PPC_INTEGER) |
| 1566 | 1575 | { |
| 1567 | 1576 | uint32_t mb, me; |
| 1577 | + TCGv t0, t1, t2, t3; | |
| 1568 | 1578 | |
| 1569 | 1579 | mb = MB(ctx->opcode); |
| 1570 | 1580 | me = ME(ctx->opcode); |
| 1571 | - tcg_gen_mov_tl(cpu_T[0], cpu_gpr[rS(ctx->opcode)]); | |
| 1572 | - tcg_gen_mov_tl(cpu_T[1], cpu_gpr[rB(ctx->opcode)]); | |
| 1573 | - gen_op_rotl32_T0_T1(); | |
| 1581 | + t0 = tcg_temp_new(TCG_TYPE_TL); | |
| 1582 | + tcg_gen_andi_tl(t0, cpu_gpr[rB(ctx->opcode)], 0x1f); | |
| 1583 | + t1 = tcg_temp_new(TCG_TYPE_TL); | |
| 1584 | + tcg_gen_ext32u_tl(t1, cpu_gpr[rS(ctx->opcode)]); | |
| 1585 | + t2 = tcg_temp_new(TCG_TYPE_TL); | |
| 1586 | + tcg_gen_shl_tl(t2, t1, t0); | |
| 1587 | + t3 = tcg_const_tl(32); | |
| 1588 | + tcg_gen_sub_tl(t0, t3, t0); | |
| 1589 | + tcg_temp_free(t3); | |
| 1590 | + tcg_gen_shr_tl(t1, t1, t0); | |
| 1591 | + tcg_temp_free(t0); | |
| 1592 | + tcg_gen_or_tl(t2, t2, t1); | |
| 1593 | + tcg_temp_free(t1); | |
| 1574 | 1594 | if (unlikely(mb != 0 || me != 31)) { |
| 1575 | 1595 | #if defined(TARGET_PPC64) |
| 1576 | 1596 | mb += 32; |
| 1577 | 1597 | me += 32; |
| 1578 | 1598 | #endif |
| 1579 | - tcg_gen_andi_tl(cpu_T[0], cpu_T[0], MASK(mb, me)); | |
| 1599 | + tcg_gen_andi_tl(cpu_gpr[rA(ctx->opcode)], t2, MASK(mb, me)); | |
| 1600 | + } else { | |
| 1601 | + tcg_gen_ext32u_tl(cpu_gpr[rA(ctx->opcode)], t2); | |
| 1580 | 1602 | } |
| 1581 | - tcg_gen_mov_tl(cpu_gpr[rA(ctx->opcode)], cpu_T[0]); | |
| 1603 | + tcg_temp_free(t2); | |
| 1582 | 1604 | if (unlikely(Rc(ctx->opcode) != 0)) |
| 1583 | - gen_set_Rc0(ctx, cpu_T[0]); | |
| 1605 | + gen_set_Rc0(ctx, cpu_gpr[rA(ctx->opcode)]); | |
| 1584 | 1606 | } |
| 1585 | 1607 | |
| 1586 | 1608 | #if defined(TARGET_PPC64) |
| ... | ... | @@ -1618,31 +1640,30 @@ GEN_HANDLER2(name##3, stringify(name), opc1, opc2 | 0x11, 0xFF, 0x00000000, \ |
| 1618 | 1640 | static always_inline void gen_rldinm (DisasContext *ctx, uint32_t mb, |
| 1619 | 1641 | uint32_t me, uint32_t sh) |
| 1620 | 1642 | { |
| 1621 | - tcg_gen_mov_tl(cpu_T[0], cpu_gpr[rS(ctx->opcode)]); | |
| 1622 | - if (likely(sh == 0)) { | |
| 1623 | - goto do_mask; | |
| 1624 | - } | |
| 1625 | - if (likely(mb == 0)) { | |
| 1626 | - if (likely(me == 63)) { | |
| 1627 | - gen_op_rotli64_T0(sh); | |
| 1628 | - goto do_store; | |
| 1629 | - } else if (likely(me == (63 - sh))) { | |
| 1630 | - gen_op_sli_T0(sh); | |
| 1631 | - goto do_store; | |
| 1643 | + if (likely(sh != 0 && mb == 0 && me == (63 - sh))) { | |
| 1644 | + tcg_gen_shli_tl(cpu_gpr[rA(ctx->opcode)], cpu_gpr[rS(ctx->opcode)], sh); | |
| 1645 | + } else if (likely(sh != 0 && me == 63 && sh == (64 - mb))) { | |
| 1646 | + tcg_gen_shri_tl(cpu_gpr[rA(ctx->opcode)], cpu_gpr[rS(ctx->opcode)], mb); | |
| 1647 | + } else { | |
| 1648 | + TCGv t0 = tcg_temp_new(TCG_TYPE_TL); | |
| 1649 | + if (likely(sh != 0)) { | |
| 1650 | + TCGv t1 = tcg_temp_new(TCG_TYPE_TL); | |
| 1651 | + tcg_gen_shli_tl(t0, cpu_gpr[rS(ctx->opcode)], sh); | |
| 1652 | + tcg_gen_shri_tl(t1, cpu_gpr[rS(ctx->opcode)], 64 - sh); | |
| 1653 | + tcg_gen_or_tl(t0, t0, t1); | |
| 1654 | + tcg_temp_free(t1); | |
| 1655 | + } else { | |
| 1656 | + tcg_gen_mov_tl(t0, cpu_gpr[rS(ctx->opcode)]); | |
| 1632 | 1657 | } |
| 1633 | - } else if (likely(me == 63)) { | |
| 1634 | - if (likely(sh == (64 - mb))) { | |
| 1635 | - gen_op_srli_T0_64(mb); | |
| 1636 | - goto do_store; | |
| 1658 | + if (likely(mb == 0 && me == 63)) { | |
| 1659 | + tcg_gen_ext32u_tl(cpu_gpr[rA(ctx->opcode)], t0); | |
| 1660 | + } else { | |
| 1661 | + tcg_gen_andi_tl(cpu_gpr[rA(ctx->opcode)], t0, MASK(mb, me)); | |
| 1637 | 1662 | } |
| 1663 | + tcg_temp_free(t0); | |
| 1638 | 1664 | } |
| 1639 | - gen_op_rotli64_T0(sh); | |
| 1640 | - do_mask: | |
| 1641 | - tcg_gen_andi_tl(cpu_T[0], cpu_T[0], MASK(mb, me)); | |
| 1642 | - do_store: | |
| 1643 | - tcg_gen_mov_tl(cpu_gpr[rA(ctx->opcode)], cpu_T[0]); | |
| 1644 | 1665 | if (unlikely(Rc(ctx->opcode) != 0)) |
| 1645 | - gen_set_Rc0(ctx, cpu_T[0]); | |
| 1666 | + gen_set_Rc0(ctx, cpu_gpr[rA(ctx->opcode)]); | |
| 1646 | 1667 | } |
| 1647 | 1668 | /* rldicl - rldicl. */ |
| 1648 | 1669 | static always_inline void gen_rldicl (DisasContext *ctx, int mbn, int shn) |
| ... | ... | @@ -1678,15 +1699,27 @@ GEN_PPC64_R4(rldic, 0x1E, 0x04); |
| 1678 | 1699 | static always_inline void gen_rldnm (DisasContext *ctx, uint32_t mb, |
| 1679 | 1700 | uint32_t me) |
| 1680 | 1701 | { |
| 1681 | - tcg_gen_mov_tl(cpu_T[0], cpu_gpr[rS(ctx->opcode)]); | |
| 1682 | - tcg_gen_mov_tl(cpu_T[1], cpu_gpr[rB(ctx->opcode)]); | |
| 1683 | - gen_op_rotl64_T0_T1(); | |
| 1702 | + TCGv t0, t1, t2; | |
| 1703 | + | |
| 1704 | + mb = MB(ctx->opcode); | |
| 1705 | + me = ME(ctx->opcode); | |
| 1706 | + t0 = tcg_temp_new(TCG_TYPE_TL); | |
| 1707 | + tcg_gen_andi_tl(t0, cpu_gpr[rB(ctx->opcode)], 0x3f); | |
| 1708 | + t1 = tcg_temp_new(TCG_TYPE_TL); | |
| 1709 | + tcg_gen_shl_tl(t1, cpu_gpr[rS(ctx->opcode)], t0); | |
| 1710 | + t2 = tcg_const_tl(32); | |
| 1711 | + tcg_gen_sub_tl(t0, t2, t0); | |
| 1712 | + tcg_temp_free(t2); | |
| 1713 | + tcg_gen_shr_tl(t0, cpu_gpr[rS(ctx->opcode)], t0); | |
| 1714 | + tcg_gen_or_tl(t1, t1, t0); | |
| 1715 | + tcg_temp_free(t0); | |
| 1684 | 1716 | if (unlikely(mb != 0 || me != 63)) { |
| 1685 | - tcg_gen_andi_tl(cpu_T[0], cpu_T[0], MASK(mb, me)); | |
| 1686 | - } | |
| 1687 | - tcg_gen_mov_tl(cpu_gpr[rA(ctx->opcode)], cpu_T[0]); | |
| 1717 | + tcg_gen_andi_tl(cpu_gpr[rA(ctx->opcode)], t1, MASK(mb, me)); | |
| 1718 | + } else | |
| 1719 | + tcg_gen_mov_tl(cpu_gpr[rA(ctx->opcode)], t1); | |
| 1720 | + tcg_temp_free(t1); | |
| 1688 | 1721 | if (unlikely(Rc(ctx->opcode) != 0)) |
| 1689 | - gen_set_Rc0(ctx, cpu_T[0]); | |
| 1722 | + gen_set_Rc0(ctx, cpu_gpr[rA(ctx->opcode)]); | |
| 1690 | 1723 | } |
| 1691 | 1724 | |
| 1692 | 1725 | /* rldcl - rldcl. */ |
| ... | ... | @@ -1710,33 +1743,35 @@ GEN_PPC64_R2(rldcr, 0x1E, 0x09); |
| 1710 | 1743 | /* rldimi - rldimi. */ |
| 1711 | 1744 | static always_inline void gen_rldimi (DisasContext *ctx, int mbn, int shn) |
| 1712 | 1745 | { |
| 1713 | - uint64_t mask; | |
| 1714 | 1746 | uint32_t sh, mb, me; |
| 1715 | 1747 | |
| 1716 | 1748 | sh = SH(ctx->opcode) | (shn << 5); |
| 1717 | 1749 | mb = MB(ctx->opcode) | (mbn << 5); |
| 1718 | 1750 | me = 63 - sh; |
| 1719 | - if (likely(sh == 0)) { | |
| 1720 | - if (likely(mb == 0)) { | |
| 1721 | - tcg_gen_mov_tl(cpu_T[0], cpu_gpr[rS(ctx->opcode)]); | |
| 1722 | - goto do_store; | |
| 1751 | + if (unlikely(sh == 0 && mb == 0)) { | |
| 1752 | + tcg_gen_mov_tl(cpu_gpr[rA(ctx->opcode)], cpu_gpr[rS(ctx->opcode)]); | |
| 1753 | + } else { | |
| 1754 | + TCGv t0, t1; | |
| 1755 | + target_ulong mask; | |
| 1756 | + | |
| 1757 | + t0 = tcg_temp_new(TCG_TYPE_TL); | |
| 1758 | + t1 = tcg_temp_new(TCG_TYPE_TL); | |
| 1759 | + if (likely(sh == 0)) { | |
| 1760 | + tcg_gen_mov_tl(t0, cpu_gpr[rS(ctx->opcode)]); | |
| 1761 | + } else { | |
| 1762 | + tcg_gen_shli_tl(t0, cpu_gpr[rS(ctx->opcode)], sh); | |
| 1763 | + tcg_gen_shri_tl(t1, cpu_gpr[rS(ctx->opcode)], 64 - sh); | |
| 1764 | + tcg_gen_or_tl(t0, t0, t1); | |
| 1723 | 1765 | } |
| 1724 | - tcg_gen_mov_tl(cpu_T[0], cpu_gpr[rS(ctx->opcode)]); | |
| 1725 | - tcg_gen_mov_tl(cpu_T[1], cpu_gpr[rA(ctx->opcode)]); | |
| 1726 | - goto do_mask; | |
| 1766 | + mask = MASK(mb, me); | |
| 1767 | + tcg_gen_andi_tl(t0, t0, mask); | |
| 1768 | + tcg_gen_andi_tl(t1, cpu_gpr[rA(ctx->opcode)], ~mask); | |
| 1769 | + tcg_gen_or_tl(cpu_gpr[rA(ctx->opcode)], t0, t1); | |
| 1770 | + tcg_temp_free(t0); | |
| 1771 | + tcg_temp_free(t1); | |
| 1727 | 1772 | } |
| 1728 | - tcg_gen_mov_tl(cpu_T[0], cpu_gpr[rS(ctx->opcode)]); | |
| 1729 | - tcg_gen_mov_tl(cpu_T[1], cpu_gpr[rA(ctx->opcode)]); | |
| 1730 | - gen_op_rotli64_T0(sh); | |
| 1731 | - do_mask: | |
| 1732 | - mask = MASK(mb, me); | |
| 1733 | - tcg_gen_andi_tl(cpu_T[0], cpu_T[0], mask); | |
| 1734 | - tcg_gen_andi_tl(cpu_T[1], cpu_T[1], ~mask); | |
| 1735 | - gen_op_or(); | |
| 1736 | - do_store: | |
| 1737 | - tcg_gen_mov_tl(cpu_gpr[rA(ctx->opcode)], cpu_T[0]); | |
| 1738 | 1773 | if (unlikely(Rc(ctx->opcode) != 0)) |
| 1739 | - gen_set_Rc0(ctx, cpu_T[0]); | |
| 1774 | + gen_set_Rc0(ctx, cpu_gpr[rA(ctx->opcode)]); | |
| 1740 | 1775 | } |
| 1741 | 1776 | GEN_PPC64_R4(rldimi, 0x1E, 0x06); |
| 1742 | 1777 | #endif | ... | ... |