mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-07 17:53:56 -06:00
tcg: TCGMemOp is now accelerator independent MemOp
Preparation for collapsing the two byte swaps, adjust_endianness and handle_bswap, along the I/O path. Target dependant attributes are conditionalized upon NEED_CPU_H. Signed-off-by: Tony Nguyen <tony.nguyen@bt.com> Acked-by: David Gibson <david@gibson.dropbear.id.au> Reviewed-by: Richard Henderson <richard.henderson@linaro.org> Acked-by: Cornelia Huck <cohuck@redhat.com> Message-Id: <81d9cd7d7f5aaadfa772d6c48ecee834e9cf7882.1566466906.git.tony.nguyen@bt.com> Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
This commit is contained in:
parent
fec105c2ab
commit
14776ab5a1
39 changed files with 418 additions and 396 deletions
|
@ -85,7 +85,7 @@ typedef void NeonGenOneOpFn(TCGv_i64, TCGv_i64);
|
|||
typedef void CryptoTwoOpFn(TCGv_ptr, TCGv_ptr);
|
||||
typedef void CryptoThreeOpIntFn(TCGv_ptr, TCGv_ptr, TCGv_i32);
|
||||
typedef void CryptoThreeOpFn(TCGv_ptr, TCGv_ptr, TCGv_ptr);
|
||||
typedef void AtomicThreeOpFn(TCGv_i64, TCGv_i64, TCGv_i64, TCGArg, TCGMemOp);
|
||||
typedef void AtomicThreeOpFn(TCGv_i64, TCGv_i64, TCGv_i64, TCGArg, MemOp);
|
||||
|
||||
/* initialize TCG globals. */
|
||||
void a64_translate_init(void)
|
||||
|
@ -433,7 +433,7 @@ TCGv_i64 read_cpu_reg_sp(DisasContext *s, int reg, int sf)
|
|||
* Dn, Sn, Hn or Bn).
|
||||
* (Note that this is not the same mapping as for A32; see cpu.h)
|
||||
*/
|
||||
static inline int fp_reg_offset(DisasContext *s, int regno, TCGMemOp size)
|
||||
static inline int fp_reg_offset(DisasContext *s, int regno, MemOp size)
|
||||
{
|
||||
return vec_reg_offset(s, regno, 0, size);
|
||||
}
|
||||
|
@ -849,7 +849,7 @@ static void do_gpr_ld_memidx(DisasContext *s,
|
|||
bool iss_valid, unsigned int iss_srt,
|
||||
bool iss_sf, bool iss_ar)
|
||||
{
|
||||
TCGMemOp memop = s->be_data + size;
|
||||
MemOp memop = s->be_data + size;
|
||||
|
||||
g_assert(size <= 3);
|
||||
|
||||
|
@ -926,7 +926,7 @@ static void do_fp_ld(DisasContext *s, int destidx, TCGv_i64 tcg_addr, int size)
|
|||
TCGv_i64 tmphi;
|
||||
|
||||
if (size < 4) {
|
||||
TCGMemOp memop = s->be_data + size;
|
||||
MemOp memop = s->be_data + size;
|
||||
tmphi = tcg_const_i64(0);
|
||||
tcg_gen_qemu_ld_i64(tmplo, tcg_addr, get_mem_index(s), memop);
|
||||
} else {
|
||||
|
@ -967,7 +967,7 @@ static void do_fp_ld(DisasContext *s, int destidx, TCGv_i64 tcg_addr, int size)
|
|||
|
||||
/* Get value of an element within a vector register */
|
||||
static void read_vec_element(DisasContext *s, TCGv_i64 tcg_dest, int srcidx,
|
||||
int element, TCGMemOp memop)
|
||||
int element, MemOp memop)
|
||||
{
|
||||
int vect_off = vec_reg_offset(s, srcidx, element, memop & MO_SIZE);
|
||||
switch (memop) {
|
||||
|
@ -999,7 +999,7 @@ static void read_vec_element(DisasContext *s, TCGv_i64 tcg_dest, int srcidx,
|
|||
}
|
||||
|
||||
static void read_vec_element_i32(DisasContext *s, TCGv_i32 tcg_dest, int srcidx,
|
||||
int element, TCGMemOp memop)
|
||||
int element, MemOp memop)
|
||||
{
|
||||
int vect_off = vec_reg_offset(s, srcidx, element, memop & MO_SIZE);
|
||||
switch (memop) {
|
||||
|
@ -1026,7 +1026,7 @@ static void read_vec_element_i32(DisasContext *s, TCGv_i32 tcg_dest, int srcidx,
|
|||
|
||||
/* Set value of an element within a vector register */
|
||||
static void write_vec_element(DisasContext *s, TCGv_i64 tcg_src, int destidx,
|
||||
int element, TCGMemOp memop)
|
||||
int element, MemOp memop)
|
||||
{
|
||||
int vect_off = vec_reg_offset(s, destidx, element, memop & MO_SIZE);
|
||||
switch (memop) {
|
||||
|
@ -1048,7 +1048,7 @@ static void write_vec_element(DisasContext *s, TCGv_i64 tcg_src, int destidx,
|
|||
}
|
||||
|
||||
static void write_vec_element_i32(DisasContext *s, TCGv_i32 tcg_src,
|
||||
int destidx, int element, TCGMemOp memop)
|
||||
int destidx, int element, MemOp memop)
|
||||
{
|
||||
int vect_off = vec_reg_offset(s, destidx, element, memop & MO_SIZE);
|
||||
switch (memop) {
|
||||
|
@ -1068,7 +1068,7 @@ static void write_vec_element_i32(DisasContext *s, TCGv_i32 tcg_src,
|
|||
|
||||
/* Store from vector register to memory */
|
||||
static void do_vec_st(DisasContext *s, int srcidx, int element,
|
||||
TCGv_i64 tcg_addr, int size, TCGMemOp endian)
|
||||
TCGv_i64 tcg_addr, int size, MemOp endian)
|
||||
{
|
||||
TCGv_i64 tcg_tmp = tcg_temp_new_i64();
|
||||
|
||||
|
@ -1080,7 +1080,7 @@ static void do_vec_st(DisasContext *s, int srcidx, int element,
|
|||
|
||||
/* Load from memory to vector register */
|
||||
static void do_vec_ld(DisasContext *s, int destidx, int element,
|
||||
TCGv_i64 tcg_addr, int size, TCGMemOp endian)
|
||||
TCGv_i64 tcg_addr, int size, MemOp endian)
|
||||
{
|
||||
TCGv_i64 tcg_tmp = tcg_temp_new_i64();
|
||||
|
||||
|
@ -2176,7 +2176,7 @@ static void gen_load_exclusive(DisasContext *s, int rt, int rt2,
|
|||
TCGv_i64 addr, int size, bool is_pair)
|
||||
{
|
||||
int idx = get_mem_index(s);
|
||||
TCGMemOp memop = s->be_data;
|
||||
MemOp memop = s->be_data;
|
||||
|
||||
g_assert(size <= 3);
|
||||
if (is_pair) {
|
||||
|
@ -3262,7 +3262,7 @@ static void disas_ldst_multiple_struct(DisasContext *s, uint32_t insn)
|
|||
bool is_postidx = extract32(insn, 23, 1);
|
||||
bool is_q = extract32(insn, 30, 1);
|
||||
TCGv_i64 clean_addr, tcg_rn, tcg_ebytes;
|
||||
TCGMemOp endian = s->be_data;
|
||||
MemOp endian = s->be_data;
|
||||
|
||||
int ebytes; /* bytes per element */
|
||||
int elements; /* elements per vector */
|
||||
|
@ -5431,7 +5431,7 @@ static void disas_fp_csel(DisasContext *s, uint32_t insn)
|
|||
unsigned int mos, type, rm, cond, rn, rd;
|
||||
TCGv_i64 t_true, t_false, t_zero;
|
||||
DisasCompare64 c;
|
||||
TCGMemOp sz;
|
||||
MemOp sz;
|
||||
|
||||
mos = extract32(insn, 29, 3);
|
||||
type = extract32(insn, 22, 2);
|
||||
|
@ -6243,7 +6243,7 @@ static void disas_fp_imm(DisasContext *s, uint32_t insn)
|
|||
int mos = extract32(insn, 29, 3);
|
||||
uint64_t imm;
|
||||
TCGv_i64 tcg_res;
|
||||
TCGMemOp sz;
|
||||
MemOp sz;
|
||||
|
||||
if (mos || imm5) {
|
||||
unallocated_encoding(s);
|
||||
|
@ -7006,7 +7006,7 @@ static TCGv_i32 do_reduction_op(DisasContext *s, int fpopcode, int rn,
|
|||
{
|
||||
if (esize == size) {
|
||||
int element;
|
||||
TCGMemOp msize = esize == 16 ? MO_16 : MO_32;
|
||||
MemOp msize = esize == 16 ? MO_16 : MO_32;
|
||||
TCGv_i32 tcg_elem;
|
||||
|
||||
/* We should have one register left here */
|
||||
|
@ -7998,7 +7998,7 @@ static void handle_vec_simd_sqshrn(DisasContext *s, bool is_scalar, bool is_q,
|
|||
int shift = (2 * esize) - immhb;
|
||||
int elements = is_scalar ? 1 : (64 / esize);
|
||||
bool round = extract32(opcode, 0, 1);
|
||||
TCGMemOp ldop = (size + 1) | (is_u_shift ? 0 : MO_SIGN);
|
||||
MemOp ldop = (size + 1) | (is_u_shift ? 0 : MO_SIGN);
|
||||
TCGv_i64 tcg_rn, tcg_rd, tcg_round;
|
||||
TCGv_i32 tcg_rd_narrowed;
|
||||
TCGv_i64 tcg_final;
|
||||
|
@ -8157,7 +8157,7 @@ static void handle_simd_qshl(DisasContext *s, bool scalar, bool is_q,
|
|||
}
|
||||
};
|
||||
NeonGenTwoOpEnvFn *genfn = fns[src_unsigned][dst_unsigned][size];
|
||||
TCGMemOp memop = scalar ? size : MO_32;
|
||||
MemOp memop = scalar ? size : MO_32;
|
||||
int maxpass = scalar ? 1 : is_q ? 4 : 2;
|
||||
|
||||
for (pass = 0; pass < maxpass; pass++) {
|
||||
|
@ -8201,7 +8201,7 @@ static void handle_simd_intfp_conv(DisasContext *s, int rd, int rn,
|
|||
TCGv_ptr tcg_fpst = get_fpstatus_ptr(size == MO_16);
|
||||
TCGv_i32 tcg_shift = NULL;
|
||||
|
||||
TCGMemOp mop = size | (is_signed ? MO_SIGN : 0);
|
||||
MemOp mop = size | (is_signed ? MO_SIGN : 0);
|
||||
int pass;
|
||||
|
||||
if (fracbits || size == MO_64) {
|
||||
|
@ -9980,7 +9980,7 @@ static void handle_vec_simd_shri(DisasContext *s, bool is_q, bool is_u,
|
|||
int dsize = is_q ? 128 : 64;
|
||||
int esize = 8 << size;
|
||||
int elements = dsize/esize;
|
||||
TCGMemOp memop = size | (is_u ? 0 : MO_SIGN);
|
||||
MemOp memop = size | (is_u ? 0 : MO_SIGN);
|
||||
TCGv_i64 tcg_rn = new_tmp_a64(s);
|
||||
TCGv_i64 tcg_rd = new_tmp_a64(s);
|
||||
TCGv_i64 tcg_round;
|
||||
|
@ -10323,7 +10323,7 @@ static void handle_3rd_widening(DisasContext *s, int is_q, int is_u, int size,
|
|||
TCGv_i64 tcg_op1 = tcg_temp_new_i64();
|
||||
TCGv_i64 tcg_op2 = tcg_temp_new_i64();
|
||||
TCGv_i64 tcg_passres;
|
||||
TCGMemOp memop = MO_32 | (is_u ? 0 : MO_SIGN);
|
||||
MemOp memop = MO_32 | (is_u ? 0 : MO_SIGN);
|
||||
|
||||
int elt = pass + is_q * 2;
|
||||
|
||||
|
@ -11803,7 +11803,7 @@ static void handle_2misc_pairwise(DisasContext *s, int opcode, bool u,
|
|||
|
||||
if (size == 2) {
|
||||
/* 32 + 32 -> 64 op */
|
||||
TCGMemOp memop = size + (u ? 0 : MO_SIGN);
|
||||
MemOp memop = size + (u ? 0 : MO_SIGN);
|
||||
|
||||
for (pass = 0; pass < maxpass; pass++) {
|
||||
TCGv_i64 tcg_op1 = tcg_temp_new_i64();
|
||||
|
@ -12825,7 +12825,7 @@ static void disas_simd_indexed(DisasContext *s, uint32_t insn)
|
|||
|
||||
switch (is_fp) {
|
||||
case 1: /* normal fp */
|
||||
/* convert insn encoded size to TCGMemOp size */
|
||||
/* convert insn encoded size to MemOp size */
|
||||
switch (size) {
|
||||
case 0: /* half-precision */
|
||||
size = MO_16;
|
||||
|
@ -12873,7 +12873,7 @@ static void disas_simd_indexed(DisasContext *s, uint32_t insn)
|
|||
return;
|
||||
}
|
||||
|
||||
/* Given TCGMemOp size, adjust register and indexing. */
|
||||
/* Given MemOp size, adjust register and indexing. */
|
||||
switch (size) {
|
||||
case MO_16:
|
||||
index = h << 2 | l << 1 | m;
|
||||
|
@ -13170,7 +13170,7 @@ static void disas_simd_indexed(DisasContext *s, uint32_t insn)
|
|||
TCGv_i64 tcg_res[2];
|
||||
int pass;
|
||||
bool satop = extract32(opcode, 0, 1);
|
||||
TCGMemOp memop = MO_32;
|
||||
MemOp memop = MO_32;
|
||||
|
||||
if (satop || !u) {
|
||||
memop |= MO_SIGN;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue