mirror of https://github.com/xemu-project/xemu.git
target/arm: Convert Neon VSWP to decodetree
Convert the Neon VSWP insn to decodetree. Since the new implementation doesn't have to share a pass-loop with the other 2-reg-misc operations we can implement the swap with 64-bit accesses rather than 32-bits (which brings us into line with the pseudocode and is more efficient). Signed-off-by: Peter Maydell <peter.maydell@linaro.org> Reviewed-by: Richard Henderson <richard.henderson@linaro.org> Message-id: 20200616170844.13318-20-peter.maydell@linaro.org
This commit is contained in:
parent
a183d5fb38
commit
8ab3a227a0
|
@ -488,6 +488,8 @@ Vimm_1r 1111 001 . 1 . 000 ... .... cmode:4 0 . op:1 1 .... @1reg_imm
|
||||||
VABS_F 1111 001 11 . 11 .. 01 .... 0 1110 . . 0 .... @2misc
|
VABS_F 1111 001 11 . 11 .. 01 .... 0 1110 . . 0 .... @2misc
|
||||||
VNEG_F 1111 001 11 . 11 .. 01 .... 0 1111 . . 0 .... @2misc
|
VNEG_F 1111 001 11 . 11 .. 01 .... 0 1111 . . 0 .... @2misc
|
||||||
|
|
||||||
|
VSWP 1111 001 11 . 11 .. 10 .... 0 0000 . . 0 .... @2misc
|
||||||
|
|
||||||
VUZP 1111 001 11 . 11 .. 10 .... 0 0010 . . 0 .... @2misc
|
VUZP 1111 001 11 . 11 .. 10 .... 0 0010 . . 0 .... @2misc
|
||||||
VZIP 1111 001 11 . 11 .. 10 .... 0 0011 . . 0 .... @2misc
|
VZIP 1111 001 11 . 11 .. 10 .... 0 0011 . . 0 .... @2misc
|
||||||
|
|
||||||
|
|
|
@ -3927,3 +3927,44 @@ DO_VCVT(VCVTPU, FPROUNDING_POSINF, false)
|
||||||
DO_VCVT(VCVTPS, FPROUNDING_POSINF, true)
|
DO_VCVT(VCVTPS, FPROUNDING_POSINF, true)
|
||||||
DO_VCVT(VCVTMU, FPROUNDING_NEGINF, false)
|
DO_VCVT(VCVTMU, FPROUNDING_NEGINF, false)
|
||||||
DO_VCVT(VCVTMS, FPROUNDING_NEGINF, true)
|
DO_VCVT(VCVTMS, FPROUNDING_NEGINF, true)
|
||||||
|
|
||||||
|
static bool trans_VSWP(DisasContext *s, arg_2misc *a)
|
||||||
|
{
|
||||||
|
TCGv_i64 rm, rd;
|
||||||
|
int pass;
|
||||||
|
|
||||||
|
if (!arm_dc_feature(s, ARM_FEATURE_NEON)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* UNDEF accesses to D16-D31 if they don't exist. */
|
||||||
|
if (!dc_isar_feature(aa32_simd_r32, s) &&
|
||||||
|
((a->vd | a->vm) & 0x10)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (a->size != 0) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((a->vd | a->vm) & a->q) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!vfp_access_check(s)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
rm = tcg_temp_new_i64();
|
||||||
|
rd = tcg_temp_new_i64();
|
||||||
|
for (pass = 0; pass < (a->q ? 2 : 1); pass++) {
|
||||||
|
neon_load_reg64(rm, a->vm + pass);
|
||||||
|
neon_load_reg64(rd, a->vd + pass);
|
||||||
|
neon_store_reg64(rm, a->vd + pass);
|
||||||
|
neon_store_reg64(rd, a->vm + pass);
|
||||||
|
}
|
||||||
|
tcg_temp_free_i64(rm);
|
||||||
|
tcg_temp_free_i64(rd);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
|
@ -4944,6 +4944,7 @@ static int disas_neon_data_insn(DisasContext *s, uint32_t insn)
|
||||||
case NEON_2RM_VCVTPS:
|
case NEON_2RM_VCVTPS:
|
||||||
case NEON_2RM_VCVTMU:
|
case NEON_2RM_VCVTMU:
|
||||||
case NEON_2RM_VCVTMS:
|
case NEON_2RM_VCVTMS:
|
||||||
|
case NEON_2RM_VSWP:
|
||||||
/* handled by decodetree */
|
/* handled by decodetree */
|
||||||
return 1;
|
return 1;
|
||||||
case NEON_2RM_VTRN:
|
case NEON_2RM_VTRN:
|
||||||
|
@ -4965,10 +4966,6 @@ static int disas_neon_data_insn(DisasContext *s, uint32_t insn)
|
||||||
for (pass = 0; pass < (q ? 4 : 2); pass++) {
|
for (pass = 0; pass < (q ? 4 : 2); pass++) {
|
||||||
tmp = neon_load_reg(rm, pass);
|
tmp = neon_load_reg(rm, pass);
|
||||||
switch (op) {
|
switch (op) {
|
||||||
case NEON_2RM_VSWP:
|
|
||||||
tmp2 = neon_load_reg(rd, pass);
|
|
||||||
neon_store_reg(rm, pass, tmp2);
|
|
||||||
break;
|
|
||||||
case NEON_2RM_VTRN:
|
case NEON_2RM_VTRN:
|
||||||
tmp2 = neon_load_reg(rd, pass);
|
tmp2 = neon_load_reg(rd, pass);
|
||||||
switch (size) {
|
switch (size) {
|
||||||
|
|
Loading…
Reference in New Issue