mirror of https://github.com/xemu-project/xemu.git
target/arm: Implement SVE2 signed saturating doubling multiply high
Reviewed-by: Peter Maydell <peter.maydell@linaro.org> Signed-off-by: Richard Henderson <richard.henderson@linaro.org> Message-id: 20210525010358.152808-59-richard.henderson@linaro.org Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
parent
b95f5eebf6
commit
169d7c5825
|
@ -957,6 +957,16 @@ DEF_HELPER_FLAGS_5(neon_sqrdmulh_h, TCG_CALL_NO_RWG,
|
||||||
DEF_HELPER_FLAGS_5(neon_sqrdmulh_s, TCG_CALL_NO_RWG,
|
DEF_HELPER_FLAGS_5(neon_sqrdmulh_s, TCG_CALL_NO_RWG,
|
||||||
void, ptr, ptr, ptr, ptr, i32)
|
void, ptr, ptr, ptr, ptr, i32)
|
||||||
|
|
||||||
|
DEF_HELPER_FLAGS_4(sve2_sqdmulh_b, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32)
|
||||||
|
DEF_HELPER_FLAGS_4(sve2_sqdmulh_h, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32)
|
||||||
|
DEF_HELPER_FLAGS_4(sve2_sqdmulh_s, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32)
|
||||||
|
DEF_HELPER_FLAGS_4(sve2_sqdmulh_d, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32)
|
||||||
|
|
||||||
|
DEF_HELPER_FLAGS_4(sve2_sqrdmulh_b, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32)
|
||||||
|
DEF_HELPER_FLAGS_4(sve2_sqrdmulh_h, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32)
|
||||||
|
DEF_HELPER_FLAGS_4(sve2_sqrdmulh_s, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32)
|
||||||
|
DEF_HELPER_FLAGS_4(sve2_sqrdmulh_d, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32)
|
||||||
|
|
||||||
DEF_HELPER_FLAGS_4(gvec_xar_d, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32)
|
DEF_HELPER_FLAGS_4(gvec_xar_d, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32)
|
||||||
|
|
||||||
#ifdef TARGET_AARCH64
|
#ifdef TARGET_AARCH64
|
||||||
|
|
|
@ -1202,6 +1202,10 @@ SMULH_zzz 00000100 .. 1 ..... 0110 10 ..... ..... @rd_rn_rm
|
||||||
UMULH_zzz 00000100 .. 1 ..... 0110 11 ..... ..... @rd_rn_rm
|
UMULH_zzz 00000100 .. 1 ..... 0110 11 ..... ..... @rd_rn_rm
|
||||||
PMUL_zzz 00000100 00 1 ..... 0110 01 ..... ..... @rd_rn_rm_e0
|
PMUL_zzz 00000100 00 1 ..... 0110 01 ..... ..... @rd_rn_rm_e0
|
||||||
|
|
||||||
|
# SVE2 signed saturating doubling multiply high (unpredicated)
|
||||||
|
SQDMULH_zzz 00000100 .. 1 ..... 0111 00 ..... ..... @rd_rn_rm
|
||||||
|
SQRDMULH_zzz 00000100 .. 1 ..... 0111 01 ..... ..... @rd_rn_rm
|
||||||
|
|
||||||
### SVE2 Integer - Predicated
|
### SVE2 Integer - Predicated
|
||||||
|
|
||||||
SADALP_zpzz 01000100 .. 000 100 101 ... ..... ..... @rdm_pg_rn
|
SADALP_zpzz 01000100 .. 000 100 101 ... ..... ..... @rdm_pg_rn
|
||||||
|
|
|
@ -6433,6 +6433,24 @@ static bool trans_PMUL_zzz(DisasContext *s, arg_rrr_esz *a)
|
||||||
return do_sve2_zzz_ool(s, a, gen_helper_gvec_pmul_b);
|
return do_sve2_zzz_ool(s, a, gen_helper_gvec_pmul_b);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bool trans_SQDMULH_zzz(DisasContext *s, arg_rrr_esz *a)
|
||||||
|
{
|
||||||
|
static gen_helper_gvec_3 * const fns[4] = {
|
||||||
|
gen_helper_sve2_sqdmulh_b, gen_helper_sve2_sqdmulh_h,
|
||||||
|
gen_helper_sve2_sqdmulh_s, gen_helper_sve2_sqdmulh_d,
|
||||||
|
};
|
||||||
|
return do_sve2_zzz_ool(s, a, fns[a->esz]);
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool trans_SQRDMULH_zzz(DisasContext *s, arg_rrr_esz *a)
|
||||||
|
{
|
||||||
|
static gen_helper_gvec_3 * const fns[4] = {
|
||||||
|
gen_helper_sve2_sqrdmulh_b, gen_helper_sve2_sqrdmulh_h,
|
||||||
|
gen_helper_sve2_sqrdmulh_s, gen_helper_sve2_sqrdmulh_d,
|
||||||
|
};
|
||||||
|
return do_sve2_zzz_ool(s, a, fns[a->esz]);
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* SVE2 Integer - Predicated
|
* SVE2 Integer - Predicated
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -81,6 +81,26 @@ void HELPER(sve2_sqrdmlsh_b)(void *vd, void *vn, void *vm,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void HELPER(sve2_sqdmulh_b)(void *vd, void *vn, void *vm, uint32_t desc)
|
||||||
|
{
|
||||||
|
intptr_t i, opr_sz = simd_oprsz(desc);
|
||||||
|
int8_t *d = vd, *n = vn, *m = vm;
|
||||||
|
|
||||||
|
for (i = 0; i < opr_sz; ++i) {
|
||||||
|
d[i] = do_sqrdmlah_b(n[i], m[i], 0, false, false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void HELPER(sve2_sqrdmulh_b)(void *vd, void *vn, void *vm, uint32_t desc)
|
||||||
|
{
|
||||||
|
intptr_t i, opr_sz = simd_oprsz(desc);
|
||||||
|
int8_t *d = vd, *n = vn, *m = vm;
|
||||||
|
|
||||||
|
for (i = 0; i < opr_sz; ++i) {
|
||||||
|
d[i] = do_sqrdmlah_b(n[i], m[i], 0, false, true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* Signed saturating rounding doubling multiply-accumulate high half, 16-bit */
|
/* Signed saturating rounding doubling multiply-accumulate high half, 16-bit */
|
||||||
int16_t do_sqrdmlah_h(int16_t src1, int16_t src2, int16_t src3,
|
int16_t do_sqrdmlah_h(int16_t src1, int16_t src2, int16_t src3,
|
||||||
bool neg, bool round, uint32_t *sat)
|
bool neg, bool round, uint32_t *sat)
|
||||||
|
@ -198,6 +218,28 @@ void HELPER(sve2_sqrdmlsh_h)(void *vd, void *vn, void *vm,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void HELPER(sve2_sqdmulh_h)(void *vd, void *vn, void *vm, uint32_t desc)
|
||||||
|
{
|
||||||
|
intptr_t i, opr_sz = simd_oprsz(desc);
|
||||||
|
int16_t *d = vd, *n = vn, *m = vm;
|
||||||
|
uint32_t discard;
|
||||||
|
|
||||||
|
for (i = 0; i < opr_sz / 2; ++i) {
|
||||||
|
d[i] = do_sqrdmlah_h(n[i], m[i], 0, false, false, &discard);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void HELPER(sve2_sqrdmulh_h)(void *vd, void *vn, void *vm, uint32_t desc)
|
||||||
|
{
|
||||||
|
intptr_t i, opr_sz = simd_oprsz(desc);
|
||||||
|
int16_t *d = vd, *n = vn, *m = vm;
|
||||||
|
uint32_t discard;
|
||||||
|
|
||||||
|
for (i = 0; i < opr_sz / 2; ++i) {
|
||||||
|
d[i] = do_sqrdmlah_h(n[i], m[i], 0, false, true, &discard);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* Signed saturating rounding doubling multiply-accumulate high half, 32-bit */
|
/* Signed saturating rounding doubling multiply-accumulate high half, 32-bit */
|
||||||
int32_t do_sqrdmlah_s(int32_t src1, int32_t src2, int32_t src3,
|
int32_t do_sqrdmlah_s(int32_t src1, int32_t src2, int32_t src3,
|
||||||
bool neg, bool round, uint32_t *sat)
|
bool neg, bool round, uint32_t *sat)
|
||||||
|
@ -309,6 +351,28 @@ void HELPER(sve2_sqrdmlsh_s)(void *vd, void *vn, void *vm,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void HELPER(sve2_sqdmulh_s)(void *vd, void *vn, void *vm, uint32_t desc)
|
||||||
|
{
|
||||||
|
intptr_t i, opr_sz = simd_oprsz(desc);
|
||||||
|
int32_t *d = vd, *n = vn, *m = vm;
|
||||||
|
uint32_t discard;
|
||||||
|
|
||||||
|
for (i = 0; i < opr_sz / 4; ++i) {
|
||||||
|
d[i] = do_sqrdmlah_s(n[i], m[i], 0, false, false, &discard);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void HELPER(sve2_sqrdmulh_s)(void *vd, void *vn, void *vm, uint32_t desc)
|
||||||
|
{
|
||||||
|
intptr_t i, opr_sz = simd_oprsz(desc);
|
||||||
|
int32_t *d = vd, *n = vn, *m = vm;
|
||||||
|
uint32_t discard;
|
||||||
|
|
||||||
|
for (i = 0; i < opr_sz / 4; ++i) {
|
||||||
|
d[i] = do_sqrdmlah_s(n[i], m[i], 0, false, true, &discard);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* Signed saturating rounding doubling multiply-accumulate high half, 64-bit */
|
/* Signed saturating rounding doubling multiply-accumulate high half, 64-bit */
|
||||||
static int64_t do_sat128_d(Int128 r)
|
static int64_t do_sat128_d(Int128 r)
|
||||||
{
|
{
|
||||||
|
@ -368,6 +432,26 @@ void HELPER(sve2_sqrdmlsh_d)(void *vd, void *vn, void *vm,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void HELPER(sve2_sqdmulh_d)(void *vd, void *vn, void *vm, uint32_t desc)
|
||||||
|
{
|
||||||
|
intptr_t i, opr_sz = simd_oprsz(desc);
|
||||||
|
int64_t *d = vd, *n = vn, *m = vm;
|
||||||
|
|
||||||
|
for (i = 0; i < opr_sz / 8; ++i) {
|
||||||
|
d[i] = do_sqrdmlah_d(n[i], m[i], 0, false, false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void HELPER(sve2_sqrdmulh_d)(void *vd, void *vn, void *vm, uint32_t desc)
|
||||||
|
{
|
||||||
|
intptr_t i, opr_sz = simd_oprsz(desc);
|
||||||
|
int64_t *d = vd, *n = vn, *m = vm;
|
||||||
|
|
||||||
|
for (i = 0; i < opr_sz / 8; ++i) {
|
||||||
|
d[i] = do_sqrdmlah_d(n[i], m[i], 0, false, true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* Integer 8 and 16-bit dot-product.
|
/* Integer 8 and 16-bit dot-product.
|
||||||
*
|
*
|
||||||
* Note that for the loops herein, host endianness does not matter
|
* Note that for the loops herein, host endianness does not matter
|
||||||
|
|
Loading…
Reference in New Issue