mirror of
https://github.com/yuzu-emu/unicorn.git
synced 2024-12-23 01:05:36 +00:00
tcg: Add temp_readonly
In most, but not all, places that we check for TEMP_FIXED, we are really testing that we do not modify the temporary. Backports e01fa97dea857a35be5bb8cce0d632a62e72c689
This commit is contained in:
parent
30739864d2
commit
b49c4639d1
|
@ -2605,7 +2605,7 @@ static void temp_load(TCGContext *, TCGTemp *, TCGRegSet, TCGRegSet, TCGRegSet);
|
||||||
mark it free; otherwise mark it dead. */
|
mark it free; otherwise mark it dead. */
|
||||||
static void temp_free_or_dead(TCGContext *s, TCGTemp *ts, int free_or_dead)
|
static void temp_free_or_dead(TCGContext *s, TCGTemp *ts, int free_or_dead)
|
||||||
{
|
{
|
||||||
if (ts->kind == TEMP_FIXED) {
|
if (temp_readonly(ts)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (ts->val_type == TEMP_VAL_REG) {
|
if (ts->val_type == TEMP_VAL_REG) {
|
||||||
|
@ -2629,7 +2629,7 @@ static inline void temp_dead(TCGContext *s, TCGTemp *ts)
|
||||||
static void temp_sync(TCGContext *s, TCGTemp *ts, TCGRegSet allocated_regs,
|
static void temp_sync(TCGContext *s, TCGTemp *ts, TCGRegSet allocated_regs,
|
||||||
TCGRegSet preferred_regs, int free_or_dead)
|
TCGRegSet preferred_regs, int free_or_dead)
|
||||||
{
|
{
|
||||||
if (ts->kind == TEMP_FIXED) {
|
if (temp_readonly(ts)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (!ts->mem_coherent) {
|
if (!ts->mem_coherent) {
|
||||||
|
@ -2812,8 +2812,7 @@ static void temp_save(TCGContext *s, TCGTemp *ts, TCGRegSet allocated_regs)
|
||||||
{
|
{
|
||||||
/* The liveness analysis already ensures that globals are back
|
/* The liveness analysis already ensures that globals are back
|
||||||
in memory. Keep an tcg_debug_assert for safety. */
|
in memory. Keep an tcg_debug_assert for safety. */
|
||||||
tcg_debug_assert(ts->val_type == TEMP_VAL_MEM
|
tcg_debug_assert(ts->val_type == TEMP_VAL_MEM || temp_readonly(ts));
|
||||||
|| ts->kind == TEMP_FIXED);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* save globals to their canonical location and assume they can be
|
/* save globals to their canonical location and assume they can be
|
||||||
|
@ -2871,7 +2870,7 @@ static void tcg_reg_alloc_do_movi(TCGContext *s, TCGTemp *ots,
|
||||||
TCGRegSet preferred_regs)
|
TCGRegSet preferred_regs)
|
||||||
{
|
{
|
||||||
/* ENV should not be modified. */
|
/* ENV should not be modified. */
|
||||||
tcg_debug_assert(ots->kind != TEMP_FIXED);
|
tcg_debug_assert(!temp_readonly(ots));
|
||||||
|
|
||||||
/* The movi is not explicitly generated here. */
|
/* The movi is not explicitly generated here. */
|
||||||
if (ots->val_type == TEMP_VAL_REG) {
|
if (ots->val_type == TEMP_VAL_REG) {
|
||||||
|
@ -2911,7 +2910,7 @@ static void tcg_reg_alloc_mov(TCGContext *s, const TCGOp *op)
|
||||||
ts = arg_temp(op->args[1]);
|
ts = arg_temp(op->args[1]);
|
||||||
|
|
||||||
/* ENV should not be modified. */
|
/* ENV should not be modified. */
|
||||||
tcg_debug_assert(ots->kind != TEMP_FIXED);
|
tcg_debug_assert(!temp_readonly(ots));
|
||||||
|
|
||||||
/* Note that otype != itype for no-op truncation. */
|
/* Note that otype != itype for no-op truncation. */
|
||||||
otype = ots->type;
|
otype = ots->type;
|
||||||
|
@ -2972,7 +2971,7 @@ static void tcg_reg_alloc_mov(TCGContext *s, const TCGOp *op)
|
||||||
* Store the source register into the destination slot
|
* Store the source register into the destination slot
|
||||||
* and leave the destination temp as TEMP_VAL_MEM.
|
* and leave the destination temp as TEMP_VAL_MEM.
|
||||||
*/
|
*/
|
||||||
assert(ots->kind != TEMP_FIXED);
|
assert(!temp_readonly(ots));
|
||||||
if (!ts->mem_allocated) {
|
if (!ts->mem_allocated) {
|
||||||
temp_allocate_frame(s, ots);
|
temp_allocate_frame(s, ots);
|
||||||
}
|
}
|
||||||
|
@ -3009,7 +3008,7 @@ static void tcg_reg_alloc_dup(TCGContext *s, const TCGOp *op)
|
||||||
its = arg_temp(op->args[1]);
|
its = arg_temp(op->args[1]);
|
||||||
|
|
||||||
/* ENV should not be modified. */
|
/* ENV should not be modified. */
|
||||||
tcg_debug_assert(ots->kind != TEMP_FIXED);
|
tcg_debug_assert(!temp_readonly(ots));
|
||||||
|
|
||||||
itype = its->type;
|
itype = its->type;
|
||||||
vece = TCGOP_VECE(op);
|
vece = TCGOP_VECE(op);
|
||||||
|
@ -3239,7 +3238,7 @@ static void tcg_reg_alloc_op(TCGContext *s, const TCGOp *op)
|
||||||
ts = arg_temp(arg);
|
ts = arg_temp(arg);
|
||||||
|
|
||||||
/* ENV should not be modified. */
|
/* ENV should not be modified. */
|
||||||
tcg_debug_assert(ts->kind != TEMP_FIXED);
|
tcg_debug_assert(!temp_readonly(ts));
|
||||||
|
|
||||||
if (arg_ct->oalias && !const_args[arg_ct->alias_index]) {
|
if (arg_ct->oalias && !const_args[arg_ct->alias_index]) {
|
||||||
reg = new_args[arg_ct->alias_index];
|
reg = new_args[arg_ct->alias_index];
|
||||||
|
@ -3280,7 +3279,7 @@ static void tcg_reg_alloc_op(TCGContext *s, const TCGOp *op)
|
||||||
ts = arg_temp(op->args[i]);
|
ts = arg_temp(op->args[i]);
|
||||||
|
|
||||||
/* ENV should not be modified. */
|
/* ENV should not be modified. */
|
||||||
tcg_debug_assert(ts->kind != TEMP_FIXED);
|
tcg_debug_assert(!temp_readonly(ts));
|
||||||
|
|
||||||
if (NEED_SYNC_ARG(i)) {
|
if (NEED_SYNC_ARG(i)) {
|
||||||
temp_sync(s, ts, o_allocated_regs, 0, IS_DEAD_ARG(i));
|
temp_sync(s, ts, o_allocated_regs, 0, IS_DEAD_ARG(i));
|
||||||
|
@ -3412,7 +3411,7 @@ static void tcg_reg_alloc_call(TCGContext *s, TCGOp *op)
|
||||||
ts = arg_temp(arg);
|
ts = arg_temp(arg);
|
||||||
|
|
||||||
/* ENV should not be modified. */
|
/* ENV should not be modified. */
|
||||||
tcg_debug_assert(ts->kind != TEMP_FIXED);
|
tcg_debug_assert(!temp_readonly(ts));
|
||||||
|
|
||||||
reg = tcg_target_call_oarg_regs[i];
|
reg = tcg_target_call_oarg_regs[i];
|
||||||
tcg_debug_assert(s->reg_to_temp[reg] == NULL);
|
tcg_debug_assert(s->reg_to_temp[reg] == NULL);
|
||||||
|
|
|
@ -875,6 +875,11 @@ struct TCGContext {
|
||||||
TCGLabel *exitreq_label; // gen_tb_start()
|
TCGLabel *exitreq_label; // gen_tb_start()
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static inline bool temp_readonly(TCGTemp *ts)
|
||||||
|
{
|
||||||
|
return ts->kind == TEMP_FIXED;
|
||||||
|
}
|
||||||
|
|
||||||
static inline size_t temp_idx(TCGContext *tcg_ctx, TCGTemp *ts)
|
static inline size_t temp_idx(TCGContext *tcg_ctx, TCGTemp *ts)
|
||||||
{
|
{
|
||||||
ptrdiff_t n = ts - tcg_ctx->temps;
|
ptrdiff_t n = ts - tcg_ctx->temps;
|
||||||
|
|
Loading…
Reference in a new issue