mirror of https://gitee.com/openkylin/qemu.git
target/arm: Move some functions used only in translate-neon.inc.c to that file
The functions neon_element_offset(), neon_load_element(), neon_load_element64(), neon_store_element() and neon_store_element64() are used only in the translate-neon.inc.c file, so move their definitions there. Since the .inc.c file is #included in translate.c this doesn't make much difference currently, but it's a more logical place to put the functions and it might be helpful if we ever decide to try to make the .inc.c files genuinely separate compilation units. Signed-off-by: Peter Maydell <peter.maydell@linaro.org> Reviewed-by: Richard Henderson <richard.henderson@linaro.org> Message-id: 20200616170844.13318-22-peter.maydell@linaro.org
This commit is contained in:
parent
d4366190f8
commit
6fb5787898
|
@ -54,6 +54,107 @@ static inline int rsub_8(DisasContext *s, int x)
|
|||
#include "decode-neon-ls.inc.c"
|
||||
#include "decode-neon-shared.inc.c"
|
||||
|
||||
/* Return the offset of a 2**SIZE piece of a NEON register, at index ELE,
|
||||
* where 0 is the least significant end of the register.
|
||||
*/
|
||||
static inline long
|
||||
neon_element_offset(int reg, int element, MemOp size)
|
||||
{
|
||||
int element_size = 1 << size;
|
||||
int ofs = element * element_size;
|
||||
#ifdef HOST_WORDS_BIGENDIAN
|
||||
/* Calculate the offset assuming fully little-endian,
|
||||
* then XOR to account for the order of the 8-byte units.
|
||||
*/
|
||||
if (element_size < 8) {
|
||||
ofs ^= 8 - element_size;
|
||||
}
|
||||
#endif
|
||||
return neon_reg_offset(reg, 0) + ofs;
|
||||
}
|
||||
|
||||
static void neon_load_element(TCGv_i32 var, int reg, int ele, MemOp mop)
|
||||
{
|
||||
long offset = neon_element_offset(reg, ele, mop & MO_SIZE);
|
||||
|
||||
switch (mop) {
|
||||
case MO_UB:
|
||||
tcg_gen_ld8u_i32(var, cpu_env, offset);
|
||||
break;
|
||||
case MO_UW:
|
||||
tcg_gen_ld16u_i32(var, cpu_env, offset);
|
||||
break;
|
||||
case MO_UL:
|
||||
tcg_gen_ld_i32(var, cpu_env, offset);
|
||||
break;
|
||||
default:
|
||||
g_assert_not_reached();
|
||||
}
|
||||
}
|
||||
|
||||
static void neon_load_element64(TCGv_i64 var, int reg, int ele, MemOp mop)
|
||||
{
|
||||
long offset = neon_element_offset(reg, ele, mop & MO_SIZE);
|
||||
|
||||
switch (mop) {
|
||||
case MO_UB:
|
||||
tcg_gen_ld8u_i64(var, cpu_env, offset);
|
||||
break;
|
||||
case MO_UW:
|
||||
tcg_gen_ld16u_i64(var, cpu_env, offset);
|
||||
break;
|
||||
case MO_UL:
|
||||
tcg_gen_ld32u_i64(var, cpu_env, offset);
|
||||
break;
|
||||
case MO_Q:
|
||||
tcg_gen_ld_i64(var, cpu_env, offset);
|
||||
break;
|
||||
default:
|
||||
g_assert_not_reached();
|
||||
}
|
||||
}
|
||||
|
||||
static void neon_store_element(int reg, int ele, MemOp size, TCGv_i32 var)
|
||||
{
|
||||
long offset = neon_element_offset(reg, ele, size);
|
||||
|
||||
switch (size) {
|
||||
case MO_8:
|
||||
tcg_gen_st8_i32(var, cpu_env, offset);
|
||||
break;
|
||||
case MO_16:
|
||||
tcg_gen_st16_i32(var, cpu_env, offset);
|
||||
break;
|
||||
case MO_32:
|
||||
tcg_gen_st_i32(var, cpu_env, offset);
|
||||
break;
|
||||
default:
|
||||
g_assert_not_reached();
|
||||
}
|
||||
}
|
||||
|
||||
static void neon_store_element64(int reg, int ele, MemOp size, TCGv_i64 var)
|
||||
{
|
||||
long offset = neon_element_offset(reg, ele, size);
|
||||
|
||||
switch (size) {
|
||||
case MO_8:
|
||||
tcg_gen_st8_i64(var, cpu_env, offset);
|
||||
break;
|
||||
case MO_16:
|
||||
tcg_gen_st16_i64(var, cpu_env, offset);
|
||||
break;
|
||||
case MO_32:
|
||||
tcg_gen_st32_i64(var, cpu_env, offset);
|
||||
break;
|
||||
case MO_64:
|
||||
tcg_gen_st_i64(var, cpu_env, offset);
|
||||
break;
|
||||
default:
|
||||
g_assert_not_reached();
|
||||
}
|
||||
}
|
||||
|
||||
static bool trans_VCMLA(DisasContext *s, arg_VCMLA *a)
|
||||
{
|
||||
int opr_sz;
|
||||
|
|
|
@ -1133,25 +1133,6 @@ neon_reg_offset (int reg, int n)
|
|||
return vfp_reg_offset(0, sreg);
|
||||
}
|
||||
|
||||
/* Return the offset of a 2**SIZE piece of a NEON register, at index ELE,
|
||||
* where 0 is the least significant end of the register.
|
||||
*/
|
||||
static inline long
|
||||
neon_element_offset(int reg, int element, MemOp size)
|
||||
{
|
||||
int element_size = 1 << size;
|
||||
int ofs = element * element_size;
|
||||
#ifdef HOST_WORDS_BIGENDIAN
|
||||
/* Calculate the offset assuming fully little-endian,
|
||||
* then XOR to account for the order of the 8-byte units.
|
||||
*/
|
||||
if (element_size < 8) {
|
||||
ofs ^= 8 - element_size;
|
||||
}
|
||||
#endif
|
||||
return neon_reg_offset(reg, 0) + ofs;
|
||||
}
|
||||
|
||||
static TCGv_i32 neon_load_reg(int reg, int pass)
|
||||
{
|
||||
TCGv_i32 tmp = tcg_temp_new_i32();
|
||||
|
@ -1159,94 +1140,12 @@ static TCGv_i32 neon_load_reg(int reg, int pass)
|
|||
return tmp;
|
||||
}
|
||||
|
||||
static void neon_load_element(TCGv_i32 var, int reg, int ele, MemOp mop)
|
||||
{
|
||||
long offset = neon_element_offset(reg, ele, mop & MO_SIZE);
|
||||
|
||||
switch (mop) {
|
||||
case MO_UB:
|
||||
tcg_gen_ld8u_i32(var, cpu_env, offset);
|
||||
break;
|
||||
case MO_UW:
|
||||
tcg_gen_ld16u_i32(var, cpu_env, offset);
|
||||
break;
|
||||
case MO_UL:
|
||||
tcg_gen_ld_i32(var, cpu_env, offset);
|
||||
break;
|
||||
default:
|
||||
g_assert_not_reached();
|
||||
}
|
||||
}
|
||||
|
||||
static void neon_load_element64(TCGv_i64 var, int reg, int ele, MemOp mop)
|
||||
{
|
||||
long offset = neon_element_offset(reg, ele, mop & MO_SIZE);
|
||||
|
||||
switch (mop) {
|
||||
case MO_UB:
|
||||
tcg_gen_ld8u_i64(var, cpu_env, offset);
|
||||
break;
|
||||
case MO_UW:
|
||||
tcg_gen_ld16u_i64(var, cpu_env, offset);
|
||||
break;
|
||||
case MO_UL:
|
||||
tcg_gen_ld32u_i64(var, cpu_env, offset);
|
||||
break;
|
||||
case MO_Q:
|
||||
tcg_gen_ld_i64(var, cpu_env, offset);
|
||||
break;
|
||||
default:
|
||||
g_assert_not_reached();
|
||||
}
|
||||
}
|
||||
|
||||
static void neon_store_reg(int reg, int pass, TCGv_i32 var)
|
||||
{
|
||||
tcg_gen_st_i32(var, cpu_env, neon_reg_offset(reg, pass));
|
||||
tcg_temp_free_i32(var);
|
||||
}
|
||||
|
||||
static void neon_store_element(int reg, int ele, MemOp size, TCGv_i32 var)
|
||||
{
|
||||
long offset = neon_element_offset(reg, ele, size);
|
||||
|
||||
switch (size) {
|
||||
case MO_8:
|
||||
tcg_gen_st8_i32(var, cpu_env, offset);
|
||||
break;
|
||||
case MO_16:
|
||||
tcg_gen_st16_i32(var, cpu_env, offset);
|
||||
break;
|
||||
case MO_32:
|
||||
tcg_gen_st_i32(var, cpu_env, offset);
|
||||
break;
|
||||
default:
|
||||
g_assert_not_reached();
|
||||
}
|
||||
}
|
||||
|
||||
static void neon_store_element64(int reg, int ele, MemOp size, TCGv_i64 var)
|
||||
{
|
||||
long offset = neon_element_offset(reg, ele, size);
|
||||
|
||||
switch (size) {
|
||||
case MO_8:
|
||||
tcg_gen_st8_i64(var, cpu_env, offset);
|
||||
break;
|
||||
case MO_16:
|
||||
tcg_gen_st16_i64(var, cpu_env, offset);
|
||||
break;
|
||||
case MO_32:
|
||||
tcg_gen_st32_i64(var, cpu_env, offset);
|
||||
break;
|
||||
case MO_64:
|
||||
tcg_gen_st_i64(var, cpu_env, offset);
|
||||
break;
|
||||
default:
|
||||
g_assert_not_reached();
|
||||
}
|
||||
}
|
||||
|
||||
static inline void neon_load_reg64(TCGv_i64 var, int reg)
|
||||
{
|
||||
tcg_gen_ld_i64(var, cpu_env, vfp_reg_offset(1, reg));
|
||||
|
|
Loading…
Reference in New Issue