mirror of
https://github.com/yuzu-emu/unicorn.git
synced 2025-02-01 23:21:08 +00:00
target-mips: Misaligned memory accesses for MSA
MIPS SIMD Architecture vector loads and stores require misalignment support. MSA Memory access should work as an atomic operation. Therefore, it has to check validity of all addresses for a vector store access if it is spanning into two pages. Separating helper functions for each data format as format is known in translation. To use mmu_idx from cpu_mmu_index() instead of calculating it from hflag. Removing save_cpu_state() call in translation because it is able to use cpu_restore_state() on fault as GETRA() is passed. Backports commit adc370a48fd26b92188fa4848dfb088578b1936c from qemu
This commit is contained in:
parent
6d0766f246
commit
922d30c448
|
@ -382,6 +382,7 @@
|
|||
#define _edata _edata_aarch64
|
||||
#define _end _end_aarch64
|
||||
#define end_list end_list_aarch64
|
||||
#define ensure_writable_pages ensure_writable_pages_aarch64
|
||||
#define eq128 eq128_aarch64
|
||||
#define ErrorClass_lookup ErrorClass_lookup_aarch64
|
||||
#define error_copy error_copy_aarch64
|
||||
|
@ -1533,6 +1534,14 @@
|
|||
#define helper_le_stl_mmu helper_le_stl_mmu_aarch64
|
||||
#define helper_le_stq_mmu helper_le_stq_mmu_aarch64
|
||||
#define helper_le_stw_mmu helper_le_stw_mmu_aarch64
|
||||
#define helper_msa_ld_b helper_msa_ld_b_aarch64
|
||||
#define helper_msa_ld_d helper_msa_ld_d_aarch64
|
||||
#define helper_msa_ld_h helper_msa_ld_h_aarch64
|
||||
#define helper_msa_ld_w helper_msa_ld_w_aarch64
|
||||
#define helper_msa_st_b helper_msa_st_b_aarch64
|
||||
#define helper_msa_st_d helper_msa_st_d_aarch64
|
||||
#define helper_msa_st_h helper_msa_st_h_aarch64
|
||||
#define helper_msa_st_w helper_msa_st_w_aarch64
|
||||
#define helper_msr_i_pstate helper_msr_i_pstate_aarch64
|
||||
#define helper_neon_abd_f32 helper_neon_abd_f32_aarch64
|
||||
#define helper_neon_abdl_s16 helper_neon_abdl_s16_aarch64
|
||||
|
|
|
@ -382,6 +382,7 @@
|
|||
#define _edata _edata_aarch64eb
|
||||
#define _end _end_aarch64eb
|
||||
#define end_list end_list_aarch64eb
|
||||
#define ensure_writable_pages ensure_writable_pages_aarch64eb
|
||||
#define eq128 eq128_aarch64eb
|
||||
#define ErrorClass_lookup ErrorClass_lookup_aarch64eb
|
||||
#define error_copy error_copy_aarch64eb
|
||||
|
@ -1533,6 +1534,14 @@
|
|||
#define helper_le_stl_mmu helper_le_stl_mmu_aarch64eb
|
||||
#define helper_le_stq_mmu helper_le_stq_mmu_aarch64eb
|
||||
#define helper_le_stw_mmu helper_le_stw_mmu_aarch64eb
|
||||
#define helper_msa_ld_b helper_msa_ld_b_aarch64eb
|
||||
#define helper_msa_ld_d helper_msa_ld_d_aarch64eb
|
||||
#define helper_msa_ld_h helper_msa_ld_h_aarch64eb
|
||||
#define helper_msa_ld_w helper_msa_ld_w_aarch64eb
|
||||
#define helper_msa_st_b helper_msa_st_b_aarch64eb
|
||||
#define helper_msa_st_d helper_msa_st_d_aarch64eb
|
||||
#define helper_msa_st_h helper_msa_st_h_aarch64eb
|
||||
#define helper_msa_st_w helper_msa_st_w_aarch64eb
|
||||
#define helper_msr_i_pstate helper_msr_i_pstate_aarch64eb
|
||||
#define helper_neon_abd_f32 helper_neon_abd_f32_aarch64eb
|
||||
#define helper_neon_abdl_s16 helper_neon_abdl_s16_aarch64eb
|
||||
|
|
|
@ -382,6 +382,7 @@
|
|||
#define _edata _edata_arm
|
||||
#define _end _end_arm
|
||||
#define end_list end_list_arm
|
||||
#define ensure_writable_pages ensure_writable_pages_arm
|
||||
#define eq128 eq128_arm
|
||||
#define ErrorClass_lookup ErrorClass_lookup_arm
|
||||
#define error_copy error_copy_arm
|
||||
|
@ -1533,6 +1534,14 @@
|
|||
#define helper_le_stl_mmu helper_le_stl_mmu_arm
|
||||
#define helper_le_stq_mmu helper_le_stq_mmu_arm
|
||||
#define helper_le_stw_mmu helper_le_stw_mmu_arm
|
||||
#define helper_msa_ld_b helper_msa_ld_b_arm
|
||||
#define helper_msa_ld_d helper_msa_ld_d_arm
|
||||
#define helper_msa_ld_h helper_msa_ld_h_arm
|
||||
#define helper_msa_ld_w helper_msa_ld_w_arm
|
||||
#define helper_msa_st_b helper_msa_st_b_arm
|
||||
#define helper_msa_st_d helper_msa_st_d_arm
|
||||
#define helper_msa_st_h helper_msa_st_h_arm
|
||||
#define helper_msa_st_w helper_msa_st_w_arm
|
||||
#define helper_msr_i_pstate helper_msr_i_pstate_arm
|
||||
#define helper_neon_abd_f32 helper_neon_abd_f32_arm
|
||||
#define helper_neon_abdl_s16 helper_neon_abdl_s16_arm
|
||||
|
|
|
@ -382,6 +382,7 @@
|
|||
#define _edata _edata_armeb
|
||||
#define _end _end_armeb
|
||||
#define end_list end_list_armeb
|
||||
#define ensure_writable_pages ensure_writable_pages_armeb
|
||||
#define eq128 eq128_armeb
|
||||
#define ErrorClass_lookup ErrorClass_lookup_armeb
|
||||
#define error_copy error_copy_armeb
|
||||
|
@ -1533,6 +1534,14 @@
|
|||
#define helper_le_stl_mmu helper_le_stl_mmu_armeb
|
||||
#define helper_le_stq_mmu helper_le_stq_mmu_armeb
|
||||
#define helper_le_stw_mmu helper_le_stw_mmu_armeb
|
||||
#define helper_msa_ld_b helper_msa_ld_b_armeb
|
||||
#define helper_msa_ld_d helper_msa_ld_d_armeb
|
||||
#define helper_msa_ld_h helper_msa_ld_h_armeb
|
||||
#define helper_msa_ld_w helper_msa_ld_w_armeb
|
||||
#define helper_msa_st_b helper_msa_st_b_armeb
|
||||
#define helper_msa_st_d helper_msa_st_d_armeb
|
||||
#define helper_msa_st_h helper_msa_st_h_armeb
|
||||
#define helper_msa_st_w helper_msa_st_w_armeb
|
||||
#define helper_msr_i_pstate helper_msr_i_pstate_armeb
|
||||
#define helper_neon_abd_f32 helper_neon_abd_f32_armeb
|
||||
#define helper_neon_abdl_s16 helper_neon_abdl_s16_armeb
|
||||
|
|
|
@ -388,6 +388,7 @@ symbols = (
|
|||
'_edata',
|
||||
'_end',
|
||||
'end_list',
|
||||
'ensure_writable_pages',
|
||||
'eq128',
|
||||
'ErrorClass_lookup',
|
||||
'error_copy',
|
||||
|
@ -1539,6 +1540,14 @@ symbols = (
|
|||
'helper_le_stl_mmu',
|
||||
'helper_le_stq_mmu',
|
||||
'helper_le_stw_mmu',
|
||||
'helper_msa_ld_b',
|
||||
'helper_msa_ld_d',
|
||||
'helper_msa_ld_h',
|
||||
'helper_msa_ld_w',
|
||||
'helper_msa_st_b',
|
||||
'helper_msa_st_d',
|
||||
'helper_msa_st_h',
|
||||
'helper_msa_st_w',
|
||||
'helper_msr_i_pstate',
|
||||
'helper_neon_abd_f32',
|
||||
'helper_neon_abdl_s16',
|
||||
|
|
|
@ -382,6 +382,7 @@
|
|||
#define _edata _edata_m68k
|
||||
#define _end _end_m68k
|
||||
#define end_list end_list_m68k
|
||||
#define ensure_writable_pages ensure_writable_pages_m68k
|
||||
#define eq128 eq128_m68k
|
||||
#define ErrorClass_lookup ErrorClass_lookup_m68k
|
||||
#define error_copy error_copy_m68k
|
||||
|
@ -1533,6 +1534,14 @@
|
|||
#define helper_le_stl_mmu helper_le_stl_mmu_m68k
|
||||
#define helper_le_stq_mmu helper_le_stq_mmu_m68k
|
||||
#define helper_le_stw_mmu helper_le_stw_mmu_m68k
|
||||
#define helper_msa_ld_b helper_msa_ld_b_m68k
|
||||
#define helper_msa_ld_d helper_msa_ld_d_m68k
|
||||
#define helper_msa_ld_h helper_msa_ld_h_m68k
|
||||
#define helper_msa_ld_w helper_msa_ld_w_m68k
|
||||
#define helper_msa_st_b helper_msa_st_b_m68k
|
||||
#define helper_msa_st_d helper_msa_st_d_m68k
|
||||
#define helper_msa_st_h helper_msa_st_h_m68k
|
||||
#define helper_msa_st_w helper_msa_st_w_m68k
|
||||
#define helper_msr_i_pstate helper_msr_i_pstate_m68k
|
||||
#define helper_neon_abd_f32 helper_neon_abd_f32_m68k
|
||||
#define helper_neon_abdl_s16 helper_neon_abdl_s16_m68k
|
||||
|
|
|
@ -382,6 +382,7 @@
|
|||
#define _edata _edata_mips
|
||||
#define _end _end_mips
|
||||
#define end_list end_list_mips
|
||||
#define ensure_writable_pages ensure_writable_pages_mips
|
||||
#define eq128 eq128_mips
|
||||
#define ErrorClass_lookup ErrorClass_lookup_mips
|
||||
#define error_copy error_copy_mips
|
||||
|
@ -1533,6 +1534,14 @@
|
|||
#define helper_le_stl_mmu helper_le_stl_mmu_mips
|
||||
#define helper_le_stq_mmu helper_le_stq_mmu_mips
|
||||
#define helper_le_stw_mmu helper_le_stw_mmu_mips
|
||||
#define helper_msa_ld_b helper_msa_ld_b_mips
|
||||
#define helper_msa_ld_d helper_msa_ld_d_mips
|
||||
#define helper_msa_ld_h helper_msa_ld_h_mips
|
||||
#define helper_msa_ld_w helper_msa_ld_w_mips
|
||||
#define helper_msa_st_b helper_msa_st_b_mips
|
||||
#define helper_msa_st_d helper_msa_st_d_mips
|
||||
#define helper_msa_st_h helper_msa_st_h_mips
|
||||
#define helper_msa_st_w helper_msa_st_w_mips
|
||||
#define helper_msr_i_pstate helper_msr_i_pstate_mips
|
||||
#define helper_neon_abd_f32 helper_neon_abd_f32_mips
|
||||
#define helper_neon_abdl_s16 helper_neon_abdl_s16_mips
|
||||
|
|
|
@ -382,6 +382,7 @@
|
|||
#define _edata _edata_mips64
|
||||
#define _end _end_mips64
|
||||
#define end_list end_list_mips64
|
||||
#define ensure_writable_pages ensure_writable_pages_mips64
|
||||
#define eq128 eq128_mips64
|
||||
#define ErrorClass_lookup ErrorClass_lookup_mips64
|
||||
#define error_copy error_copy_mips64
|
||||
|
@ -1533,6 +1534,14 @@
|
|||
#define helper_le_stl_mmu helper_le_stl_mmu_mips64
|
||||
#define helper_le_stq_mmu helper_le_stq_mmu_mips64
|
||||
#define helper_le_stw_mmu helper_le_stw_mmu_mips64
|
||||
#define helper_msa_ld_b helper_msa_ld_b_mips64
|
||||
#define helper_msa_ld_d helper_msa_ld_d_mips64
|
||||
#define helper_msa_ld_h helper_msa_ld_h_mips64
|
||||
#define helper_msa_ld_w helper_msa_ld_w_mips64
|
||||
#define helper_msa_st_b helper_msa_st_b_mips64
|
||||
#define helper_msa_st_d helper_msa_st_d_mips64
|
||||
#define helper_msa_st_h helper_msa_st_h_mips64
|
||||
#define helper_msa_st_w helper_msa_st_w_mips64
|
||||
#define helper_msr_i_pstate helper_msr_i_pstate_mips64
|
||||
#define helper_neon_abd_f32 helper_neon_abd_f32_mips64
|
||||
#define helper_neon_abdl_s16 helper_neon_abdl_s16_mips64
|
||||
|
|
|
@ -382,6 +382,7 @@
|
|||
#define _edata _edata_mips64el
|
||||
#define _end _end_mips64el
|
||||
#define end_list end_list_mips64el
|
||||
#define ensure_writable_pages ensure_writable_pages_mips64el
|
||||
#define eq128 eq128_mips64el
|
||||
#define ErrorClass_lookup ErrorClass_lookup_mips64el
|
||||
#define error_copy error_copy_mips64el
|
||||
|
@ -1533,6 +1534,14 @@
|
|||
#define helper_le_stl_mmu helper_le_stl_mmu_mips64el
|
||||
#define helper_le_stq_mmu helper_le_stq_mmu_mips64el
|
||||
#define helper_le_stw_mmu helper_le_stw_mmu_mips64el
|
||||
#define helper_msa_ld_b helper_msa_ld_b_mips64el
|
||||
#define helper_msa_ld_d helper_msa_ld_d_mips64el
|
||||
#define helper_msa_ld_h helper_msa_ld_h_mips64el
|
||||
#define helper_msa_ld_w helper_msa_ld_w_mips64el
|
||||
#define helper_msa_st_b helper_msa_st_b_mips64el
|
||||
#define helper_msa_st_d helper_msa_st_d_mips64el
|
||||
#define helper_msa_st_h helper_msa_st_h_mips64el
|
||||
#define helper_msa_st_w helper_msa_st_w_mips64el
|
||||
#define helper_msr_i_pstate helper_msr_i_pstate_mips64el
|
||||
#define helper_neon_abd_f32 helper_neon_abd_f32_mips64el
|
||||
#define helper_neon_abdl_s16 helper_neon_abdl_s16_mips64el
|
||||
|
|
|
@ -382,6 +382,7 @@
|
|||
#define _edata _edata_mipsel
|
||||
#define _end _end_mipsel
|
||||
#define end_list end_list_mipsel
|
||||
#define ensure_writable_pages ensure_writable_pages_mipsel
|
||||
#define eq128 eq128_mipsel
|
||||
#define ErrorClass_lookup ErrorClass_lookup_mipsel
|
||||
#define error_copy error_copy_mipsel
|
||||
|
@ -1533,6 +1534,14 @@
|
|||
#define helper_le_stl_mmu helper_le_stl_mmu_mipsel
|
||||
#define helper_le_stq_mmu helper_le_stq_mmu_mipsel
|
||||
#define helper_le_stw_mmu helper_le_stw_mmu_mipsel
|
||||
#define helper_msa_ld_b helper_msa_ld_b_mipsel
|
||||
#define helper_msa_ld_d helper_msa_ld_d_mipsel
|
||||
#define helper_msa_ld_h helper_msa_ld_h_mipsel
|
||||
#define helper_msa_ld_w helper_msa_ld_w_mipsel
|
||||
#define helper_msa_st_b helper_msa_st_b_mipsel
|
||||
#define helper_msa_st_d helper_msa_st_d_mipsel
|
||||
#define helper_msa_st_h helper_msa_st_h_mipsel
|
||||
#define helper_msa_st_w helper_msa_st_w_mipsel
|
||||
#define helper_msr_i_pstate helper_msr_i_pstate_mipsel
|
||||
#define helper_neon_abd_f32 helper_neon_abd_f32_mipsel
|
||||
#define helper_neon_abdl_s16 helper_neon_abdl_s16_mipsel
|
||||
|
|
|
@ -382,6 +382,7 @@
|
|||
#define _edata _edata_powerpc
|
||||
#define _end _end_powerpc
|
||||
#define end_list end_list_powerpc
|
||||
#define ensure_writable_pages ensure_writable_pages_powerpc
|
||||
#define eq128 eq128_powerpc
|
||||
#define ErrorClass_lookup ErrorClass_lookup_powerpc
|
||||
#define error_copy error_copy_powerpc
|
||||
|
@ -1533,6 +1534,14 @@
|
|||
#define helper_le_stl_mmu helper_le_stl_mmu_powerpc
|
||||
#define helper_le_stq_mmu helper_le_stq_mmu_powerpc
|
||||
#define helper_le_stw_mmu helper_le_stw_mmu_powerpc
|
||||
#define helper_msa_ld_b helper_msa_ld_b_powerpc
|
||||
#define helper_msa_ld_d helper_msa_ld_d_powerpc
|
||||
#define helper_msa_ld_h helper_msa_ld_h_powerpc
|
||||
#define helper_msa_ld_w helper_msa_ld_w_powerpc
|
||||
#define helper_msa_st_b helper_msa_st_b_powerpc
|
||||
#define helper_msa_st_d helper_msa_st_d_powerpc
|
||||
#define helper_msa_st_h helper_msa_st_h_powerpc
|
||||
#define helper_msa_st_w helper_msa_st_w_powerpc
|
||||
#define helper_msr_i_pstate helper_msr_i_pstate_powerpc
|
||||
#define helper_neon_abd_f32 helper_neon_abd_f32_powerpc
|
||||
#define helper_neon_abdl_s16 helper_neon_abdl_s16_powerpc
|
||||
|
|
|
@ -382,6 +382,7 @@
|
|||
#define _edata _edata_sparc
|
||||
#define _end _end_sparc
|
||||
#define end_list end_list_sparc
|
||||
#define ensure_writable_pages ensure_writable_pages_sparc
|
||||
#define eq128 eq128_sparc
|
||||
#define ErrorClass_lookup ErrorClass_lookup_sparc
|
||||
#define error_copy error_copy_sparc
|
||||
|
@ -1533,6 +1534,14 @@
|
|||
#define helper_le_stl_mmu helper_le_stl_mmu_sparc
|
||||
#define helper_le_stq_mmu helper_le_stq_mmu_sparc
|
||||
#define helper_le_stw_mmu helper_le_stw_mmu_sparc
|
||||
#define helper_msa_ld_b helper_msa_ld_b_sparc
|
||||
#define helper_msa_ld_d helper_msa_ld_d_sparc
|
||||
#define helper_msa_ld_h helper_msa_ld_h_sparc
|
||||
#define helper_msa_ld_w helper_msa_ld_w_sparc
|
||||
#define helper_msa_st_b helper_msa_st_b_sparc
|
||||
#define helper_msa_st_d helper_msa_st_d_sparc
|
||||
#define helper_msa_st_h helper_msa_st_h_sparc
|
||||
#define helper_msa_st_w helper_msa_st_w_sparc
|
||||
#define helper_msr_i_pstate helper_msr_i_pstate_sparc
|
||||
#define helper_neon_abd_f32 helper_neon_abd_f32_sparc
|
||||
#define helper_neon_abdl_s16 helper_neon_abdl_s16_sparc
|
||||
|
|
|
@ -382,6 +382,7 @@
|
|||
#define _edata _edata_sparc64
|
||||
#define _end _end_sparc64
|
||||
#define end_list end_list_sparc64
|
||||
#define ensure_writable_pages ensure_writable_pages_sparc64
|
||||
#define eq128 eq128_sparc64
|
||||
#define ErrorClass_lookup ErrorClass_lookup_sparc64
|
||||
#define error_copy error_copy_sparc64
|
||||
|
@ -1533,6 +1534,14 @@
|
|||
#define helper_le_stl_mmu helper_le_stl_mmu_sparc64
|
||||
#define helper_le_stq_mmu helper_le_stq_mmu_sparc64
|
||||
#define helper_le_stw_mmu helper_le_stw_mmu_sparc64
|
||||
#define helper_msa_ld_b helper_msa_ld_b_sparc64
|
||||
#define helper_msa_ld_d helper_msa_ld_d_sparc64
|
||||
#define helper_msa_ld_h helper_msa_ld_h_sparc64
|
||||
#define helper_msa_ld_w helper_msa_ld_w_sparc64
|
||||
#define helper_msa_st_b helper_msa_st_b_sparc64
|
||||
#define helper_msa_st_d helper_msa_st_d_sparc64
|
||||
#define helper_msa_st_h helper_msa_st_h_sparc64
|
||||
#define helper_msa_st_w helper_msa_st_w_sparc64
|
||||
#define helper_msr_i_pstate helper_msr_i_pstate_sparc64
|
||||
#define helper_neon_abd_f32 helper_neon_abd_f32_sparc64
|
||||
#define helper_neon_abdl_s16 helper_neon_abdl_s16_sparc64
|
||||
|
|
|
@ -933,5 +933,11 @@ DEF_HELPER_4(msa_ftint_u_df, void, env, i32, i32, i32)
|
|||
DEF_HELPER_4(msa_ffint_s_df, void, env, i32, i32, i32)
|
||||
DEF_HELPER_4(msa_ffint_u_df, void, env, i32, i32, i32)
|
||||
|
||||
DEF_HELPER_5(msa_ld_df, void, env, i32, i32, i32, s32)
|
||||
DEF_HELPER_5(msa_st_df, void, env, i32, i32, i32, s32)
|
||||
#define MSALDST_PROTO(type) \
|
||||
DEF_HELPER_3(msa_ld_ ## type, void, env, i32, tl) \
|
||||
DEF_HELPER_3(msa_st_ ## type, void, env, i32, tl)
|
||||
MSALDST_PROTO(b)
|
||||
MSALDST_PROTO(h)
|
||||
MSALDST_PROTO(w)
|
||||
MSALDST_PROTO(d)
|
||||
#undef MSALDST_PROTO
|
||||
|
|
|
@ -89,10 +89,10 @@ static inline type do_##name(CPUMIPSState *env, target_ulong addr, \
|
|||
} \
|
||||
}
|
||||
#endif
|
||||
HELPER_LD(lbu, ldub, uint8_t)
|
||||
HELPER_LD(lhu, lduw, uint16_t)
|
||||
HELPER_LD(lw, ldl, int32_t)
|
||||
#if defined(TARGET_MIPS64)
|
||||
HELPER_LD(ld, ldq, int64_t)
|
||||
#endif
|
||||
#undef HELPER_LD
|
||||
|
||||
#if defined(CONFIG_USER_ONLY)
|
||||
|
@ -117,9 +117,10 @@ static inline void do_##name(CPUMIPSState *env, target_ulong addr, \
|
|||
}
|
||||
#endif
|
||||
HELPER_ST(sb, stb, uint8_t)
|
||||
HELPER_ST(sh, stw, uint16_t)
|
||||
HELPER_ST(sw, stl, uint32_t)
|
||||
#if defined(TARGET_MIPS64)
|
||||
HELPER_ST(sd, stq, uint64_t)
|
||||
#endif
|
||||
#undef HELPER_ST
|
||||
|
||||
target_ulong helper_clo (target_ulong arg1)
|
||||
|
@ -3595,72 +3596,84 @@ FOP_CONDN_S(sne, (float32_lt(fst1, fst0, &env->active_fpu.fp_status)
|
|||
/* Element-by-element access macros */
|
||||
#define DF_ELEMENTS(df) (MSA_WRLEN / DF_BITS(df))
|
||||
|
||||
void helper_msa_ld_df(CPUMIPSState *env, uint32_t df, uint32_t wd, uint32_t rs,
|
||||
int32_t s10)
|
||||
{
|
||||
wr_t *pwd = &(env->active_fpu.fpr[wd].wr);
|
||||
target_ulong addr = env->active_tc.gpr[rs] + (s10 << df);
|
||||
int i;
|
||||
#if !defined(CONFIG_USER_ONLY)
|
||||
#define MEMOP_IDX(DF) \
|
||||
TCGMemOpIdx oi = make_memop_idx(MO_TE | DF | MO_UNALN, \
|
||||
cpu_mmu_index(env));
|
||||
#else
|
||||
#define MEMOP_IDX(DF)
|
||||
#endif
|
||||
|
||||
switch (df) {
|
||||
case DF_BYTE:
|
||||
for (i = 0; i < DF_ELEMENTS(DF_BYTE); i++) {
|
||||
pwd->b[i] = do_lbu(env, addr + (i << DF_BYTE),
|
||||
env->hflags & MIPS_HFLAG_KSU);
|
||||
}
|
||||
break;
|
||||
case DF_HALF:
|
||||
for (i = 0; i < DF_ELEMENTS(DF_HALF); i++) {
|
||||
pwd->h[i] = do_lhu(env, addr + (i << DF_HALF),
|
||||
env->hflags & MIPS_HFLAG_KSU);
|
||||
}
|
||||
break;
|
||||
case DF_WORD:
|
||||
for (i = 0; i < DF_ELEMENTS(DF_WORD); i++) {
|
||||
pwd->w[i] = do_lw(env, addr + (i << DF_WORD),
|
||||
env->hflags & MIPS_HFLAG_KSU);
|
||||
}
|
||||
break;
|
||||
case DF_DOUBLE:
|
||||
for (i = 0; i < DF_ELEMENTS(DF_DOUBLE); i++) {
|
||||
pwd->d[i] = do_ld(env, addr + (i << DF_DOUBLE),
|
||||
env->hflags & MIPS_HFLAG_KSU);
|
||||
}
|
||||
break;
|
||||
}
|
||||
#define MSA_LD_DF(DF, TYPE, LD_INSN, ...) \
|
||||
void helper_msa_ld_ ## TYPE(CPUMIPSState *env, uint32_t wd, \
|
||||
target_ulong addr) \
|
||||
{ \
|
||||
wr_t *pwd = &(env->active_fpu.fpr[wd].wr); \
|
||||
wr_t wx; \
|
||||
int i; \
|
||||
MEMOP_IDX(DF) \
|
||||
for (i = 0; i < DF_ELEMENTS(DF); i++) { \
|
||||
wx.TYPE[i] = LD_INSN(env, addr + (i << DF), ##__VA_ARGS__); \
|
||||
} \
|
||||
memcpy(pwd, &wx, sizeof(wr_t)); \
|
||||
}
|
||||
|
||||
void helper_msa_st_df(CPUMIPSState *env, uint32_t df, uint32_t wd, uint32_t rs,
|
||||
int32_t s10)
|
||||
{
|
||||
wr_t *pwd = &(env->active_fpu.fpr[wd].wr);
|
||||
target_ulong addr = env->active_tc.gpr[rs] + (s10 << df);
|
||||
int i;
|
||||
#define MSA_PAGESPAN(x) \
|
||||
((((x) & ~TARGET_PAGE_MASK) + MSA_WRLEN/8 - 1) >= TARGET_PAGE_SIZE)
|
||||
|
||||
switch (df) {
|
||||
case DF_BYTE:
|
||||
for (i = 0; i < DF_ELEMENTS(DF_BYTE); i++) {
|
||||
do_sb(env, addr + (i << DF_BYTE), pwd->b[i],
|
||||
env->hflags & MIPS_HFLAG_KSU);
|
||||
}
|
||||
break;
|
||||
case DF_HALF:
|
||||
for (i = 0; i < DF_ELEMENTS(DF_HALF); i++) {
|
||||
do_sh(env, addr + (i << DF_HALF), pwd->h[i],
|
||||
env->hflags & MIPS_HFLAG_KSU);
|
||||
}
|
||||
break;
|
||||
case DF_WORD:
|
||||
for (i = 0; i < DF_ELEMENTS(DF_WORD); i++) {
|
||||
do_sw(env, addr + (i << DF_WORD), pwd->w[i],
|
||||
env->hflags & MIPS_HFLAG_KSU);
|
||||
}
|
||||
break;
|
||||
case DF_DOUBLE:
|
||||
for (i = 0; i < DF_ELEMENTS(DF_DOUBLE); i++) {
|
||||
do_sd(env, addr + (i << DF_DOUBLE), pwd->d[i],
|
||||
env->hflags & MIPS_HFLAG_KSU);
|
||||
}
|
||||
break;
|
||||
static inline void ensure_writable_pages(CPUMIPSState *env,
|
||||
target_ulong addr,
|
||||
int mmu_idx,
|
||||
uintptr_t retaddr)
|
||||
{
|
||||
#if !defined(CONFIG_USER_ONLY)
|
||||
target_ulong page_addr;
|
||||
if (unlikely(MSA_PAGESPAN(addr))) {
|
||||
/* first page */
|
||||
// UNICORN: Commented out
|
||||
//probe_write(env, addr, mmu_idx, retaddr);
|
||||
/* second page */
|
||||
page_addr = (addr & TARGET_PAGE_MASK) + TARGET_PAGE_SIZE;
|
||||
//probe_write(env, page_addr, mmu_idx, retaddr);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
#define MSA_ST_DF(DF, TYPE, ST_INSN, ...) \
|
||||
void helper_msa_st_ ## TYPE(CPUMIPSState *env, uint32_t wd, \
|
||||
target_ulong addr) \
|
||||
{ \
|
||||
wr_t *pwd = &(env->active_fpu.fpr[wd].wr); \
|
||||
int mmu_idx = cpu_mmu_index(env); \
|
||||
int i; \
|
||||
MEMOP_IDX(DF) \
|
||||
ensure_writable_pages(env, addr, mmu_idx, GETRA()); \
|
||||
for (i = 0; i < DF_ELEMENTS(DF); i++) { \
|
||||
ST_INSN(env, addr + (i << DF), pwd->TYPE[i], ##__VA_ARGS__); \
|
||||
} \
|
||||
}
|
||||
|
||||
#if !defined(CONFIG_USER_ONLY)
|
||||
MSA_ST_DF(DF_BYTE, b, helper_ret_stb_mmu, oi, GETRA())
|
||||
MSA_ST_DF(DF_HALF, h, helper_ret_stw_mmu, oi, GETRA())
|
||||
MSA_ST_DF(DF_WORD, w, helper_ret_stl_mmu, oi, GETRA())
|
||||
MSA_ST_DF(DF_DOUBLE, d, helper_ret_stq_mmu, oi, GETRA())
|
||||
#else
|
||||
MSA_ST_DF(DF_BYTE, b, cpu_stb_data)
|
||||
MSA_ST_DF(DF_HALF, h, cpu_stw_data)
|
||||
MSA_ST_DF(DF_WORD, w, cpu_stl_data)
|
||||
MSA_ST_DF(DF_DOUBLE, d, cpu_stq_data)
|
||||
#endif
|
||||
|
||||
|
||||
#if !defined(CONFIG_USER_ONLY)
|
||||
MSA_LD_DF(DF_BYTE, b, helper_ret_ldub_mmu, oi, GETRA())
|
||||
MSA_LD_DF(DF_HALF, h, helper_ret_lduw_mmu, oi, GETRA())
|
||||
MSA_LD_DF(DF_WORD, w, helper_ret_ldul_mmu, oi, GETRA())
|
||||
MSA_LD_DF(DF_DOUBLE, d, helper_ret_ldq_mmu, oi, GETRA())
|
||||
#else
|
||||
MSA_LD_DF(DF_BYTE, b, cpu_ldub_data)
|
||||
MSA_LD_DF(DF_HALF, h, cpu_lduw_data)
|
||||
MSA_LD_DF(DF_WORD, w, cpu_ldl_data)
|
||||
MSA_LD_DF(DF_DOUBLE, d, cpu_ldq_data)
|
||||
#endif
|
||||
|
|
|
@ -18577,32 +18577,39 @@ static void gen_msa(CPUMIPSState *env, DisasContext *ctx)
|
|||
uint8_t wd = (ctx->opcode >> 6) & 0x1f;
|
||||
uint8_t df = (ctx->opcode >> 0) & 0x3;
|
||||
|
||||
TCGv_i32 tdf = tcg_const_i32(tcg_ctx, df);
|
||||
TCGv_i32 twd = tcg_const_i32(tcg_ctx, wd);
|
||||
TCGv_i32 trs = tcg_const_i32(tcg_ctx, rs);
|
||||
TCGv_i32 ts10 = tcg_const_i32(tcg_ctx, s10);
|
||||
TCGv taddr = tcg_temp_new(tcg_ctx);
|
||||
gen_base_offset_addr(ctx, taddr, rs, s10 << df);
|
||||
|
||||
switch (MASK_MSA_MINOR(opcode)) {
|
||||
case OPC_LD_B:
|
||||
gen_helper_msa_ld_b(tcg_ctx, tcg_ctx->cpu_env, twd, taddr);
|
||||
break;
|
||||
case OPC_LD_H:
|
||||
gen_helper_msa_ld_h(tcg_ctx, tcg_ctx->cpu_env, twd, taddr);
|
||||
break;
|
||||
case OPC_LD_W:
|
||||
gen_helper_msa_ld_w(tcg_ctx, tcg_ctx->cpu_env, twd, taddr);
|
||||
break;
|
||||
case OPC_LD_D:
|
||||
save_cpu_state(ctx, 1);
|
||||
gen_helper_msa_ld_df(tcg_ctx, tcg_ctx->cpu_env, tdf, twd, trs, ts10);
|
||||
gen_helper_msa_ld_d(tcg_ctx, tcg_ctx->cpu_env, twd, taddr);
|
||||
break;
|
||||
case OPC_ST_B:
|
||||
gen_helper_msa_st_b(tcg_ctx, tcg_ctx->cpu_env, twd, taddr);
|
||||
break;
|
||||
case OPC_ST_H:
|
||||
gen_helper_msa_st_h(tcg_ctx, tcg_ctx->cpu_env, twd, taddr);
|
||||
break;
|
||||
case OPC_ST_W:
|
||||
gen_helper_msa_st_w(tcg_ctx, tcg_ctx->cpu_env, twd, taddr);
|
||||
break;
|
||||
case OPC_ST_D:
|
||||
save_cpu_state(ctx, 1);
|
||||
gen_helper_msa_st_df(tcg_ctx, tcg_ctx->cpu_env, tdf, twd, trs, ts10);
|
||||
gen_helper_msa_st_d(tcg_ctx, tcg_ctx->cpu_env, twd, taddr);
|
||||
break;
|
||||
}
|
||||
|
||||
tcg_temp_free_i32(tcg_ctx, twd);
|
||||
tcg_temp_free_i32(tcg_ctx, tdf);
|
||||
tcg_temp_free_i32(tcg_ctx, trs);
|
||||
tcg_temp_free_i32(tcg_ctx, ts10);
|
||||
tcg_temp_free(tcg_ctx, taddr);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
|
|
|
@ -382,6 +382,7 @@
|
|||
#define _edata _edata_x86_64
|
||||
#define _end _end_x86_64
|
||||
#define end_list end_list_x86_64
|
||||
#define ensure_writable_pages ensure_writable_pages_x86_64
|
||||
#define eq128 eq128_x86_64
|
||||
#define ErrorClass_lookup ErrorClass_lookup_x86_64
|
||||
#define error_copy error_copy_x86_64
|
||||
|
@ -1533,6 +1534,14 @@
|
|||
#define helper_le_stl_mmu helper_le_stl_mmu_x86_64
|
||||
#define helper_le_stq_mmu helper_le_stq_mmu_x86_64
|
||||
#define helper_le_stw_mmu helper_le_stw_mmu_x86_64
|
||||
#define helper_msa_ld_b helper_msa_ld_b_x86_64
|
||||
#define helper_msa_ld_d helper_msa_ld_d_x86_64
|
||||
#define helper_msa_ld_h helper_msa_ld_h_x86_64
|
||||
#define helper_msa_ld_w helper_msa_ld_w_x86_64
|
||||
#define helper_msa_st_b helper_msa_st_b_x86_64
|
||||
#define helper_msa_st_d helper_msa_st_d_x86_64
|
||||
#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_i_pstate helper_msr_i_pstate_x86_64
|
||||
#define helper_neon_abd_f32 helper_neon_abd_f32_x86_64
|
||||
#define helper_neon_abdl_s16 helper_neon_abdl_s16_x86_64
|
||||
|
|
Loading…
Reference in a new issue