All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Lluís Vilanova" <vilanova@ac.upc.edu>
To: qemu-devel@nongnu.org
Cc: "Edgar E . Iglesias" <edgar.iglesias@gmail.com>,
	rth@twiddle.net, peter.maydell@linaro.org
Subject: [Qemu-devel] [PATCH v1 1/2] tcg: Add support for constant value promises
Date: Fri, 15 Jan 2016 16:35:05 +0100	[thread overview]
Message-ID: <145287210479.25408.17499099590726683703.stgit@localhost> (raw)
In-Reply-To: <145287209895.25408.12995870835200275306.stgit@localhost>

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 <vilanova@ac.upc.edu>
---
 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);
 
 /**

  reply	other threads:[~2016-01-15 15:35 UTC|newest]

Thread overview: 9+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-01-15 15:34 [Qemu-devel] [PATCH v1 0/2] tcg: Add support for constant value promises Lluís Vilanova
2016-01-15 15:35 ` Lluís Vilanova [this message]
2016-01-15 18:20   ` [Qemu-devel] [PATCH v1 1/2] " Richard Henderson
2016-01-15 20:12     ` Lluís Vilanova
2016-01-15 20:26       ` Richard Henderson
2016-01-16 20:57         ` Lluís Vilanova
2016-01-19 17:00           ` Edgar E. Iglesias
2016-01-19 21:17             ` Lluís Vilanova
2016-01-15 15:35 ` [Qemu-devel] [PATCH v1 2/2] gen-icount: Use " Lluís Vilanova

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=145287210479.25408.17499099590726683703.stgit@localhost \
    --to=vilanova@ac.upc.edu \
    --cc=edgar.iglesias@gmail.com \
    --cc=peter.maydell@linaro.org \
    --cc=qemu-devel@nongnu.org \
    --cc=rth@twiddle.net \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.