target/arm: Implement MVE shifts by register
Implement the MVE shifts by register, which perform shifts on a single general-purpose register. Signed-off-by: Peter Maydell <peter.maydell@linaro.org> Reviewed-by: Richard Henderson <richard.henderson@linaro.org> Message-id: 20210628135835.6690-19-peter.maydell@linaro.org
This commit is contained in:
parent
46321d47a9
commit
04ea4d3cfd
|
@ -461,3 +461,5 @@ DEF_HELPER_FLAGS_3(mve_uqrshll48, TCG_CALL_NO_RWG, i64, env, i64, i32)
|
||||||
|
|
||||||
DEF_HELPER_FLAGS_3(mve_uqshl, TCG_CALL_NO_RWG, i32, env, i32, i32)
|
DEF_HELPER_FLAGS_3(mve_uqshl, TCG_CALL_NO_RWG, i32, env, i32, i32)
|
||||||
DEF_HELPER_FLAGS_3(mve_sqshl, TCG_CALL_NO_RWG, i32, env, i32, i32)
|
DEF_HELPER_FLAGS_3(mve_sqshl, TCG_CALL_NO_RWG, i32, env, i32, i32)
|
||||||
|
DEF_HELPER_FLAGS_3(mve_uqrshl, TCG_CALL_NO_RWG, i32, env, i32, i32)
|
||||||
|
DEF_HELPER_FLAGS_3(mve_sqrshr, TCG_CALL_NO_RWG, i32, env, i32, i32)
|
||||||
|
|
|
@ -1638,3 +1638,13 @@ uint32_t HELPER(mve_sqshl)(CPUARMState *env, uint32_t n, uint32_t shift)
|
||||||
{
|
{
|
||||||
return do_sqrshl_bhs(n, (int8_t)shift, 32, false, &env->QF);
|
return do_sqrshl_bhs(n, (int8_t)shift, 32, false, &env->QF);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
uint32_t HELPER(mve_uqrshl)(CPUARMState *env, uint32_t n, uint32_t shift)
|
||||||
|
{
|
||||||
|
return do_uqrshl_bhs(n, (int8_t)shift, 32, true, &env->QF);
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32_t HELPER(mve_sqrshr)(CPUARMState *env, uint32_t n, uint32_t shift)
|
||||||
|
{
|
||||||
|
return do_sqrshl_bhs(n, -(int8_t)shift, 32, true, &env->QF);
|
||||||
|
}
|
||||||
|
|
|
@ -51,6 +51,7 @@
|
||||||
&mve_shl_ri rdalo rdahi shim
|
&mve_shl_ri rdalo rdahi shim
|
||||||
&mve_shl_rr rdalo rdahi rm
|
&mve_shl_rr rdalo rdahi rm
|
||||||
&mve_sh_ri rda shim
|
&mve_sh_ri rda shim
|
||||||
|
&mve_sh_rr rda rm
|
||||||
|
|
||||||
# rdahi: bits [3:1] from insn, bit 0 is 1
|
# rdahi: bits [3:1] from insn, bit 0 is 1
|
||||||
# rdalo: bits [3:1] from insn, bit 0 is 0
|
# rdalo: bits [3:1] from insn, bit 0 is 0
|
||||||
|
@ -74,6 +75,7 @@
|
||||||
&mve_shl_rr rdalo=%rdalo_17 rdahi=%rdahi_9
|
&mve_shl_rr rdalo=%rdalo_17 rdahi=%rdahi_9
|
||||||
@mve_sh_ri ....... .... . rda:4 . ... ... . .. .. .... \
|
@mve_sh_ri ....... .... . rda:4 . ... ... . .. .. .... \
|
||||||
&mve_sh_ri shim=%imm5_12_6
|
&mve_sh_ri shim=%imm5_12_6
|
||||||
|
@mve_sh_rr ....... .... . rda:4 rm:4 .... .... .... &mve_sh_rr
|
||||||
|
|
||||||
{
|
{
|
||||||
TST_xrri 1110101 0000 1 .... 0 ... 1111 .... .... @S_xrr_shi
|
TST_xrri 1110101 0000 1 .... 0 ... 1111 .... .... @S_xrr_shi
|
||||||
|
@ -112,10 +114,18 @@ BIC_rrri 1110101 0001 . .... 0 ... .... .... .... @s_rrr_shi
|
||||||
SQSHLL_ri 1110101 0010 1 ... 1 0 ... ... 1 .. 11 1111 @mve_shl_ri
|
SQSHLL_ri 1110101 0010 1 ... 1 0 ... ... 1 .. 11 1111 @mve_shl_ri
|
||||||
}
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
UQRSHL_rr 1110101 0010 1 .... .... 1111 0000 1101 @mve_sh_rr
|
||||||
LSLL_rr 1110101 0010 1 ... 0 .... ... 1 0000 1101 @mve_shl_rr
|
LSLL_rr 1110101 0010 1 ... 0 .... ... 1 0000 1101 @mve_shl_rr
|
||||||
ASRL_rr 1110101 0010 1 ... 0 .... ... 1 0010 1101 @mve_shl_rr
|
|
||||||
UQRSHLL64_rr 1110101 0010 1 ... 1 .... ... 1 0000 1101 @mve_shl_rr
|
UQRSHLL64_rr 1110101 0010 1 ... 1 .... ... 1 0000 1101 @mve_shl_rr
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
SQRSHR_rr 1110101 0010 1 .... .... 1111 0010 1101 @mve_sh_rr
|
||||||
|
ASRL_rr 1110101 0010 1 ... 0 .... ... 1 0010 1101 @mve_shl_rr
|
||||||
SQRSHRL64_rr 1110101 0010 1 ... 1 .... ... 1 0010 1101 @mve_shl_rr
|
SQRSHRL64_rr 1110101 0010 1 ... 1 .... ... 1 0010 1101 @mve_shl_rr
|
||||||
|
}
|
||||||
|
|
||||||
UQRSHLL48_rr 1110101 0010 1 ... 1 .... ... 1 1000 1101 @mve_shl_rr
|
UQRSHLL48_rr 1110101 0010 1 ... 1 .... ... 1 1000 1101 @mve_shl_rr
|
||||||
SQRSHRL48_rr 1110101 0010 1 ... 1 .... ... 1 1010 1101 @mve_shl_rr
|
SQRSHRL48_rr 1110101 0010 1 ... 1 .... ... 1 1010 1101 @mve_shl_rr
|
||||||
]
|
]
|
||||||
|
|
|
@ -5925,6 +5925,36 @@ static bool trans_UQSHL_ri(DisasContext *s, arg_mve_sh_ri *a)
|
||||||
return do_mve_sh_ri(s, a, gen_mve_uqshl);
|
return do_mve_sh_ri(s, a, gen_mve_uqshl);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bool do_mve_sh_rr(DisasContext *s, arg_mve_sh_rr *a, ShiftFn *fn)
|
||||||
|
{
|
||||||
|
if (!arm_dc_feature(s, ARM_FEATURE_V8_1M)) {
|
||||||
|
/* Decode falls through to ORR/MOV UNPREDICTABLE handling */
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (!dc_isar_feature(aa32_mve, s) ||
|
||||||
|
!arm_dc_feature(s, ARM_FEATURE_M_MAIN) ||
|
||||||
|
a->rda == 13 || a->rda == 15 || a->rm == 13 || a->rm == 15 ||
|
||||||
|
a->rm == a->rda) {
|
||||||
|
/* These rda/rm cases are UNPREDICTABLE; we choose to UNDEF */
|
||||||
|
unallocated_encoding(s);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* The helper takes care of the sign-extension of the low 8 bits of Rm */
|
||||||
|
fn(cpu_R[a->rda], cpu_env, cpu_R[a->rda], cpu_R[a->rm]);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool trans_SQRSHR_rr(DisasContext *s, arg_mve_sh_rr *a)
|
||||||
|
{
|
||||||
|
return do_mve_sh_rr(s, a, gen_helper_mve_sqrshr);
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool trans_UQRSHL_rr(DisasContext *s, arg_mve_sh_rr *a)
|
||||||
|
{
|
||||||
|
return do_mve_sh_rr(s, a, gen_helper_mve_uqrshl);
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Multiply and multiply accumulate
|
* Multiply and multiply accumulate
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -467,6 +467,7 @@ typedef void AtomicThreeOpFn(TCGv_i64, TCGv_i64, TCGv_i64, TCGArg, MemOp);
|
||||||
typedef void WideShiftImmFn(TCGv_i64, TCGv_i64, int64_t shift);
|
typedef void WideShiftImmFn(TCGv_i64, TCGv_i64, int64_t shift);
|
||||||
typedef void WideShiftFn(TCGv_i64, TCGv_ptr, TCGv_i64, TCGv_i32);
|
typedef void WideShiftFn(TCGv_i64, TCGv_ptr, TCGv_i64, TCGv_i32);
|
||||||
typedef void ShiftImmFn(TCGv_i32, TCGv_i32, int32_t shift);
|
typedef void ShiftImmFn(TCGv_i32, TCGv_i32, int32_t shift);
|
||||||
|
typedef void ShiftFn(TCGv_i32, TCGv_ptr, TCGv_i32, TCGv_i32);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* arm_tbflags_from_tb:
|
* arm_tbflags_from_tb:
|
||||||
|
|
Loading…
Reference in a new issue