Commit 1f5063fb9756805efcd8c5a438ab747f36f796d9
1 parent
eb24dadd
Convert array8/16/32 and alignaddr to TCG
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@4085 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
4 changed files
with
45 additions
and
52 deletions
target-sparc/helper.h
| @@ -8,6 +8,10 @@ target_ulong TCG_HELPER_PROTO helper_rdpsr(void); | @@ -8,6 +8,10 @@ target_ulong TCG_HELPER_PROTO helper_rdpsr(void); | ||
| 8 | void TCG_HELPER_PROTO helper_wrpstate(target_ulong new_state); | 8 | void TCG_HELPER_PROTO helper_wrpstate(target_ulong new_state); |
| 9 | void TCG_HELPER_PROTO helper_done(void); | 9 | void TCG_HELPER_PROTO helper_done(void); |
| 10 | void TCG_HELPER_PROTO helper_retry(void); | 10 | void TCG_HELPER_PROTO helper_retry(void); |
| 11 | +target_ulong TCG_HELPER_PROTO helper_array8(target_ulong pixel_addr, | ||
| 12 | + target_ulong cubesize); | ||
| 13 | +target_ulong TCG_HELPER_PROTO helper_alignaddr(target_ulong addr, | ||
| 14 | + target_ulong offset); | ||
| 11 | target_ulong TCG_HELPER_PROTO helper_popc(target_ulong val); | 15 | target_ulong TCG_HELPER_PROTO helper_popc(target_ulong val); |
| 12 | void TCG_HELPER_PROTO helper_ldf_asi(target_ulong addr, int asi, int size, | 16 | void TCG_HELPER_PROTO helper_ldf_asi(target_ulong addr, int asi, int size, |
| 13 | int rd); | 17 | int rd); |
target-sparc/op.c
| @@ -568,54 +568,6 @@ void OPPROTO op_restored(void) | @@ -568,54 +568,6 @@ void OPPROTO op_restored(void) | ||
| 568 | #endif | 568 | #endif |
| 569 | 569 | ||
| 570 | #ifdef TARGET_SPARC64 | 570 | #ifdef TARGET_SPARC64 |
| 571 | -// This function uses non-native bit order | ||
| 572 | -#define GET_FIELD(X, FROM, TO) \ | ||
| 573 | - ((X) >> (63 - (TO)) & ((1ULL << ((TO) - (FROM) + 1)) - 1)) | ||
| 574 | - | ||
| 575 | -// This function uses the order in the manuals, i.e. bit 0 is 2^0 | ||
| 576 | -#define GET_FIELD_SP(X, FROM, TO) \ | ||
| 577 | - GET_FIELD(X, 63 - (TO), 63 - (FROM)) | ||
| 578 | - | ||
| 579 | -void OPPROTO op_array8() | ||
| 580 | -{ | ||
| 581 | - T0 = (GET_FIELD_SP(T0, 60, 63) << (17 + 2 * T1)) | | ||
| 582 | - (GET_FIELD_SP(T0, 39, 39 + T1 - 1) << (17 + T1)) | | ||
| 583 | - (GET_FIELD_SP(T0, 17 + T1 - 1, 17) << 17) | | ||
| 584 | - (GET_FIELD_SP(T0, 56, 59) << 13) | (GET_FIELD_SP(T0, 35, 38) << 9) | | ||
| 585 | - (GET_FIELD_SP(T0, 13, 16) << 5) | (((T0 >> 55) & 1) << 4) | | ||
| 586 | - (GET_FIELD_SP(T0, 33, 34) << 2) | GET_FIELD_SP(T0, 11, 12); | ||
| 587 | -} | ||
| 588 | - | ||
| 589 | -void OPPROTO op_array16() | ||
| 590 | -{ | ||
| 591 | - T0 = ((GET_FIELD_SP(T0, 60, 63) << (17 + 2 * T1)) | | ||
| 592 | - (GET_FIELD_SP(T0, 39, 39 + T1 - 1) << (17 + T1)) | | ||
| 593 | - (GET_FIELD_SP(T0, 17 + T1 - 1, 17) << 17) | | ||
| 594 | - (GET_FIELD_SP(T0, 56, 59) << 13) | (GET_FIELD_SP(T0, 35, 38) << 9) | | ||
| 595 | - (GET_FIELD_SP(T0, 13, 16) << 5) | (((T0 >> 55) & 1) << 4) | | ||
| 596 | - (GET_FIELD_SP(T0, 33, 34) << 2) | GET_FIELD_SP(T0, 11, 12)) << 1; | ||
| 597 | -} | ||
| 598 | - | ||
| 599 | -void OPPROTO op_array32() | ||
| 600 | -{ | ||
| 601 | - T0 = ((GET_FIELD_SP(T0, 60, 63) << (17 + 2 * T1)) | | ||
| 602 | - (GET_FIELD_SP(T0, 39, 39 + T1 - 1) << (17 + T1)) | | ||
| 603 | - (GET_FIELD_SP(T0, 17 + T1 - 1, 17) << 17) | | ||
| 604 | - (GET_FIELD_SP(T0, 56, 59) << 13) | (GET_FIELD_SP(T0, 35, 38) << 9) | | ||
| 605 | - (GET_FIELD_SP(T0, 13, 16) << 5) | (((T0 >> 55) & 1) << 4) | | ||
| 606 | - (GET_FIELD_SP(T0, 33, 34) << 2) | GET_FIELD_SP(T0, 11, 12)) << 2; | ||
| 607 | -} | ||
| 608 | - | ||
| 609 | -void OPPROTO op_alignaddr() | ||
| 610 | -{ | ||
| 611 | - uint64_t tmp; | ||
| 612 | - | ||
| 613 | - tmp = T0 + T1; | ||
| 614 | - env->gsr &= ~7ULL; | ||
| 615 | - env->gsr |= tmp & 7ULL; | ||
| 616 | - T0 = tmp & ~7ULL; | ||
| 617 | -} | ||
| 618 | - | ||
| 619 | void OPPROTO op_faligndata() | 571 | void OPPROTO op_faligndata() |
| 620 | { | 572 | { |
| 621 | uint64_t tmp; | 573 | uint64_t tmp; |
target-sparc/op_helper.c
| @@ -1637,6 +1637,37 @@ target_ulong helper_rdpsr(void) | @@ -1637,6 +1637,37 @@ target_ulong helper_rdpsr(void) | ||
| 1637 | 1637 | ||
| 1638 | #else | 1638 | #else |
| 1639 | 1639 | ||
| 1640 | +// This function uses non-native bit order | ||
| 1641 | +#define GET_FIELD(X, FROM, TO) \ | ||
| 1642 | + ((X) >> (63 - (TO)) & ((1ULL << ((TO) - (FROM) + 1)) - 1)) | ||
| 1643 | + | ||
| 1644 | +// This function uses the order in the manuals, i.e. bit 0 is 2^0 | ||
| 1645 | +#define GET_FIELD_SP(X, FROM, TO) \ | ||
| 1646 | + GET_FIELD(X, 63 - (TO), 63 - (FROM)) | ||
| 1647 | + | ||
| 1648 | +target_ulong helper_array8(target_ulong pixel_addr, target_ulong cubesize) | ||
| 1649 | +{ | ||
| 1650 | + return (GET_FIELD_SP(pixel_addr, 60, 63) << (17 + 2 * cubesize)) | | ||
| 1651 | + (GET_FIELD_SP(pixel_addr, 39, 39 + cubesize - 1) << (17 + cubesize)) | | ||
| 1652 | + (GET_FIELD_SP(pixel_addr, 17 + cubesize - 1, 17) << 17) | | ||
| 1653 | + (GET_FIELD_SP(pixel_addr, 56, 59) << 13) | | ||
| 1654 | + (GET_FIELD_SP(pixel_addr, 35, 38) << 9) | | ||
| 1655 | + (GET_FIELD_SP(pixel_addr, 13, 16) << 5) | | ||
| 1656 | + (((pixel_addr >> 55) & 1) << 4) | | ||
| 1657 | + (GET_FIELD_SP(pixel_addr, 33, 34) << 2) | | ||
| 1658 | + GET_FIELD_SP(pixel_addr, 11, 12); | ||
| 1659 | +} | ||
| 1660 | + | ||
| 1661 | +target_ulong helper_alignaddr(target_ulong addr, target_ulong offset) | ||
| 1662 | +{ | ||
| 1663 | + uint64_t tmp; | ||
| 1664 | + | ||
| 1665 | + tmp = addr + offset; | ||
| 1666 | + env->gsr &= ~7ULL; | ||
| 1667 | + env->gsr |= tmp & 7ULL; | ||
| 1668 | + return tmp & ~7ULL; | ||
| 1669 | +} | ||
| 1670 | + | ||
| 1640 | target_ulong helper_popc(target_ulong val) | 1671 | target_ulong helper_popc(target_ulong val) |
| 1641 | { | 1672 | { |
| 1642 | return ctpop64(val); | 1673 | return ctpop64(val); |
target-sparc/translate.c
| @@ -3515,25 +3515,31 @@ static void disas_sparc_insn(DisasContext * dc) | @@ -3515,25 +3515,31 @@ static void disas_sparc_insn(DisasContext * dc) | ||
| 3515 | case 0x010: /* VIS I array8 */ | 3515 | case 0x010: /* VIS I array8 */ |
| 3516 | gen_movl_reg_T0(rs1); | 3516 | gen_movl_reg_T0(rs1); |
| 3517 | gen_movl_reg_T1(rs2); | 3517 | gen_movl_reg_T1(rs2); |
| 3518 | - gen_op_array8(); | 3518 | + tcg_gen_helper_1_2(helper_array8, cpu_T[0], cpu_T[0], |
| 3519 | + cpu_T[1]); | ||
| 3519 | gen_movl_T0_reg(rd); | 3520 | gen_movl_T0_reg(rd); |
| 3520 | break; | 3521 | break; |
| 3521 | case 0x012: /* VIS I array16 */ | 3522 | case 0x012: /* VIS I array16 */ |
| 3522 | gen_movl_reg_T0(rs1); | 3523 | gen_movl_reg_T0(rs1); |
| 3523 | gen_movl_reg_T1(rs2); | 3524 | gen_movl_reg_T1(rs2); |
| 3524 | - gen_op_array16(); | 3525 | + tcg_gen_helper_1_2(helper_array8, cpu_T[0], cpu_T[0], |
| 3526 | + cpu_T[1]); | ||
| 3527 | + tcg_gen_shli_i64(cpu_T[0], cpu_T[0], 1); | ||
| 3525 | gen_movl_T0_reg(rd); | 3528 | gen_movl_T0_reg(rd); |
| 3526 | break; | 3529 | break; |
| 3527 | case 0x014: /* VIS I array32 */ | 3530 | case 0x014: /* VIS I array32 */ |
| 3528 | gen_movl_reg_T0(rs1); | 3531 | gen_movl_reg_T0(rs1); |
| 3529 | gen_movl_reg_T1(rs2); | 3532 | gen_movl_reg_T1(rs2); |
| 3530 | - gen_op_array32(); | 3533 | + tcg_gen_helper_1_2(helper_array8, cpu_T[0], cpu_T[0], |
| 3534 | + cpu_T[1]); | ||
| 3535 | + tcg_gen_shli_i64(cpu_T[0], cpu_T[0], 2); | ||
| 3531 | gen_movl_T0_reg(rd); | 3536 | gen_movl_T0_reg(rd); |
| 3532 | break; | 3537 | break; |
| 3533 | case 0x018: /* VIS I alignaddr */ | 3538 | case 0x018: /* VIS I alignaddr */ |
| 3534 | gen_movl_reg_T0(rs1); | 3539 | gen_movl_reg_T0(rs1); |
| 3535 | gen_movl_reg_T1(rs2); | 3540 | gen_movl_reg_T1(rs2); |
| 3536 | - gen_op_alignaddr(); | 3541 | + tcg_gen_helper_1_2(helper_alignaddr, cpu_T[0], cpu_T[0], |
| 3542 | + cpu_T[1]); | ||
| 3537 | gen_movl_T0_reg(rd); | 3543 | gen_movl_T0_reg(rd); |
| 3538 | break; | 3544 | break; |
| 3539 | case 0x019: /* VIS II bmask */ | 3545 | case 0x019: /* VIS II bmask */ |