mirror of
https://github.com/yuzu-emu/unicorn.git
synced 2025-01-03 19:55:41 +00:00
target/arm: Convert Neon VADD, VSUB, VABD 3-reg-same insns to decodetree
Convert the Neon VADD, VSUB, VABD 3-reg-same insns to decodetree. We already have gvec helpers for addition and subtraction, but must add one for fabd. Backports commit a26a352bb498662cd0c205cb433a352f86fac7d2 from qemu
This commit is contained in:
parent
1df5d57e8a
commit
bb0aa79847
|
@ -1152,6 +1152,7 @@
|
|||
#define helper_gvec_eq32 helper_gvec_eq32_aarch64
|
||||
#define helper_gvec_eq64 helper_gvec_eq64_aarch64
|
||||
#define helper_gvec_eqv helper_gvec_eqv_aarch64
|
||||
#define helper_gvec_fabd_s helper_gvec_fabd_s_aarch64
|
||||
#define helper_gvec_fadd_d helper_gvec_fadd_d_aarch64
|
||||
#define helper_gvec_fadd_h helper_gvec_fadd_h_aarch64
|
||||
#define helper_gvec_fadd_s helper_gvec_fadd_s_aarch64
|
||||
|
@ -1466,7 +1467,6 @@
|
|||
#define helper_msa_st_h helper_msa_st_h_aarch64
|
||||
#define helper_msa_st_w helper_msa_st_w_aarch64
|
||||
#define helper_msr_banked helper_msr_banked_aarch64
|
||||
#define helper_neon_abd_f32 helper_neon_abd_f32_aarch64
|
||||
#define helper_neon_abdl_s16 helper_neon_abdl_s16_aarch64
|
||||
#define helper_neon_abdl_s32 helper_neon_abdl_s32_aarch64
|
||||
#define helper_neon_abdl_s64 helper_neon_abdl_s64_aarch64
|
||||
|
|
|
@ -1152,6 +1152,7 @@
|
|||
#define helper_gvec_eq32 helper_gvec_eq32_aarch64eb
|
||||
#define helper_gvec_eq64 helper_gvec_eq64_aarch64eb
|
||||
#define helper_gvec_eqv helper_gvec_eqv_aarch64eb
|
||||
#define helper_gvec_fabd_s helper_gvec_fabd_s_aarch64eb
|
||||
#define helper_gvec_fadd_d helper_gvec_fadd_d_aarch64eb
|
||||
#define helper_gvec_fadd_h helper_gvec_fadd_h_aarch64eb
|
||||
#define helper_gvec_fadd_s helper_gvec_fadd_s_aarch64eb
|
||||
|
@ -1466,7 +1467,6 @@
|
|||
#define helper_msa_st_h helper_msa_st_h_aarch64eb
|
||||
#define helper_msa_st_w helper_msa_st_w_aarch64eb
|
||||
#define helper_msr_banked helper_msr_banked_aarch64eb
|
||||
#define helper_neon_abd_f32 helper_neon_abd_f32_aarch64eb
|
||||
#define helper_neon_abdl_s16 helper_neon_abdl_s16_aarch64eb
|
||||
#define helper_neon_abdl_s32 helper_neon_abdl_s32_aarch64eb
|
||||
#define helper_neon_abdl_s64 helper_neon_abdl_s64_aarch64eb
|
||||
|
|
|
@ -1152,6 +1152,7 @@
|
|||
#define helper_gvec_eq32 helper_gvec_eq32_arm
|
||||
#define helper_gvec_eq64 helper_gvec_eq64_arm
|
||||
#define helper_gvec_eqv helper_gvec_eqv_arm
|
||||
#define helper_gvec_fabd_s helper_gvec_fabd_s_arm
|
||||
#define helper_gvec_fadd_d helper_gvec_fadd_d_arm
|
||||
#define helper_gvec_fadd_h helper_gvec_fadd_h_arm
|
||||
#define helper_gvec_fadd_s helper_gvec_fadd_s_arm
|
||||
|
@ -1466,7 +1467,6 @@
|
|||
#define helper_msa_st_h helper_msa_st_h_arm
|
||||
#define helper_msa_st_w helper_msa_st_w_arm
|
||||
#define helper_msr_banked helper_msr_banked_arm
|
||||
#define helper_neon_abd_f32 helper_neon_abd_f32_arm
|
||||
#define helper_neon_abdl_s16 helper_neon_abdl_s16_arm
|
||||
#define helper_neon_abdl_s32 helper_neon_abdl_s32_arm
|
||||
#define helper_neon_abdl_s64 helper_neon_abdl_s64_arm
|
||||
|
|
|
@ -1152,6 +1152,7 @@
|
|||
#define helper_gvec_eq32 helper_gvec_eq32_armeb
|
||||
#define helper_gvec_eq64 helper_gvec_eq64_armeb
|
||||
#define helper_gvec_eqv helper_gvec_eqv_armeb
|
||||
#define helper_gvec_fabd_s helper_gvec_fabd_s_armeb
|
||||
#define helper_gvec_fadd_d helper_gvec_fadd_d_armeb
|
||||
#define helper_gvec_fadd_h helper_gvec_fadd_h_armeb
|
||||
#define helper_gvec_fadd_s helper_gvec_fadd_s_armeb
|
||||
|
@ -1466,7 +1467,6 @@
|
|||
#define helper_msa_st_h helper_msa_st_h_armeb
|
||||
#define helper_msa_st_w helper_msa_st_w_armeb
|
||||
#define helper_msr_banked helper_msr_banked_armeb
|
||||
#define helper_neon_abd_f32 helper_neon_abd_f32_armeb
|
||||
#define helper_neon_abdl_s16 helper_neon_abdl_s16_armeb
|
||||
#define helper_neon_abdl_s32 helper_neon_abdl_s32_armeb
|
||||
#define helper_neon_abdl_s64 helper_neon_abdl_s64_armeb
|
||||
|
|
|
@ -1158,6 +1158,7 @@ symbols = (
|
|||
'helper_gvec_eq32',
|
||||
'helper_gvec_eq64',
|
||||
'helper_gvec_eqv',
|
||||
'helper_gvec_fabd_s',
|
||||
'helper_gvec_fadd_d',
|
||||
'helper_gvec_fadd_h',
|
||||
'helper_gvec_fadd_s',
|
||||
|
@ -1472,7 +1473,6 @@ symbols = (
|
|||
'helper_msa_st_h',
|
||||
'helper_msa_st_w',
|
||||
'helper_msr_banked',
|
||||
'helper_neon_abd_f32',
|
||||
'helper_neon_abdl_s16',
|
||||
'helper_neon_abdl_s32',
|
||||
'helper_neon_abdl_s64',
|
||||
|
|
|
@ -1152,6 +1152,7 @@
|
|||
#define helper_gvec_eq32 helper_gvec_eq32_m68k
|
||||
#define helper_gvec_eq64 helper_gvec_eq64_m68k
|
||||
#define helper_gvec_eqv helper_gvec_eqv_m68k
|
||||
#define helper_gvec_fabd_s helper_gvec_fabd_s_m68k
|
||||
#define helper_gvec_fadd_d helper_gvec_fadd_d_m68k
|
||||
#define helper_gvec_fadd_h helper_gvec_fadd_h_m68k
|
||||
#define helper_gvec_fadd_s helper_gvec_fadd_s_m68k
|
||||
|
@ -1466,7 +1467,6 @@
|
|||
#define helper_msa_st_h helper_msa_st_h_m68k
|
||||
#define helper_msa_st_w helper_msa_st_w_m68k
|
||||
#define helper_msr_banked helper_msr_banked_m68k
|
||||
#define helper_neon_abd_f32 helper_neon_abd_f32_m68k
|
||||
#define helper_neon_abdl_s16 helper_neon_abdl_s16_m68k
|
||||
#define helper_neon_abdl_s32 helper_neon_abdl_s32_m68k
|
||||
#define helper_neon_abdl_s64 helper_neon_abdl_s64_m68k
|
||||
|
|
|
@ -1152,6 +1152,7 @@
|
|||
#define helper_gvec_eq32 helper_gvec_eq32_mips
|
||||
#define helper_gvec_eq64 helper_gvec_eq64_mips
|
||||
#define helper_gvec_eqv helper_gvec_eqv_mips
|
||||
#define helper_gvec_fabd_s helper_gvec_fabd_s_mips
|
||||
#define helper_gvec_fadd_d helper_gvec_fadd_d_mips
|
||||
#define helper_gvec_fadd_h helper_gvec_fadd_h_mips
|
||||
#define helper_gvec_fadd_s helper_gvec_fadd_s_mips
|
||||
|
@ -1466,7 +1467,6 @@
|
|||
#define helper_msa_st_h helper_msa_st_h_mips
|
||||
#define helper_msa_st_w helper_msa_st_w_mips
|
||||
#define helper_msr_banked helper_msr_banked_mips
|
||||
#define helper_neon_abd_f32 helper_neon_abd_f32_mips
|
||||
#define helper_neon_abdl_s16 helper_neon_abdl_s16_mips
|
||||
#define helper_neon_abdl_s32 helper_neon_abdl_s32_mips
|
||||
#define helper_neon_abdl_s64 helper_neon_abdl_s64_mips
|
||||
|
|
|
@ -1152,6 +1152,7 @@
|
|||
#define helper_gvec_eq32 helper_gvec_eq32_mips64
|
||||
#define helper_gvec_eq64 helper_gvec_eq64_mips64
|
||||
#define helper_gvec_eqv helper_gvec_eqv_mips64
|
||||
#define helper_gvec_fabd_s helper_gvec_fabd_s_mips64
|
||||
#define helper_gvec_fadd_d helper_gvec_fadd_d_mips64
|
||||
#define helper_gvec_fadd_h helper_gvec_fadd_h_mips64
|
||||
#define helper_gvec_fadd_s helper_gvec_fadd_s_mips64
|
||||
|
@ -1466,7 +1467,6 @@
|
|||
#define helper_msa_st_h helper_msa_st_h_mips64
|
||||
#define helper_msa_st_w helper_msa_st_w_mips64
|
||||
#define helper_msr_banked helper_msr_banked_mips64
|
||||
#define helper_neon_abd_f32 helper_neon_abd_f32_mips64
|
||||
#define helper_neon_abdl_s16 helper_neon_abdl_s16_mips64
|
||||
#define helper_neon_abdl_s32 helper_neon_abdl_s32_mips64
|
||||
#define helper_neon_abdl_s64 helper_neon_abdl_s64_mips64
|
||||
|
|
|
@ -1152,6 +1152,7 @@
|
|||
#define helper_gvec_eq32 helper_gvec_eq32_mips64el
|
||||
#define helper_gvec_eq64 helper_gvec_eq64_mips64el
|
||||
#define helper_gvec_eqv helper_gvec_eqv_mips64el
|
||||
#define helper_gvec_fabd_s helper_gvec_fabd_s_mips64el
|
||||
#define helper_gvec_fadd_d helper_gvec_fadd_d_mips64el
|
||||
#define helper_gvec_fadd_h helper_gvec_fadd_h_mips64el
|
||||
#define helper_gvec_fadd_s helper_gvec_fadd_s_mips64el
|
||||
|
@ -1466,7 +1467,6 @@
|
|||
#define helper_msa_st_h helper_msa_st_h_mips64el
|
||||
#define helper_msa_st_w helper_msa_st_w_mips64el
|
||||
#define helper_msr_banked helper_msr_banked_mips64el
|
||||
#define helper_neon_abd_f32 helper_neon_abd_f32_mips64el
|
||||
#define helper_neon_abdl_s16 helper_neon_abdl_s16_mips64el
|
||||
#define helper_neon_abdl_s32 helper_neon_abdl_s32_mips64el
|
||||
#define helper_neon_abdl_s64 helper_neon_abdl_s64_mips64el
|
||||
|
|
|
@ -1152,6 +1152,7 @@
|
|||
#define helper_gvec_eq32 helper_gvec_eq32_mipsel
|
||||
#define helper_gvec_eq64 helper_gvec_eq64_mipsel
|
||||
#define helper_gvec_eqv helper_gvec_eqv_mipsel
|
||||
#define helper_gvec_fabd_s helper_gvec_fabd_s_mipsel
|
||||
#define helper_gvec_fadd_d helper_gvec_fadd_d_mipsel
|
||||
#define helper_gvec_fadd_h helper_gvec_fadd_h_mipsel
|
||||
#define helper_gvec_fadd_s helper_gvec_fadd_s_mipsel
|
||||
|
@ -1466,7 +1467,6 @@
|
|||
#define helper_msa_st_h helper_msa_st_h_mipsel
|
||||
#define helper_msa_st_w helper_msa_st_w_mipsel
|
||||
#define helper_msr_banked helper_msr_banked_mipsel
|
||||
#define helper_neon_abd_f32 helper_neon_abd_f32_mipsel
|
||||
#define helper_neon_abdl_s16 helper_neon_abdl_s16_mipsel
|
||||
#define helper_neon_abdl_s32 helper_neon_abdl_s32_mipsel
|
||||
#define helper_neon_abdl_s64 helper_neon_abdl_s64_mipsel
|
||||
|
|
|
@ -1152,6 +1152,7 @@
|
|||
#define helper_gvec_eq32 helper_gvec_eq32_powerpc
|
||||
#define helper_gvec_eq64 helper_gvec_eq64_powerpc
|
||||
#define helper_gvec_eqv helper_gvec_eqv_powerpc
|
||||
#define helper_gvec_fabd_s helper_gvec_fabd_s_powerpc
|
||||
#define helper_gvec_fadd_d helper_gvec_fadd_d_powerpc
|
||||
#define helper_gvec_fadd_h helper_gvec_fadd_h_powerpc
|
||||
#define helper_gvec_fadd_s helper_gvec_fadd_s_powerpc
|
||||
|
@ -1466,7 +1467,6 @@
|
|||
#define helper_msa_st_h helper_msa_st_h_powerpc
|
||||
#define helper_msa_st_w helper_msa_st_w_powerpc
|
||||
#define helper_msr_banked helper_msr_banked_powerpc
|
||||
#define helper_neon_abd_f32 helper_neon_abd_f32_powerpc
|
||||
#define helper_neon_abdl_s16 helper_neon_abdl_s16_powerpc
|
||||
#define helper_neon_abdl_s32 helper_neon_abdl_s32_powerpc
|
||||
#define helper_neon_abdl_s64 helper_neon_abdl_s64_powerpc
|
||||
|
|
|
@ -1152,6 +1152,7 @@
|
|||
#define helper_gvec_eq32 helper_gvec_eq32_riscv32
|
||||
#define helper_gvec_eq64 helper_gvec_eq64_riscv32
|
||||
#define helper_gvec_eqv helper_gvec_eqv_riscv32
|
||||
#define helper_gvec_fabd_s helper_gvec_fabd_s_riscv32
|
||||
#define helper_gvec_fadd_d helper_gvec_fadd_d_riscv32
|
||||
#define helper_gvec_fadd_h helper_gvec_fadd_h_riscv32
|
||||
#define helper_gvec_fadd_s helper_gvec_fadd_s_riscv32
|
||||
|
@ -1466,7 +1467,6 @@
|
|||
#define helper_msa_st_h helper_msa_st_h_riscv32
|
||||
#define helper_msa_st_w helper_msa_st_w_riscv32
|
||||
#define helper_msr_banked helper_msr_banked_riscv32
|
||||
#define helper_neon_abd_f32 helper_neon_abd_f32_riscv32
|
||||
#define helper_neon_abdl_s16 helper_neon_abdl_s16_riscv32
|
||||
#define helper_neon_abdl_s32 helper_neon_abdl_s32_riscv32
|
||||
#define helper_neon_abdl_s64 helper_neon_abdl_s64_riscv32
|
||||
|
|
|
@ -1152,6 +1152,7 @@
|
|||
#define helper_gvec_eq32 helper_gvec_eq32_riscv64
|
||||
#define helper_gvec_eq64 helper_gvec_eq64_riscv64
|
||||
#define helper_gvec_eqv helper_gvec_eqv_riscv64
|
||||
#define helper_gvec_fabd_s helper_gvec_fabd_s_riscv64
|
||||
#define helper_gvec_fadd_d helper_gvec_fadd_d_riscv64
|
||||
#define helper_gvec_fadd_h helper_gvec_fadd_h_riscv64
|
||||
#define helper_gvec_fadd_s helper_gvec_fadd_s_riscv64
|
||||
|
@ -1466,7 +1467,6 @@
|
|||
#define helper_msa_st_h helper_msa_st_h_riscv64
|
||||
#define helper_msa_st_w helper_msa_st_w_riscv64
|
||||
#define helper_msr_banked helper_msr_banked_riscv64
|
||||
#define helper_neon_abd_f32 helper_neon_abd_f32_riscv64
|
||||
#define helper_neon_abdl_s16 helper_neon_abdl_s16_riscv64
|
||||
#define helper_neon_abdl_s32 helper_neon_abdl_s32_riscv64
|
||||
#define helper_neon_abdl_s64 helper_neon_abdl_s64_riscv64
|
||||
|
|
|
@ -1152,6 +1152,7 @@
|
|||
#define helper_gvec_eq32 helper_gvec_eq32_sparc
|
||||
#define helper_gvec_eq64 helper_gvec_eq64_sparc
|
||||
#define helper_gvec_eqv helper_gvec_eqv_sparc
|
||||
#define helper_gvec_fabd_s helper_gvec_fabd_s_sparc
|
||||
#define helper_gvec_fadd_d helper_gvec_fadd_d_sparc
|
||||
#define helper_gvec_fadd_h helper_gvec_fadd_h_sparc
|
||||
#define helper_gvec_fadd_s helper_gvec_fadd_s_sparc
|
||||
|
@ -1466,7 +1467,6 @@
|
|||
#define helper_msa_st_h helper_msa_st_h_sparc
|
||||
#define helper_msa_st_w helper_msa_st_w_sparc
|
||||
#define helper_msr_banked helper_msr_banked_sparc
|
||||
#define helper_neon_abd_f32 helper_neon_abd_f32_sparc
|
||||
#define helper_neon_abdl_s16 helper_neon_abdl_s16_sparc
|
||||
#define helper_neon_abdl_s32 helper_neon_abdl_s32_sparc
|
||||
#define helper_neon_abdl_s64 helper_neon_abdl_s64_sparc
|
||||
|
|
|
@ -1152,6 +1152,7 @@
|
|||
#define helper_gvec_eq32 helper_gvec_eq32_sparc64
|
||||
#define helper_gvec_eq64 helper_gvec_eq64_sparc64
|
||||
#define helper_gvec_eqv helper_gvec_eqv_sparc64
|
||||
#define helper_gvec_fabd_s helper_gvec_fabd_s_sparc64
|
||||
#define helper_gvec_fadd_d helper_gvec_fadd_d_sparc64
|
||||
#define helper_gvec_fadd_h helper_gvec_fadd_h_sparc64
|
||||
#define helper_gvec_fadd_s helper_gvec_fadd_s_sparc64
|
||||
|
@ -1466,7 +1467,6 @@
|
|||
#define helper_msa_st_h helper_msa_st_h_sparc64
|
||||
#define helper_msa_st_w helper_msa_st_w_sparc64
|
||||
#define helper_msr_banked helper_msr_banked_sparc64
|
||||
#define helper_neon_abd_f32 helper_neon_abd_f32_sparc64
|
||||
#define helper_neon_abdl_s16 helper_neon_abdl_s16_sparc64
|
||||
#define helper_neon_abdl_s32 helper_neon_abdl_s32_sparc64
|
||||
#define helper_neon_abdl_s64 helper_neon_abdl_s64_sparc64
|
||||
|
|
|
@ -392,7 +392,6 @@ DEF_HELPER_FLAGS_2(neon_qneg_s16, TCG_CALL_NO_RWG, i32, env, i32)
|
|||
DEF_HELPER_FLAGS_2(neon_qneg_s32, TCG_CALL_NO_RWG, i32, env, i32)
|
||||
DEF_HELPER_FLAGS_2(neon_qneg_s64, TCG_CALL_NO_RWG, i64, env, i64)
|
||||
|
||||
DEF_HELPER_3(neon_abd_f32, i32, i32, i32, ptr)
|
||||
DEF_HELPER_3(neon_ceq_f32, i32, i32, i32, ptr)
|
||||
DEF_HELPER_3(neon_cge_f32, i32, i32, i32, ptr)
|
||||
DEF_HELPER_3(neon_cgt_f32, i32, i32, i32, ptr)
|
||||
|
@ -591,6 +590,8 @@ DEF_HELPER_FLAGS_5(gvec_fmul_h, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, ptr, i32)
|
|||
DEF_HELPER_FLAGS_5(gvec_fmul_s, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, ptr, i32)
|
||||
DEF_HELPER_FLAGS_5(gvec_fmul_d, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, ptr, i32)
|
||||
|
||||
DEF_HELPER_FLAGS_5(gvec_fabd_s, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, ptr, i32)
|
||||
|
||||
DEF_HELPER_FLAGS_5(gvec_ftsmul_h, TCG_CALL_NO_RWG,
|
||||
void, ptr, ptr, ptr, ptr, i32)
|
||||
DEF_HELPER_FLAGS_5(gvec_ftsmul_s, TCG_CALL_NO_RWG,
|
||||
|
|
|
@ -45,6 +45,10 @@
|
|||
@3same_q0 .... ... . . . size:2 .... .... .... . 0 . . .... \
|
||||
&3same vm=%vm_dp vn=%vn_dp vd=%vd_dp q=0
|
||||
|
||||
# For FP insns the high bit of 'size' is used as part of opcode decode
|
||||
@3same_fp .... ... . . . . size:1 .... .... .... . q:1 . . .... \
|
||||
&3same vm=%vm_dp vn=%vn_dp vd=%vd_dp
|
||||
|
||||
VHADD_S_3s 1111 001 0 0 . .. .... .... 0000 . . . 0 .... @3same
|
||||
VHADD_U_3s 1111 001 1 0 . .. .... .... 0000 . . . 0 .... @3same
|
||||
VQADD_S_3s 1111 001 0 0 . .. .... .... 0000 . . . 1 .... @3same
|
||||
|
@ -169,3 +173,7 @@ SHA256SU1_3s 1111 001 1 0 . 10 .... .... 1100 . 1 . 0 .... \
|
|||
vm=%vm_dp vn=%vn_dp vd=%vd_dp
|
||||
|
||||
VQRDMLSH_3s 1111 001 1 0 . .. .... .... 1100 ... 1 .... @3same
|
||||
|
||||
VADD_fp_3s 1111 001 0 0 . 0 . .... .... 1101 ... 0 .... @3same_fp
|
||||
VSUB_fp_3s 1111 001 0 0 . 1 . .... .... 1101 ... 0 .... @3same_fp
|
||||
VABD_fp_3s 1111 001 1 0 . 1 . .... .... 1101 ... 0 .... @3same_fp
|
||||
|
|
|
@ -1836,15 +1836,6 @@ uint64_t HELPER(neon_qneg_s64)(CPUARMState *env, uint64_t x)
|
|||
return x;
|
||||
}
|
||||
|
||||
/* NEON Float helpers. */
|
||||
uint32_t HELPER(neon_abd_f32)(uint32_t a, uint32_t b, void *fpstp)
|
||||
{
|
||||
float_status *fpst = fpstp;
|
||||
float32 f0 = make_float32(a);
|
||||
float32 f1 = make_float32(b);
|
||||
return float32_val(float32_abs(float32_sub(f0, f1, fpst)));
|
||||
}
|
||||
|
||||
/* Floating point comparisons produce an integer result.
|
||||
* Note that EQ doesn't signal InvalidOp for QNaNs but GE and GT do.
|
||||
* Softfloat routines return 0/1, which we convert to the 0/-1 Neon requires.
|
||||
|
|
|
@ -678,9 +678,8 @@ static void write_fp_sreg(DisasContext *s, int reg, TCGv_i32 v)
|
|||
tcg_temp_free_i64(tcg_ctx, tmp);
|
||||
}
|
||||
|
||||
TCGv_ptr get_fpstatus_ptr(DisasContext *s, bool is_f16)
|
||||
TCGv_ptr get_fpstatus_ptr(TCGContext *tcg_ctx, bool is_f16)
|
||||
{
|
||||
TCGContext *tcg_ctx = s->uc->tcg_ctx;
|
||||
TCGv_ptr statusptr = tcg_temp_new_ptr(tcg_ctx);
|
||||
int offset;
|
||||
|
||||
|
@ -762,7 +761,7 @@ static void gen_gvec_op3_fpst(DisasContext *s, bool is_q, int rd, int rn,
|
|||
{
|
||||
TCGContext *tcg_ctx = s->uc->tcg_ctx;
|
||||
|
||||
TCGv_ptr fpst = get_fpstatus_ptr(s, is_fp16);
|
||||
TCGv_ptr fpst = get_fpstatus_ptr(tcg_ctx, is_fp16);
|
||||
tcg_gen_gvec_3_ptr(tcg_ctx, vec_full_reg_offset(s, rd),
|
||||
vec_full_reg_offset(s, rn),
|
||||
vec_full_reg_offset(s, rm), fpst,
|
||||
|
@ -5613,7 +5612,7 @@ static void handle_fp_compare(DisasContext *s, int size,
|
|||
{
|
||||
TCGContext *tcg_ctx = s->uc->tcg_ctx;
|
||||
TCGv_i64 tcg_flags = tcg_temp_new_i64(tcg_ctx);
|
||||
TCGv_ptr fpst = get_fpstatus_ptr(s, size == MO_16);
|
||||
TCGv_ptr fpst = get_fpstatus_ptr(tcg_ctx, size == MO_16);
|
||||
|
||||
if (size == MO_64) {
|
||||
TCGv_i64 tcg_vn, tcg_vm;
|
||||
|
@ -5875,7 +5874,7 @@ static void handle_fp_1src_half(DisasContext *s, int opcode, int rd, int rn)
|
|||
tcg_gen_xori_i32(tcg_ctx, tcg_res, tcg_op, 0x8000);
|
||||
break;
|
||||
case 0x3: /* FSQRT */
|
||||
fpst = get_fpstatus_ptr(s, true);
|
||||
fpst = get_fpstatus_ptr(tcg_ctx, true);
|
||||
gen_helper_sqrt_f16(tcg_ctx, tcg_res, tcg_op, fpst);
|
||||
break;
|
||||
case 0x8: /* FRINTN */
|
||||
|
@ -5885,7 +5884,7 @@ static void handle_fp_1src_half(DisasContext *s, int opcode, int rd, int rn)
|
|||
case 0xc: /* FRINTA */
|
||||
{
|
||||
TCGv_i32 tcg_rmode = tcg_const_i32(tcg_ctx, arm_rmode_to_sf(opcode & 7));
|
||||
fpst = get_fpstatus_ptr(s, true);
|
||||
fpst = get_fpstatus_ptr(tcg_ctx, true);
|
||||
|
||||
gen_helper_set_rmode(tcg_ctx, tcg_rmode, tcg_rmode, fpst);
|
||||
gen_helper_advsimd_rinth(tcg_ctx, tcg_res, tcg_op, fpst);
|
||||
|
@ -5895,11 +5894,11 @@ static void handle_fp_1src_half(DisasContext *s, int opcode, int rd, int rn)
|
|||
break;
|
||||
}
|
||||
case 0xe: /* FRINTX */
|
||||
fpst = get_fpstatus_ptr(s, true);
|
||||
fpst = get_fpstatus_ptr(tcg_ctx, true);
|
||||
gen_helper_advsimd_rinth_exact(tcg_ctx, tcg_res, tcg_op, fpst);
|
||||
break;
|
||||
case 0xf: /* FRINTI */
|
||||
fpst = get_fpstatus_ptr(s, true);
|
||||
fpst = get_fpstatus_ptr(tcg_ctx, true);
|
||||
gen_helper_advsimd_rinth(tcg_ctx, tcg_res, tcg_op, fpst);
|
||||
break;
|
||||
default:
|
||||
|
@ -5972,7 +5971,7 @@ static void handle_fp_1src_single(DisasContext *s, int opcode, int rd, int rn)
|
|||
g_assert_not_reached();
|
||||
}
|
||||
|
||||
fpst = get_fpstatus_ptr(s, false);
|
||||
fpst = get_fpstatus_ptr(tcg_ctx, false);
|
||||
if (rmode >= 0) {
|
||||
TCGv_i32 tcg_rmode = tcg_const_i32(tcg_ctx, rmode);
|
||||
gen_helper_set_rmode(tcg_ctx, tcg_rmode, tcg_rmode, fpst);
|
||||
|
@ -6050,7 +6049,7 @@ static void handle_fp_1src_double(DisasContext *s, int opcode, int rd, int rn)
|
|||
g_assert_not_reached();
|
||||
}
|
||||
|
||||
fpst = get_fpstatus_ptr(s, false);
|
||||
fpst = get_fpstatus_ptr(tcg_ctx, false);
|
||||
if (rmode >= 0) {
|
||||
TCGv_i32 tcg_rmode = tcg_const_i32(tcg_ctx, rmode);
|
||||
gen_helper_set_rmode(tcg_ctx, tcg_rmode, tcg_rmode, fpst);
|
||||
|
@ -6087,7 +6086,7 @@ static void handle_fp_fcvt(DisasContext *s, int opcode,
|
|||
/* Single to half */
|
||||
TCGv_i32 tcg_rd = tcg_temp_new_i32(tcg_ctx);
|
||||
TCGv_i32 ahp = get_ahp_flag(s);
|
||||
TCGv_ptr fpst = get_fpstatus_ptr(s, false);
|
||||
TCGv_ptr fpst = get_fpstatus_ptr(tcg_ctx, false);
|
||||
|
||||
gen_helper_vfp_fcvt_f32_to_f16(tcg_ctx, tcg_rd, tcg_rn, fpst, ahp);
|
||||
/* write_fp_sreg is OK here because top half of tcg_rd is zero */
|
||||
|
@ -6107,7 +6106,7 @@ static void handle_fp_fcvt(DisasContext *s, int opcode,
|
|||
/* Double to single */
|
||||
gen_helper_vfp_fcvtsd(tcg_ctx, tcg_rd, tcg_rn, tcg_ctx->cpu_env);
|
||||
} else {
|
||||
TCGv_ptr fpst = get_fpstatus_ptr(s, false);
|
||||
TCGv_ptr fpst = get_fpstatus_ptr(tcg_ctx, false);
|
||||
TCGv_i32 ahp = get_ahp_flag(s);
|
||||
/* Double to half */
|
||||
gen_helper_vfp_fcvt_f64_to_f16(tcg_ctx, tcg_rd, tcg_rn, fpst, ahp);
|
||||
|
@ -6123,7 +6122,7 @@ static void handle_fp_fcvt(DisasContext *s, int opcode,
|
|||
case 0x3:
|
||||
{
|
||||
TCGv_i32 tcg_rn = read_fp_sreg(s, rn);
|
||||
TCGv_ptr tcg_fpst = get_fpstatus_ptr(s, false);
|
||||
TCGv_ptr tcg_fpst = get_fpstatus_ptr(tcg_ctx, false);
|
||||
TCGv_i32 tcg_ahp = get_ahp_flag(s);
|
||||
tcg_gen_ext16u_i32(tcg_ctx, tcg_rn, tcg_rn);
|
||||
if (dtype == 0) {
|
||||
|
@ -6241,7 +6240,7 @@ static void handle_fp_2src_single(DisasContext *s, int opcode,
|
|||
TCGv_ptr fpst;
|
||||
|
||||
tcg_res = tcg_temp_new_i32(tcg_ctx);
|
||||
fpst = get_fpstatus_ptr(s, false);
|
||||
fpst = get_fpstatus_ptr(tcg_ctx, false);
|
||||
tcg_op1 = read_fp_sreg(s, rn);
|
||||
tcg_op2 = read_fp_sreg(s, rm);
|
||||
|
||||
|
@ -6295,7 +6294,7 @@ static void handle_fp_2src_double(DisasContext *s, int opcode,
|
|||
TCGv_ptr fpst;
|
||||
|
||||
tcg_res = tcg_temp_new_i64(tcg_ctx);
|
||||
fpst = get_fpstatus_ptr(s, false);
|
||||
fpst = get_fpstatus_ptr(tcg_ctx, false);
|
||||
tcg_op1 = read_fp_dreg(s, rn);
|
||||
tcg_op2 = read_fp_dreg(s, rm);
|
||||
|
||||
|
@ -6350,7 +6349,7 @@ static void handle_fp_2src_half(DisasContext *s, int opcode,
|
|||
TCGv_ptr fpst;
|
||||
|
||||
tcg_res = tcg_temp_new_i32(tcg_ctx);
|
||||
fpst = get_fpstatus_ptr(s, true);
|
||||
fpst = get_fpstatus_ptr(tcg_ctx, true);
|
||||
tcg_op1 = read_fp_hreg(s, rn);
|
||||
tcg_op2 = read_fp_hreg(s, rm);
|
||||
|
||||
|
@ -6450,7 +6449,7 @@ static void handle_fp_3src_single(DisasContext *s, bool o0, bool o1,
|
|||
TCGContext *tcg_ctx = s->uc->tcg_ctx;
|
||||
TCGv_i32 tcg_op1, tcg_op2, tcg_op3;
|
||||
TCGv_i32 tcg_res = tcg_temp_new_i32(tcg_ctx);
|
||||
TCGv_ptr fpst = get_fpstatus_ptr(s, false);
|
||||
TCGv_ptr fpst = get_fpstatus_ptr(tcg_ctx, false);
|
||||
|
||||
tcg_op1 = read_fp_sreg(s, rn);
|
||||
tcg_op2 = read_fp_sreg(s, rm);
|
||||
|
@ -6489,7 +6488,7 @@ static void handle_fp_3src_double(DisasContext *s, bool o0, bool o1,
|
|||
TCGContext *tcg_ctx = s->uc->tcg_ctx;
|
||||
TCGv_i64 tcg_op1, tcg_op2, tcg_op3;
|
||||
TCGv_i64 tcg_res = tcg_temp_new_i64(tcg_ctx);
|
||||
TCGv_ptr fpst = get_fpstatus_ptr(s, false);
|
||||
TCGv_ptr fpst = get_fpstatus_ptr(tcg_ctx, false);
|
||||
|
||||
tcg_op1 = read_fp_dreg(s, rn);
|
||||
tcg_op2 = read_fp_dreg(s, rm);
|
||||
|
@ -6529,7 +6528,7 @@ static void handle_fp_3src_half(DisasContext *s, bool o0, bool o1,
|
|||
|
||||
TCGv_i32 tcg_op1, tcg_op2, tcg_op3;
|
||||
TCGv_i32 tcg_res = tcg_temp_new_i32(tcg_ctx);
|
||||
TCGv_ptr fpst = get_fpstatus_ptr(s, true);
|
||||
TCGv_ptr fpst = get_fpstatus_ptr(tcg_ctx, true);
|
||||
|
||||
tcg_op1 = read_fp_hreg(s, rn);
|
||||
tcg_op2 = read_fp_hreg(s, rm);
|
||||
|
@ -6677,7 +6676,7 @@ static void handle_fpfpcvt(DisasContext *s, int rd, int rn, int opcode,
|
|||
TCGv_i32 tcg_shift, tcg_single;
|
||||
TCGv_i64 tcg_double;
|
||||
|
||||
tcg_fpstatus = get_fpstatus_ptr(s, type == 3);
|
||||
tcg_fpstatus = get_fpstatus_ptr(tcg_ctx, type == 3);
|
||||
|
||||
tcg_shift = tcg_const_i32(tcg_ctx, 64 - scale);
|
||||
|
||||
|
@ -6967,7 +6966,7 @@ static void handle_fjcvtzs(DisasContext *s, int rd, int rn)
|
|||
{
|
||||
TCGContext *tcg_ctx = s->uc->tcg_ctx;
|
||||
TCGv_i64 t = read_fp_dreg(s, rn);
|
||||
TCGv_ptr fpstatus = get_fpstatus_ptr(s, false);
|
||||
TCGv_ptr fpstatus = get_fpstatus_ptr(tcg_ctx, false);
|
||||
|
||||
gen_helper_fjcvtzs(tcg_ctx, t, t, fpstatus);
|
||||
|
||||
|
@ -7577,7 +7576,7 @@ static void disas_simd_across_lanes(DisasContext *s, uint32_t insn)
|
|||
* Note that correct NaN propagation requires that we do these
|
||||
* operations in exactly the order specified by the pseudocode.
|
||||
*/
|
||||
TCGv_ptr fpst = get_fpstatus_ptr(s, size == MO_16);
|
||||
TCGv_ptr fpst = get_fpstatus_ptr(tcg_ctx, size == MO_16);
|
||||
int fpopcode = opcode | is_min << 4 | is_u << 5;
|
||||
int vmap = (1 << elements) - 1;
|
||||
TCGv_i32 tcg_res32 = do_reduction_op(s, fpopcode, rn, esize,
|
||||
|
@ -8096,7 +8095,7 @@ static void disas_simd_scalar_pairwise(DisasContext *s, uint32_t insn)
|
|||
return;
|
||||
}
|
||||
|
||||
fpst = get_fpstatus_ptr(s, size == MO_16);
|
||||
fpst = get_fpstatus_ptr(tcg_ctx, size == MO_16);
|
||||
break;
|
||||
default:
|
||||
unallocated_encoding(s);
|
||||
|
@ -8615,7 +8614,7 @@ static void handle_simd_intfp_conv(DisasContext *s, int rd, int rn,
|
|||
int fracbits, int size)
|
||||
{
|
||||
TCGContext *tcg_ctx = s->uc->tcg_ctx;
|
||||
TCGv_ptr tcg_fpst = get_fpstatus_ptr(s, size == MO_16);
|
||||
TCGv_ptr tcg_fpst = get_fpstatus_ptr(tcg_ctx, size == MO_16);
|
||||
TCGv_i32 tcg_shift = NULL;
|
||||
|
||||
MemOp mop = size | (is_signed ? MO_SIGN : 0);
|
||||
|
@ -8797,7 +8796,7 @@ static void handle_simd_shift_fpint_conv(DisasContext *s, bool is_scalar,
|
|||
assert(!(is_scalar && is_q));
|
||||
|
||||
tcg_rmode = tcg_const_i32(tcg_ctx, arm_rmode_to_sf(FPROUNDING_ZERO));
|
||||
tcg_fpstatus = get_fpstatus_ptr(s, size == MO_16);
|
||||
tcg_fpstatus = get_fpstatus_ptr(tcg_ctx, size == MO_16);
|
||||
gen_helper_set_rmode(tcg_ctx, tcg_rmode, tcg_rmode, tcg_fpstatus);
|
||||
fracbits = (16 << size) - immhb;
|
||||
tcg_shift = tcg_const_i32(tcg_ctx, fracbits);
|
||||
|
@ -9139,7 +9138,7 @@ static void handle_3same_float(DisasContext *s, int size, int elements,
|
|||
{
|
||||
TCGContext *tcg_ctx = s->uc->tcg_ctx;
|
||||
int pass;
|
||||
TCGv_ptr fpst = get_fpstatus_ptr(s, false);
|
||||
TCGv_ptr fpst = get_fpstatus_ptr(tcg_ctx, false);
|
||||
|
||||
for (pass = 0; pass < elements; pass++) {
|
||||
if (size) {
|
||||
|
@ -9534,7 +9533,7 @@ static void disas_simd_scalar_three_reg_same_fp16(DisasContext *s,
|
|||
return;
|
||||
}
|
||||
|
||||
fpst = get_fpstatus_ptr(s, true);
|
||||
fpst = get_fpstatus_ptr(tcg_ctx, true);
|
||||
|
||||
tcg_op1 = read_fp_hreg(s, rn);
|
||||
tcg_op2 = read_fp_hreg(s, rm);
|
||||
|
@ -9790,7 +9789,7 @@ static void handle_2misc_fcmp_zero(DisasContext *s, int opcode,
|
|||
return;
|
||||
}
|
||||
|
||||
fpst = get_fpstatus_ptr(s, size == MO_16);
|
||||
fpst = get_fpstatus_ptr(tcg_ctx, size == MO_16);
|
||||
|
||||
if (is_double) {
|
||||
TCGv_i64 tcg_op = tcg_temp_new_i64(tcg_ctx);
|
||||
|
@ -9921,7 +9920,7 @@ static void handle_2misc_reciprocal(DisasContext *s, int opcode,
|
|||
{
|
||||
TCGContext *tcg_ctx = s->uc->tcg_ctx;
|
||||
bool is_double = (size == 3);
|
||||
TCGv_ptr fpst = get_fpstatus_ptr(s, false);
|
||||
TCGv_ptr fpst = get_fpstatus_ptr(tcg_ctx, false);
|
||||
|
||||
if (is_double) {
|
||||
TCGv_i64 tcg_op = tcg_temp_new_i64(tcg_ctx);
|
||||
|
@ -10063,7 +10062,7 @@ static void handle_2misc_narrow(DisasContext *s, bool scalar,
|
|||
} else {
|
||||
TCGv_i32 tcg_lo = tcg_temp_new_i32(tcg_ctx);
|
||||
TCGv_i32 tcg_hi = tcg_temp_new_i32(tcg_ctx);
|
||||
TCGv_ptr fpst = get_fpstatus_ptr(s, false);
|
||||
TCGv_ptr fpst = get_fpstatus_ptr(tcg_ctx, false);
|
||||
TCGv_i32 ahp = get_ahp_flag(s);
|
||||
|
||||
tcg_gen_extr_i64_i32(tcg_ctx, tcg_lo, tcg_hi, tcg_op);
|
||||
|
@ -10327,7 +10326,7 @@ static void disas_simd_scalar_two_reg_misc(DisasContext *s, uint32_t insn)
|
|||
|
||||
if (is_fcvt) {
|
||||
tcg_rmode = tcg_const_i32(tcg_ctx, arm_rmode_to_sf(rmode));
|
||||
tcg_fpstatus = get_fpstatus_ptr(s, false);
|
||||
tcg_fpstatus = get_fpstatus_ptr(tcg_ctx, false);
|
||||
gen_helper_set_rmode(tcg_ctx, tcg_rmode, tcg_rmode, tcg_fpstatus);
|
||||
} else {
|
||||
tcg_rmode = NULL;
|
||||
|
@ -11159,7 +11158,7 @@ static void handle_simd_3same_pair(DisasContext *s, int is_q, int u, int opcode,
|
|||
|
||||
/* Floating point operations need fpst */
|
||||
if (opcode >= 0x58) {
|
||||
fpst = get_fpstatus_ptr(s, false);
|
||||
fpst = get_fpstatus_ptr(tcg_ctx, false);
|
||||
} else {
|
||||
fpst = NULL;
|
||||
}
|
||||
|
@ -11776,7 +11775,7 @@ static void disas_simd_three_reg_same_fp16(DisasContext *s, uint32_t insn)
|
|||
break;
|
||||
}
|
||||
|
||||
fpst = get_fpstatus_ptr(s, true);
|
||||
fpst = get_fpstatus_ptr(tcg_ctx, true);
|
||||
|
||||
if (pairwise) {
|
||||
int maxpass = is_q ? 8 : 4;
|
||||
|
@ -12069,7 +12068,7 @@ static void handle_2misc_widening(DisasContext *s, int opcode, bool is_q,
|
|||
/* 16 -> 32 bit fp conversion */
|
||||
int srcelt = is_q ? 4 : 0;
|
||||
TCGv_i32 tcg_res[4];
|
||||
TCGv_ptr fpst = get_fpstatus_ptr(s, false);
|
||||
TCGv_ptr fpst = get_fpstatus_ptr(tcg_ctx, false);
|
||||
TCGv_i32 ahp = get_ahp_flag(s);
|
||||
|
||||
for (pass = 0; pass < 4; pass++) {
|
||||
|
@ -12546,7 +12545,7 @@ static void disas_simd_two_reg_misc(DisasContext *s, uint32_t insn)
|
|||
}
|
||||
|
||||
if (need_fpstatus || need_rmode) {
|
||||
tcg_fpstatus = get_fpstatus_ptr(s, false);
|
||||
tcg_fpstatus = get_fpstatus_ptr(tcg_ctx, false);
|
||||
} else {
|
||||
tcg_fpstatus = NULL;
|
||||
}
|
||||
|
@ -12937,7 +12936,7 @@ static void disas_simd_two_reg_misc_fp16(DisasContext *s, uint32_t insn)
|
|||
}
|
||||
|
||||
if (need_rmode || need_fpst) {
|
||||
tcg_fpstatus = get_fpstatus_ptr(s, true);
|
||||
tcg_fpstatus = get_fpstatus_ptr(tcg_ctx, true);
|
||||
}
|
||||
|
||||
if (need_rmode) {
|
||||
|
@ -13247,7 +13246,7 @@ static void disas_simd_indexed(DisasContext *s, uint32_t insn)
|
|||
}
|
||||
|
||||
if (is_fp) {
|
||||
fpst = get_fpstatus_ptr(s, is_fp16);
|
||||
fpst = get_fpstatus_ptr(tcg_ctx, is_fp16);
|
||||
} else {
|
||||
fpst = NULL;
|
||||
}
|
||||
|
|
|
@ -36,7 +36,7 @@ TCGv_i64 cpu_reg_sp(DisasContext *s, int reg);
|
|||
TCGv_i64 read_cpu_reg(DisasContext *s, int reg, int sf);
|
||||
TCGv_i64 read_cpu_reg_sp(DisasContext *s, int reg, int sf);
|
||||
void write_fp_dreg(DisasContext *s, int reg, TCGv_i64 v);
|
||||
TCGv_ptr get_fpstatus_ptr(DisasContext *, bool);
|
||||
TCGv_ptr get_fpstatus_ptr(TCGContext *, bool);
|
||||
bool logic_imm_decode_wmask(uint64_t *result, unsigned int immn,
|
||||
unsigned int imms, unsigned int immr);
|
||||
bool sve_access_check(DisasContext *s);
|
||||
|
|
|
@ -63,7 +63,7 @@ static bool trans_VCMLA(DisasContext *s, arg_VCMLA *a)
|
|||
}
|
||||
|
||||
opr_sz = (1 + a->q) * 8;
|
||||
fpst = get_fpstatus_ptr(s, 1);
|
||||
fpst = get_fpstatus_ptr(tcg_ctx, 1);
|
||||
fn_gvec_ptr = a->size ? gen_helper_gvec_fcmlas : gen_helper_gvec_fcmlah;
|
||||
tcg_gen_gvec_3_ptr(tcg_ctx, vfp_reg_offset(1, a->vd),
|
||||
vfp_reg_offset(1, a->vn),
|
||||
|
@ -101,7 +101,7 @@ static bool trans_VCADD(DisasContext *s, arg_VCADD *a)
|
|||
}
|
||||
|
||||
opr_sz = (1 + a->q) * 8;
|
||||
fpst = get_fpstatus_ptr(s, 1);
|
||||
fpst = get_fpstatus_ptr(tcg_ctx, 1);
|
||||
fn_gvec_ptr = a->size ? gen_helper_gvec_fcadds : gen_helper_gvec_fcaddh;
|
||||
tcg_gen_gvec_3_ptr(tcg_ctx, vfp_reg_offset(1, a->vd),
|
||||
vfp_reg_offset(1, a->vn),
|
||||
|
@ -208,7 +208,7 @@ static bool trans_VCMLA_scalar(DisasContext *s, arg_VCMLA_scalar *a)
|
|||
fn_gvec_ptr = (a->size ? gen_helper_gvec_fcmlas_idx
|
||||
: gen_helper_gvec_fcmlah_idx);
|
||||
opr_sz = (1 + a->q) * 8;
|
||||
fpst = get_fpstatus_ptr(s, 1);
|
||||
fpst = get_fpstatus_ptr(tcg_ctx, 1);
|
||||
tcg_gen_gvec_3_ptr(tcg_ctx, vfp_reg_offset(1, a->vd),
|
||||
vfp_reg_offset(1, a->vn),
|
||||
vfp_reg_offset(1, a->vm),
|
||||
|
@ -245,7 +245,7 @@ static bool trans_VDOT_scalar(DisasContext *s, arg_VDOT_scalar *a)
|
|||
|
||||
fn_gvec = a->u ? gen_helper_gvec_udot_idx_b : gen_helper_gvec_sdot_idx_b;
|
||||
opr_sz = (1 + a->q) * 8;
|
||||
fpst = get_fpstatus_ptr(s, 1);
|
||||
fpst = get_fpstatus_ptr(tcg_ctx, 1);
|
||||
tcg_gen_gvec_3_ool(tcg_ctx, vfp_reg_offset(1, a->vd),
|
||||
vfp_reg_offset(1, a->vn),
|
||||
vfp_reg_offset(1, a->rm),
|
||||
|
@ -1039,3 +1039,31 @@ DO_3SAME_PAIR(VPADD, padd_u)
|
|||
|
||||
DO_3SAME_VQDMULH(VQDMULH, qdmulh)
|
||||
DO_3SAME_VQDMULH(VQRDMULH, qrdmulh)
|
||||
|
||||
/*
|
||||
* For all the functions using this macro, size == 1 means fp16,
|
||||
* which is an architecture extension we don't implement yet.
|
||||
*/
|
||||
#define DO_3S_FP_GVEC(INSN,FUNC) \
|
||||
static void gen_##INSN##_3s(TCGContext *s, unsigned vece, uint32_t rd_ofs, \
|
||||
uint32_t rn_ofs, uint32_t rm_ofs, \
|
||||
uint32_t oprsz, uint32_t maxsz) \
|
||||
{ \
|
||||
TCGv_ptr fpst = get_fpstatus_ptr(s, 1); \
|
||||
tcg_gen_gvec_3_ptr(s, rd_ofs, rn_ofs, rm_ofs, fpst, \
|
||||
oprsz, maxsz, 0, FUNC); \
|
||||
tcg_temp_free_ptr(s, fpst); \
|
||||
} \
|
||||
static bool trans_##INSN##_fp_3s(DisasContext *s, arg_3same *a) \
|
||||
{ \
|
||||
if (a->size != 0) { \
|
||||
/* TODO fp16 support */ \
|
||||
return false; \
|
||||
} \
|
||||
return do_3same(s, a, gen_##INSN##_3s); \
|
||||
}
|
||||
|
||||
|
||||
DO_3S_FP_GVEC(VADD, gen_helper_gvec_fadd_s)
|
||||
DO_3S_FP_GVEC(VSUB, gen_helper_gvec_fsub_s)
|
||||
DO_3S_FP_GVEC(VABD, gen_helper_gvec_fabd_s)
|
||||
|
|
|
@ -3598,7 +3598,7 @@ static bool trans_FMLA_zzxz(DisasContext *s, arg_FMLA_zzxz *a)
|
|||
if (sve_access_check(s)) {
|
||||
TCGContext *tcg_ctx = s->uc->tcg_ctx;
|
||||
unsigned vsz = vec_full_reg_size(s);
|
||||
TCGv_ptr status = get_fpstatus_ptr(s, a->esz == MO_16);
|
||||
TCGv_ptr status = get_fpstatus_ptr(tcg_ctx, a->esz == MO_16);
|
||||
tcg_gen_gvec_4_ptr(tcg_ctx, vec_full_reg_offset(s, a->rd),
|
||||
vec_full_reg_offset(s, a->rn),
|
||||
vec_full_reg_offset(s, a->rm),
|
||||
|
@ -3625,7 +3625,7 @@ static bool trans_FMUL_zzx(DisasContext *s, arg_FMUL_zzx *a)
|
|||
if (sve_access_check(s)) {
|
||||
TCGContext *tcg_ctx = s->uc->tcg_ctx;
|
||||
unsigned vsz = vec_full_reg_size(s);
|
||||
TCGv_ptr status = get_fpstatus_ptr(s, a->esz == MO_16);
|
||||
TCGv_ptr status = get_fpstatus_ptr(tcg_ctx, a->esz == MO_16);
|
||||
tcg_gen_gvec_3_ptr(tcg_ctx, vec_full_reg_offset(s, a->rd),
|
||||
vec_full_reg_offset(s, a->rn),
|
||||
vec_full_reg_offset(s, a->rm),
|
||||
|
@ -3658,7 +3658,7 @@ static void do_reduce(DisasContext *s, arg_rpr_esz *a,
|
|||
|
||||
tcg_gen_addi_ptr(tcg_ctx, t_zn, tcg_ctx->cpu_env, vec_full_reg_offset(s, a->rn));
|
||||
tcg_gen_addi_ptr(tcg_ctx, t_pg, tcg_ctx->cpu_env, pred_full_reg_offset(s, a->pg));
|
||||
status = get_fpstatus_ptr(s, a->esz == MO_16);
|
||||
status = get_fpstatus_ptr(tcg_ctx, a->esz == MO_16);
|
||||
|
||||
fn(tcg_ctx, temp, t_zn, t_pg, status, t_desc);
|
||||
tcg_temp_free_ptr(tcg_ctx, t_zn);
|
||||
|
@ -3701,7 +3701,7 @@ static void do_zz_fp(DisasContext *s, arg_rr_esz *a, gen_helper_gvec_2_ptr *fn)
|
|||
{
|
||||
TCGContext *tcg_ctx = s->uc->tcg_ctx;
|
||||
unsigned vsz = vec_full_reg_size(s);
|
||||
TCGv_ptr status = get_fpstatus_ptr(s, a->esz == MO_16);
|
||||
TCGv_ptr status = get_fpstatus_ptr(tcg_ctx, a->esz == MO_16);
|
||||
|
||||
tcg_gen_gvec_2_ptr(tcg_ctx, vec_full_reg_offset(s, a->rd),
|
||||
vec_full_reg_offset(s, a->rn),
|
||||
|
@ -3750,7 +3750,7 @@ static void do_ppz_fp(DisasContext *s, arg_rpr_esz *a,
|
|||
{
|
||||
TCGContext *tcg_ctx = s->uc->tcg_ctx;
|
||||
unsigned vsz = vec_full_reg_size(s);
|
||||
TCGv_ptr status = get_fpstatus_ptr(s, a->esz == MO_16);
|
||||
TCGv_ptr status = get_fpstatus_ptr(tcg_ctx, a->esz == MO_16);
|
||||
|
||||
tcg_gen_gvec_3_ptr(tcg_ctx, pred_full_reg_offset(s, a->rd),
|
||||
vec_full_reg_offset(s, a->rn),
|
||||
|
@ -3803,7 +3803,7 @@ static bool trans_FTMAD(DisasContext *s, arg_FTMAD *a)
|
|||
if (sve_access_check(s)) {
|
||||
TCGContext *tcg_ctx = s->uc->tcg_ctx;
|
||||
unsigned vsz = vec_full_reg_size(s);
|
||||
TCGv_ptr status = get_fpstatus_ptr(s, a->esz == MO_16);
|
||||
TCGv_ptr status = get_fpstatus_ptr(tcg_ctx, a->esz == MO_16);
|
||||
tcg_gen_gvec_3_ptr(tcg_ctx, vec_full_reg_offset(s, a->rd),
|
||||
vec_full_reg_offset(s, a->rn),
|
||||
vec_full_reg_offset(s, a->rm),
|
||||
|
@ -3844,7 +3844,7 @@ static bool trans_FADDA(DisasContext *s, arg_rprr_esz *a)
|
|||
t_pg = tcg_temp_new_ptr(tcg_ctx);
|
||||
tcg_gen_addi_ptr(tcg_ctx, t_rm, tcg_ctx->cpu_env, vec_full_reg_offset(s, a->rm));
|
||||
tcg_gen_addi_ptr(tcg_ctx, t_pg, tcg_ctx->cpu_env, pred_full_reg_offset(s, a->pg));
|
||||
t_fpst = get_fpstatus_ptr(s, a->esz == MO_16);
|
||||
t_fpst = get_fpstatus_ptr(tcg_ctx, a->esz == MO_16);
|
||||
t_desc = tcg_const_i32(tcg_ctx, simd_desc(vsz, vsz, 0));
|
||||
|
||||
fns[a->esz - 1](tcg_ctx, t_val, t_val, t_rm, t_pg, t_fpst, t_desc);
|
||||
|
@ -3872,7 +3872,7 @@ static bool do_zzz_fp(DisasContext *s, arg_rrr_esz *a,
|
|||
if (sve_access_check(s)) {
|
||||
TCGContext *tcg_ctx = s->uc->tcg_ctx;
|
||||
unsigned vsz = vec_full_reg_size(s);
|
||||
TCGv_ptr status = get_fpstatus_ptr(s, a->esz == MO_16);
|
||||
TCGv_ptr status = get_fpstatus_ptr(tcg_ctx, a->esz == MO_16);
|
||||
tcg_gen_gvec_3_ptr(tcg_ctx, vec_full_reg_offset(s, a->rd),
|
||||
vec_full_reg_offset(s, a->rn),
|
||||
vec_full_reg_offset(s, a->rm),
|
||||
|
@ -3915,7 +3915,7 @@ static bool do_zpzz_fp(DisasContext *s, arg_rprr_esz *a,
|
|||
if (sve_access_check(s)) {
|
||||
TCGContext *tcg_ctx = s->uc->tcg_ctx;
|
||||
unsigned vsz = vec_full_reg_size(s);
|
||||
TCGv_ptr status = get_fpstatus_ptr(s, a->esz == MO_16);
|
||||
TCGv_ptr status = get_fpstatus_ptr(tcg_ctx, a->esz == MO_16);
|
||||
tcg_gen_gvec_4_ptr(tcg_ctx, vec_full_reg_offset(s, a->rd),
|
||||
vec_full_reg_offset(s, a->rn),
|
||||
vec_full_reg_offset(s, a->rm),
|
||||
|
@ -3968,7 +3968,7 @@ static void do_fp_scalar(DisasContext *s, int zd, int zn, int pg, bool is_fp16,
|
|||
tcg_gen_addi_ptr(tcg_ctx, t_zn, tcg_ctx->cpu_env, vec_full_reg_offset(s, zn));
|
||||
tcg_gen_addi_ptr(tcg_ctx, t_pg, tcg_ctx->cpu_env, pred_full_reg_offset(s, pg));
|
||||
|
||||
status = get_fpstatus_ptr(s, is_fp16);
|
||||
status = get_fpstatus_ptr(tcg_ctx, is_fp16);
|
||||
desc = tcg_const_i32(tcg_ctx, simd_desc(vsz, vsz, 0));
|
||||
fn(tcg_ctx, t_zd, t_zn, t_pg, scalar, status, desc);
|
||||
|
||||
|
@ -4034,7 +4034,7 @@ static bool do_fp_cmp(DisasContext *s, arg_rprr_esz *a,
|
|||
if (sve_access_check(s)) {
|
||||
TCGContext *tcg_ctx = s->uc->tcg_ctx;
|
||||
unsigned vsz = vec_full_reg_size(s);
|
||||
TCGv_ptr status = get_fpstatus_ptr(s, a->esz == MO_16);
|
||||
TCGv_ptr status = get_fpstatus_ptr(tcg_ctx, a->esz == MO_16);
|
||||
tcg_gen_gvec_4_ptr(tcg_ctx, pred_full_reg_offset(s, a->rd),
|
||||
vec_full_reg_offset(s, a->rn),
|
||||
vec_full_reg_offset(s, a->rm),
|
||||
|
@ -4079,7 +4079,7 @@ static bool trans_FCADD(DisasContext *s, arg_FCADD *a)
|
|||
if (sve_access_check(s)) {
|
||||
TCGContext *tcg_ctx = s->uc->tcg_ctx;
|
||||
unsigned vsz = vec_full_reg_size(s);
|
||||
TCGv_ptr status = get_fpstatus_ptr(s, a->esz == MO_16);
|
||||
TCGv_ptr status = get_fpstatus_ptr(tcg_ctx, a->esz == MO_16);
|
||||
tcg_gen_gvec_4_ptr(tcg_ctx, vec_full_reg_offset(s, a->rd),
|
||||
vec_full_reg_offset(s, a->rn),
|
||||
vec_full_reg_offset(s, a->rm),
|
||||
|
@ -4100,7 +4100,7 @@ static bool do_fmla(DisasContext *s, arg_rprrr_esz *a,
|
|||
if (sve_access_check(s)) {
|
||||
TCGContext *tcg_ctx = s->uc->tcg_ctx;
|
||||
unsigned vsz = vec_full_reg_size(s);
|
||||
TCGv_ptr status = get_fpstatus_ptr(s, a->esz == MO_16);
|
||||
TCGv_ptr status = get_fpstatus_ptr(tcg_ctx, a->esz == MO_16);
|
||||
tcg_gen_gvec_5_ptr(tcg_ctx, vec_full_reg_offset(s, a->rd),
|
||||
vec_full_reg_offset(s, a->rn),
|
||||
vec_full_reg_offset(s, a->rm),
|
||||
|
@ -4145,7 +4145,7 @@ static bool trans_FCMLA_zpzzz(DisasContext *s, arg_FCMLA_zpzzz *a)
|
|||
if (sve_access_check(s)) {
|
||||
TCGContext *tcg_ctx = s->uc->tcg_ctx;
|
||||
unsigned vsz = vec_full_reg_size(s);
|
||||
TCGv_ptr status = get_fpstatus_ptr(s, a->esz == MO_16);
|
||||
TCGv_ptr status = get_fpstatus_ptr(tcg_ctx, a->esz == MO_16);
|
||||
tcg_gen_gvec_5_ptr(tcg_ctx, vec_full_reg_offset(s, a->rd),
|
||||
vec_full_reg_offset(s, a->rn),
|
||||
vec_full_reg_offset(s, a->rm),
|
||||
|
@ -4169,7 +4169,7 @@ static bool trans_FCMLA_zzxz(DisasContext *s, arg_FCMLA_zzxz *a)
|
|||
if (sve_access_check(s)) {
|
||||
TCGContext *tcg_ctx = s->uc->tcg_ctx;
|
||||
unsigned vsz = vec_full_reg_size(s);
|
||||
TCGv_ptr status = get_fpstatus_ptr(s, a->esz == MO_16);
|
||||
TCGv_ptr status = get_fpstatus_ptr(tcg_ctx, a->esz == MO_16);
|
||||
tcg_gen_gvec_3_ptr(tcg_ctx, vec_full_reg_offset(s, a->rd),
|
||||
vec_full_reg_offset(s, a->rn),
|
||||
vec_full_reg_offset(s, a->rm),
|
||||
|
@ -4191,7 +4191,7 @@ static bool do_zpz_ptr(DisasContext *s, int rd, int rn, int pg,
|
|||
if (sve_access_check(s)) {
|
||||
TCGContext *tcg_ctx = s->uc->tcg_ctx;
|
||||
unsigned vsz = vec_full_reg_size(s);
|
||||
TCGv_ptr status = get_fpstatus_ptr(s, is_fp16);
|
||||
TCGv_ptr status = get_fpstatus_ptr(tcg_ctx, is_fp16);
|
||||
tcg_gen_gvec_3_ptr(tcg_ctx, vec_full_reg_offset(s, rd),
|
||||
vec_full_reg_offset(s, rn),
|
||||
pred_full_reg_offset(s, pg),
|
||||
|
@ -4338,7 +4338,7 @@ static bool do_frint_mode(DisasContext *s, arg_rpr_esz *a, int mode)
|
|||
TCGContext *tcg_ctx = s->uc->tcg_ctx;
|
||||
unsigned vsz = vec_full_reg_size(s);
|
||||
TCGv_i32 tmode = tcg_const_i32(tcg_ctx, mode);
|
||||
TCGv_ptr status = get_fpstatus_ptr(s, a->esz == MO_16);
|
||||
TCGv_ptr status = get_fpstatus_ptr(tcg_ctx, a->esz == MO_16);
|
||||
|
||||
gen_helper_set_rmode(tcg_ctx, tmode, tmode, status);
|
||||
|
||||
|
|
|
@ -368,7 +368,7 @@ static bool trans_VRINT(DisasContext *s, arg_VRINT *a)
|
|||
return true;
|
||||
}
|
||||
|
||||
fpst = get_fpstatus_ptr(s, 0);
|
||||
fpst = get_fpstatus_ptr(tcg_ctx, 0);
|
||||
|
||||
tcg_rmode = tcg_const_i32(tcg_ctx, arm_rmode_to_sf(rounding));
|
||||
gen_helper_set_rmode(tcg_ctx, tcg_rmode, tcg_rmode, fpst);
|
||||
|
@ -432,7 +432,7 @@ static bool trans_VCVT(DisasContext *s, arg_VCVT *a)
|
|||
return true;
|
||||
}
|
||||
|
||||
fpst = get_fpstatus_ptr(s, 0);
|
||||
fpst = get_fpstatus_ptr(tcg_ctx, 0);
|
||||
|
||||
tcg_shift = tcg_const_i32(tcg_ctx, 0);
|
||||
|
||||
|
@ -1253,7 +1253,7 @@ static bool do_vfp_3op_sp(DisasContext *s, VFPGen3OpSPFn *fn,
|
|||
f0 = tcg_temp_new_i32(tcg_ctx);
|
||||
f1 = tcg_temp_new_i32(tcg_ctx);
|
||||
fd = tcg_temp_new_i32(tcg_ctx);
|
||||
fpst = get_fpstatus_ptr(s, 0);
|
||||
fpst = get_fpstatus_ptr(tcg_ctx, 0);
|
||||
|
||||
neon_load_reg32(s, f0, vn);
|
||||
neon_load_reg32(s, f1, vm);
|
||||
|
@ -1337,7 +1337,7 @@ static bool do_vfp_3op_dp(DisasContext *s, VFPGen3OpDPFn *fn,
|
|||
f0 = tcg_temp_new_i64(tcg_ctx);
|
||||
f1 = tcg_temp_new_i64(tcg_ctx);
|
||||
fd = tcg_temp_new_i64(tcg_ctx);
|
||||
fpst = get_fpstatus_ptr(s, 0);
|
||||
fpst = get_fpstatus_ptr(tcg_ctx, 0);
|
||||
|
||||
neon_load_reg64(s, f0, vn);
|
||||
neon_load_reg64(s, f1, vm);
|
||||
|
@ -1823,7 +1823,7 @@ static bool do_vfm_sp(DisasContext *s, arg_VFMA_sp *a, bool neg_n, bool neg_d)
|
|||
/* VFNMA, VFNMS */
|
||||
gen_helper_vfp_negs(tcg_ctx, vd, vd);
|
||||
}
|
||||
fpst = get_fpstatus_ptr(s, 0);
|
||||
fpst = get_fpstatus_ptr(tcg_ctx, 0);
|
||||
gen_helper_vfp_muladds(tcg_ctx, vd, vn, vm, vd, fpst);
|
||||
neon_store_reg32(s, vd, a->vd);
|
||||
|
||||
|
@ -1915,7 +1915,7 @@ static bool do_vfm_dp(DisasContext *s, arg_VFMA_dp *a, bool neg_n, bool neg_d)
|
|||
/* VFNMA, VFNMS */
|
||||
gen_helper_vfp_negd(tcg_ctx, vd, vd);
|
||||
}
|
||||
fpst = get_fpstatus_ptr(s, 0);
|
||||
fpst = get_fpstatus_ptr(tcg_ctx, 0);
|
||||
gen_helper_vfp_muladdd(tcg_ctx, vd, vn, vm, vd, fpst);
|
||||
neon_store_reg64(s, vd, a->vd);
|
||||
|
||||
|
@ -2204,7 +2204,7 @@ static bool trans_VCVT_f32_f16(DisasContext *s, arg_VCVT_f32_f16 *a)
|
|||
return true;
|
||||
}
|
||||
|
||||
fpst = get_fpstatus_ptr(s, false);
|
||||
fpst = get_fpstatus_ptr(tcg_ctx, false);
|
||||
ahp_mode = get_ahp_flag(s);
|
||||
tmp = tcg_temp_new_i32(tcg_ctx);
|
||||
/* The T bit tells us if we want the low or high 16 bits of Vm */
|
||||
|
@ -2243,7 +2243,7 @@ static bool trans_VCVT_f64_f16(DisasContext *s, arg_VCVT_f64_f16 *a)
|
|||
return true;
|
||||
}
|
||||
|
||||
fpst = get_fpstatus_ptr(s, false);
|
||||
fpst = get_fpstatus_ptr(tcg_ctx, false);
|
||||
ahp_mode = get_ahp_flag(s);
|
||||
tmp = tcg_temp_new_i32(tcg_ctx);
|
||||
/* The T bit tells us if we want the low or high 16 bits of Vm */
|
||||
|
@ -2273,7 +2273,7 @@ static bool trans_VCVT_f16_f32(DisasContext *s, arg_VCVT_f16_f32 *a)
|
|||
return true;
|
||||
}
|
||||
|
||||
fpst = get_fpstatus_ptr(s, false);
|
||||
fpst = get_fpstatus_ptr(tcg_ctx, false);
|
||||
ahp_mode = get_ahp_flag(s);
|
||||
tmp = tcg_temp_new_i32(tcg_ctx);
|
||||
|
||||
|
@ -2311,7 +2311,7 @@ static bool trans_VCVT_f16_f64(DisasContext *s, arg_VCVT_f16_f64 *a)
|
|||
return true;
|
||||
}
|
||||
|
||||
fpst = get_fpstatus_ptr(s, false);
|
||||
fpst = get_fpstatus_ptr(tcg_ctx, false);
|
||||
ahp_mode = get_ahp_flag(s);
|
||||
tmp = tcg_temp_new_i32(tcg_ctx);
|
||||
vm = tcg_temp_new_i64(tcg_ctx);
|
||||
|
@ -2342,7 +2342,7 @@ static bool trans_VRINTR_sp(DisasContext *s, arg_VRINTR_sp *a)
|
|||
|
||||
tmp = tcg_temp_new_i32(tcg_ctx);
|
||||
neon_load_reg32(s, tmp, a->vm);
|
||||
fpst = get_fpstatus_ptr(s, false);
|
||||
fpst = get_fpstatus_ptr(tcg_ctx, false);
|
||||
gen_helper_rints(tcg_ctx, tmp, tmp, fpst);
|
||||
neon_store_reg32(s, tmp, a->vd);
|
||||
tcg_temp_free_ptr(tcg_ctx, fpst);
|
||||
|
@ -2375,7 +2375,7 @@ static bool trans_VRINTR_dp(DisasContext *s, arg_VRINTR_dp *a)
|
|||
|
||||
tmp = tcg_temp_new_i64(tcg_ctx);
|
||||
neon_load_reg64(s, tmp, a->vm);
|
||||
fpst = get_fpstatus_ptr(s, false);
|
||||
fpst = get_fpstatus_ptr(tcg_ctx, false);
|
||||
gen_helper_rintd(tcg_ctx, tmp, tmp, fpst);
|
||||
neon_store_reg64(s, tmp, a->vd);
|
||||
tcg_temp_free_ptr(tcg_ctx, fpst);
|
||||
|
@ -2400,7 +2400,7 @@ static bool trans_VRINTZ_sp(DisasContext *s, arg_VRINTZ_sp *a)
|
|||
|
||||
tmp = tcg_temp_new_i32(tcg_ctx);
|
||||
neon_load_reg32(s, tmp, a->vm);
|
||||
fpst = get_fpstatus_ptr(s, false);
|
||||
fpst = get_fpstatus_ptr(tcg_ctx, false);
|
||||
tcg_rmode = tcg_const_i32(tcg_ctx, float_round_to_zero);
|
||||
gen_helper_set_rmode(tcg_ctx, tcg_rmode, tcg_rmode, fpst);
|
||||
gen_helper_rints(tcg_ctx, tmp, tmp, fpst);
|
||||
|
@ -2438,7 +2438,7 @@ static bool trans_VRINTZ_dp(DisasContext *s, arg_VRINTZ_dp *a)
|
|||
|
||||
tmp = tcg_temp_new_i64(tcg_ctx);
|
||||
neon_load_reg64(s, tmp, a->vm);
|
||||
fpst = get_fpstatus_ptr(s, false);
|
||||
fpst = get_fpstatus_ptr(tcg_ctx, false);
|
||||
tcg_rmode = tcg_const_i32(tcg_ctx, float_round_to_zero);
|
||||
gen_helper_set_rmode(tcg_ctx, tcg_rmode, tcg_rmode, fpst);
|
||||
gen_helper_rintd(tcg_ctx, tmp, tmp, fpst);
|
||||
|
@ -2466,7 +2466,7 @@ static bool trans_VRINTX_sp(DisasContext *s, arg_VRINTX_sp *a)
|
|||
|
||||
tmp = tcg_temp_new_i32(tcg_ctx);
|
||||
neon_load_reg32(s, tmp, a->vm);
|
||||
fpst = get_fpstatus_ptr(s, false);
|
||||
fpst = get_fpstatus_ptr(tcg_ctx, false);
|
||||
gen_helper_rints_exact(tcg_ctx, tmp, tmp, fpst);
|
||||
neon_store_reg32(s, tmp, a->vd);
|
||||
tcg_temp_free_ptr(tcg_ctx, fpst);
|
||||
|
@ -2499,7 +2499,7 @@ static bool trans_VRINTX_dp(DisasContext *s, arg_VRINTX_dp *a)
|
|||
|
||||
tmp = tcg_temp_new_i64(tcg_ctx);
|
||||
neon_load_reg64(s, tmp, a->vm);
|
||||
fpst = get_fpstatus_ptr(s, false);
|
||||
fpst = get_fpstatus_ptr(tcg_ctx, false);
|
||||
gen_helper_rintd_exact(tcg_ctx, tmp, tmp, fpst);
|
||||
neon_store_reg64(s, tmp, a->vd);
|
||||
tcg_temp_free_ptr(tcg_ctx, fpst);
|
||||
|
@ -2581,7 +2581,7 @@ static bool trans_VCVT_int_sp(DisasContext *s, arg_VCVT_int_sp *a)
|
|||
|
||||
vm = tcg_temp_new_i32(tcg_ctx);
|
||||
neon_load_reg32(s, vm, a->vm);
|
||||
fpst = get_fpstatus_ptr(s, false);
|
||||
fpst = get_fpstatus_ptr(tcg_ctx, false);
|
||||
if (a->s) {
|
||||
/* i32 -> f32 */
|
||||
gen_helper_vfp_sitos(tcg_ctx, vm, vm, fpst);
|
||||
|
@ -2618,7 +2618,7 @@ static bool trans_VCVT_int_dp(DisasContext *s, arg_VCVT_int_dp *a)
|
|||
vm = tcg_temp_new_i32(tcg_ctx);
|
||||
vd = tcg_temp_new_i64(tcg_ctx);
|
||||
neon_load_reg32(s, vm, a->vm);
|
||||
fpst = get_fpstatus_ptr(s, false);
|
||||
fpst = get_fpstatus_ptr(tcg_ctx, false);
|
||||
if (a->s) {
|
||||
/* i32 -> f64 */
|
||||
gen_helper_vfp_sitod(tcg_ctx, vd, vm, fpst);
|
||||
|
@ -2686,7 +2686,7 @@ static bool trans_VCVT_fix_sp(DisasContext *s, arg_VCVT_fix_sp *a)
|
|||
vd = tcg_temp_new_i32(tcg_ctx);
|
||||
neon_load_reg32(s, vd, a->vd);
|
||||
|
||||
fpst = get_fpstatus_ptr(s, false);
|
||||
fpst = get_fpstatus_ptr(tcg_ctx, false);
|
||||
shift = tcg_const_i32(tcg_ctx, frac_bits);
|
||||
|
||||
/* Switch on op:U:sx bits */
|
||||
|
@ -2752,7 +2752,7 @@ static bool trans_VCVT_fix_dp(DisasContext *s, arg_VCVT_fix_dp *a)
|
|||
vd = tcg_temp_new_i64(tcg_ctx);
|
||||
neon_load_reg64(s, vd, a->vd);
|
||||
|
||||
fpst = get_fpstatus_ptr(s, false);
|
||||
fpst = get_fpstatus_ptr(tcg_ctx, false);
|
||||
shift = tcg_const_i32(tcg_ctx, frac_bits);
|
||||
|
||||
/* Switch on op:U:sx bits */
|
||||
|
@ -2806,7 +2806,7 @@ static bool trans_VCVT_sp_int(DisasContext *s, arg_VCVT_sp_int *a)
|
|||
return true;
|
||||
}
|
||||
|
||||
fpst = get_fpstatus_ptr(s, false);
|
||||
fpst = get_fpstatus_ptr(tcg_ctx, false);
|
||||
vm = tcg_temp_new_i32(tcg_ctx);
|
||||
neon_load_reg32(s, vm, a->vm);
|
||||
|
||||
|
@ -2849,7 +2849,7 @@ static bool trans_VCVT_dp_int(DisasContext *s, arg_VCVT_dp_int *a)
|
|||
return true;
|
||||
}
|
||||
|
||||
fpst = get_fpstatus_ptr(s, false);
|
||||
fpst = get_fpstatus_ptr(tcg_ctx, false);
|
||||
vm = tcg_temp_new_i64(tcg_ctx);
|
||||
vd = tcg_temp_new_i32(tcg_ctx);
|
||||
neon_load_reg64(s, vm, a->vm);
|
||||
|
|
|
@ -1182,9 +1182,8 @@ static inline void gen_hlt(DisasContext *s, int imm)
|
|||
unallocated_encoding(s);
|
||||
}
|
||||
|
||||
static TCGv_ptr get_fpstatus_ptr(DisasContext *s, int neon)
|
||||
static TCGv_ptr get_fpstatus_ptr(TCGContext *tcg_ctx, int neon)
|
||||
{
|
||||
TCGContext *tcg_ctx = s->uc->tcg_ctx;
|
||||
TCGv_ptr statusptr = tcg_temp_new_ptr(tcg_ctx);
|
||||
int offset;
|
||||
if (neon) {
|
||||
|
@ -5572,6 +5571,9 @@ static int disas_neon_data_insn(DisasContext *s, uint32_t insn)
|
|||
switch (op) {
|
||||
case NEON_3R_FLOAT_ARITH:
|
||||
pairwise = (u && size < 2); /* if VPADD (float) */
|
||||
if (!pairwise) {
|
||||
return 1; /* handled by decodetree */
|
||||
}
|
||||
break;
|
||||
case NEON_3R_FLOAT_MINMAX:
|
||||
pairwise = u; /* if VPMIN/VPMAX (float) */
|
||||
|
@ -5626,18 +5628,11 @@ static int disas_neon_data_insn(DisasContext *s, uint32_t insn)
|
|||
switch (op) {
|
||||
case NEON_3R_FLOAT_ARITH: /* Floating point arithmetic. */
|
||||
{
|
||||
TCGv_ptr fpstatus = get_fpstatus_ptr(s, 1);
|
||||
TCGv_ptr fpstatus = get_fpstatus_ptr(tcg_ctx, 1);
|
||||
switch ((u << 2) | size) {
|
||||
case 0: /* VADD */
|
||||
case 4: /* VPADD */
|
||||
gen_helper_vfp_adds(tcg_ctx, tmp, tmp, tmp2, fpstatus);
|
||||
break;
|
||||
case 2: /* VSUB */
|
||||
gen_helper_vfp_subs(tcg_ctx, tmp, tmp, tmp2, fpstatus);
|
||||
break;
|
||||
case 6: /* VABD */
|
||||
gen_helper_neon_abd_f32(tcg_ctx, tmp, tmp, tmp2, fpstatus);
|
||||
break;
|
||||
default:
|
||||
abort();
|
||||
}
|
||||
|
@ -5646,7 +5641,7 @@ static int disas_neon_data_insn(DisasContext *s, uint32_t insn)
|
|||
}
|
||||
case NEON_3R_FLOAT_MULTIPLY:
|
||||
{
|
||||
TCGv_ptr fpstatus = get_fpstatus_ptr(s, 1);
|
||||
TCGv_ptr fpstatus = get_fpstatus_ptr(tcg_ctx, 1);
|
||||
gen_helper_vfp_muls(tcg_ctx, tmp, tmp, tmp2, fpstatus);
|
||||
if (!u) {
|
||||
tcg_temp_free_i32(tcg_ctx, tmp2);
|
||||
|
@ -5662,7 +5657,7 @@ static int disas_neon_data_insn(DisasContext *s, uint32_t insn)
|
|||
}
|
||||
case NEON_3R_FLOAT_CMP:
|
||||
{
|
||||
TCGv_ptr fpstatus = get_fpstatus_ptr(s, 1);
|
||||
TCGv_ptr fpstatus = get_fpstatus_ptr(tcg_ctx, 1);
|
||||
if (!u) {
|
||||
gen_helper_neon_ceq_f32(tcg_ctx, tmp, tmp, tmp2, fpstatus);
|
||||
} else {
|
||||
|
@ -5677,7 +5672,7 @@ static int disas_neon_data_insn(DisasContext *s, uint32_t insn)
|
|||
}
|
||||
case NEON_3R_FLOAT_ACMP:
|
||||
{
|
||||
TCGv_ptr fpstatus = get_fpstatus_ptr(s, 1);
|
||||
TCGv_ptr fpstatus = get_fpstatus_ptr(tcg_ctx, 1);
|
||||
if (size == 0) {
|
||||
gen_helper_neon_acge_f32(tcg_ctx, tmp, tmp, tmp2, fpstatus);
|
||||
} else {
|
||||
|
@ -5688,7 +5683,7 @@ static int disas_neon_data_insn(DisasContext *s, uint32_t insn)
|
|||
}
|
||||
case NEON_3R_FLOAT_MINMAX:
|
||||
{
|
||||
TCGv_ptr fpstatus = get_fpstatus_ptr(s, 1);
|
||||
TCGv_ptr fpstatus = get_fpstatus_ptr(tcg_ctx, 1);
|
||||
if (size == 0) {
|
||||
gen_helper_vfp_maxs(tcg_ctx, tmp, tmp, tmp2, fpstatus);
|
||||
} else {
|
||||
|
@ -5700,7 +5695,7 @@ static int disas_neon_data_insn(DisasContext *s, uint32_t insn)
|
|||
case NEON_3R_FLOAT_MISC:
|
||||
if (u) {
|
||||
/* VMAXNM/VMINNM */
|
||||
TCGv_ptr fpstatus = get_fpstatus_ptr(s, 1);
|
||||
TCGv_ptr fpstatus = get_fpstatus_ptr(tcg_ctx, 1);
|
||||
if (size == 0) {
|
||||
gen_helper_vfp_maxnums(tcg_ctx, tmp, tmp, tmp2, fpstatus);
|
||||
} else {
|
||||
|
@ -5718,7 +5713,7 @@ static int disas_neon_data_insn(DisasContext *s, uint32_t insn)
|
|||
case NEON_3R_VFM_VQRDMLSH:
|
||||
{
|
||||
/* VFMA, VFMS: fused multiply-add */
|
||||
TCGv_ptr fpstatus = get_fpstatus_ptr(s, 1);
|
||||
TCGv_ptr fpstatus = get_fpstatus_ptr(tcg_ctx, 1);
|
||||
TCGv_i32 tmp3 = neon_load_reg(s, rd, pass);
|
||||
if (size) {
|
||||
/* VFMS */
|
||||
|
@ -6070,7 +6065,7 @@ static int disas_neon_data_insn(DisasContext *s, uint32_t insn)
|
|||
* hence this 32-shift where the ARM ARM has 64-imm6.
|
||||
*/
|
||||
shift = 32 - shift;
|
||||
fpst = get_fpstatus_ptr(s, 1);
|
||||
fpst = get_fpstatus_ptr(tcg_ctx, 1);
|
||||
shiftv = tcg_const_i32(tcg_ctx, shift);
|
||||
for (pass = 0; pass < (q ? 4 : 2); pass++) {
|
||||
TCGv_i32 tmpf = neon_load_reg(s, rm, pass);
|
||||
|
@ -6431,7 +6426,7 @@ static int disas_neon_data_insn(DisasContext *s, uint32_t insn)
|
|||
gen_helper_neon_qrdmulh_s32(tcg_ctx, tmp, tcg_ctx->cpu_env, tmp, tmp2);
|
||||
}
|
||||
} else if (op & 1) {
|
||||
TCGv_ptr fpstatus = get_fpstatus_ptr(s, 1);
|
||||
TCGv_ptr fpstatus = get_fpstatus_ptr(tcg_ctx, 1);
|
||||
gen_helper_vfp_muls(tcg_ctx, tmp, tmp, tmp2, fpstatus);
|
||||
tcg_temp_free_ptr(tcg_ctx, fpstatus);
|
||||
} else {
|
||||
|
@ -6452,7 +6447,7 @@ static int disas_neon_data_insn(DisasContext *s, uint32_t insn)
|
|||
break;
|
||||
case 1:
|
||||
{
|
||||
TCGv_ptr fpstatus = get_fpstatus_ptr(s, 1);
|
||||
TCGv_ptr fpstatus = get_fpstatus_ptr(tcg_ctx, 1);
|
||||
gen_helper_vfp_adds(tcg_ctx, tmp, tmp, tmp2, fpstatus);
|
||||
tcg_temp_free_ptr(tcg_ctx, fpstatus);
|
||||
break;
|
||||
|
@ -6462,7 +6457,7 @@ static int disas_neon_data_insn(DisasContext *s, uint32_t insn)
|
|||
break;
|
||||
case 5:
|
||||
{
|
||||
TCGv_ptr fpstatus = get_fpstatus_ptr(s, 1);
|
||||
TCGv_ptr fpstatus = get_fpstatus_ptr(tcg_ctx, 1);
|
||||
gen_helper_vfp_subs(tcg_ctx, tmp, tmp2, tmp, fpstatus);
|
||||
tcg_temp_free_ptr(tcg_ctx, fpstatus);
|
||||
break;
|
||||
|
@ -6754,7 +6749,7 @@ static int disas_neon_data_insn(DisasContext *s, uint32_t insn)
|
|||
q || (rm & 1)) {
|
||||
return 1;
|
||||
}
|
||||
fpst = get_fpstatus_ptr(s, true);
|
||||
fpst = get_fpstatus_ptr(tcg_ctx, true);
|
||||
ahp = get_ahp_flag(s);
|
||||
tmp = neon_load_reg(s, rm, 0);
|
||||
gen_helper_vfp_fcvt_f32_to_f16(tcg_ctx, tmp, tmp, fpst, ahp);
|
||||
|
@ -6784,7 +6779,7 @@ static int disas_neon_data_insn(DisasContext *s, uint32_t insn)
|
|||
q || (rd & 1)) {
|
||||
return 1;
|
||||
}
|
||||
fpst = get_fpstatus_ptr(s, true);
|
||||
fpst = get_fpstatus_ptr(tcg_ctx, true);
|
||||
ahp = get_ahp_flag(s);
|
||||
tmp3 = tcg_temp_new_i32(tcg_ctx);
|
||||
tmp = neon_load_reg(s, rm, 0);
|
||||
|
@ -6952,7 +6947,7 @@ static int disas_neon_data_insn(DisasContext *s, uint32_t insn)
|
|||
break;
|
||||
case NEON_2RM_VCGT0_F:
|
||||
{
|
||||
TCGv_ptr fpstatus = get_fpstatus_ptr(s, 1);
|
||||
TCGv_ptr fpstatus = get_fpstatus_ptr(tcg_ctx, 1);
|
||||
tmp2 = tcg_const_i32(tcg_ctx, 0);
|
||||
gen_helper_neon_cgt_f32(tcg_ctx, tmp, tmp, tmp2, fpstatus);
|
||||
tcg_temp_free_i32(tcg_ctx, tmp2);
|
||||
|
@ -6961,7 +6956,7 @@ static int disas_neon_data_insn(DisasContext *s, uint32_t insn)
|
|||
}
|
||||
case NEON_2RM_VCGE0_F:
|
||||
{
|
||||
TCGv_ptr fpstatus = get_fpstatus_ptr(s, 1);
|
||||
TCGv_ptr fpstatus = get_fpstatus_ptr(tcg_ctx, 1);
|
||||
tmp2 = tcg_const_i32(tcg_ctx, 0);
|
||||
gen_helper_neon_cge_f32(tcg_ctx, tmp, tmp, tmp2, fpstatus);
|
||||
tcg_temp_free_i32(tcg_ctx, tmp2);
|
||||
|
@ -6970,7 +6965,7 @@ static int disas_neon_data_insn(DisasContext *s, uint32_t insn)
|
|||
}
|
||||
case NEON_2RM_VCEQ0_F:
|
||||
{
|
||||
TCGv_ptr fpstatus = get_fpstatus_ptr(s, 1);
|
||||
TCGv_ptr fpstatus = get_fpstatus_ptr(tcg_ctx, 1);
|
||||
tmp2 = tcg_const_i32(tcg_ctx, 0);
|
||||
gen_helper_neon_ceq_f32(tcg_ctx, tmp, tmp, tmp2, fpstatus);
|
||||
tcg_temp_free_i32(tcg_ctx, tmp2);
|
||||
|
@ -6979,7 +6974,7 @@ static int disas_neon_data_insn(DisasContext *s, uint32_t insn)
|
|||
}
|
||||
case NEON_2RM_VCLE0_F:
|
||||
{
|
||||
TCGv_ptr fpstatus = get_fpstatus_ptr(s, 1);
|
||||
TCGv_ptr fpstatus = get_fpstatus_ptr(tcg_ctx, 1);
|
||||
tmp2 = tcg_const_i32(tcg_ctx, 0);
|
||||
gen_helper_neon_cge_f32(tcg_ctx, tmp, tmp2, tmp, fpstatus);
|
||||
tcg_temp_free_i32(tcg_ctx, tmp2);
|
||||
|
@ -6988,7 +6983,7 @@ static int disas_neon_data_insn(DisasContext *s, uint32_t insn)
|
|||
}
|
||||
case NEON_2RM_VCLT0_F:
|
||||
{
|
||||
TCGv_ptr fpstatus = get_fpstatus_ptr(s, 1);
|
||||
TCGv_ptr fpstatus = get_fpstatus_ptr(tcg_ctx, 1);
|
||||
tmp2 = tcg_const_i32(tcg_ctx, 0);
|
||||
gen_helper_neon_cgt_f32(tcg_ctx, tmp, tmp2, tmp, fpstatus);
|
||||
tcg_temp_free_i32(tcg_ctx, tmp2);
|
||||
|
@ -7021,7 +7016,7 @@ static int disas_neon_data_insn(DisasContext *s, uint32_t insn)
|
|||
case NEON_2RM_VRINTZ:
|
||||
{
|
||||
TCGv_i32 tcg_rmode;
|
||||
TCGv_ptr fpstatus = get_fpstatus_ptr(s, 1);
|
||||
TCGv_ptr fpstatus = get_fpstatus_ptr(tcg_ctx, 1);
|
||||
int rmode;
|
||||
|
||||
if (op == NEON_2RM_VRINTZ) {
|
||||
|
@ -7042,7 +7037,7 @@ static int disas_neon_data_insn(DisasContext *s, uint32_t insn)
|
|||
}
|
||||
case NEON_2RM_VRINTX:
|
||||
{
|
||||
TCGv_ptr fpstatus = get_fpstatus_ptr(s, 1);
|
||||
TCGv_ptr fpstatus = get_fpstatus_ptr(tcg_ctx, 1);
|
||||
gen_helper_rints_exact(tcg_ctx, tmp, tmp, fpstatus);
|
||||
tcg_temp_free_ptr(tcg_ctx, fpstatus);
|
||||
break;
|
||||
|
@ -7057,7 +7052,7 @@ static int disas_neon_data_insn(DisasContext *s, uint32_t insn)
|
|||
case NEON_2RM_VCVTMS:
|
||||
{
|
||||
bool is_signed = !extract32(insn, 7, 1);
|
||||
TCGv_ptr fpst = get_fpstatus_ptr(s, 1);
|
||||
TCGv_ptr fpst = get_fpstatus_ptr(tcg_ctx, 1);
|
||||
TCGv_i32 tcg_rmode, tcg_shift;
|
||||
int rmode = fp_decode_rm[extract32(insn, 8, 2)];
|
||||
|
||||
|
@ -7089,42 +7084,42 @@ static int disas_neon_data_insn(DisasContext *s, uint32_t insn)
|
|||
break;
|
||||
case NEON_2RM_VRECPE_F:
|
||||
{
|
||||
TCGv_ptr fpstatus = get_fpstatus_ptr(s, 1);
|
||||
TCGv_ptr fpstatus = get_fpstatus_ptr(tcg_ctx, 1);
|
||||
gen_helper_recpe_f32(tcg_ctx, tmp, tmp, fpstatus);
|
||||
tcg_temp_free_ptr(tcg_ctx, fpstatus);
|
||||
break;
|
||||
}
|
||||
case NEON_2RM_VRSQRTE_F:
|
||||
{
|
||||
TCGv_ptr fpstatus = get_fpstatus_ptr(s, 1);
|
||||
TCGv_ptr fpstatus = get_fpstatus_ptr(tcg_ctx, 1);
|
||||
gen_helper_rsqrte_f32(tcg_ctx, tmp, tmp, fpstatus);
|
||||
tcg_temp_free_ptr(tcg_ctx, fpstatus);
|
||||
break;
|
||||
}
|
||||
case NEON_2RM_VCVT_FS: /* VCVT.F32.S32 */
|
||||
{
|
||||
TCGv_ptr fpstatus = get_fpstatus_ptr(s, 1);
|
||||
TCGv_ptr fpstatus = get_fpstatus_ptr(tcg_ctx, 1);
|
||||
gen_helper_vfp_sitos(tcg_ctx, tmp, tmp, fpstatus);
|
||||
tcg_temp_free_ptr(tcg_ctx, fpstatus);
|
||||
break;
|
||||
}
|
||||
case NEON_2RM_VCVT_FU: /* VCVT.F32.U32 */
|
||||
{
|
||||
TCGv_ptr fpstatus = get_fpstatus_ptr(s, 1);
|
||||
TCGv_ptr fpstatus = get_fpstatus_ptr(tcg_ctx, 1);
|
||||
gen_helper_vfp_uitos(tcg_ctx, tmp, tmp, fpstatus);
|
||||
tcg_temp_free_ptr(tcg_ctx, fpstatus);
|
||||
break;
|
||||
}
|
||||
case NEON_2RM_VCVT_SF: /* VCVT.S32.F32 */
|
||||
{
|
||||
TCGv_ptr fpstatus = get_fpstatus_ptr(s, 1);
|
||||
TCGv_ptr fpstatus = get_fpstatus_ptr(tcg_ctx, 1);
|
||||
gen_helper_vfp_tosizs(tcg_ctx, tmp, tmp, fpstatus);
|
||||
tcg_temp_free_ptr(tcg_ctx, fpstatus);
|
||||
break;
|
||||
}
|
||||
case NEON_2RM_VCVT_UF: /* VCVT.U32.F32 */
|
||||
{
|
||||
TCGv_ptr fpstatus = get_fpstatus_ptr(s, 1);
|
||||
TCGv_ptr fpstatus = get_fpstatus_ptr(tcg_ctx, 1);
|
||||
gen_helper_vfp_touizs(tcg_ctx, tmp, tmp, fpstatus);
|
||||
tcg_temp_free_ptr(tcg_ctx, fpstatus);
|
||||
break;
|
||||
|
|
|
@ -692,6 +692,11 @@ static float64 float64_ftsmul(float64 op1, uint64_t op2, float_status *stat)
|
|||
return result;
|
||||
}
|
||||
|
||||
static float32 float32_abd(float32 op1, float32 op2, float_status *stat)
|
||||
{
|
||||
return float32_abs(float32_sub(op1, op2, stat));
|
||||
}
|
||||
|
||||
#define DO_3OP(NAME, FUNC, TYPE) \
|
||||
void HELPER(NAME)(void *vd, void *vn, void *vm, void *stat, uint32_t desc) \
|
||||
{ \
|
||||
|
@ -719,6 +724,8 @@ DO_3OP(gvec_ftsmul_h, float16_ftsmul, float16)
|
|||
DO_3OP(gvec_ftsmul_s, float32_ftsmul, float32)
|
||||
DO_3OP(gvec_ftsmul_d, float64_ftsmul, float64)
|
||||
|
||||
DO_3OP(gvec_fabd_s, float32_abd, float32)
|
||||
|
||||
#ifdef TARGET_AARCH64
|
||||
|
||||
DO_3OP(gvec_recps_h, helper_recpsf_f16, float16)
|
||||
|
|
|
@ -1152,6 +1152,7 @@
|
|||
#define helper_gvec_eq32 helper_gvec_eq32_x86_64
|
||||
#define helper_gvec_eq64 helper_gvec_eq64_x86_64
|
||||
#define helper_gvec_eqv helper_gvec_eqv_x86_64
|
||||
#define helper_gvec_fabd_s helper_gvec_fabd_s_x86_64
|
||||
#define helper_gvec_fadd_d helper_gvec_fadd_d_x86_64
|
||||
#define helper_gvec_fadd_h helper_gvec_fadd_h_x86_64
|
||||
#define helper_gvec_fadd_s helper_gvec_fadd_s_x86_64
|
||||
|
@ -1466,7 +1467,6 @@
|
|||
#define helper_msa_st_h helper_msa_st_h_x86_64
|
||||
#define helper_msa_st_w helper_msa_st_w_x86_64
|
||||
#define helper_msr_banked helper_msr_banked_x86_64
|
||||
#define helper_neon_abd_f32 helper_neon_abd_f32_x86_64
|
||||
#define helper_neon_abdl_s16 helper_neon_abdl_s16_x86_64
|
||||
#define helper_neon_abdl_s32 helper_neon_abdl_s32_x86_64
|
||||
#define helper_neon_abdl_s64 helper_neon_abdl_s64_x86_64
|
||||
|
|
Loading…
Reference in a new issue