[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH v1 1/2] tcg: Add support for constant value promises
From: |
Lluís Vilanova |
Subject: |
[Qemu-devel] [PATCH v1 1/2] tcg: Add support for constant value promises |
Date: |
Fri, 15 Jan 2016 16:35:05 +0100 |
User-agent: |
StGit/0.17.1-dirty |
A TCG constant value promise allows creating TCG code that works with a
constant whose value is not known until after the code has been
generated (e.g., a count of the instructions in a basic block).
Signed-off-by: Lluís Vilanova <address@hidden>
---
tcg/tcg-op.h | 6 ++++++
tcg/tcg.c | 33 +++++++++++++++++++++++++++++++++
tcg/tcg.h | 12 ++++++++++++
3 files changed, 51 insertions(+)
diff --git a/tcg/tcg-op.h b/tcg/tcg-op.h
index 4e20dc1..6966672 100644
--- a/tcg/tcg-op.h
+++ b/tcg/tcg-op.h
@@ -757,6 +757,7 @@ void tcg_gen_goto_tb(unsigned idx);
#if TARGET_LONG_BITS == 32
#define TCGv TCGv_i32
+#define TCGv_promise TCGv_promise_i32
#define tcg_temp_new() tcg_temp_new_i32()
#define tcg_global_reg_new tcg_global_reg_new_i32
#define tcg_global_mem_new tcg_global_mem_new_i32
@@ -769,6 +770,7 @@ void tcg_gen_goto_tb(unsigned idx);
#define tcg_gen_qemu_st_tl tcg_gen_qemu_st_i32
#else
#define TCGv TCGv_i64
+#define TCGv_promise TCGv_promise_i64
#define tcg_temp_new() tcg_temp_new_i64()
#define tcg_global_reg_new tcg_global_reg_new_i64
#define tcg_global_mem_new tcg_global_mem_new_i64
@@ -914,6 +916,8 @@ static inline void tcg_gen_qemu_st64(TCGv_i64 arg, TCGv
addr, int mem_index)
#define tcg_gen_deposit_tl tcg_gen_deposit_i64
#define tcg_const_tl tcg_const_i64
#define tcg_const_local_tl tcg_const_local_i64
+#define tcg_promise_tl tcg_promise_i64
+#define tcg_set_promise_tl tcg_set_promise_i64
#define tcg_gen_movcond_tl tcg_gen_movcond_i64
#define tcg_gen_add2_tl tcg_gen_add2_i64
#define tcg_gen_sub2_tl tcg_gen_sub2_i64
@@ -991,6 +995,8 @@ static inline void tcg_gen_qemu_st64(TCGv_i64 arg, TCGv
addr, int mem_index)
#define tcg_gen_deposit_tl tcg_gen_deposit_i32
#define tcg_const_tl tcg_const_i32
#define tcg_const_local_tl tcg_const_local_i32
+#define tcg_promise_tl tcg_promise_i32
+#define tcg_set_promise_tl tcg_set_promise_i32
#define tcg_gen_movcond_tl tcg_gen_movcond_i32
#define tcg_gen_add2_tl tcg_gen_add2_i32
#define tcg_gen_sub2_tl tcg_gen_sub2_i32
diff --git a/tcg/tcg.c b/tcg/tcg.c
index a163541..ea5426d 100644
--- a/tcg/tcg.c
+++ b/tcg/tcg.c
@@ -691,6 +691,39 @@ TCGv_i64 tcg_const_local_i64(int64_t val)
return t0;
}
+TCGv_i32 tcg_promise_i32(TCGv_promise_i32 *promise)
+{
+ int pi = tcg_ctx.gen_next_parm_idx;
+ *promise = (TCGv_promise_i32)&tcg_ctx.gen_opparam_buf[pi];
+ return tcg_const_i32(0xdeadcafe);
+}
+
+TCGv_i64 tcg_promise_i64(TCGv_promise_i64 *promise)
+{
+ int pi = tcg_ctx.gen_next_parm_idx;
+ *promise = (TCGv_promise_i64)&tcg_ctx.gen_opparam_buf[pi];
+ return tcg_const_i64(0xdeadcafe);
+}
+
+void tcg_set_promise_i32(TCGv_promise_i32 promise, int32_t val)
+{
+ TCGArg *args = (TCGArg *)promise;
+ /* parameter as set by tcg_gen_op2() from tcg_gen_movi_i32() */
+ args[1] = val;
+}
+
+void tcg_set_promise_i64(TCGv_promise_i64 promise, int64_t val)
+{
+ TCGArg *args = (TCGArg *)promise;
+ /* parameter as set by tcg_gen_op2() from tcg_gen_movi_i64() */
+#if TCG_TARGET_REG_BITS == 32
+ args[1] = (int32_t)val;
+ args[3] = (int32_t)(val >> 32);
+#else
+ args[1] = val;
+#endif
+}
+
#if defined(CONFIG_DEBUG_TCG)
void tcg_clear_temp_count(void)
{
diff --git a/tcg/tcg.h b/tcg/tcg.h
index a696922..79e83c8 100644
--- a/tcg/tcg.h
+++ b/tcg/tcg.h
@@ -308,6 +308,9 @@ typedef tcg_target_ulong TCGArg;
typedef struct TCGv_i32_d *TCGv_i32;
typedef struct TCGv_i64_d *TCGv_i64;
typedef struct TCGv_ptr_d *TCGv_ptr;
+typedef struct TCGv_promise_i32_d *TCGv_promise_i32;
+typedef struct TCGv_promise_i64_d *TCGv_promise_i64;
+typedef struct TCGv_promise_ptr_d *TCGv_promise_ptr;
static inline TCGv_i32 QEMU_ARTIFICIAL MAKE_TCGV_I32(intptr_t i)
{
@@ -746,6 +749,8 @@ void tcg_add_target_add_op_defs(const TCGTargetOpDef
*tdefs);
#define TCGV_PTR_TO_NAT(n) MAKE_TCGV_I32(GET_TCGV_PTR(n))
#define tcg_const_ptr(V) TCGV_NAT_TO_PTR(tcg_const_i32((intptr_t)(V)))
+#define tcg_promise_ptr(V) TCGV_NAT_TO_PTR(tcg_promise_i32((intptr_t)(V)))
+#define tcg_set_promise_ptr(V)
TCGV_NAT_TO_PTR(tcg_set_promise_i32((intptr_t)(V)))
#define tcg_global_reg_new_ptr(R, N) \
TCGV_NAT_TO_PTR(tcg_global_reg_new_i32((R), (N)))
#define tcg_global_mem_new_ptr(R, O, N) \
@@ -757,6 +762,8 @@ void tcg_add_target_add_op_defs(const TCGTargetOpDef
*tdefs);
#define TCGV_PTR_TO_NAT(n) MAKE_TCGV_I64(GET_TCGV_PTR(n))
#define tcg_const_ptr(V) TCGV_NAT_TO_PTR(tcg_const_i64((intptr_t)(V)))
+#define tcg_promise_ptr(V) TCGV_NAT_TO_PTR(tcg_promise_i64((intptr_t)(V)))
+#define tcg_set_promise_ptr(P, V) tcg_set_promise_i64(P, (intptr_t)(V)))
#define tcg_global_reg_new_ptr(R, N) \
TCGV_NAT_TO_PTR(tcg_global_reg_new_i64((R), (N)))
#define tcg_global_mem_new_ptr(R, O, N) \
@@ -780,6 +787,11 @@ TCGv_i64 tcg_const_i64(int64_t val);
TCGv_i32 tcg_const_local_i32(int32_t val);
TCGv_i64 tcg_const_local_i64(int64_t val);
+TCGv_i32 tcg_promise_i32(TCGv_promise_i32 *promise);
+TCGv_i64 tcg_promise_i64(TCGv_promise_i64 *promise);
+void tcg_set_promise_i32(TCGv_promise_i32 promise, int32_t val);
+void tcg_set_promise_i64(TCGv_promise_i64 promise, int64_t val);
+
TCGLabel *gen_new_label(void);
/**
- [Qemu-devel] [PATCH v1 0/2] tcg: Add support for constant value promises, Lluís Vilanova, 2016/01/15
- [Qemu-devel] [PATCH v1 1/2] tcg: Add support for constant value promises,
Lluís Vilanova <=
- Re: [Qemu-devel] [PATCH v1 1/2] tcg: Add support for constant value promises, Richard Henderson, 2016/01/15
- Re: [Qemu-devel] [PATCH v1 1/2] tcg: Add support for constant value promises, Lluís Vilanova, 2016/01/15
- Re: [Qemu-devel] [PATCH v1 1/2] tcg: Add support for constant value promises, Richard Henderson, 2016/01/15
- Re: [Qemu-devel] [PATCH v1 1/2] tcg: Add support for constant value promises, Lluís Vilanova, 2016/01/16
- Re: [Qemu-devel] [PATCH v1 1/2] tcg: Add support for constant value promises, Edgar E. Iglesias, 2016/01/19
- Re: [Qemu-devel] [PATCH v1 1/2] tcg: Add support for constant value promises, Lluís Vilanova, 2016/01/19
[Qemu-devel] [PATCH v1 2/2] gen-icount: Use constant value promises, Lluís Vilanova, 2016/01/15