[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH v3 13/26] tcg: synchronize globals for ops with side
From: |
Aurelien Jarno |
Subject: |
[Qemu-devel] [PATCH v3 13/26] tcg: synchronize globals for ops with side effects |
Date: |
Fri, 19 Oct 2012 23:39:02 +0200 |
Operations with side effects (in practice qemu_ld/st ops), only need to
synchronize globals to make sure the CPU state is consistent in case of
exception.
Reviewed-by: Richard Henderson <address@hidden>
Signed-off-by: Aurelien Jarno <address@hidden>
---
tcg/tcg.c | 33 ++++++++++++++++++++++++---------
tcg/tcg.h | 4 ++--
2 files changed, 26 insertions(+), 11 deletions(-)
diff --git a/tcg/tcg.c b/tcg/tcg.c
index 840e252..c9c6423 100644
--- a/tcg/tcg.c
+++ b/tcg/tcg.c
@@ -1407,9 +1407,8 @@ static void tcg_liveness_analysis(TCGContext *s)
/* if end of basic block, update */
if (def->flags & TCG_OPF_BB_END) {
tcg_la_bb_end(s, dead_temps, mem_temps);
- } else if (def->flags & TCG_OPF_CALL_CLOBBER) {
- /* globals should go back to memory */
- memset(dead_temps, 1, s->nb_globals);
+ } else if (def->flags & TCG_OPF_SIDE_EFFECTS) {
+ /* globals should be synced to memory */
memset(mem_temps, 1, s->nb_globals);
}
@@ -1670,6 +1669,23 @@ static void save_globals(TCGContext *s, TCGRegSet
allocated_regs)
}
}
+/* sync globals to their canonical location and assume they can be
+ read by the following code. 'allocated_regs' is used in case a
+ temporary registers needs to be allocated to store a constant. */
+static void sync_globals(TCGContext *s, TCGRegSet allocated_regs)
+{
+ int i;
+
+ for (i = 0; i < s->nb_globals; i++) {
+#ifdef USE_LIVENESS_ANALYSIS
+ assert(s->temps[i].val_type != TEMP_VAL_REG || s->temps[i].fixed_reg ||
+ s->temps[i].mem_coherent);
+#else
+ temp_sync(s, i, allocated_regs);
+#endif
+ }
+}
+
/* at the end of a basic block, we assume all temporaries are dead and
all globals are stored at their canonical location. */
static void tcg_reg_alloc_bb_end(TCGContext *s, TCGRegSet allocated_regs)
@@ -1907,12 +1923,11 @@ static void tcg_reg_alloc_op(TCGContext *s,
tcg_reg_free(s, reg);
}
}
- /* XXX: for load/store we could do that only for the slow path
- (i.e. when a memory callback is called) */
-
- /* store globals and free associated registers (we assume the insn
- can modify any global. */
- save_globals(s, allocated_regs);
+ }
+ if (def->flags & TCG_OPF_SIDE_EFFECTS) {
+ /* sync globals if the op has side effects and might trigger
+ an exception. */
+ sync_globals(s, allocated_regs);
}
/* satisfy the output constraints */
diff --git a/tcg/tcg.h b/tcg/tcg.h
index 73d3769..fb6d9ea 100644
--- a/tcg/tcg.h
+++ b/tcg/tcg.h
@@ -530,8 +530,8 @@ enum {
TCG_OPF_BB_END = 0x01,
/* Instruction clobbers call registers and potentially update globals. */
TCG_OPF_CALL_CLOBBER = 0x02,
- /* Instruction has side effects: it cannot be removed
- if its outputs are not used. */
+ /* Instruction has side effects: it cannot be removed if its outputs
+ are not used, and might trigger exceptions. */
TCG_OPF_SIDE_EFFECTS = 0x04,
/* Instruction operands are 64-bits (otherwise 32-bits). */
TCG_OPF_64BIT = 0x08,
--
1.7.10.4
- [Qemu-devel] [PATCH v3 24/26] target-sparc: rename helper flags, (continued)
- [Qemu-devel] [PATCH v3 24/26] target-sparc: rename helper flags, Aurelien Jarno, 2012/10/19
- [Qemu-devel] [PATCH 07/26] tcg: rewrite tcg_reg_alloc_mov(), Aurelien Jarno, 2012/10/19
- [Qemu-devel] [PATCH v3 20/26] target-mips: rename helper flags, Aurelien Jarno, 2012/10/19
- [Qemu-devel] [PATCH v3 26/26] tcg: remove compatiblity call flags, Aurelien Jarno, 2012/10/19
- [Qemu-devel] [PATCH v3 19/26] target-microblaze: rename helper flags, Aurelien Jarno, 2012/10/19
- [Qemu-devel] [PATCH v3 14/26] tcg: rework TCG helper flags, Aurelien Jarno, 2012/10/19
- [Qemu-devel] [PATCH v3 04/26] tcg: sync output arguments on liveness request, Aurelien Jarno, 2012/10/19
- [Qemu-devel] [PATCH v3 03/26] tcg: add temp_sync(), Aurelien Jarno, 2012/10/19
- [Qemu-devel] [PATCH v3 08/26] tcg: always mark dead input arguments as dead, Aurelien Jarno, 2012/10/19
- [Qemu-devel] [PATCH v3 12/26] tcg: forbid ld/st function to modify globals, Aurelien Jarno, 2012/10/19
- [Qemu-devel] [PATCH v3 13/26] tcg: synchronize globals for ops with side effects,
Aurelien Jarno <=
- [Qemu-devel] [PATCH v3 10/26] tcg: don't explicitly save globals and temps, Aurelien Jarno, 2012/10/19
- [Qemu-devel] [PATCH v3 16/26] target-arm: rename helper flags, Aurelien Jarno, 2012/10/19
- [Qemu-devel] [PATCH v3 22/26] target-s390x: rename helper flags, Aurelien Jarno, 2012/10/19
- Re: [Qemu-devel] [PATCH v3 00/26] tcg: rework liveness analysis and register allocator, Richard Henderson, 2012/10/21