mirror of
https://github.com/Motorhead1991/qemu.git
synced 2026-03-04 09:04:39 -07:00
Improvements to tcg constant handling.
Force utf8 for decodetree.
-----BEGIN PGP SIGNATURE-----
iQFRBAABCgA7FiEEekgeeIaLTbaoWgXAZN846K9+IV8FAl//qU4dHHJpY2hhcmQu
aGVuZGVyc29uQGxpbmFyby5vcmcACgkQZN846K9+IV/Tpgf9EXQZFrmwjQ9FfSfL
pdqIgTeAmDqr5pIGs84Wy5MZuNldyTqJQRaTYl6Xtv3ZjQcX8TDfwH6KeV/hub58
L/Ug1X0fRL7ESc3OeiPH77BrLqiOXTjrlHocgqFU7fVVg+rhzxrQ3IvY6PuWH01+
NBcvQ/Ku8vQeRoTb2lcHB9qreaRXbd0vwCaN/9a+8aiKOqfIMCYK0Z23O9pTf/YW
x8ksnMF2hdzAxFYDbOWRfgbcJp4P1xpw4lvWSegcodl+yDliznTfCdh+9mYMsga8
nr1VP6SCcktkg+maPhxeOToBxcPkhymtTVpXCzv/Vnuz4XsGyDSoJDfUVVTvZ/R/
pycA/g==
=fNFy
-----END PGP SIGNATURE-----
Merge remote-tracking branch 'remotes/rth-gitlab/tags/pull-tcg-20210113' into staging
Improvements to tcg constant handling.
Force utf8 for decodetree.
# gpg: Signature made Thu 14 Jan 2021 02:15:42 GMT
# gpg: using RSA key 7A481E78868B4DB6A85A05C064DF38E8AF7E215F
# gpg: issuer "richard.henderson@linaro.org"
# gpg: Good signature from "Richard Henderson <richard.henderson@linaro.org>" [full]
# Primary key fingerprint: 7A48 1E78 868B 4DB6 A85A 05C0 64DF 38E8 AF7E 215F
* remotes/rth-gitlab/tags/pull-tcg-20210113: (24 commits)
decodetree: Open files with encoding='utf-8'
tcg/aarch64: Use tcg_constant_vec with tcg vec expanders
tcg/ppc: Use tcg_constant_vec with tcg vec expanders
tcg: Remove tcg_gen_dup{8,16,32,64}i_vec
tcg/i386: Use tcg_constant_vec with tcg vec expanders
tcg: Add tcg_reg_alloc_dup2
tcg: Remove movi and dupi opcodes
tcg/tci: Add special tci_movi_{i32,i64} opcodes
tcg: Use tcg_constant_{i32,i64,vec} with gvec expanders
tcg: Use tcg_constant_{i32,i64} with tcg plugins
tcg: Use tcg_constant_{i32,i64} with tcg int expanders
tcg: Use tcg_constant_i32 with icount expander
tcg: Convert tcg_gen_dupi_vec to TCG_CONST
tcg/optimize: Use tcg_constant_internal with constant folding
tcg/optimize: Adjust TempOptInfo allocation
tcg/optimize: Improve find_better_copy
tcg: Introduce TYPE_CONST temporaries
tcg: Expand TempOptInfo to 64-bits
tcg: Rename struct tcg_temp_info to TempOptInfo
tcg: Expand TCGTemp.val to 64-bits
...
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
commit
7c79721606
21 changed files with 890 additions and 669 deletions
|
|
@ -34,7 +34,7 @@ static inline void gen_io_end(void)
|
|||
|
||||
static inline void gen_tb_start(const TranslationBlock *tb)
|
||||
{
|
||||
TCGv_i32 count, imm;
|
||||
TCGv_i32 count;
|
||||
|
||||
tcg_ctx->exitreq_label = gen_new_label();
|
||||
if (tb_cflags(tb) & CF_USE_ICOUNT) {
|
||||
|
|
@ -48,15 +48,13 @@ static inline void gen_tb_start(const TranslationBlock *tb)
|
|||
offsetof(ArchCPU, env));
|
||||
|
||||
if (tb_cflags(tb) & CF_USE_ICOUNT) {
|
||||
imm = tcg_temp_new_i32();
|
||||
/* We emit a movi with a dummy immediate argument. Keep the insn index
|
||||
* of the movi so that we later (when we know the actual insn count)
|
||||
* can update the immediate argument with the actual insn count. */
|
||||
tcg_gen_movi_i32(imm, 0xdeadbeef);
|
||||
/*
|
||||
* We emit a sub with a dummy immediate argument. Keep the insn index
|
||||
* of the sub so that we later (when we know the actual insn count)
|
||||
* can update the argument with the actual insn count.
|
||||
*/
|
||||
tcg_gen_sub_i32(count, count, tcg_constant_i32(0));
|
||||
icount_start_insn = tcg_last_op();
|
||||
|
||||
tcg_gen_sub_i32(count, count, imm);
|
||||
tcg_temp_free_i32(imm);
|
||||
}
|
||||
|
||||
tcg_gen_brcondi_i32(TCG_COND_LT, count, 0, tcg_ctx->exitreq_label);
|
||||
|
|
@ -74,9 +72,12 @@ static inline void gen_tb_start(const TranslationBlock *tb)
|
|||
static inline void gen_tb_end(const TranslationBlock *tb, int num_insns)
|
||||
{
|
||||
if (tb_cflags(tb) & CF_USE_ICOUNT) {
|
||||
/* Update the num_insn immediate parameter now that we know
|
||||
* the actual insn count. */
|
||||
tcg_set_insn_param(icount_start_insn, 1, num_insns);
|
||||
/*
|
||||
* Update the num_insn immediate parameter now that we know
|
||||
* the actual insn count.
|
||||
*/
|
||||
tcg_set_insn_param(icount_start_insn, 2,
|
||||
tcgv_i32_arg(tcg_constant_i32(num_insns)));
|
||||
}
|
||||
|
||||
gen_set_label(tcg_ctx->exitreq_label);
|
||||
|
|
|
|||
|
|
@ -271,6 +271,7 @@ void tcg_gen_mb(TCGBar);
|
|||
|
||||
/* 32 bit ops */
|
||||
|
||||
void tcg_gen_movi_i32(TCGv_i32 ret, int32_t arg);
|
||||
void tcg_gen_addi_i32(TCGv_i32 ret, TCGv_i32 arg1, int32_t arg2);
|
||||
void tcg_gen_subfi_i32(TCGv_i32 ret, int32_t arg1, TCGv_i32 arg2);
|
||||
void tcg_gen_subi_i32(TCGv_i32 ret, TCGv_i32 arg1, int32_t arg2);
|
||||
|
|
@ -349,11 +350,6 @@ static inline void tcg_gen_mov_i32(TCGv_i32 ret, TCGv_i32 arg)
|
|||
}
|
||||
}
|
||||
|
||||
static inline void tcg_gen_movi_i32(TCGv_i32 ret, int32_t arg)
|
||||
{
|
||||
tcg_gen_op2i_i32(INDEX_op_movi_i32, ret, arg);
|
||||
}
|
||||
|
||||
static inline void tcg_gen_ld8u_i32(TCGv_i32 ret, TCGv_ptr arg2,
|
||||
tcg_target_long offset)
|
||||
{
|
||||
|
|
@ -467,6 +463,7 @@ static inline void tcg_gen_not_i32(TCGv_i32 ret, TCGv_i32 arg)
|
|||
|
||||
/* 64 bit ops */
|
||||
|
||||
void tcg_gen_movi_i64(TCGv_i64 ret, int64_t arg);
|
||||
void tcg_gen_addi_i64(TCGv_i64 ret, TCGv_i64 arg1, int64_t arg2);
|
||||
void tcg_gen_subfi_i64(TCGv_i64 ret, int64_t arg1, TCGv_i64 arg2);
|
||||
void tcg_gen_subi_i64(TCGv_i64 ret, TCGv_i64 arg1, int64_t arg2);
|
||||
|
|
@ -550,11 +547,6 @@ static inline void tcg_gen_mov_i64(TCGv_i64 ret, TCGv_i64 arg)
|
|||
}
|
||||
}
|
||||
|
||||
static inline void tcg_gen_movi_i64(TCGv_i64 ret, int64_t arg)
|
||||
{
|
||||
tcg_gen_op2i_i64(INDEX_op_movi_i64, ret, arg);
|
||||
}
|
||||
|
||||
static inline void tcg_gen_ld8u_i64(TCGv_i64 ret, TCGv_ptr arg2,
|
||||
tcg_target_long offset)
|
||||
{
|
||||
|
|
@ -698,7 +690,6 @@ static inline void tcg_gen_sub_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
|
|||
|
||||
void tcg_gen_discard_i64(TCGv_i64 arg);
|
||||
void tcg_gen_mov_i64(TCGv_i64 ret, TCGv_i64 arg);
|
||||
void tcg_gen_movi_i64(TCGv_i64 ret, int64_t arg);
|
||||
void tcg_gen_ld8u_i64(TCGv_i64 ret, TCGv_ptr arg2, tcg_target_long offset);
|
||||
void tcg_gen_ld8s_i64(TCGv_i64 ret, TCGv_ptr arg2, tcg_target_long offset);
|
||||
void tcg_gen_ld16u_i64(TCGv_i64 ret, TCGv_ptr arg2, tcg_target_long offset);
|
||||
|
|
@ -968,10 +959,6 @@ void tcg_gen_mov_vec(TCGv_vec, TCGv_vec);
|
|||
void tcg_gen_dup_i32_vec(unsigned vece, TCGv_vec, TCGv_i32);
|
||||
void tcg_gen_dup_i64_vec(unsigned vece, TCGv_vec, TCGv_i64);
|
||||
void tcg_gen_dup_mem_vec(unsigned vece, TCGv_vec, TCGv_ptr, tcg_target_long);
|
||||
void tcg_gen_dup8i_vec(TCGv_vec, uint32_t);
|
||||
void tcg_gen_dup16i_vec(TCGv_vec, uint32_t);
|
||||
void tcg_gen_dup32i_vec(TCGv_vec, uint32_t);
|
||||
void tcg_gen_dup64i_vec(TCGv_vec, uint64_t);
|
||||
void tcg_gen_dupi_vec(unsigned vece, TCGv_vec, uint64_t);
|
||||
void tcg_gen_add_vec(unsigned vece, TCGv_vec r, TCGv_vec a, TCGv_vec b);
|
||||
void tcg_gen_sub_vec(unsigned vece, TCGv_vec r, TCGv_vec a, TCGv_vec b);
|
||||
|
|
|
|||
|
|
@ -45,7 +45,6 @@ DEF(br, 0, 0, 1, TCG_OPF_BB_END)
|
|||
DEF(mb, 0, 0, 1, 0)
|
||||
|
||||
DEF(mov_i32, 1, 1, 0, TCG_OPF_NOT_PRESENT)
|
||||
DEF(movi_i32, 1, 0, 1, TCG_OPF_NOT_PRESENT)
|
||||
DEF(setcond_i32, 1, 2, 1, 0)
|
||||
DEF(movcond_i32, 1, 4, 1, IMPL(TCG_TARGET_HAS_movcond_i32))
|
||||
/* load/store */
|
||||
|
|
@ -111,7 +110,6 @@ DEF(ctz_i32, 1, 2, 0, IMPL(TCG_TARGET_HAS_ctz_i32))
|
|||
DEF(ctpop_i32, 1, 1, 0, IMPL(TCG_TARGET_HAS_ctpop_i32))
|
||||
|
||||
DEF(mov_i64, 1, 1, 0, TCG_OPF_64BIT | TCG_OPF_NOT_PRESENT)
|
||||
DEF(movi_i64, 1, 0, 1, TCG_OPF_64BIT | TCG_OPF_NOT_PRESENT)
|
||||
DEF(setcond_i64, 1, 2, 1, IMPL64)
|
||||
DEF(movcond_i64, 1, 4, 1, IMPL64 | IMPL(TCG_TARGET_HAS_movcond_i64))
|
||||
/* load/store */
|
||||
|
|
@ -221,7 +219,6 @@ DEF(qemu_st8_i32, 0, TLADDR_ARGS + 1, 1,
|
|||
#define IMPLVEC TCG_OPF_VECTOR | IMPL(TCG_TARGET_MAYBE_vec)
|
||||
|
||||
DEF(mov_vec, 1, 1, 0, TCG_OPF_VECTOR | TCG_OPF_NOT_PRESENT)
|
||||
DEF(dupi_vec, 1, 0, 1, TCG_OPF_VECTOR | TCG_OPF_NOT_PRESENT)
|
||||
|
||||
DEF(dup_vec, 1, 1, 0, IMPLVEC)
|
||||
DEF(dup2_vec, 1, 2, 0, IMPLVEC | IMPL(TCG_TARGET_REG_BITS == 32))
|
||||
|
|
@ -278,6 +275,14 @@ DEF(last_generic, 0, 0, 0, TCG_OPF_NOT_PRESENT)
|
|||
#include "tcg-target.opc.h"
|
||||
#endif
|
||||
|
||||
#ifdef TCG_TARGET_INTERPRETER
|
||||
/* These opcodes are only for use between the tci generator and interpreter. */
|
||||
DEF(tci_movi_i32, 1, 0, 1, TCG_OPF_NOT_PRESENT)
|
||||
#if TCG_TARGET_REG_BITS == 64
|
||||
DEF(tci_movi_i64, 1, 0, 1, TCG_OPF_64BIT | TCG_OPF_NOT_PRESENT)
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#undef TLADDR_ARGS
|
||||
#undef DATA64_ARGS
|
||||
#undef IMPL
|
||||
|
|
|
|||
|
|
@ -483,26 +483,32 @@ typedef enum TCGTempVal {
|
|||
TEMP_VAL_CONST,
|
||||
} TCGTempVal;
|
||||
|
||||
typedef enum TCGTempKind {
|
||||
/* Temp is dead at the end of all basic blocks. */
|
||||
TEMP_NORMAL,
|
||||
/* Temp is saved across basic blocks but dead at the end of TBs. */
|
||||
TEMP_LOCAL,
|
||||
/* Temp is saved across both basic blocks and translation blocks. */
|
||||
TEMP_GLOBAL,
|
||||
/* Temp is in a fixed register. */
|
||||
TEMP_FIXED,
|
||||
/* Temp is a fixed constant. */
|
||||
TEMP_CONST,
|
||||
} TCGTempKind;
|
||||
|
||||
typedef struct TCGTemp {
|
||||
TCGReg reg:8;
|
||||
TCGTempVal val_type:8;
|
||||
TCGType base_type:8;
|
||||
TCGType type:8;
|
||||
unsigned int fixed_reg:1;
|
||||
TCGTempKind kind:3;
|
||||
unsigned int indirect_reg:1;
|
||||
unsigned int indirect_base:1;
|
||||
unsigned int mem_coherent:1;
|
||||
unsigned int mem_allocated:1;
|
||||
/* If true, the temp is saved across both basic blocks and
|
||||
translation blocks. */
|
||||
unsigned int temp_global:1;
|
||||
/* If true, the temp is saved across basic blocks but dead
|
||||
at the end of translation blocks. If false, the temp is
|
||||
dead at the end of basic blocks. */
|
||||
unsigned int temp_local:1;
|
||||
unsigned int temp_allocated:1;
|
||||
|
||||
tcg_target_long val;
|
||||
int64_t val;
|
||||
struct TCGTemp *mem_base;
|
||||
intptr_t mem_offset;
|
||||
const char *name;
|
||||
|
|
@ -661,6 +667,7 @@ struct TCGContext {
|
|||
QSIMPLEQ_HEAD(, TCGOp) plugin_ops;
|
||||
#endif
|
||||
|
||||
GHashTable *const_table[TCG_TYPE_COUNT];
|
||||
TCGTempSet free_temps[TCG_TYPE_COUNT * 2];
|
||||
TCGTemp temps[TCG_MAX_TEMPS]; /* globals first, temps after */
|
||||
|
||||
|
|
@ -675,6 +682,11 @@ struct TCGContext {
|
|||
target_ulong gen_insn_data[TCG_MAX_INSNS][TARGET_INSN_START_WORDS];
|
||||
};
|
||||
|
||||
static inline bool temp_readonly(TCGTemp *ts)
|
||||
{
|
||||
return ts->kind >= TEMP_FIXED;
|
||||
}
|
||||
|
||||
extern TCGContext tcg_init_ctx;
|
||||
extern __thread TCGContext *tcg_ctx;
|
||||
extern const void *tcg_code_gen_epilogue;
|
||||
|
|
@ -1070,6 +1082,7 @@ TCGOp *tcg_op_insert_after(TCGContext *s, TCGOp *op, TCGOpcode opc);
|
|||
|
||||
void tcg_optimize(TCGContext *s);
|
||||
|
||||
/* Allocate a new temporary and initialize it with a constant. */
|
||||
TCGv_i32 tcg_const_i32(int32_t val);
|
||||
TCGv_i64 tcg_const_i64(int64_t val);
|
||||
TCGv_i32 tcg_const_local_i32(int32_t val);
|
||||
|
|
@ -1079,6 +1092,25 @@ TCGv_vec tcg_const_ones_vec(TCGType);
|
|||
TCGv_vec tcg_const_zeros_vec_matching(TCGv_vec);
|
||||
TCGv_vec tcg_const_ones_vec_matching(TCGv_vec);
|
||||
|
||||
/*
|
||||
* Locate or create a read-only temporary that is a constant.
|
||||
* This kind of temporary need not and should not be freed.
|
||||
*/
|
||||
TCGTemp *tcg_constant_internal(TCGType type, int64_t val);
|
||||
|
||||
static inline TCGv_i32 tcg_constant_i32(int32_t val)
|
||||
{
|
||||
return temp_tcgv_i32(tcg_constant_internal(TCG_TYPE_I32, val));
|
||||
}
|
||||
|
||||
static inline TCGv_i64 tcg_constant_i64(int64_t val)
|
||||
{
|
||||
return temp_tcgv_i64(tcg_constant_internal(TCG_TYPE_I64, val));
|
||||
}
|
||||
|
||||
TCGv_vec tcg_constant_vec(TCGType type, unsigned vece, int64_t val);
|
||||
TCGv_vec tcg_constant_vec_matching(TCGv_vec match, unsigned vece, int64_t val);
|
||||
|
||||
#if UINTPTR_MAX == UINT32_MAX
|
||||
# define tcg_const_ptr(x) ((TCGv_ptr)tcg_const_i32((intptr_t)(x)))
|
||||
# define tcg_const_local_ptr(x) ((TCGv_ptr)tcg_const_local_i32((intptr_t)(x)))
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue