mirror of https://github.com/xemu-project/xemu.git
target/arm: Extend store_cpu_offset to take field size
Currently we assume all fields are 32-bit. Prepare for fields of a single byte, using sizeof_field(). Signed-off-by: Richard Henderson <richard.henderson@linaro.org> Reviewed-by: Peter Maydell <peter.maydell@linaro.org> [PMM: use sizeof_field() instead of raw sizeof()] Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
parent
5322155240
commit
4f4c2a4ba2
|
@ -61,17 +61,14 @@ static inline TCGv_i32 load_cpu_offset(int offset)
|
||||||
|
|
||||||
#define load_cpu_field(name) load_cpu_offset(offsetof(CPUARMState, name))
|
#define load_cpu_field(name) load_cpu_offset(offsetof(CPUARMState, name))
|
||||||
|
|
||||||
static inline void store_cpu_offset(TCGv_i32 var, int offset)
|
void store_cpu_offset(TCGv_i32 var, int offset, int size);
|
||||||
{
|
|
||||||
tcg_gen_st_i32(var, cpu_env, offset);
|
|
||||||
tcg_temp_free_i32(var);
|
|
||||||
}
|
|
||||||
|
|
||||||
#define store_cpu_field(var, name) \
|
#define store_cpu_field(var, name) \
|
||||||
store_cpu_offset(var, offsetof(CPUARMState, name))
|
store_cpu_offset(var, offsetof(CPUARMState, name), \
|
||||||
|
sizeof_field(CPUARMState, name))
|
||||||
|
|
||||||
#define store_cpu_field_constant(val, name) \
|
#define store_cpu_field_constant(val, name) \
|
||||||
tcg_gen_st_i32(tcg_constant_i32(val), cpu_env, offsetof(CPUARMState, name))
|
store_cpu_field(tcg_constant_i32(val), name)
|
||||||
|
|
||||||
/* Create a new temporary and set it to the value of a CPU register. */
|
/* Create a new temporary and set it to the value of a CPU register. */
|
||||||
static inline TCGv_i32 load_reg(DisasContext *s, int reg)
|
static inline TCGv_i32 load_reg(DisasContext *s, int reg)
|
||||||
|
|
|
@ -180,6 +180,25 @@ typedef enum ISSInfo {
|
||||||
ISSIs16Bit = (1 << 8),
|
ISSIs16Bit = (1 << 8),
|
||||||
} ISSInfo;
|
} ISSInfo;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Store var into env + offset to a member with size bytes.
|
||||||
|
* Free var after use.
|
||||||
|
*/
|
||||||
|
void store_cpu_offset(TCGv_i32 var, int offset, int size)
|
||||||
|
{
|
||||||
|
switch (size) {
|
||||||
|
case 1:
|
||||||
|
tcg_gen_st8_i32(var, cpu_env, offset);
|
||||||
|
break;
|
||||||
|
case 4:
|
||||||
|
tcg_gen_st_i32(var, cpu_env, offset);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
g_assert_not_reached();
|
||||||
|
}
|
||||||
|
tcg_temp_free_i32(var);
|
||||||
|
}
|
||||||
|
|
||||||
/* Save the syndrome information for a Data Abort */
|
/* Save the syndrome information for a Data Abort */
|
||||||
static void disas_set_da_iss(DisasContext *s, MemOp memop, ISSInfo issinfo)
|
static void disas_set_da_iss(DisasContext *s, MemOp memop, ISSInfo issinfo)
|
||||||
{
|
{
|
||||||
|
@ -4852,7 +4871,7 @@ static void do_coproc_insn(DisasContext *s, int cpnum, int is64,
|
||||||
tcg_temp_free_i32(tmp);
|
tcg_temp_free_i32(tmp);
|
||||||
} else {
|
} else {
|
||||||
TCGv_i32 tmp = load_reg(s, rt);
|
TCGv_i32 tmp = load_reg(s, rt);
|
||||||
store_cpu_offset(tmp, ri->fieldoffset);
|
store_cpu_offset(tmp, ri->fieldoffset, 4);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue