target/ppc: implement lxvr[bhwd]/stxvr[bhwd]x
Implement the following PowerISA v3.1 instuctions: lxvrbx: Load VSX Vector Rightmost Byte Indexed X-form lxvrhx: Load VSX Vector Rightmost Halfword Indexed X-form lxvrwx: Load VSX Vector Rightmost Word Indexed X-form lxvrdx: Load VSX Vector Rightmost Doubleword Indexed X-form stxvrbx: Store VSX Vector Rightmost Byte Indexed X-form stxvrhx: Store VSX Vector Rightmost Halfword Indexed X-form stxvrwx: Store VSX Vector Rightmost Word Indexed X-form stxvrdx: Store VSX Vector Rightmost Doubleword Indexed X-form Reviewed-by: Richard Henderson <richard.henderson@linaro.org> Signed-off-by: Lucas Coutinho <lucas.coutinho@eldorado.org.br> Signed-off-by: Matheus Ferst <matheus.ferst@eldorado.org.br> Message-Id: <20220225210936.1749575-50-matheus.ferst@eldorado.org.br> Signed-off-by: Cédric Le Goater <clg@kaod.org>
This commit is contained in:
parent
20e2d04e66
commit
604d00c76f
@ -614,6 +614,14 @@ LXVX 011111 ..... ..... ..... 0100 - 01100 . @X_TSX
|
||||
STXVX 011111 ..... ..... ..... 0110001100 . @X_TSX
|
||||
LXVPX 011111 ..... ..... ..... 0101001101 - @X_TSXP
|
||||
STXVPX 011111 ..... ..... ..... 0111001101 - @X_TSXP
|
||||
LXVRBX 011111 ..... ..... ..... 0000001101 . @X_TSX
|
||||
LXVRHX 011111 ..... ..... ..... 0000101101 . @X_TSX
|
||||
LXVRWX 011111 ..... ..... ..... 0001001101 . @X_TSX
|
||||
LXVRDX 011111 ..... ..... ..... 0001101101 . @X_TSX
|
||||
STXVRBX 011111 ..... ..... ..... 0010001101 . @X_TSX
|
||||
STXVRHX 011111 ..... ..... ..... 0010101101 . @X_TSX
|
||||
STXVRWX 011111 ..... ..... ..... 0011001101 . @X_TSX
|
||||
STXVRDX 011111 ..... ..... ..... 0011101101 . @X_TSX
|
||||
|
||||
## VSX Scalar Multiply-Add Instructions
|
||||
|
||||
|
@ -2363,6 +2363,41 @@ TRANS64_FLAGS2(ISA310, PLXV, do_lstxv_PLS_D, false, false)
|
||||
TRANS64_FLAGS2(ISA310, PSTXVP, do_lstxv_PLS_D, true, true)
|
||||
TRANS64_FLAGS2(ISA310, PLXVP, do_lstxv_PLS_D, false, true)
|
||||
|
||||
static bool do_lstrm(DisasContext *ctx, arg_X *a, MemOp mop, bool store)
|
||||
{
|
||||
TCGv ea;
|
||||
TCGv_i64 xt;
|
||||
|
||||
REQUIRE_VSX(ctx);
|
||||
|
||||
xt = tcg_temp_new_i64();
|
||||
|
||||
gen_set_access_type(ctx, ACCESS_INT);
|
||||
ea = do_ea_calc(ctx, a->ra , cpu_gpr[a->rb]);
|
||||
|
||||
if (store) {
|
||||
get_cpu_vsr(xt, a->rt, false);
|
||||
tcg_gen_qemu_st_i64(xt, ea, ctx->mem_idx, mop);
|
||||
} else {
|
||||
tcg_gen_qemu_ld_i64(xt, ea, ctx->mem_idx, mop);
|
||||
set_cpu_vsr(a->rt, xt, false);
|
||||
set_cpu_vsr(a->rt, tcg_constant_i64(0), true);
|
||||
}
|
||||
|
||||
tcg_temp_free(ea);
|
||||
tcg_temp_free_i64(xt);
|
||||
return true;
|
||||
}
|
||||
|
||||
TRANS_FLAGS2(ISA310, LXVRBX, do_lstrm, DEF_MEMOP(MO_UB), false)
|
||||
TRANS_FLAGS2(ISA310, LXVRHX, do_lstrm, DEF_MEMOP(MO_UW), false)
|
||||
TRANS_FLAGS2(ISA310, LXVRWX, do_lstrm, DEF_MEMOP(MO_UL), false)
|
||||
TRANS_FLAGS2(ISA310, LXVRDX, do_lstrm, DEF_MEMOP(MO_UQ), false)
|
||||
TRANS_FLAGS2(ISA310, STXVRBX, do_lstrm, DEF_MEMOP(MO_UB), true)
|
||||
TRANS_FLAGS2(ISA310, STXVRHX, do_lstrm, DEF_MEMOP(MO_UW), true)
|
||||
TRANS_FLAGS2(ISA310, STXVRWX, do_lstrm, DEF_MEMOP(MO_UL), true)
|
||||
TRANS_FLAGS2(ISA310, STXVRDX, do_lstrm, DEF_MEMOP(MO_UQ), true)
|
||||
|
||||
static void gen_xxeval_i64(TCGv_i64 t, TCGv_i64 a, TCGv_i64 b, TCGv_i64 c,
|
||||
int64_t imm)
|
||||
{
|
||||
|
Loading…
Reference in New Issue
Block a user