Hexagon (target/hexagon) Make special new_value for USR
Precursor to moving new_value from the global state to DisasContext USR will need to stay in the global state because some helpers will set it's value Signed-off-by: Taylor Simpson <tsimpson@quicinc.com> Reviewed-by: Richard Henderson <richard.henderson@linaro.org> Message-Id: <20230427230012.3800327-17-tsimpson@quicinc.com>
This commit is contained in:
parent
00e64fda06
commit
6aa4f1d15c
@ -186,7 +186,7 @@ We also generate an analyze_<tag> function for each instruction. Currently,
|
|||||||
these functions record the writes to registers by calling ctx_log_*. During
|
these functions record the writes to registers by calling ctx_log_*. During
|
||||||
gen_start_packet, we invoke the analyze_<tag> function for each instruction in
|
gen_start_packet, we invoke the analyze_<tag> function for each instruction in
|
||||||
the packet, and we mark the implicit writes. After the analysis is performed,
|
the packet, and we mark the implicit writes. After the analysis is performed,
|
||||||
we initialize hex_new_value for each of the predicated assignments.
|
we initialize the result register for each of the predicated assignments.
|
||||||
|
|
||||||
In addition to instruction semantics, we use a generator to create the decode
|
In addition to instruction semantics, we use a generator to create the decode
|
||||||
tree. This generation is also a two step process. The first step is to run
|
tree. This generation is also a two step process. The first step is to run
|
||||||
|
@ -90,6 +90,7 @@ typedef struct CPUArchState {
|
|||||||
|
|
||||||
uint8_t slot_cancelled;
|
uint8_t slot_cancelled;
|
||||||
target_ulong new_value[TOTAL_PER_THREAD_REGS];
|
target_ulong new_value[TOTAL_PER_THREAD_REGS];
|
||||||
|
target_ulong new_value_usr;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Only used when HEX_DEBUG is on, but unconditionally included
|
* Only used when HEX_DEBUG is on, but unconditionally included
|
||||||
|
@ -190,7 +190,7 @@ def genptr_decl_new(f, tag, regtype, regid, regno):
|
|||||||
if regid in {"s", "t"}:
|
if regid in {"s", "t"}:
|
||||||
f.write(
|
f.write(
|
||||||
f" TCGv {regtype}{regid}N = "
|
f" TCGv {regtype}{regid}N = "
|
||||||
f"hex_new_value[insn->regno[{regno}]];\n"
|
f"get_result_gpr(ctx, insn->regno[{regno}]);\n"
|
||||||
)
|
)
|
||||||
else:
|
else:
|
||||||
print("Bad register parse: ", regtype, regid)
|
print("Bad register parse: ", regtype, regid)
|
||||||
|
@ -68,10 +68,14 @@ static inline void gen_masked_reg_write(TCGv new_val, TCGv cur_val,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static TCGv get_result_gpr(DisasContext *ctx, int rnum)
|
TCGv get_result_gpr(DisasContext *ctx, int rnum)
|
||||||
{
|
{
|
||||||
if (ctx->need_commit) {
|
if (ctx->need_commit) {
|
||||||
return hex_new_value[rnum];
|
if (rnum == HEX_REG_USR) {
|
||||||
|
return hex_new_value_usr;
|
||||||
|
} else {
|
||||||
|
return hex_new_value[rnum];
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
return hex_gpr[rnum];
|
return hex_gpr[rnum];
|
||||||
}
|
}
|
||||||
|
@ -35,6 +35,7 @@ void gen_store4i(TCGv_env cpu_env, TCGv vaddr, int32_t src, uint32_t slot);
|
|||||||
void gen_store8i(TCGv_env cpu_env, TCGv vaddr, int64_t src, uint32_t slot);
|
void gen_store8i(TCGv_env cpu_env, TCGv vaddr, int64_t src, uint32_t slot);
|
||||||
TCGv gen_read_reg(TCGv result, int num);
|
TCGv gen_read_reg(TCGv result, int num);
|
||||||
TCGv gen_read_preg(TCGv pred, uint8_t num);
|
TCGv gen_read_preg(TCGv pred, uint8_t num);
|
||||||
|
TCGv get_result_gpr(DisasContext *ctx, int rnum);
|
||||||
TCGv get_result_pred(DisasContext *ctx, int pnum);
|
TCGv get_result_pred(DisasContext *ctx, int pnum);
|
||||||
void gen_log_reg_write(DisasContext *ctx, int rnum, TCGv val);
|
void gen_log_reg_write(DisasContext *ctx, int rnum, TCGv val);
|
||||||
void gen_log_pred_write(DisasContext *ctx, int pnum, TCGv val);
|
void gen_log_pred_write(DisasContext *ctx, int pnum, TCGv val);
|
||||||
|
@ -46,7 +46,7 @@
|
|||||||
#define SET_USR_FIELD(FIELD, VAL) \
|
#define SET_USR_FIELD(FIELD, VAL) \
|
||||||
do { \
|
do { \
|
||||||
if (pkt_need_commit) { \
|
if (pkt_need_commit) { \
|
||||||
fINSERT_BITS(env->new_value[HEX_REG_USR], \
|
fINSERT_BITS(env->new_value_usr, \
|
||||||
reg_field_info[FIELD].width, \
|
reg_field_info[FIELD].width, \
|
||||||
reg_field_info[FIELD].offset, (VAL)); \
|
reg_field_info[FIELD].offset, (VAL)); \
|
||||||
} else { \
|
} else { \
|
||||||
|
@ -45,6 +45,7 @@ TCGv hex_this_PC;
|
|||||||
TCGv hex_slot_cancelled;
|
TCGv hex_slot_cancelled;
|
||||||
TCGv hex_branch_taken;
|
TCGv hex_branch_taken;
|
||||||
TCGv hex_new_value[TOTAL_PER_THREAD_REGS];
|
TCGv hex_new_value[TOTAL_PER_THREAD_REGS];
|
||||||
|
TCGv hex_new_value_usr;
|
||||||
TCGv hex_reg_written[TOTAL_PER_THREAD_REGS];
|
TCGv hex_reg_written[TOTAL_PER_THREAD_REGS];
|
||||||
TCGv hex_new_pred_value[NUM_PREGS];
|
TCGv hex_new_pred_value[NUM_PREGS];
|
||||||
TCGv hex_pred_written;
|
TCGv hex_pred_written;
|
||||||
@ -547,12 +548,12 @@ static void gen_start_packet(DisasContext *ctx)
|
|||||||
tcg_gen_movi_tl(hex_pred_written, 0);
|
tcg_gen_movi_tl(hex_pred_written, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Preload the predicated registers into hex_new_value[i] */
|
/* Preload the predicated registers into get_result_gpr(ctx, i) */
|
||||||
if (ctx->need_commit &&
|
if (ctx->need_commit &&
|
||||||
!bitmap_empty(ctx->predicated_regs, TOTAL_PER_THREAD_REGS)) {
|
!bitmap_empty(ctx->predicated_regs, TOTAL_PER_THREAD_REGS)) {
|
||||||
int i = find_first_bit(ctx->predicated_regs, TOTAL_PER_THREAD_REGS);
|
int i = find_first_bit(ctx->predicated_regs, TOTAL_PER_THREAD_REGS);
|
||||||
while (i < TOTAL_PER_THREAD_REGS) {
|
while (i < TOTAL_PER_THREAD_REGS) {
|
||||||
tcg_gen_mov_tl(hex_new_value[i], hex_gpr[i]);
|
tcg_gen_mov_tl(get_result_gpr(ctx, i), hex_gpr[i]);
|
||||||
i = find_next_bit(ctx->predicated_regs, TOTAL_PER_THREAD_REGS,
|
i = find_next_bit(ctx->predicated_regs, TOTAL_PER_THREAD_REGS,
|
||||||
i + 1);
|
i + 1);
|
||||||
}
|
}
|
||||||
@ -667,7 +668,7 @@ static void gen_reg_writes(DisasContext *ctx)
|
|||||||
for (i = 0; i < ctx->reg_log_idx; i++) {
|
for (i = 0; i < ctx->reg_log_idx; i++) {
|
||||||
int reg_num = ctx->reg_log[i];
|
int reg_num = ctx->reg_log[i];
|
||||||
|
|
||||||
tcg_gen_mov_tl(hex_gpr[reg_num], hex_new_value[reg_num]);
|
tcg_gen_mov_tl(hex_gpr[reg_num], get_result_gpr(ctx, reg_num));
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* ctx->is_tight_loop is set when SA0 points to the beginning of the TB.
|
* ctx->is_tight_loop is set when SA0 points to the beginning of the TB.
|
||||||
@ -1180,10 +1181,14 @@ void hexagon_translate_init(void)
|
|||||||
offsetof(CPUHexagonState, gpr[i]),
|
offsetof(CPUHexagonState, gpr[i]),
|
||||||
hexagon_regnames[i]);
|
hexagon_regnames[i]);
|
||||||
|
|
||||||
snprintf(new_value_names[i], NAME_LEN, "new_%s", hexagon_regnames[i]);
|
if (i == HEX_REG_USR) {
|
||||||
hex_new_value[i] = tcg_global_mem_new(cpu_env,
|
hex_new_value[i] = NULL;
|
||||||
offsetof(CPUHexagonState, new_value[i]),
|
} else {
|
||||||
new_value_names[i]);
|
snprintf(new_value_names[i], NAME_LEN, "new_%s", hexagon_regnames[i]);
|
||||||
|
hex_new_value[i] = tcg_global_mem_new(cpu_env,
|
||||||
|
offsetof(CPUHexagonState, new_value[i]),
|
||||||
|
new_value_names[i]);
|
||||||
|
}
|
||||||
|
|
||||||
if (HEX_DEBUG) {
|
if (HEX_DEBUG) {
|
||||||
snprintf(reg_written_names[i], NAME_LEN, "reg_written_%s",
|
snprintf(reg_written_names[i], NAME_LEN, "reg_written_%s",
|
||||||
@ -1193,6 +1198,9 @@ void hexagon_translate_init(void)
|
|||||||
reg_written_names[i]);
|
reg_written_names[i]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
hex_new_value_usr = tcg_global_mem_new(cpu_env,
|
||||||
|
offsetof(CPUHexagonState, new_value_usr), "new_value_usr");
|
||||||
|
|
||||||
for (i = 0; i < NUM_PREGS; i++) {
|
for (i = 0; i < NUM_PREGS; i++) {
|
||||||
hex_pred[i] = tcg_global_mem_new(cpu_env,
|
hex_pred[i] = tcg_global_mem_new(cpu_env,
|
||||||
offsetof(CPUHexagonState, pred[i]),
|
offsetof(CPUHexagonState, pred[i]),
|
||||||
|
@ -191,6 +191,7 @@ extern TCGv hex_this_PC;
|
|||||||
extern TCGv hex_slot_cancelled;
|
extern TCGv hex_slot_cancelled;
|
||||||
extern TCGv hex_branch_taken;
|
extern TCGv hex_branch_taken;
|
||||||
extern TCGv hex_new_value[TOTAL_PER_THREAD_REGS];
|
extern TCGv hex_new_value[TOTAL_PER_THREAD_REGS];
|
||||||
|
extern TCGv hex_new_value_usr;
|
||||||
extern TCGv hex_reg_written[TOTAL_PER_THREAD_REGS];
|
extern TCGv hex_reg_written[TOTAL_PER_THREAD_REGS];
|
||||||
extern TCGv hex_new_pred_value[NUM_PREGS];
|
extern TCGv hex_new_pred_value[NUM_PREGS];
|
||||||
extern TCGv hex_pred_written;
|
extern TCGv hex_pred_written;
|
||||||
|
Loading…
Reference in New Issue
Block a user