mirror of
https://github.com/yuzu-emu/unicorn.git
synced 2024-12-23 12:35:36 +00:00
target/arm: Convert Neon VQABS, VQNEG to decodetree
Convert the Neon VQABS and VQNEG insns to decodetree. Since these are the only ones which need cpu_env passing to the helper, we wrap the helper rather than creating a whole new do_2misc_env() function. Backports commit 4936f38abe6db0a9d23fd04e4cb0cf4d51cff174 from qemu
This commit is contained in:
parent
4033a3ca5c
commit
3dcee11013
|
@ -465,6 +465,9 @@ Vimm_1r 1111 001 . 1 . 000 ... .... cmode:4 0 . op:1 1 .... @1reg_imm
|
|||
VPADAL_S 1111 001 11 . 11 .. 00 .... 0 1100 . . 0 .... @2misc
|
||||
VPADAL_U 1111 001 11 . 11 .. 00 .... 0 1101 . . 0 .... @2misc
|
||||
|
||||
VQABS 1111 001 11 . 11 .. 00 .... 0 1110 . . 0 .... @2misc
|
||||
VQNEG 1111 001 11 . 11 .. 00 .... 0 1111 . . 0 .... @2misc
|
||||
|
||||
VCGT0 1111 001 11 . 11 .. 01 .... 0 0000 . . 0 .... @2misc
|
||||
VCGE0 1111 001 11 . 11 .. 01 .... 0 0001 . . 0 .... @2misc
|
||||
VCEQ0 1111 001 11 . 11 .. 01 .... 0 0010 . . 0 .... @2misc
|
||||
|
|
|
@ -3717,3 +3717,38 @@ static bool trans_VRSQRTE(DisasContext *s, arg_2misc *a)
|
|||
}
|
||||
return do_2misc(s, a, gen_helper_rsqrte_u32);
|
||||
}
|
||||
|
||||
#define WRAP_1OP_ENV_FN(WRAPNAME, FUNC) \
|
||||
static void WRAPNAME(TCGContext *s, TCGv_i32 d, TCGv_i32 m) \
|
||||
{ \
|
||||
FUNC(s, d, s->cpu_env, m); \
|
||||
}
|
||||
|
||||
WRAP_1OP_ENV_FN(gen_VQABS_s8, gen_helper_neon_qabs_s8)
|
||||
WRAP_1OP_ENV_FN(gen_VQABS_s16, gen_helper_neon_qabs_s16)
|
||||
WRAP_1OP_ENV_FN(gen_VQABS_s32, gen_helper_neon_qabs_s32)
|
||||
WRAP_1OP_ENV_FN(gen_VQNEG_s8, gen_helper_neon_qneg_s8)
|
||||
WRAP_1OP_ENV_FN(gen_VQNEG_s16, gen_helper_neon_qneg_s16)
|
||||
WRAP_1OP_ENV_FN(gen_VQNEG_s32, gen_helper_neon_qneg_s32)
|
||||
|
||||
static bool trans_VQABS(DisasContext *s, arg_2misc *a)
|
||||
{
|
||||
static NeonGenOneOpFn * const fn[] = {
|
||||
gen_VQABS_s8,
|
||||
gen_VQABS_s16,
|
||||
gen_VQABS_s32,
|
||||
NULL,
|
||||
};
|
||||
return do_2misc(s, a, fn[a->size]);
|
||||
}
|
||||
|
||||
static bool trans_VQNEG(DisasContext *s, arg_2misc *a)
|
||||
{
|
||||
static NeonGenOneOpFn * const fn[] = {
|
||||
gen_VQNEG_s8,
|
||||
gen_VQNEG_s16,
|
||||
gen_VQNEG_s32,
|
||||
NULL,
|
||||
};
|
||||
return do_2misc(s, a, fn[a->size]);
|
||||
}
|
||||
|
|
|
@ -5047,6 +5047,8 @@ static int disas_neon_data_insn(DisasContext *s, uint32_t insn)
|
|||
case NEON_2RM_VNEG_F:
|
||||
case NEON_2RM_VRECPE:
|
||||
case NEON_2RM_VRSQRTE:
|
||||
case NEON_2RM_VQABS:
|
||||
case NEON_2RM_VQNEG:
|
||||
/* handled by decodetree */
|
||||
return 1;
|
||||
case NEON_2RM_VTRN:
|
||||
|
@ -5068,34 +5070,6 @@ static int disas_neon_data_insn(DisasContext *s, uint32_t insn)
|
|||
for (pass = 0; pass < (q ? 4 : 2); pass++) {
|
||||
tmp = neon_load_reg(s, rm, pass);
|
||||
switch (op) {
|
||||
case NEON_2RM_VQABS:
|
||||
switch (size) {
|
||||
case 0:
|
||||
gen_helper_neon_qabs_s8(tcg_ctx, tmp, tcg_ctx->cpu_env, tmp);
|
||||
break;
|
||||
case 1:
|
||||
gen_helper_neon_qabs_s16(tcg_ctx, tmp, tcg_ctx->cpu_env, tmp);
|
||||
break;
|
||||
case 2:
|
||||
gen_helper_neon_qabs_s32(tcg_ctx, tmp, tcg_ctx->cpu_env, tmp);
|
||||
break;
|
||||
default: abort();
|
||||
}
|
||||
break;
|
||||
case NEON_2RM_VQNEG:
|
||||
switch (size) {
|
||||
case 0:
|
||||
gen_helper_neon_qneg_s8(tcg_ctx, tmp, tcg_ctx->cpu_env, tmp);
|
||||
break;
|
||||
case 1:
|
||||
gen_helper_neon_qneg_s16(tcg_ctx, tmp, tcg_ctx->cpu_env, tmp);
|
||||
break;
|
||||
case 2:
|
||||
gen_helper_neon_qneg_s32(tcg_ctx, tmp, tcg_ctx->cpu_env, tmp);
|
||||
break;
|
||||
default: abort();
|
||||
}
|
||||
break;
|
||||
case NEON_2RM_VCGT0_F:
|
||||
{
|
||||
TCGv_ptr fpstatus = get_fpstatus_ptr(tcg_ctx, 1);
|
||||
|
|
Loading…
Reference in a new issue