qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] [PATCH v2] tci: Support deposit operations


From: Stefan Weil
Subject: Re: [Qemu-devel] [PATCH v2] tci: Support deposit operations
Date: Sun, 18 Nov 2012 20:39:22 +0100
User-agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.1.16) Gecko/20121027 Iceowl/1.0b1 Icedove/3.0.11

Am 18.09.2012 22:52, schrieb Stefan Weil:
The operations for INDEX_op_deposit_i32 and INDEX_op_deposit_i64
are now supported and enabled by default.

Signed-off-by: Stefan Weil<address@hidden>
---

The interpreter code for INDEX_op_deposit_i64 was buggy in v1 of this patch.

There is also an alternate implementation of the interpreter part which is
based on deposit32, deposit32 from bitops.h.

The implemention below is a little bit more efficient (smaller and faster).

Regards

Stefan Weil


  tcg/tci/tcg-target.c |   24 ++++++++++++++++++++++++
  tcg/tci/tcg-target.h |    4 ++--
  tci.c                |   22 ++++++++++++++++++++++
  3 files changed, 48 insertions(+), 2 deletions(-)

diff --git a/tcg/tci/tcg-target.c b/tcg/tci/tcg-target.c
index d272a90..5866b6b 100644
--- a/tcg/tci/tcg-target.c
+++ b/tcg/tci/tcg-target.c
@@ -123,6 +123,9 @@ static const TCGTargetOpDef tcg_target_op_defs[] = {
      { INDEX_op_rotl_i32, { R, RI, RI } },
      { INDEX_op_rotr_i32, { R, RI, RI } },
  #endif
+#if TCG_TARGET_HAS_deposit_i32
+    { INDEX_op_deposit_i32, { R, "0", R } },
+#endif

      { INDEX_op_brcond_i32, { R, RI } },

@@ -201,6 +204,9 @@ static const TCGTargetOpDef tcg_target_op_defs[] = {
      { INDEX_op_rotl_i64, { R, RI, RI } },
      { INDEX_op_rotr_i64, { R, RI, RI } },
  #endif
+#if TCG_TARGET_HAS_deposit_i64
+    { INDEX_op_deposit_i64, { R, "0", R } },
+#endif
      { INDEX_op_brcond_i64, { R, RI } },

  #if TCG_TARGET_HAS_ext8s_i64
@@ -657,6 +663,15 @@ static void tcg_out_op(TCGContext *s, TCGOpcode opc, const 
TCGArg *args,
          tcg_out_ri32(s, const_args[1], args[1]);
          tcg_out_ri32(s, const_args[2], args[2]);
          break;
+    case INDEX_op_deposit_i32:  /* Optional (TCG_TARGET_HAS_deposit_i32). */
+        tcg_out_r(s, args[0]);
+        tcg_out_r(s, args[1]);
+        tcg_out_r(s, args[2]);
+        assert(args[3]<= UINT8_MAX);
+        tcg_out8(s, args[3]);
+        assert(args[4]<= UINT8_MAX);
+        tcg_out8(s, args[4]);
+        break;

  #if TCG_TARGET_REG_BITS == 64
      case INDEX_op_mov_i64:
@@ -684,6 +699,15 @@ static void tcg_out_op(TCGContext *s, TCGOpcode opc, const 
TCGArg *args,
          tcg_out_ri64(s, const_args[1], args[1]);
          tcg_out_ri64(s, const_args[2], args[2]);
          break;
+    case INDEX_op_deposit_i64:  /* Optional (TCG_TARGET_HAS_deposit_i64). */
+        tcg_out_r(s, args[0]);
+        tcg_out_r(s, args[1]);
+        tcg_out_r(s, args[2]);
+        assert(args[3]<= UINT8_MAX);
+        tcg_out8(s, args[3]);
+        assert(args[4]<= UINT8_MAX);
+        tcg_out8(s, args[4]);
+        break;
      case INDEX_op_div_i64:      /* Optional (TCG_TARGET_HAS_div_i64). */
      case INDEX_op_divu_i64:     /* Optional (TCG_TARGET_HAS_div_i64). */
      case INDEX_op_rem_i64:      /* Optional (TCG_TARGET_HAS_div_i64). */
diff --git a/tcg/tci/tcg-target.h b/tcg/tci/tcg-target.h
index 30a0f21..f7ca8be 100644
--- a/tcg/tci/tcg-target.h
+++ b/tcg/tci/tcg-target.h
@@ -67,7 +67,7 @@
  #define TCG_TARGET_HAS_ext8u_i32        1
  #define TCG_TARGET_HAS_ext16u_i32       1
  #define TCG_TARGET_HAS_andc_i32         0
-#define TCG_TARGET_HAS_deposit_i32      0
+#define TCG_TARGET_HAS_deposit_i32      1
  #define TCG_TARGET_HAS_eqv_i32          0
  #define TCG_TARGET_HAS_nand_i32         0
  #define TCG_TARGET_HAS_nor_i32          0
@@ -80,7 +80,7 @@
  #define TCG_TARGET_HAS_bswap16_i64      1
  #define TCG_TARGET_HAS_bswap32_i64      1
  #define TCG_TARGET_HAS_bswap64_i64      1
-#define TCG_TARGET_HAS_deposit_i64      0
+#define TCG_TARGET_HAS_deposit_i64      1
  /* Not more than one of the next two defines must be 1. */
  #define TCG_TARGET_HAS_div_i64          0
  #define TCG_TARGET_HAS_div2_i64         0
diff --git a/tci.c b/tci.c
index a4f7b78..21535c7 100644
--- a/tci.c
+++ b/tci.c
@@ -690,6 +690,17 @@ tcg_target_ulong tcg_qemu_tb_exec(CPUArchState *cpustate, 
uint8_t *tb_ptr)
              tci_write_reg32(t0, (t1>>  t2) | (t1<<  (32 - t2)));
              break;
  #endif
+#if TCG_TARGET_HAS_deposit_i32
+        case INDEX_op_deposit_i32:
+            t0 = *tb_ptr++;
+            t1 = tci_read_r32(&tb_ptr);
+            t2 = tci_read_r32(&tb_ptr);
+            tmp16 = *tb_ptr++;
+            tmp8 = *tb_ptr++;
+            tmp32 = (((1<<  tmp8) - 1)<<  tmp16);
+            tci_write_reg32(t0, (t1&  ~tmp32) | ((t2<<  tmp16)&  tmp32));
+            break;
+#endif
          case INDEX_op_brcond_i32:
              t0 = tci_read_r32(&tb_ptr);
              t1 = tci_read_ri32(&tb_ptr);
@@ -937,6 +948,17 @@ tcg_target_ulong tcg_qemu_tb_exec(CPUArchState *cpustate, 
uint8_t *tb_ptr)
              TODO();
              break;
  #endif
+#if TCG_TARGET_HAS_deposit_i64
+        case INDEX_op_deposit_i64:
+            t0 = *tb_ptr++;
+            t1 = tci_read_r64(&tb_ptr);
+            t2 = tci_read_r64(&tb_ptr);
+            tmp16 = *tb_ptr++;
+            tmp8 = *tb_ptr++;
+            tmp64 = (((1ULL<<  tmp8) - 1)<<  tmp16);
+            tci_write_reg64(t0, (t1&  ~tmp64) | ((t2<<  tmp16)&  tmp64));
+            break;
+#endif
          case INDEX_op_brcond_i64:
              t0 = tci_read_r64(&tb_ptr);
              t1 = tci_read_ri64(&tb_ptr);

Blue, could you please commit either this patch or
http://patchwork.ozlabs.org/patch/184852/

Thanks,
Stefan




reply via email to

[Prev in Thread] Current Thread [Next in Thread]