mirror of
https://github.com/xemu-project/xemu.git
synced 2024-11-25 12:40:08 +00:00
target/ppc: convert VSX logical operations to vector operations
Signed-off-by: Richard Henderson <richard.henderson@linaro.org> Acked-by: David Gibson <david@gibson.dropbear.id.au> Message-Id: <20190215100058.20015-6-mark.cave-ayland@ilande.co.uk> Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
This commit is contained in:
parent
0f6a6d5db8
commit
7b8fe477e1
@ -10,6 +10,11 @@ static inline void set_vsr(int n, TCGv_i64 src)
|
||||
tcg_gen_st_i64(src, cpu_env, offsetof(CPUPPCState, vsr[n].u64[1]));
|
||||
}
|
||||
|
||||
static inline int vsr_full_offset(int n)
|
||||
{
|
||||
return offsetof(CPUPPCState, vsr[n].u64[0]);
|
||||
}
|
||||
|
||||
static inline void get_cpu_vsrh(TCGv_i64 dst, int n)
|
||||
{
|
||||
if (n < 32) {
|
||||
@ -1255,40 +1260,26 @@ static void gen_xxbrw(DisasContext *ctx)
|
||||
tcg_temp_free_i64(xbl);
|
||||
}
|
||||
|
||||
#define VSX_LOGICAL(name, tcg_op) \
|
||||
#define VSX_LOGICAL(name, vece, tcg_op) \
|
||||
static void glue(gen_, name)(DisasContext * ctx) \
|
||||
{ \
|
||||
TCGv_i64 t0; \
|
||||
TCGv_i64 t1; \
|
||||
TCGv_i64 t2; \
|
||||
if (unlikely(!ctx->vsx_enabled)) { \
|
||||
gen_exception(ctx, POWERPC_EXCP_VSXU); \
|
||||
return; \
|
||||
} \
|
||||
t0 = tcg_temp_new_i64(); \
|
||||
t1 = tcg_temp_new_i64(); \
|
||||
t2 = tcg_temp_new_i64(); \
|
||||
get_cpu_vsrh(t0, xA(ctx->opcode)); \
|
||||
get_cpu_vsrh(t1, xB(ctx->opcode)); \
|
||||
tcg_op(t2, t0, t1); \
|
||||
set_cpu_vsrh(xT(ctx->opcode), t2); \
|
||||
get_cpu_vsrl(t0, xA(ctx->opcode)); \
|
||||
get_cpu_vsrl(t1, xB(ctx->opcode)); \
|
||||
tcg_op(t2, t0, t1); \
|
||||
set_cpu_vsrl(xT(ctx->opcode), t2); \
|
||||
tcg_temp_free_i64(t0); \
|
||||
tcg_temp_free_i64(t1); \
|
||||
tcg_temp_free_i64(t2); \
|
||||
tcg_op(vece, vsr_full_offset(xT(ctx->opcode)), \
|
||||
vsr_full_offset(xA(ctx->opcode)), \
|
||||
vsr_full_offset(xB(ctx->opcode)), 16, 16); \
|
||||
}
|
||||
|
||||
VSX_LOGICAL(xxland, tcg_gen_and_i64)
|
||||
VSX_LOGICAL(xxlandc, tcg_gen_andc_i64)
|
||||
VSX_LOGICAL(xxlor, tcg_gen_or_i64)
|
||||
VSX_LOGICAL(xxlxor, tcg_gen_xor_i64)
|
||||
VSX_LOGICAL(xxlnor, tcg_gen_nor_i64)
|
||||
VSX_LOGICAL(xxleqv, tcg_gen_eqv_i64)
|
||||
VSX_LOGICAL(xxlnand, tcg_gen_nand_i64)
|
||||
VSX_LOGICAL(xxlorc, tcg_gen_orc_i64)
|
||||
VSX_LOGICAL(xxland, MO_64, tcg_gen_gvec_and)
|
||||
VSX_LOGICAL(xxlandc, MO_64, tcg_gen_gvec_andc)
|
||||
VSX_LOGICAL(xxlor, MO_64, tcg_gen_gvec_or)
|
||||
VSX_LOGICAL(xxlxor, MO_64, tcg_gen_gvec_xor)
|
||||
VSX_LOGICAL(xxlnor, MO_64, tcg_gen_gvec_nor)
|
||||
VSX_LOGICAL(xxleqv, MO_64, tcg_gen_gvec_eqv)
|
||||
VSX_LOGICAL(xxlnand, MO_64, tcg_gen_gvec_nand)
|
||||
VSX_LOGICAL(xxlorc, MO_64, tcg_gen_gvec_orc)
|
||||
|
||||
#define VSX_XXMRG(name, high) \
|
||||
static void glue(gen_, name)(DisasContext * ctx) \
|
||||
|
Loading…
Reference in New Issue
Block a user