Commit 3d3a6a0a48136117b8cd45dc9b1a88e7e3927d87
1 parent
b61f2753
PPC: convert SPE logical instructions to TCG
(Nathan Froyd) git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@5494 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
2 changed files
with
70 additions
and
56 deletions
target-ppc/op.c
... | ... | @@ -2507,54 +2507,6 @@ void OPPROTO op_evcntlsw (void) |
2507 | 2507 | RETURN(); |
2508 | 2508 | } |
2509 | 2509 | |
2510 | -void OPPROTO op_evand (void) | |
2511 | -{ | |
2512 | - T0_64 &= T1_64; | |
2513 | - RETURN(); | |
2514 | -} | |
2515 | - | |
2516 | -void OPPROTO op_evandc (void) | |
2517 | -{ | |
2518 | - T0_64 &= ~T1_64; | |
2519 | - RETURN(); | |
2520 | -} | |
2521 | - | |
2522 | -void OPPROTO op_evor (void) | |
2523 | -{ | |
2524 | - T0_64 |= T1_64; | |
2525 | - RETURN(); | |
2526 | -} | |
2527 | - | |
2528 | -void OPPROTO op_evxor (void) | |
2529 | -{ | |
2530 | - T0_64 ^= T1_64; | |
2531 | - RETURN(); | |
2532 | -} | |
2533 | - | |
2534 | -void OPPROTO op_eveqv (void) | |
2535 | -{ | |
2536 | - T0_64 = ~(T0_64 ^ T1_64); | |
2537 | - RETURN(); | |
2538 | -} | |
2539 | - | |
2540 | -void OPPROTO op_evnor (void) | |
2541 | -{ | |
2542 | - T0_64 = ~(T0_64 | T1_64); | |
2543 | - RETURN(); | |
2544 | -} | |
2545 | - | |
2546 | -void OPPROTO op_evorc (void) | |
2547 | -{ | |
2548 | - T0_64 |= ~T1_64; | |
2549 | - RETURN(); | |
2550 | -} | |
2551 | - | |
2552 | -void OPPROTO op_evnand (void) | |
2553 | -{ | |
2554 | - T0_64 = ~(T0_64 & T1_64); | |
2555 | - RETURN(); | |
2556 | -} | |
2557 | - | |
2558 | 2510 | void OPPROTO op_evsrws (void) |
2559 | 2511 | { |
2560 | 2512 | do_evsrws(); | ... | ... |
target-ppc/translate.c
... | ... | @@ -5723,6 +5723,23 @@ static always_inline void gen_##name (DisasContext *ctx) \ |
5723 | 5723 | gen_store_gpr64(rD(ctx->opcode), cpu_T64[0]); \ |
5724 | 5724 | } |
5725 | 5725 | |
5726 | +#define GEN_SPEOP_TCG_ARITH2(name) \ | |
5727 | +static always_inline void gen_##name (DisasContext *ctx) \ | |
5728 | +{ \ | |
5729 | + if (unlikely(!ctx->spe_enabled)) { \ | |
5730 | + GEN_EXCP_NO_AP(ctx); \ | |
5731 | + return; \ | |
5732 | + } \ | |
5733 | + TCGv t0 = tcg_temp_new(TCG_TYPE_I64); \ | |
5734 | + TCGv t1 = tcg_temp_new(TCG_TYPE_I64); \ | |
5735 | + gen_load_gpr64(t0, rA(ctx->opcode)); \ | |
5736 | + gen_load_gpr64(t1, rB(ctx->opcode)); \ | |
5737 | + gen_op_##name(t0, t1); \ | |
5738 | + gen_store_gpr64(rD(ctx->opcode), t0); \ | |
5739 | + tcg_temp_free(t0); \ | |
5740 | + tcg_temp_free(t1); \ | |
5741 | +} | |
5742 | + | |
5726 | 5743 | #define GEN_SPEOP_ARITH1(name) \ |
5727 | 5744 | static always_inline void gen_##name (DisasContext *ctx) \ |
5728 | 5745 | { \ |
... | ... | @@ -5749,14 +5766,59 @@ static always_inline void gen_##name (DisasContext *ctx) \ |
5749 | 5766 | } |
5750 | 5767 | |
5751 | 5768 | /* Logical */ |
5752 | -GEN_SPEOP_ARITH2(evand); | |
5753 | -GEN_SPEOP_ARITH2(evandc); | |
5754 | -GEN_SPEOP_ARITH2(evxor); | |
5755 | -GEN_SPEOP_ARITH2(evor); | |
5756 | -GEN_SPEOP_ARITH2(evnor); | |
5757 | -GEN_SPEOP_ARITH2(eveqv); | |
5758 | -GEN_SPEOP_ARITH2(evorc); | |
5759 | -GEN_SPEOP_ARITH2(evnand); | |
5769 | +static always_inline void gen_op_evand (TCGv t0, TCGv t1) | |
5770 | +{ | |
5771 | + tcg_gen_and_i64(t0, t0, t1); | |
5772 | +} | |
5773 | + | |
5774 | +static always_inline void gen_op_evandc (TCGv t0, TCGv t1) | |
5775 | +{ | |
5776 | + tcg_gen_not_i64(t1, t1); | |
5777 | + tcg_gen_and_i64(t0, t0, t1); | |
5778 | +} | |
5779 | + | |
5780 | +static always_inline void gen_op_evxor (TCGv t0, TCGv t1) | |
5781 | +{ | |
5782 | + tcg_gen_xor_i64(t0, t0, t1); | |
5783 | +} | |
5784 | + | |
5785 | +static always_inline void gen_op_evor (TCGv t0, TCGv t1) | |
5786 | +{ | |
5787 | + tcg_gen_or_i64(t0, t0, t1); | |
5788 | +} | |
5789 | + | |
5790 | +static always_inline void gen_op_evnor (TCGv t0, TCGv t1) | |
5791 | +{ | |
5792 | + tcg_gen_or_i64(t0, t0, t1); | |
5793 | + tcg_gen_not_i64(t0, t0); | |
5794 | +} | |
5795 | + | |
5796 | +static always_inline void gen_op_eveqv (TCGv t0, TCGv t1) | |
5797 | +{ | |
5798 | + tcg_gen_xor_i64(t0, t0, t1); | |
5799 | + tcg_gen_not_i64(t0, t0); | |
5800 | +} | |
5801 | + | |
5802 | +static always_inline void gen_op_evorc (TCGv t0, TCGv t1) | |
5803 | +{ | |
5804 | + tcg_gen_not_i64(t1, t1); | |
5805 | + tcg_gen_or_i64(t0, t0, t1); | |
5806 | +} | |
5807 | + | |
5808 | +static always_inline void gen_op_evnand (TCGv t0, TCGv t1) | |
5809 | +{ | |
5810 | + tcg_gen_and_i64(t0, t0, t1); | |
5811 | + tcg_gen_not_i64(t0, t0); | |
5812 | +} | |
5813 | + | |
5814 | +GEN_SPEOP_TCG_ARITH2(evand); | |
5815 | +GEN_SPEOP_TCG_ARITH2(evandc); | |
5816 | +GEN_SPEOP_TCG_ARITH2(evxor); | |
5817 | +GEN_SPEOP_TCG_ARITH2(evor); | |
5818 | +GEN_SPEOP_TCG_ARITH2(evnor); | |
5819 | +GEN_SPEOP_TCG_ARITH2(eveqv); | |
5820 | +GEN_SPEOP_TCG_ARITH2(evorc); | |
5821 | +GEN_SPEOP_TCG_ARITH2(evnand); | |
5760 | 5822 | GEN_SPEOP_ARITH2(evsrwu); |
5761 | 5823 | GEN_SPEOP_ARITH2(evsrws); |
5762 | 5824 | GEN_SPEOP_ARITH2(evslw); | ... | ... |