mirror of https://gitee.com/openkylin/qemu.git
target/ppc: Move Vector Compare Not Equal or Zero to decodetree
Reviewed-by: Richard Henderson <richard.henderson@linaro.org> Signed-off-by: Matheus Ferst <matheus.ferst@eldorado.org.br> Message-Id: <20220225210936.1749575-11-matheus.ferst@eldorado.org.br> Signed-off-by: Cédric Le Goater <clg@kaod.org>
This commit is contained in:
parent
6a394290df
commit
eb936dc074
|
@ -142,16 +142,13 @@ DEF_HELPER_3(vabsduw, void, avr, avr, avr)
|
|||
DEF_HELPER_3(vavgsb, void, avr, avr, avr)
|
||||
DEF_HELPER_3(vavgsh, void, avr, avr, avr)
|
||||
DEF_HELPER_3(vavgsw, void, avr, avr, avr)
|
||||
DEF_HELPER_4(vcmpnezb, void, env, avr, avr, avr)
|
||||
DEF_HELPER_4(vcmpnezh, void, env, avr, avr, avr)
|
||||
DEF_HELPER_4(vcmpnezw, void, env, avr, avr, avr)
|
||||
DEF_HELPER_4(vcmpeqfp, void, env, avr, avr, avr)
|
||||
DEF_HELPER_4(vcmpgefp, void, env, avr, avr, avr)
|
||||
DEF_HELPER_4(vcmpgtfp, void, env, avr, avr, avr)
|
||||
DEF_HELPER_4(vcmpbfp, void, env, avr, avr, avr)
|
||||
DEF_HELPER_4(vcmpnezb_dot, void, env, avr, avr, avr)
|
||||
DEF_HELPER_4(vcmpnezh_dot, void, env, avr, avr, avr)
|
||||
DEF_HELPER_4(vcmpnezw_dot, void, env, avr, avr, avr)
|
||||
DEF_HELPER_FLAGS_4(VCMPNEZB, TCG_CALL_NO_RWG, void, avr, avr, avr, i32)
|
||||
DEF_HELPER_FLAGS_4(VCMPNEZH, TCG_CALL_NO_RWG, void, avr, avr, avr, i32)
|
||||
DEF_HELPER_FLAGS_4(VCMPNEZW, TCG_CALL_NO_RWG, void, avr, avr, avr, i32)
|
||||
DEF_HELPER_4(vcmpeqfp_dot, void, env, avr, avr, avr)
|
||||
DEF_HELPER_4(vcmpgefp_dot, void, env, avr, avr, avr)
|
||||
DEF_HELPER_4(vcmpgtfp_dot, void, env, avr, avr, avr)
|
||||
|
|
|
@ -397,6 +397,10 @@ VCMPNEB 000100 ..... ..... ..... . 0000000111 @VC
|
|||
VCMPNEH 000100 ..... ..... ..... . 0001000111 @VC
|
||||
VCMPNEW 000100 ..... ..... ..... . 0010000111 @VC
|
||||
|
||||
VCMPNEZB 000100 ..... ..... ..... . 0100000111 @VC
|
||||
VCMPNEZH 000100 ..... ..... ..... . 0101000111 @VC
|
||||
VCMPNEZW 000100 ..... ..... ..... . 0110000111 @VC
|
||||
|
||||
## Vector Bit Manipulation Instruction
|
||||
|
||||
VCFUGED 000100 ..... ..... ..... 10101001101 @VX
|
||||
|
|
|
@ -662,46 +662,18 @@ VCF(ux, uint32_to_float32, u32)
|
|||
VCF(sx, int32_to_float32, s32)
|
||||
#undef VCF
|
||||
|
||||
#define VCMPNE_DO(suffix, element, etype, cmpzero, record) \
|
||||
void helper_vcmpne##suffix(CPUPPCState *env, ppc_avr_t *r, \
|
||||
ppc_avr_t *a, ppc_avr_t *b) \
|
||||
{ \
|
||||
etype ones = (etype)-1; \
|
||||
etype all = ones; \
|
||||
etype result, none = 0; \
|
||||
int i; \
|
||||
\
|
||||
for (i = 0; i < ARRAY_SIZE(r->element); i++) { \
|
||||
if (cmpzero) { \
|
||||
result = ((a->element[i] == 0) \
|
||||
|| (b->element[i] == 0) \
|
||||
|| (a->element[i] != b->element[i]) ? \
|
||||
ones : 0x0); \
|
||||
} else { \
|
||||
result = (a->element[i] != b->element[i]) ? ones : 0x0; \
|
||||
} \
|
||||
r->element[i] = result; \
|
||||
all &= result; \
|
||||
none |= result; \
|
||||
} \
|
||||
if (record) { \
|
||||
env->crf[6] = ((all != 0) << 3) | ((none == 0) << 1); \
|
||||
} \
|
||||
#define VCMPNEZ(NAME, ELEM) \
|
||||
void helper_##NAME(ppc_vsr_t *t, ppc_vsr_t *a, ppc_vsr_t *b, uint32_t desc) \
|
||||
{ \
|
||||
for (int i = 0; i < ARRAY_SIZE(t->ELEM); i++) { \
|
||||
t->ELEM[i] = ((a->ELEM[i] == 0) || (b->ELEM[i] == 0) || \
|
||||
(a->ELEM[i] != b->ELEM[i])) ? -1 : 0; \
|
||||
} \
|
||||
}
|
||||
|
||||
/*
|
||||
* VCMPNEZ - Vector compare not equal to zero
|
||||
* suffix - instruction mnemonic suffix (b: byte, h: halfword, w: word)
|
||||
* element - element type to access from vector
|
||||
*/
|
||||
#define VCMPNE(suffix, element, etype, cmpzero) \
|
||||
VCMPNE_DO(suffix, element, etype, cmpzero, 0) \
|
||||
VCMPNE_DO(suffix##_dot, element, etype, cmpzero, 1)
|
||||
VCMPNE(zb, u8, uint8_t, 1)
|
||||
VCMPNE(zh, u16, uint16_t, 1)
|
||||
VCMPNE(zw, u32, uint32_t, 1)
|
||||
#undef VCMPNE_DO
|
||||
#undef VCMPNE
|
||||
VCMPNEZ(VCMPNEZB, u8)
|
||||
VCMPNEZ(VCMPNEZH, u16)
|
||||
VCMPNEZ(VCMPNEZW, u32)
|
||||
#undef VCMPNEZ
|
||||
|
||||
#define VCMPFP_DO(suffix, compare, order, record) \
|
||||
void helper_vcmp##suffix(CPUPPCState *env, ppc_avr_t *r, \
|
||||
|
|
|
@ -985,10 +985,6 @@ static void glue(gen_, name0##_##name1)(DisasContext *ctx) \
|
|||
} \
|
||||
}
|
||||
|
||||
GEN_VXRFORM(vcmpnezb, 3, 4)
|
||||
GEN_VXRFORM(vcmpnezh, 3, 5)
|
||||
GEN_VXRFORM(vcmpnezw, 3, 6)
|
||||
|
||||
static void do_vcmp_rc(int vrt)
|
||||
{
|
||||
TCGv_i64 tmp, set, clr;
|
||||
|
@ -1049,6 +1045,68 @@ TRANS_FLAGS2(ISA300, VCMPNEB, do_vcmp, TCG_COND_NE, MO_8)
|
|||
TRANS_FLAGS2(ISA300, VCMPNEH, do_vcmp, TCG_COND_NE, MO_16)
|
||||
TRANS_FLAGS2(ISA300, VCMPNEW, do_vcmp, TCG_COND_NE, MO_32)
|
||||
|
||||
static void gen_vcmpnez_vec(unsigned vece, TCGv_vec t, TCGv_vec a, TCGv_vec b)
|
||||
{
|
||||
TCGv_vec t0, t1, zero;
|
||||
|
||||
t0 = tcg_temp_new_vec_matching(t);
|
||||
t1 = tcg_temp_new_vec_matching(t);
|
||||
zero = tcg_constant_vec_matching(t, vece, 0);
|
||||
|
||||
tcg_gen_cmp_vec(TCG_COND_EQ, vece, t0, a, zero);
|
||||
tcg_gen_cmp_vec(TCG_COND_EQ, vece, t1, b, zero);
|
||||
tcg_gen_cmp_vec(TCG_COND_NE, vece, t, a, b);
|
||||
|
||||
tcg_gen_or_vec(vece, t, t, t0);
|
||||
tcg_gen_or_vec(vece, t, t, t1);
|
||||
|
||||
tcg_temp_free_vec(t0);
|
||||
tcg_temp_free_vec(t1);
|
||||
}
|
||||
|
||||
static bool do_vcmpnez(DisasContext *ctx, arg_VC *a, int vece)
|
||||
{
|
||||
static const TCGOpcode vecop_list[] = {
|
||||
INDEX_op_cmp_vec, 0
|
||||
};
|
||||
static const GVecGen3 ops[3] = {
|
||||
{
|
||||
.fniv = gen_vcmpnez_vec,
|
||||
.fno = gen_helper_VCMPNEZB,
|
||||
.opt_opc = vecop_list,
|
||||
.vece = MO_8
|
||||
},
|
||||
{
|
||||
.fniv = gen_vcmpnez_vec,
|
||||
.fno = gen_helper_VCMPNEZH,
|
||||
.opt_opc = vecop_list,
|
||||
.vece = MO_16
|
||||
},
|
||||
{
|
||||
.fniv = gen_vcmpnez_vec,
|
||||
.fno = gen_helper_VCMPNEZW,
|
||||
.opt_opc = vecop_list,
|
||||
.vece = MO_32
|
||||
}
|
||||
};
|
||||
|
||||
REQUIRE_INSNS_FLAGS2(ctx, ISA300);
|
||||
REQUIRE_VECTOR(ctx);
|
||||
|
||||
tcg_gen_gvec_3(avr_full_offset(a->vrt), avr_full_offset(a->vra),
|
||||
avr_full_offset(a->vrb), 16, 16, &ops[vece]);
|
||||
|
||||
if (a->rc) {
|
||||
do_vcmp_rc(a->vrt);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
TRANS(VCMPNEZB, do_vcmpnez, MO_8)
|
||||
TRANS(VCMPNEZH, do_vcmpnez, MO_16)
|
||||
TRANS(VCMPNEZW, do_vcmpnez, MO_32)
|
||||
|
||||
GEN_VXRFORM(vcmpeqfp, 3, 3)
|
||||
GEN_VXRFORM(vcmpgefp, 3, 7)
|
||||
GEN_VXRFORM(vcmpgtfp, 3, 11)
|
||||
|
|
|
@ -184,9 +184,6 @@ GEN_HANDLER2_E(name, str, 0x4, opc2, opc3, 0x00000000, PPC_NONE, PPC2_ISA300),
|
|||
GEN_VXRFORM1_300(name, name, #name, opc2, opc3) \
|
||||
GEN_VXRFORM1_300(name##_dot, name##_, #name ".", opc2, (opc3 | (0x1 << 4)))
|
||||
|
||||
GEN_VXRFORM_300(vcmpnezb, 3, 4)
|
||||
GEN_VXRFORM_300(vcmpnezh, 3, 5)
|
||||
GEN_VXRFORM_300(vcmpnezw, 3, 6)
|
||||
GEN_VXRFORM(vcmpeqfp, 3, 3)
|
||||
GEN_VXRFORM(vcmpgefp, 3, 7)
|
||||
GEN_VXRFORM(vcmpgtfp, 3, 11)
|
||||
|
|
Loading…
Reference in New Issue