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 | 8 | void TCG_HELPER_PROTO helper_wrpstate(target_ulong new_state); |
9 | 9 | void TCG_HELPER_PROTO helper_done(void); |
10 | 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 | 15 | target_ulong TCG_HELPER_PROTO helper_popc(target_ulong val); |
12 | 16 | void TCG_HELPER_PROTO helper_ldf_asi(target_ulong addr, int asi, int size, |
13 | 17 | int rd); | ... | ... |
target-sparc/op.c
... | ... | @@ -568,54 +568,6 @@ void OPPROTO op_restored(void) |
568 | 568 | #endif |
569 | 569 | |
570 | 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 | 571 | void OPPROTO op_faligndata() |
620 | 572 | { |
621 | 573 | uint64_t tmp; | ... | ... |
target-sparc/op_helper.c
... | ... | @@ -1637,6 +1637,37 @@ target_ulong helper_rdpsr(void) |
1637 | 1637 | |
1638 | 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 | 1671 | target_ulong helper_popc(target_ulong val) |
1641 | 1672 | { |
1642 | 1673 | return ctpop64(val); | ... | ... |
target-sparc/translate.c
... | ... | @@ -3515,25 +3515,31 @@ static void disas_sparc_insn(DisasContext * dc) |
3515 | 3515 | case 0x010: /* VIS I array8 */ |
3516 | 3516 | gen_movl_reg_T0(rs1); |
3517 | 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 | 3520 | gen_movl_T0_reg(rd); |
3520 | 3521 | break; |
3521 | 3522 | case 0x012: /* VIS I array16 */ |
3522 | 3523 | gen_movl_reg_T0(rs1); |
3523 | 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 | 3528 | gen_movl_T0_reg(rd); |
3526 | 3529 | break; |
3527 | 3530 | case 0x014: /* VIS I array32 */ |
3528 | 3531 | gen_movl_reg_T0(rs1); |
3529 | 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 | 3536 | gen_movl_T0_reg(rd); |
3532 | 3537 | break; |
3533 | 3538 | case 0x018: /* VIS I alignaddr */ |
3534 | 3539 | gen_movl_reg_T0(rs1); |
3535 | 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 | 3543 | gen_movl_T0_reg(rd); |
3538 | 3544 | break; |
3539 | 3545 | case 0x019: /* VIS II bmask */ | ... | ... |