mirror of
https://github.com/qemu/qemu.git
synced 2024-12-11 20:53:51 +08:00
target/arm: Implement MVE scalar fp insns
Implement the MVE scalar floating point insns VADD, VSUB and VMUL. Signed-off-by: Peter Maydell <peter.maydell@linaro.org> Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
This commit is contained in:
parent
90257a4f35
commit
abfe39b263
@ -800,3 +800,12 @@ DEF_HELPER_FLAGS_3(mve_vcmpgt_scalarw, TCG_CALL_NO_WG, void, env, ptr, i32)
|
||||
DEF_HELPER_FLAGS_3(mve_vcmple_scalarb, TCG_CALL_NO_WG, void, env, ptr, i32)
|
||||
DEF_HELPER_FLAGS_3(mve_vcmple_scalarh, TCG_CALL_NO_WG, void, env, ptr, i32)
|
||||
DEF_HELPER_FLAGS_3(mve_vcmple_scalarw, TCG_CALL_NO_WG, void, env, ptr, i32)
|
||||
|
||||
DEF_HELPER_FLAGS_4(mve_vfadd_scalarh, TCG_CALL_NO_WG, void, env, ptr, ptr, i32)
|
||||
DEF_HELPER_FLAGS_4(mve_vfadd_scalars, TCG_CALL_NO_WG, void, env, ptr, ptr, i32)
|
||||
|
||||
DEF_HELPER_FLAGS_4(mve_vfsub_scalarh, TCG_CALL_NO_WG, void, env, ptr, ptr, i32)
|
||||
DEF_HELPER_FLAGS_4(mve_vfsub_scalars, TCG_CALL_NO_WG, void, env, ptr, ptr, i32)
|
||||
|
||||
DEF_HELPER_FLAGS_4(mve_vfmul_scalarh, TCG_CALL_NO_WG, void, env, ptr, ptr, i32)
|
||||
DEF_HELPER_FLAGS_4(mve_vfmul_scalars, TCG_CALL_NO_WG, void, env, ptr, ptr, i32)
|
||||
|
@ -31,6 +31,8 @@
|
||||
%2op_fp_size 20:1 !function=neon_3same_fp_size
|
||||
# VCADD is an exception, where bit 20 is 0 for 16 bit and 1 for 32 bit
|
||||
%2op_fp_size_rev 20:1 !function=plus_1
|
||||
# FP scalars have size in bit 28, 1 for 16 bit, 0 for 32 bit
|
||||
%2op_fp_scalar_size 28:1 !function=neon_3same_fp_size
|
||||
|
||||
# 1imm format immediate
|
||||
%imm_28_16_0 28:1 16:3 0:4
|
||||
@ -135,6 +137,9 @@
|
||||
@vmaxnma .... .... .... .... .... .... .... .... &2op \
|
||||
qd=%qd qn=%qd qm=%qm
|
||||
|
||||
@2op_fp_scalar .... .... .... .... .... .... .... rm:4 &2scalar \
|
||||
qd=%qd qn=%qn size=%2op_fp_scalar_size
|
||||
|
||||
# Vector loads and stores
|
||||
|
||||
# Widening loads and narrowing stores:
|
||||
@ -471,10 +476,17 @@ VSUB_scalar 1110 1110 0 . .. ... 1 ... 1 1111 . 100 .... @2scalar
|
||||
VBRSR 1111 1110 0 . .. ... 1 ... 1 1110 . 110 .... @2scalar
|
||||
}
|
||||
|
||||
VHADD_S_scalar 1110 1110 0 . .. ... 0 ... 0 1111 . 100 .... @2scalar
|
||||
VHADD_U_scalar 1111 1110 0 . .. ... 0 ... 0 1111 . 100 .... @2scalar
|
||||
VHSUB_S_scalar 1110 1110 0 . .. ... 0 ... 1 1111 . 100 .... @2scalar
|
||||
VHSUB_U_scalar 1111 1110 0 . .. ... 0 ... 1 1111 . 100 .... @2scalar
|
||||
{
|
||||
VADD_fp_scalar 111 . 1110 0 . 11 ... 0 ... 0 1111 . 100 .... @2op_fp_scalar
|
||||
VHADD_S_scalar 1110 1110 0 . .. ... 0 ... 0 1111 . 100 .... @2scalar
|
||||
VHADD_U_scalar 1111 1110 0 . .. ... 0 ... 0 1111 . 100 .... @2scalar
|
||||
}
|
||||
|
||||
{
|
||||
VSUB_fp_scalar 111 . 1110 0 . 11 ... 0 ... 1 1111 . 100 .... @2op_fp_scalar
|
||||
VHSUB_S_scalar 1110 1110 0 . .. ... 0 ... 1 1111 . 100 .... @2scalar
|
||||
VHSUB_U_scalar 1111 1110 0 . .. ... 0 ... 1 1111 . 100 .... @2scalar
|
||||
}
|
||||
|
||||
{
|
||||
VQADD_S_scalar 1110 1110 0 . .. ... 0 ... 0 1111 . 110 .... @2scalar
|
||||
@ -490,8 +502,11 @@ VHSUB_U_scalar 1111 1110 0 . .. ... 0 ... 1 1111 . 100 .... @2scalar
|
||||
size=%size_28
|
||||
}
|
||||
|
||||
VQDMULH_scalar 1110 1110 0 . .. ... 1 ... 0 1110 . 110 .... @2scalar
|
||||
VQRDMULH_scalar 1111 1110 0 . .. ... 1 ... 0 1110 . 110 .... @2scalar
|
||||
{
|
||||
VMUL_fp_scalar 111 . 1110 0 . 11 ... 1 ... 0 1110 . 110 .... @2op_fp_scalar
|
||||
VQDMULH_scalar 1110 1110 0 . .. ... 1 ... 0 1110 . 110 .... @2scalar
|
||||
VQRDMULH_scalar 1111 1110 0 . .. ... 1 ... 0 1110 . 110 .... @2scalar
|
||||
}
|
||||
|
||||
# The U bit (28) is don't-care because it does not affect the result
|
||||
VMLA 111- 1110 0 . .. ... 1 ... 0 1110 . 100 .... @2scalar
|
||||
|
@ -3040,3 +3040,38 @@ DO_VCMLA(vcmla180h, 2, float16, 2, DO_VCMLAH)
|
||||
DO_VCMLA(vcmla180s, 4, float32, 2, DO_VCMLAS)
|
||||
DO_VCMLA(vcmla270h, 2, float16, 3, DO_VCMLAH)
|
||||
DO_VCMLA(vcmla270s, 4, float32, 3, DO_VCMLAS)
|
||||
|
||||
#define DO_2OP_FP_SCALAR(OP, ESIZE, TYPE, FN) \
|
||||
void HELPER(glue(mve_, OP))(CPUARMState *env, \
|
||||
void *vd, void *vn, uint32_t rm) \
|
||||
{ \
|
||||
TYPE *d = vd, *n = vn; \
|
||||
TYPE r, m = rm; \
|
||||
uint16_t mask = mve_element_mask(env); \
|
||||
unsigned e; \
|
||||
float_status *fpst; \
|
||||
float_status scratch_fpst; \
|
||||
for (e = 0; e < 16 / ESIZE; e++, mask >>= ESIZE) { \
|
||||
if ((mask & MAKE_64BIT_MASK(0, ESIZE)) == 0) { \
|
||||
continue; \
|
||||
} \
|
||||
fpst = (ESIZE == 2) ? &env->vfp.standard_fp_status_f16 : \
|
||||
&env->vfp.standard_fp_status; \
|
||||
if (!(mask & 1)) { \
|
||||
/* We need the result but without updating flags */ \
|
||||
scratch_fpst = *fpst; \
|
||||
fpst = &scratch_fpst; \
|
||||
} \
|
||||
r = FN(n[H##ESIZE(e)], m, fpst); \
|
||||
mergemask(&d[H##ESIZE(e)], r, mask); \
|
||||
} \
|
||||
mve_advance_vpt(env); \
|
||||
}
|
||||
|
||||
#define DO_2OP_FP_SCALAR_ALL(OP, FN) \
|
||||
DO_2OP_FP_SCALAR(OP##h, 2, float16, float16_##FN) \
|
||||
DO_2OP_FP_SCALAR(OP##s, 4, float32, float32_##FN)
|
||||
|
||||
DO_2OP_FP_SCALAR_ALL(vfadd_scalar, add)
|
||||
DO_2OP_FP_SCALAR_ALL(vfsub_scalar, sub)
|
||||
DO_2OP_FP_SCALAR_ALL(vfmul_scalar, mul)
|
||||
|
@ -960,6 +960,26 @@ static bool trans_VQDMULLT_scalar(DisasContext *s, arg_2scalar *a)
|
||||
return do_2op_scalar(s, a, fns[a->size]);
|
||||
}
|
||||
|
||||
|
||||
#define DO_2OP_FP_SCALAR(INSN, FN) \
|
||||
static bool trans_##INSN(DisasContext *s, arg_2scalar *a) \
|
||||
{ \
|
||||
static MVEGenTwoOpScalarFn * const fns[] = { \
|
||||
NULL, \
|
||||
gen_helper_mve_##FN##h, \
|
||||
gen_helper_mve_##FN##s, \
|
||||
NULL, \
|
||||
}; \
|
||||
if (!dc_isar_feature(aa32_mve_fp, s)) { \
|
||||
return false; \
|
||||
} \
|
||||
return do_2op_scalar(s, a, fns[a->size]); \
|
||||
}
|
||||
|
||||
DO_2OP_FP_SCALAR(VADD_fp_scalar, vfadd_scalar)
|
||||
DO_2OP_FP_SCALAR(VSUB_fp_scalar, vfsub_scalar)
|
||||
DO_2OP_FP_SCALAR(VMUL_fp_scalar, vfmul_scalar)
|
||||
|
||||
static bool do_long_dual_acc(DisasContext *s, arg_vmlaldav *a,
|
||||
MVEGenLongDualAccOpFn *fn)
|
||||
{
|
||||
|
Loading…
Reference in New Issue
Block a user