mirror of
https://github.com/xemu-project/xemu.git
synced 2024-11-24 03:59:52 +00:00
target/ppc: moved vector even and odd multiplication to decodetree
Moved the instructions vmulesb, vmulosb, vmuleub, vmuloub, vmulesh, vmulosh, vmuleuh, vmulouh, vmulesw, vmulosw, muleuw and vmulouw from legacy to decodetree. Implemented the instructions vmulesd, vmulosd, vmuleud, vmuloud. Reviewed-by: Richard Henderson <richard.henderson@linaro.org> Signed-off-by: Lucas Mateus Castro (alqotel) <lucas.araujo@eldorado.org.br> Signed-off-by: Matheus Ferst <matheus.ferst@eldorado.org.br> Message-Id: <20220225210936.1749575-3-matheus.ferst@eldorado.org.br> Signed-off-by: Cédric Le Goater <clg@kaod.org>
This commit is contained in:
parent
19f0862dd8
commit
80eca687c8
@ -192,18 +192,18 @@ DEF_HELPER_3(vmrglw, void, avr, avr, avr)
|
||||
DEF_HELPER_3(vmrghb, void, avr, avr, avr)
|
||||
DEF_HELPER_3(vmrghh, void, avr, avr, avr)
|
||||
DEF_HELPER_3(vmrghw, void, avr, avr, avr)
|
||||
DEF_HELPER_3(vmulesb, void, avr, avr, avr)
|
||||
DEF_HELPER_3(vmulesh, void, avr, avr, avr)
|
||||
DEF_HELPER_3(vmulesw, void, avr, avr, avr)
|
||||
DEF_HELPER_3(vmuleub, void, avr, avr, avr)
|
||||
DEF_HELPER_3(vmuleuh, void, avr, avr, avr)
|
||||
DEF_HELPER_3(vmuleuw, void, avr, avr, avr)
|
||||
DEF_HELPER_3(vmulosb, void, avr, avr, avr)
|
||||
DEF_HELPER_3(vmulosh, void, avr, avr, avr)
|
||||
DEF_HELPER_3(vmulosw, void, avr, avr, avr)
|
||||
DEF_HELPER_3(vmuloub, void, avr, avr, avr)
|
||||
DEF_HELPER_3(vmulouh, void, avr, avr, avr)
|
||||
DEF_HELPER_3(vmulouw, void, avr, avr, avr)
|
||||
DEF_HELPER_FLAGS_3(VMULESB, TCG_CALL_NO_RWG, void, avr, avr, avr)
|
||||
DEF_HELPER_FLAGS_3(VMULESH, TCG_CALL_NO_RWG, void, avr, avr, avr)
|
||||
DEF_HELPER_FLAGS_3(VMULESW, TCG_CALL_NO_RWG, void, avr, avr, avr)
|
||||
DEF_HELPER_FLAGS_3(VMULEUB, TCG_CALL_NO_RWG, void, avr, avr, avr)
|
||||
DEF_HELPER_FLAGS_3(VMULEUH, TCG_CALL_NO_RWG, void, avr, avr, avr)
|
||||
DEF_HELPER_FLAGS_3(VMULEUW, TCG_CALL_NO_RWG, void, avr, avr, avr)
|
||||
DEF_HELPER_FLAGS_3(VMULOSB, TCG_CALL_NO_RWG, void, avr, avr, avr)
|
||||
DEF_HELPER_FLAGS_3(VMULOSH, TCG_CALL_NO_RWG, void, avr, avr, avr)
|
||||
DEF_HELPER_FLAGS_3(VMULOSW, TCG_CALL_NO_RWG, void, avr, avr, avr)
|
||||
DEF_HELPER_FLAGS_3(VMULOUB, TCG_CALL_NO_RWG, void, avr, avr, avr)
|
||||
DEF_HELPER_FLAGS_3(VMULOUH, TCG_CALL_NO_RWG, void, avr, avr, avr)
|
||||
DEF_HELPER_FLAGS_3(VMULOUW, TCG_CALL_NO_RWG, void, avr, avr, avr)
|
||||
DEF_HELPER_3(vmulhsw, void, avr, avr, avr)
|
||||
DEF_HELPER_3(vmulhuw, void, avr, avr, avr)
|
||||
DEF_HELPER_3(vmulhsd, void, avr, avr, avr)
|
||||
|
@ -440,6 +440,28 @@ VEXTRACTWM 000100 ..... 01010 ..... 11001000010 @VX_tb
|
||||
VEXTRACTDM 000100 ..... 01011 ..... 11001000010 @VX_tb
|
||||
VEXTRACTQM 000100 ..... 01100 ..... 11001000010 @VX_tb
|
||||
|
||||
## Vector Multiply Instruction
|
||||
|
||||
VMULESB 000100 ..... ..... ..... 01100001000 @VX
|
||||
VMULOSB 000100 ..... ..... ..... 00100001000 @VX
|
||||
VMULEUB 000100 ..... ..... ..... 01000001000 @VX
|
||||
VMULOUB 000100 ..... ..... ..... 00000001000 @VX
|
||||
|
||||
VMULESH 000100 ..... ..... ..... 01101001000 @VX
|
||||
VMULOSH 000100 ..... ..... ..... 00101001000 @VX
|
||||
VMULEUH 000100 ..... ..... ..... 01001001000 @VX
|
||||
VMULOUH 000100 ..... ..... ..... 00001001000 @VX
|
||||
|
||||
VMULESW 000100 ..... ..... ..... 01110001000 @VX
|
||||
VMULOSW 000100 ..... ..... ..... 00110001000 @VX
|
||||
VMULEUW 000100 ..... ..... ..... 01010001000 @VX
|
||||
VMULOUW 000100 ..... ..... ..... 00010001000 @VX
|
||||
|
||||
VMULESD 000100 ..... ..... ..... 01111001000 @VX
|
||||
VMULOSD 000100 ..... ..... ..... 00111001000 @VX
|
||||
VMULEUD 000100 ..... ..... ..... 01011001000 @VX
|
||||
VMULOUD 000100 ..... ..... ..... 00011001000 @VX
|
||||
|
||||
# VSX Load/Store Instructions
|
||||
|
||||
LXV 111101 ..... ..... ............ . 001 @DQ_TSX
|
||||
|
@ -1063,7 +1063,7 @@ void helper_vmsumuhs(CPUPPCState *env, ppc_avr_t *r, ppc_avr_t *a,
|
||||
}
|
||||
|
||||
#define VMUL_DO_EVN(name, mul_element, mul_access, prod_access, cast) \
|
||||
void helper_v##name(ppc_avr_t *r, ppc_avr_t *a, ppc_avr_t *b) \
|
||||
void helper_V##name(ppc_avr_t *r, ppc_avr_t *a, ppc_avr_t *b) \
|
||||
{ \
|
||||
int i; \
|
||||
\
|
||||
@ -1074,7 +1074,7 @@ void helper_vmsumuhs(CPUPPCState *env, ppc_avr_t *r, ppc_avr_t *a,
|
||||
}
|
||||
|
||||
#define VMUL_DO_ODD(name, mul_element, mul_access, prod_access, cast) \
|
||||
void helper_v##name(ppc_avr_t *r, ppc_avr_t *a, ppc_avr_t *b) \
|
||||
void helper_V##name(ppc_avr_t *r, ppc_avr_t *a, ppc_avr_t *b) \
|
||||
{ \
|
||||
int i; \
|
||||
\
|
||||
@ -1085,14 +1085,14 @@ void helper_vmsumuhs(CPUPPCState *env, ppc_avr_t *r, ppc_avr_t *a,
|
||||
}
|
||||
|
||||
#define VMUL(suffix, mul_element, mul_access, prod_access, cast) \
|
||||
VMUL_DO_EVN(mule##suffix, mul_element, mul_access, prod_access, cast) \
|
||||
VMUL_DO_ODD(mulo##suffix, mul_element, mul_access, prod_access, cast)
|
||||
VMUL(sb, s8, VsrSB, VsrSH, int16_t)
|
||||
VMUL(sh, s16, VsrSH, VsrSW, int32_t)
|
||||
VMUL(sw, s32, VsrSW, VsrSD, int64_t)
|
||||
VMUL(ub, u8, VsrB, VsrH, uint16_t)
|
||||
VMUL(uh, u16, VsrH, VsrW, uint32_t)
|
||||
VMUL(uw, u32, VsrW, VsrD, uint64_t)
|
||||
VMUL_DO_EVN(MULE##suffix, mul_element, mul_access, prod_access, cast) \
|
||||
VMUL_DO_ODD(MULO##suffix, mul_element, mul_access, prod_access, cast)
|
||||
VMUL(SB, s8, VsrSB, VsrSH, int16_t)
|
||||
VMUL(SH, s16, VsrSH, VsrSW, int32_t)
|
||||
VMUL(SW, s32, VsrSW, VsrSD, int64_t)
|
||||
VMUL(UB, u8, VsrB, VsrH, uint16_t)
|
||||
VMUL(UH, u16, VsrH, VsrW, uint32_t)
|
||||
VMUL(UW, u32, VsrW, VsrD, uint64_t)
|
||||
#undef VMUL_DO_EVN
|
||||
#undef VMUL_DO_ODD
|
||||
#undef VMUL
|
||||
|
@ -798,29 +798,11 @@ static void trans_vclzd(DisasContext *ctx)
|
||||
tcg_temp_free_i64(avr);
|
||||
}
|
||||
|
||||
GEN_VXFORM(vmuloub, 4, 0);
|
||||
GEN_VXFORM(vmulouh, 4, 1);
|
||||
GEN_VXFORM(vmulouw, 4, 2);
|
||||
GEN_VXFORM_V(vmuluwm, MO_32, tcg_gen_gvec_mul, 4, 2);
|
||||
GEN_VXFORM_DUAL(vmulouw, PPC_ALTIVEC, PPC_NONE,
|
||||
vmuluwm, PPC_NONE, PPC2_ALTIVEC_207)
|
||||
GEN_VXFORM(vmulosb, 4, 4);
|
||||
GEN_VXFORM(vmulosh, 4, 5);
|
||||
GEN_VXFORM(vmulosw, 4, 6);
|
||||
GEN_VXFORM_V(vmulld, MO_64, tcg_gen_gvec_mul, 4, 7);
|
||||
GEN_VXFORM(vmuleub, 4, 8);
|
||||
GEN_VXFORM(vmuleuh, 4, 9);
|
||||
GEN_VXFORM(vmuleuw, 4, 10);
|
||||
GEN_VXFORM(vmulhuw, 4, 10);
|
||||
GEN_VXFORM(vmulhud, 4, 11);
|
||||
GEN_VXFORM_DUAL(vmuleuw, PPC_ALTIVEC, PPC_NONE,
|
||||
vmulhuw, PPC_NONE, PPC2_ISA310);
|
||||
GEN_VXFORM(vmulesb, 4, 12);
|
||||
GEN_VXFORM(vmulesh, 4, 13);
|
||||
GEN_VXFORM(vmulesw, 4, 14);
|
||||
GEN_VXFORM(vmulhsw, 4, 14);
|
||||
GEN_VXFORM_DUAL(vmulesw, PPC_ALTIVEC, PPC_NONE,
|
||||
vmulhsw, PPC_NONE, PPC2_ISA310);
|
||||
GEN_VXFORM(vmulhsd, 4, 15);
|
||||
GEN_VXFORM_V(vslb, MO_8, tcg_gen_gvec_shlv, 2, 4);
|
||||
GEN_VXFORM_V(vslh, MO_16, tcg_gen_gvec_shlv, 2, 5);
|
||||
@ -2104,6 +2086,65 @@ static bool trans_VPEXTD(DisasContext *ctx, arg_VX *a)
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool do_vx_helper(DisasContext *ctx, arg_VX *a,
|
||||
void (*gen_helper)(TCGv_ptr, TCGv_ptr, TCGv_ptr))
|
||||
{
|
||||
TCGv_ptr ra, rb, rd;
|
||||
REQUIRE_VECTOR(ctx);
|
||||
|
||||
ra = gen_avr_ptr(a->vra);
|
||||
rb = gen_avr_ptr(a->vrb);
|
||||
rd = gen_avr_ptr(a->vrt);
|
||||
gen_helper(rd, ra, rb);
|
||||
tcg_temp_free_ptr(ra);
|
||||
tcg_temp_free_ptr(rb);
|
||||
tcg_temp_free_ptr(rd);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool do_vx_vmuleo(DisasContext *ctx, arg_VX *a, bool even,
|
||||
void (*gen_mul)(TCGv_i64, TCGv_i64, TCGv_i64, TCGv_i64))
|
||||
{
|
||||
TCGv_i64 vra, vrb, vrt0, vrt1;
|
||||
REQUIRE_VECTOR(ctx);
|
||||
|
||||
vra = tcg_temp_new_i64();
|
||||
vrb = tcg_temp_new_i64();
|
||||
vrt0 = tcg_temp_new_i64();
|
||||
vrt1 = tcg_temp_new_i64();
|
||||
|
||||
get_avr64(vra, a->vra, even);
|
||||
get_avr64(vrb, a->vrb, even);
|
||||
gen_mul(vrt0, vrt1, vra, vrb);
|
||||
set_avr64(a->vrt, vrt0, false);
|
||||
set_avr64(a->vrt, vrt1, true);
|
||||
|
||||
tcg_temp_free_i64(vra);
|
||||
tcg_temp_free_i64(vrb);
|
||||
tcg_temp_free_i64(vrt0);
|
||||
tcg_temp_free_i64(vrt1);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
TRANS_FLAGS2(ALTIVEC_207, VMULESB, do_vx_helper, gen_helper_VMULESB)
|
||||
TRANS_FLAGS2(ALTIVEC_207, VMULOSB, do_vx_helper, gen_helper_VMULOSB)
|
||||
TRANS_FLAGS2(ALTIVEC_207, VMULEUB, do_vx_helper, gen_helper_VMULEUB)
|
||||
TRANS_FLAGS2(ALTIVEC_207, VMULOUB, do_vx_helper, gen_helper_VMULOUB)
|
||||
TRANS_FLAGS2(ALTIVEC_207, VMULESH, do_vx_helper, gen_helper_VMULESH)
|
||||
TRANS_FLAGS2(ALTIVEC_207, VMULOSH, do_vx_helper, gen_helper_VMULOSH)
|
||||
TRANS_FLAGS2(ALTIVEC_207, VMULEUH, do_vx_helper, gen_helper_VMULEUH)
|
||||
TRANS_FLAGS2(ALTIVEC_207, VMULOUH, do_vx_helper, gen_helper_VMULOUH)
|
||||
TRANS_FLAGS2(ALTIVEC_207, VMULESW, do_vx_helper, gen_helper_VMULESW)
|
||||
TRANS_FLAGS2(ALTIVEC_207, VMULOSW, do_vx_helper, gen_helper_VMULOSW)
|
||||
TRANS_FLAGS2(ALTIVEC_207, VMULEUW, do_vx_helper, gen_helper_VMULEUW)
|
||||
TRANS_FLAGS2(ALTIVEC_207, VMULOUW, do_vx_helper, gen_helper_VMULOUW)
|
||||
TRANS_FLAGS2(ISA310, VMULESD, do_vx_vmuleo, true , tcg_gen_muls2_i64)
|
||||
TRANS_FLAGS2(ISA310, VMULOSD, do_vx_vmuleo, false, tcg_gen_muls2_i64)
|
||||
TRANS_FLAGS2(ISA310, VMULEUD, do_vx_vmuleo, true , tcg_gen_mulu2_i64)
|
||||
TRANS_FLAGS2(ISA310, VMULOUD, do_vx_vmuleo, false, tcg_gen_mulu2_i64)
|
||||
|
||||
#undef GEN_VR_LDX
|
||||
#undef GEN_VR_STX
|
||||
#undef GEN_VR_LVE
|
||||
|
@ -101,20 +101,11 @@ GEN_VXFORM_DUAL(vmrgow, vextuwlx, 6, 26, PPC_NONE, PPC2_ALTIVEC_207),
|
||||
GEN_VXFORM_300(vextubrx, 6, 28),
|
||||
GEN_VXFORM_300(vextuhrx, 6, 29),
|
||||
GEN_VXFORM_DUAL(vmrgew, vextuwrx, 6, 30, PPC_NONE, PPC2_ALTIVEC_207),
|
||||
GEN_VXFORM(vmuloub, 4, 0),
|
||||
GEN_VXFORM(vmulouh, 4, 1),
|
||||
GEN_VXFORM_DUAL(vmulouw, vmuluwm, 4, 2, PPC_ALTIVEC, PPC_NONE),
|
||||
GEN_VXFORM(vmulosb, 4, 4),
|
||||
GEN_VXFORM(vmulosh, 4, 5),
|
||||
GEN_VXFORM_207(vmulosw, 4, 6),
|
||||
GEN_VXFORM_207(vmuluwm, 4, 2),
|
||||
GEN_VXFORM_310(vmulld, 4, 7),
|
||||
GEN_VXFORM(vmuleub, 4, 8),
|
||||
GEN_VXFORM(vmuleuh, 4, 9),
|
||||
GEN_VXFORM_DUAL(vmuleuw, vmulhuw, 4, 10, PPC_ALTIVEC, PPC_NONE),
|
||||
GEN_VXFORM_310(vmulhuw, 4, 10),
|
||||
GEN_VXFORM_310(vmulhud, 4, 11),
|
||||
GEN_VXFORM(vmulesb, 4, 12),
|
||||
GEN_VXFORM(vmulesh, 4, 13),
|
||||
GEN_VXFORM_DUAL(vmulesw, vmulhsw, 4, 14, PPC_ALTIVEC, PPC_NONE),
|
||||
GEN_VXFORM_310(vmulhsw, 4, 14),
|
||||
GEN_VXFORM_310(vmulhsd, 4, 15),
|
||||
GEN_VXFORM(vslb, 2, 4),
|
||||
GEN_VXFORM(vslh, 2, 5),
|
||||
|
@ -3987,3 +3987,9 @@ void tcg_register_jit(const void *buf, size_t buf_size)
|
||||
tcg_register_jit_int(buf, buf_size, &debug_frame, sizeof(debug_frame));
|
||||
}
|
||||
#endif /* __ELF__ */
|
||||
#undef VMULEUB
|
||||
#undef VMULEUH
|
||||
#undef VMULEUW
|
||||
#undef VMULOUB
|
||||
#undef VMULOUH
|
||||
#undef VMULOUW
|
||||
|
Loading…
Reference in New Issue
Block a user