mirror of
https://github.com/yuzu-emu/unicorn.git
synced 2024-12-22 23:55:35 +00:00
target/arm/vec_helper: Add gvec fp indexed multiply-and-add operations
Add gvec helpers for doing Neon-style indexed non-fused fp multiply-and-accumulate operations. Backports commit c50d8d144098a8261233ca31b47e3bc487e112fe
This commit is contained in:
parent
3cc3099e36
commit
8c6affbca4
|
@ -1852,6 +1852,10 @@
|
|||
#define helper_gvec_vrint_rm_s helper_gvec_vrint_rm_s_aarch64
|
||||
#define helper_gvec_vrintx_h helper_gvec_vrintx_h_aarch64
|
||||
#define helper_gvec_vrintx_s helper_gvec_vrintx_s_aarch64
|
||||
#define helper_gvec_fmla_nf_idx_h helper_gvec_fmla_nf_idx_h_aarch64
|
||||
#define helper_gvec_fmla_nf_idx_s helper_gvec_fmla_nf_idx_s_aarch64
|
||||
#define helper_gvec_fmls_nf_idx_h helper_gvec_fmls_nf_idx_h_aarch64
|
||||
#define helper_gvec_fmls_nf_idx_s helper_gvec_fmls_nf_idx_s_aarch64
|
||||
#define helper_power_down helper_power_down_aarch64
|
||||
#define helper_pre_hvc helper_pre_hvc_aarch64
|
||||
#define helper_pre_smc helper_pre_smc_aarch64
|
||||
|
|
|
@ -1852,6 +1852,10 @@
|
|||
#define helper_gvec_vrint_rm_s helper_gvec_vrint_rm_s_aarch64eb
|
||||
#define helper_gvec_vrintx_h helper_gvec_vrintx_h_aarch64eb
|
||||
#define helper_gvec_vrintx_s helper_gvec_vrintx_s_aarch64eb
|
||||
#define helper_gvec_fmla_nf_idx_h helper_gvec_fmla_nf_idx_h_aarch64eb
|
||||
#define helper_gvec_fmla_nf_idx_s helper_gvec_fmla_nf_idx_s_aarch64eb
|
||||
#define helper_gvec_fmls_nf_idx_h helper_gvec_fmls_nf_idx_h_aarch64eb
|
||||
#define helper_gvec_fmls_nf_idx_s helper_gvec_fmls_nf_idx_s_aarch64eb
|
||||
#define helper_power_down helper_power_down_aarch64eb
|
||||
#define helper_pre_hvc helper_pre_hvc_aarch64eb
|
||||
#define helper_pre_smc helper_pre_smc_aarch64eb
|
||||
|
|
|
@ -1852,6 +1852,10 @@
|
|||
#define helper_gvec_vrint_rm_s helper_gvec_vrint_rm_s_arm
|
||||
#define helper_gvec_vrintx_h helper_gvec_vrintx_h_arm
|
||||
#define helper_gvec_vrintx_s helper_gvec_vrintx_s_arm
|
||||
#define helper_gvec_fmla_nf_idx_h helper_gvec_fmla_nf_idx_h_arm
|
||||
#define helper_gvec_fmla_nf_idx_s helper_gvec_fmla_nf_idx_s_arm
|
||||
#define helper_gvec_fmls_nf_idx_h helper_gvec_fmls_nf_idx_h_arm
|
||||
#define helper_gvec_fmls_nf_idx_s helper_gvec_fmls_nf_idx_s_arm
|
||||
#define helper_power_down helper_power_down_arm
|
||||
#define helper_pre_hvc helper_pre_hvc_arm
|
||||
#define helper_pre_smc helper_pre_smc_arm
|
||||
|
|
|
@ -1852,6 +1852,10 @@
|
|||
#define helper_gvec_vrint_rm_s helper_gvec_vrint_rm_s_armeb
|
||||
#define helper_gvec_vrintx_h helper_gvec_vrintx_h_armeb
|
||||
#define helper_gvec_vrintx_s helper_gvec_vrintx_s_armeb
|
||||
#define helper_gvec_fmla_nf_idx_h helper_gvec_fmla_nf_idx_h_armeb
|
||||
#define helper_gvec_fmla_nf_idx_s helper_gvec_fmla_nf_idx_s_armeb
|
||||
#define helper_gvec_fmls_nf_idx_h helper_gvec_fmls_nf_idx_h_armeb
|
||||
#define helper_gvec_fmls_nf_idx_s helper_gvec_fmls_nf_idx_s_armeb
|
||||
#define helper_power_down helper_power_down_armeb
|
||||
#define helper_pre_hvc helper_pre_hvc_armeb
|
||||
#define helper_pre_smc helper_pre_smc_armeb
|
||||
|
|
|
@ -1858,6 +1858,10 @@ symbols = (
|
|||
'helper_gvec_vrint_rm_s',
|
||||
'helper_gvec_vrintx_h',
|
||||
'helper_gvec_vrintx_s',
|
||||
'helper_gvec_fmla_nf_idx_h',
|
||||
'helper_gvec_fmla_nf_idx_s',
|
||||
'helper_gvec_fmls_nf_idx_h',
|
||||
'helper_gvec_fmls_nf_idx_s',
|
||||
'helper_power_down',
|
||||
'helper_pre_hvc',
|
||||
'helper_pre_smc',
|
||||
|
|
|
@ -1852,6 +1852,10 @@
|
|||
#define helper_gvec_vrint_rm_s helper_gvec_vrint_rm_s_m68k
|
||||
#define helper_gvec_vrintx_h helper_gvec_vrintx_h_m68k
|
||||
#define helper_gvec_vrintx_s helper_gvec_vrintx_s_m68k
|
||||
#define helper_gvec_fmla_nf_idx_h helper_gvec_fmla_nf_idx_h_m68k
|
||||
#define helper_gvec_fmla_nf_idx_s helper_gvec_fmla_nf_idx_s_m68k
|
||||
#define helper_gvec_fmls_nf_idx_h helper_gvec_fmls_nf_idx_h_m68k
|
||||
#define helper_gvec_fmls_nf_idx_s helper_gvec_fmls_nf_idx_s_m68k
|
||||
#define helper_power_down helper_power_down_m68k
|
||||
#define helper_pre_hvc helper_pre_hvc_m68k
|
||||
#define helper_pre_smc helper_pre_smc_m68k
|
||||
|
|
|
@ -1852,6 +1852,10 @@
|
|||
#define helper_gvec_vrint_rm_s helper_gvec_vrint_rm_s_mips
|
||||
#define helper_gvec_vrintx_h helper_gvec_vrintx_h_mips
|
||||
#define helper_gvec_vrintx_s helper_gvec_vrintx_s_mips
|
||||
#define helper_gvec_fmla_nf_idx_h helper_gvec_fmla_nf_idx_h_mips
|
||||
#define helper_gvec_fmla_nf_idx_s helper_gvec_fmla_nf_idx_s_mips
|
||||
#define helper_gvec_fmls_nf_idx_h helper_gvec_fmls_nf_idx_h_mips
|
||||
#define helper_gvec_fmls_nf_idx_s helper_gvec_fmls_nf_idx_s_mips
|
||||
#define helper_power_down helper_power_down_mips
|
||||
#define helper_pre_hvc helper_pre_hvc_mips
|
||||
#define helper_pre_smc helper_pre_smc_mips
|
||||
|
|
|
@ -1852,6 +1852,10 @@
|
|||
#define helper_gvec_vrint_rm_s helper_gvec_vrint_rm_s_mips64
|
||||
#define helper_gvec_vrintx_h helper_gvec_vrintx_h_mips64
|
||||
#define helper_gvec_vrintx_s helper_gvec_vrintx_s_mips64
|
||||
#define helper_gvec_fmla_nf_idx_h helper_gvec_fmla_nf_idx_h_mips64
|
||||
#define helper_gvec_fmla_nf_idx_s helper_gvec_fmla_nf_idx_s_mips64
|
||||
#define helper_gvec_fmls_nf_idx_h helper_gvec_fmls_nf_idx_h_mips64
|
||||
#define helper_gvec_fmls_nf_idx_s helper_gvec_fmls_nf_idx_s_mips64
|
||||
#define helper_power_down helper_power_down_mips64
|
||||
#define helper_pre_hvc helper_pre_hvc_mips64
|
||||
#define helper_pre_smc helper_pre_smc_mips64
|
||||
|
|
|
@ -1852,6 +1852,10 @@
|
|||
#define helper_gvec_vrint_rm_s helper_gvec_vrint_rm_s_mips64el
|
||||
#define helper_gvec_vrintx_h helper_gvec_vrintx_h_mips64el
|
||||
#define helper_gvec_vrintx_s helper_gvec_vrintx_s_mips64el
|
||||
#define helper_gvec_fmla_nf_idx_h helper_gvec_fmla_nf_idx_h_mips64el
|
||||
#define helper_gvec_fmla_nf_idx_s helper_gvec_fmla_nf_idx_s_mips64el
|
||||
#define helper_gvec_fmls_nf_idx_h helper_gvec_fmls_nf_idx_h_mips64el
|
||||
#define helper_gvec_fmls_nf_idx_s helper_gvec_fmls_nf_idx_s_mips64el
|
||||
#define helper_power_down helper_power_down_mips64el
|
||||
#define helper_pre_hvc helper_pre_hvc_mips64el
|
||||
#define helper_pre_smc helper_pre_smc_mips64el
|
||||
|
|
|
@ -1852,6 +1852,10 @@
|
|||
#define helper_gvec_vrint_rm_s helper_gvec_vrint_rm_s_mipsel
|
||||
#define helper_gvec_vrintx_h helper_gvec_vrintx_h_mipsel
|
||||
#define helper_gvec_vrintx_s helper_gvec_vrintx_s_mipsel
|
||||
#define helper_gvec_fmla_nf_idx_h helper_gvec_fmla_nf_idx_h_mipsel
|
||||
#define helper_gvec_fmla_nf_idx_s helper_gvec_fmla_nf_idx_s_mipsel
|
||||
#define helper_gvec_fmls_nf_idx_h helper_gvec_fmls_nf_idx_h_mipsel
|
||||
#define helper_gvec_fmls_nf_idx_s helper_gvec_fmls_nf_idx_s_mipsel
|
||||
#define helper_power_down helper_power_down_mipsel
|
||||
#define helper_pre_hvc helper_pre_hvc_mipsel
|
||||
#define helper_pre_smc helper_pre_smc_mipsel
|
||||
|
|
|
@ -1852,6 +1852,10 @@
|
|||
#define helper_gvec_vrint_rm_s helper_gvec_vrint_rm_s_powerpc
|
||||
#define helper_gvec_vrintx_h helper_gvec_vrintx_h_powerpc
|
||||
#define helper_gvec_vrintx_s helper_gvec_vrintx_s_powerpc
|
||||
#define helper_gvec_fmla_nf_idx_h helper_gvec_fmla_nf_idx_h_powerpc
|
||||
#define helper_gvec_fmla_nf_idx_s helper_gvec_fmla_nf_idx_s_powerpc
|
||||
#define helper_gvec_fmls_nf_idx_h helper_gvec_fmls_nf_idx_h_powerpc
|
||||
#define helper_gvec_fmls_nf_idx_s helper_gvec_fmls_nf_idx_s_powerpc
|
||||
#define helper_power_down helper_power_down_powerpc
|
||||
#define helper_pre_hvc helper_pre_hvc_powerpc
|
||||
#define helper_pre_smc helper_pre_smc_powerpc
|
||||
|
|
|
@ -1852,6 +1852,10 @@
|
|||
#define helper_gvec_vrint_rm_s helper_gvec_vrint_rm_s_riscv32
|
||||
#define helper_gvec_vrintx_h helper_gvec_vrintx_h_riscv32
|
||||
#define helper_gvec_vrintx_s helper_gvec_vrintx_s_riscv32
|
||||
#define helper_gvec_fmla_nf_idx_h helper_gvec_fmla_nf_idx_h_riscv32
|
||||
#define helper_gvec_fmla_nf_idx_s helper_gvec_fmla_nf_idx_s_riscv32
|
||||
#define helper_gvec_fmls_nf_idx_h helper_gvec_fmls_nf_idx_h_riscv32
|
||||
#define helper_gvec_fmls_nf_idx_s helper_gvec_fmls_nf_idx_s_riscv32
|
||||
#define helper_power_down helper_power_down_riscv32
|
||||
#define helper_pre_hvc helper_pre_hvc_riscv32
|
||||
#define helper_pre_smc helper_pre_smc_riscv32
|
||||
|
|
|
@ -1852,6 +1852,10 @@
|
|||
#define helper_gvec_vrint_rm_s helper_gvec_vrint_rm_s_riscv64
|
||||
#define helper_gvec_vrintx_h helper_gvec_vrintx_h_riscv64
|
||||
#define helper_gvec_vrintx_s helper_gvec_vrintx_s_riscv64
|
||||
#define helper_gvec_fmla_nf_idx_h helper_gvec_fmla_nf_idx_h_riscv64
|
||||
#define helper_gvec_fmla_nf_idx_s helper_gvec_fmla_nf_idx_s_riscv64
|
||||
#define helper_gvec_fmls_nf_idx_h helper_gvec_fmls_nf_idx_h_riscv64
|
||||
#define helper_gvec_fmls_nf_idx_s helper_gvec_fmls_nf_idx_s_riscv64
|
||||
#define helper_power_down helper_power_down_riscv64
|
||||
#define helper_pre_hvc helper_pre_hvc_riscv64
|
||||
#define helper_pre_smc helper_pre_smc_riscv64
|
||||
|
|
|
@ -1852,6 +1852,10 @@
|
|||
#define helper_gvec_vrint_rm_s helper_gvec_vrint_rm_s_sparc
|
||||
#define helper_gvec_vrintx_h helper_gvec_vrintx_h_sparc
|
||||
#define helper_gvec_vrintx_s helper_gvec_vrintx_s_sparc
|
||||
#define helper_gvec_fmla_nf_idx_h helper_gvec_fmla_nf_idx_h_sparc
|
||||
#define helper_gvec_fmla_nf_idx_s helper_gvec_fmla_nf_idx_s_sparc
|
||||
#define helper_gvec_fmls_nf_idx_h helper_gvec_fmls_nf_idx_h_sparc
|
||||
#define helper_gvec_fmls_nf_idx_s helper_gvec_fmls_nf_idx_s_sparc
|
||||
#define helper_power_down helper_power_down_sparc
|
||||
#define helper_pre_hvc helper_pre_hvc_sparc
|
||||
#define helper_pre_smc helper_pre_smc_sparc
|
||||
|
|
|
@ -1852,6 +1852,10 @@
|
|||
#define helper_gvec_vrint_rm_s helper_gvec_vrint_rm_s_sparc64
|
||||
#define helper_gvec_vrintx_h helper_gvec_vrintx_h_sparc64
|
||||
#define helper_gvec_vrintx_s helper_gvec_vrintx_s_sparc64
|
||||
#define helper_gvec_fmla_nf_idx_h helper_gvec_fmla_nf_idx_h_sparc64
|
||||
#define helper_gvec_fmla_nf_idx_s helper_gvec_fmla_nf_idx_s_sparc64
|
||||
#define helper_gvec_fmls_nf_idx_h helper_gvec_fmls_nf_idx_h_sparc64
|
||||
#define helper_gvec_fmls_nf_idx_s helper_gvec_fmls_nf_idx_s_sparc64
|
||||
#define helper_power_down helper_power_down_sparc64
|
||||
#define helper_pre_hvc helper_pre_hvc_sparc64
|
||||
#define helper_pre_smc helper_pre_smc_sparc64
|
||||
|
|
|
@ -738,6 +738,16 @@ DEF_HELPER_FLAGS_5(gvec_fmul_idx_s, TCG_CALL_NO_RWG,
|
|||
DEF_HELPER_FLAGS_5(gvec_fmul_idx_d, TCG_CALL_NO_RWG,
|
||||
void, ptr, ptr, ptr, ptr, i32)
|
||||
|
||||
DEF_HELPER_FLAGS_5(gvec_fmla_nf_idx_h, TCG_CALL_NO_RWG,
|
||||
void, ptr, ptr, ptr, ptr, i32)
|
||||
DEF_HELPER_FLAGS_5(gvec_fmla_nf_idx_s, TCG_CALL_NO_RWG,
|
||||
void, ptr, ptr, ptr, ptr, i32)
|
||||
|
||||
DEF_HELPER_FLAGS_5(gvec_fmls_nf_idx_h, TCG_CALL_NO_RWG,
|
||||
void, ptr, ptr, ptr, ptr, i32)
|
||||
DEF_HELPER_FLAGS_5(gvec_fmls_nf_idx_s, TCG_CALL_NO_RWG,
|
||||
void, ptr, ptr, ptr, ptr, i32)
|
||||
|
||||
DEF_HELPER_FLAGS_6(gvec_fmla_idx_h, TCG_CALL_NO_RWG,
|
||||
void, ptr, ptr, ptr, ptr, ptr, i32)
|
||||
DEF_HELPER_FLAGS_6(gvec_fmla_idx_s, TCG_CALL_NO_RWG,
|
||||
|
|
|
@ -1086,7 +1086,7 @@ DO_MLA_IDX(gvec_mls_idx_d, uint64_t, -, )
|
|||
|
||||
#undef DO_MLA_IDX
|
||||
|
||||
#define DO_FMUL_IDX(NAME, TYPE, H) \
|
||||
#define DO_FMUL_IDX(NAME, ADD, TYPE, H) \
|
||||
void HELPER(NAME)(void *vd, void *vn, void *vm, void *stat, uint32_t desc) \
|
||||
{ \
|
||||
intptr_t i, j, oprsz = simd_oprsz(desc); \
|
||||
|
@ -1096,15 +1096,33 @@ void HELPER(NAME)(void *vd, void *vn, void *vm, void *stat, uint32_t desc) \
|
|||
for (i = 0; i < oprsz / sizeof(TYPE); i += segment) { \
|
||||
TYPE mm = m[H(i + idx)]; \
|
||||
for (j = 0; j < segment; j++) { \
|
||||
d[i + j] = TYPE##_mul(n[i + j], mm, stat); \
|
||||
d[i + j] = TYPE##_##ADD(d[i + j], \
|
||||
TYPE##_mul(n[i + j], mm, stat), stat); \
|
||||
} \
|
||||
} \
|
||||
clear_tail(d, oprsz, simd_maxsz(desc)); \
|
||||
}
|
||||
|
||||
DO_FMUL_IDX(gvec_fmul_idx_h, float16, H2)
|
||||
DO_FMUL_IDX(gvec_fmul_idx_s, float32, H4)
|
||||
DO_FMUL_IDX(gvec_fmul_idx_d, float64, )
|
||||
#define float16_nop(N, M, S) (M)
|
||||
#define float32_nop(N, M, S) (M)
|
||||
#define float64_nop(N, M, S) (M)
|
||||
|
||||
DO_FMUL_IDX(gvec_fmul_idx_h, nop, float16, H2)
|
||||
DO_FMUL_IDX(gvec_fmul_idx_s, nop, float32, H4)
|
||||
DO_FMUL_IDX(gvec_fmul_idx_d, nop, float64, )
|
||||
|
||||
/*
|
||||
* Non-fused multiply-accumulate operations, for Neon. NB that unlike
|
||||
* the fused ops below they assume accumulate both from and into Vd.
|
||||
*/
|
||||
DO_FMUL_IDX(gvec_fmla_nf_idx_h, add, float16, H2)
|
||||
DO_FMUL_IDX(gvec_fmla_nf_idx_s, add, float32, H4)
|
||||
DO_FMUL_IDX(gvec_fmls_nf_idx_h, sub, float16, H2)
|
||||
DO_FMUL_IDX(gvec_fmls_nf_idx_s, sub, float32, H4)
|
||||
|
||||
#undef float16_nop
|
||||
#undef float32_nop
|
||||
#undef float64_nop
|
||||
|
||||
#undef DO_FMUL_IDX
|
||||
|
||||
|
|
|
@ -1852,6 +1852,10 @@
|
|||
#define helper_gvec_vrint_rm_s helper_gvec_vrint_rm_s_x86_64
|
||||
#define helper_gvec_vrintx_h helper_gvec_vrintx_h_x86_64
|
||||
#define helper_gvec_vrintx_s helper_gvec_vrintx_s_x86_64
|
||||
#define helper_gvec_fmla_nf_idx_h helper_gvec_fmla_nf_idx_h_x86_64
|
||||
#define helper_gvec_fmla_nf_idx_s helper_gvec_fmla_nf_idx_s_x86_64
|
||||
#define helper_gvec_fmls_nf_idx_h helper_gvec_fmls_nf_idx_h_x86_64
|
||||
#define helper_gvec_fmls_nf_idx_s helper_gvec_fmls_nf_idx_s_x86_64
|
||||
#define helper_power_down helper_power_down_x86_64
|
||||
#define helper_pre_hvc helper_pre_hvc_x86_64
|
||||
#define helper_pre_smc helper_pre_smc_x86_64
|
||||
|
|
Loading…
Reference in a new issue