All of lore.kernel.org
 help / color / mirror / Atom feed
From: Richard Henderson <rth@twiddle.net>
To: qemu-devel@nongnu.org
Cc: peter.maydell@linaro.org
Subject: [Qemu-devel] [PATCH v15 29/33] target-tilegx: Handle mtspr, mfspr
Date: Wed,  2 Sep 2015 18:31:21 -0700	[thread overview]
Message-ID: <1441243885-7495-30-git-send-email-rth@twiddle.net> (raw)
In-Reply-To: <1441243885-7495-1-git-send-email-rth@twiddle.net>

Signed-off-by: Richard Henderson <rth@twiddle.net>
---
 target-tilegx/translate.c | 76 +++++++++++++++++++++++++++++++++++++++++++++--
 1 file changed, 73 insertions(+), 3 deletions(-)

diff --git a/target-tilegx/translate.c b/target-tilegx/translate.c
index 609592a..9418799 100644
--- a/target-tilegx/translate.c
+++ b/target-tilegx/translate.c
@@ -24,6 +24,7 @@
 #include "tcg-op.h"
 #include "exec/cpu_ldst.h"
 #include "opcode_tilegx.h"
+#include "spr_def_64.h"
 
 #define FMT64X                          "%016" PRIx64
 
@@ -1222,9 +1223,6 @@ static TileExcp gen_rri_opcode(DisasContext *dc, unsigned opext,
         tcg_gen_addi_tl(dest_gr(dc, srca), tsrca, imm);
         mnemonic = "ldna_add";
         break;
-    case OE_IM(MFSPR, X1):
-    case OE_IM(MTSPR, X1):
-        return TILEGX_EXCP_OPCODE_UNIMPLEMENTED;
     case OE_IM(ORI, X0):
     case OE_IM(ORI, X1):
         tcg_gen_ori_tl(tdest, tsrca, imm);
@@ -1524,6 +1522,74 @@ static TileExcp gen_jump_opcode_x1(DisasContext *dc, unsigned ext, int off)
     return TILEGX_EXCP_NONE;
 }
 
+typedef struct {
+    const char *name;
+    intptr_t offset;
+    void (*get)(TCGv, TCGv_ptr);
+    void (*put)(TCGv_ptr, TCGv);
+} TileSPR;
+
+static const TileSPR *find_spr(unsigned spr)
+{
+    /* Allow the compiler to construct the binary search tree.  */
+#define D(N, O, G, P) \
+    case SPR_##N: { static const TileSPR x = { #N, O, G, P }; return &x; }
+
+    switch (spr) {
+    D(CMPEXCH_VALUE,
+      offsetof(CPUTLGState, spregs[TILEGX_SPR_CMPEXCH]), 0, 0)
+    D(INTERRUPT_CRITICAL_SECTION,
+      offsetof(CPUTLGState, spregs[TILEGX_SPR_CRITICAL_SEC]), 0, 0)
+    D(SIM_CONTROL,
+      offsetof(CPUTLGState, spregs[TILEGX_SPR_SIM_CONTROL]), 0, 0)
+    }
+
+#undef D
+
+    qemu_log_mask(LOG_UNIMP, "UNIMP SPR %u\n", spr);
+    return NULL;
+}
+
+static TileExcp gen_mtspr_x1(DisasContext *dc, unsigned spr, unsigned srca)
+{
+    const TileSPR *def = find_spr(spr);
+    TCGv tsrca;
+
+    if (def == NULL) {
+        qemu_log_mask(CPU_LOG_TB_IN_ASM, "mtspr spr[%u], %s", spr, reg_names[srca]);
+        return TILEGX_EXCP_OPCODE_UNKNOWN;
+    }
+
+    tsrca = load_gr(dc, srca);
+    if (def->put) {
+        def->put(cpu_env, tsrca);
+    } else {
+        tcg_gen_st_tl(tsrca, cpu_env, def->offset);
+    }
+    qemu_log_mask(CPU_LOG_TB_IN_ASM, "mtspr %s, %s", def->name, reg_names[srca]);
+    return TILEGX_EXCP_NONE;
+}
+
+static TileExcp gen_mfspr_x1(DisasContext *dc, unsigned dest, unsigned spr)
+{
+    const TileSPR *def = find_spr(spr);
+    TCGv tdest;
+
+    if (def == NULL) {
+        qemu_log_mask(CPU_LOG_TB_IN_ASM, "mtspr %s, spr[%u]", reg_names[dest], spr);
+        return TILEGX_EXCP_OPCODE_UNKNOWN;
+    }
+
+    tdest = dest_gr(dc, dest);
+    if (def->get) {
+        def->get(tdest, cpu_env);
+    } else {
+        tcg_gen_ld_tl(tdest, cpu_env, def->offset);
+    }
+    qemu_log_mask(CPU_LOG_TB_IN_ASM, "mfspr %s, %s", reg_names[dest], def->name);
+    return TILEGX_EXCP_NONE;
+}
+
 static TileExcp decode_y0(DisasContext *dc, tilegx_bundle_bits bundle)
 {
     unsigned opc = get_Opcode_Y0(bundle);
@@ -1778,6 +1844,10 @@ static TileExcp decode_x1(DisasContext *dc, tilegx_bundle_bits bundle)
             return gen_st_add_opcode(dc, srca, srcb, imm, MO_TEQ, "stnt_add");
         case ST_ADD_IMM8_OPCODE_X1:
             return gen_st_add_opcode(dc, srca, srcb, imm, MO_TEQ, "st_add");
+        case MFSPR_IMM8_OPCODE_X1:
+            return gen_mfspr_x1(dc, dest, get_MF_Imm14_X1(bundle));
+        case MTSPR_IMM8_OPCODE_X1:
+            return gen_mtspr_x1(dc, get_MT_Imm14_X1(bundle), srca);
         }
         imm = (int8_t)get_Imm8_X1(bundle);
         return gen_rri_opcode(dc, OE(opc, ext, X1), dest, srca, imm);
-- 
2.4.3

  parent reply	other threads:[~2015-09-03  1:31 UTC|newest]

Thread overview: 44+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-09-03  1:30 [Qemu-devel] [PATCH v15 00/33] TileGX basic instructions Richard Henderson
2015-09-03  1:30 ` [Qemu-devel] [PATCH v15 01/33] linux-user: tilegx: Firstly add architecture related features Richard Henderson
2015-09-03 14:53   ` Eric Blake
     [not found]     ` <55E96A16.5060206@hotmail.com>
2015-09-04  9:52       ` Chen Gang
2015-09-03  1:30 ` [Qemu-devel] [PATCH v15 02/33] linux-user: Support tilegx architecture in linux-user Richard Henderson
2015-09-03  1:30 ` [Qemu-devel] [PATCH v15 03/33] linux-user: Conditionalize syscalls which are not defined in tilegx Richard Henderson
2015-09-03  1:30 ` [Qemu-devel] [PATCH v15 04/33] target-tilegx: Add opcode basic implementation from Tilera Corporation Richard Henderson
2015-09-03  1:30 ` [Qemu-devel] [PATCH v15 05/33] target-tilegx: Modify opcode_tilegx.h to fit QEMU usage Richard Henderson
2015-09-03  1:30 ` [Qemu-devel] [PATCH v15 06/33] target-tilegx: Modify _SPECIAL_ opcodes Richard Henderson
2015-09-03  1:30 ` [Qemu-devel] [PATCH v15 07/33] target-tilegx: Fix LDNA_ADD_IMM8_OPCODE_X1 Richard Henderson
2015-09-03  1:31 ` [Qemu-devel] [PATCH v15 08/33] target-tilegx: Add special register information from Tilera Corporation Richard Henderson
2015-09-03  1:31 ` [Qemu-devel] [PATCH v15 09/33] target-tilegx: Add cpu basic features for linux-user Richard Henderson
2015-09-03  1:31 ` [Qemu-devel] [PATCH v15 10/33] target-tilegx: Add several helpers for instructions translation Richard Henderson
2015-09-03  1:31 ` [Qemu-devel] [PATCH v15 11/33] target-tilegx: Framework for decoding bundles Richard Henderson
2015-09-03  1:31 ` [Qemu-devel] [PATCH v15 12/33] target-tilegx: Generate SEGV properly Richard Henderson
2015-09-03  1:31 ` [Qemu-devel] [PATCH v15 13/33] target-tilegx: Add TILE-Gx building files Richard Henderson
2015-09-03  1:31 ` [Qemu-devel] [PATCH v15 14/33] target-tilegx: Handle simple logical operations Richard Henderson
2015-09-04 16:48   ` Peter Maydell
2015-09-03  1:31 ` [Qemu-devel] [PATCH v15 15/33] target-tilegx: Handle arithmetic instructions Richard Henderson
2015-09-03  1:31 ` [Qemu-devel] [PATCH v15 16/33] target-tilegx: Handle most bit manipulation instructions Richard Henderson
2015-09-04 16:51   ` Peter Maydell
2015-09-03  1:31 ` [Qemu-devel] [PATCH v15 17/33] target-tilegx: Handle basic load and store instructions Richard Henderson
2015-09-03  1:31 ` [Qemu-devel] [PATCH v15 18/33] target-tilegx: Handle post-increment " Richard Henderson
2015-09-03  1:31 ` [Qemu-devel] [PATCH v15 19/33] target-tilegx: Handle unconditional jump instructions Richard Henderson
2015-09-03  1:31 ` [Qemu-devel] [PATCH v15 20/33] target-tilegx: Handle conditional branch instructions Richard Henderson
2015-09-03  1:31 ` [Qemu-devel] [PATCH v15 21/33] target-tilegx: Handle comparison instructions Richard Henderson
2015-09-03  1:31 ` [Qemu-devel] [PATCH v15 22/33] target-tilegx: Implement system and memory management instructions Richard Henderson
2015-09-04 16:54   ` Peter Maydell
2015-09-03  1:31 ` [Qemu-devel] [PATCH v15 23/33] target-tilegx: Handle bitfield instructions Richard Henderson
2015-09-03  1:31 ` [Qemu-devel] [PATCH v15 24/33] target-tilegx: Handle shift instructions Richard Henderson
2015-09-04 16:56   ` Peter Maydell
2015-09-03  1:31 ` [Qemu-devel] [PATCH v15 25/33] target-tilegx: Handle conditional move instructions Richard Henderson
2015-09-03  1:31 ` [Qemu-devel] [PATCH v15 26/33] target-tilegx: Handle scalar multiply instructions Richard Henderson
2015-09-03  1:31 ` [Qemu-devel] [PATCH v15 27/33] target-tilegx: Handle mask instructions Richard Henderson
2015-09-03  1:31 ` [Qemu-devel] [PATCH v15 28/33] target-tilegx: Handle v1cmpeq, v1cmpne Richard Henderson
2015-09-03  1:31 ` Richard Henderson [this message]
2015-09-04 16:58   ` [Qemu-devel] [PATCH v15 29/33] target-tilegx: Handle mtspr, mfspr Peter Maydell
2015-09-03  1:31 ` [Qemu-devel] [PATCH v15 30/33] target-tilegx: Handle atomic instructions Richard Henderson
2015-09-04 17:03   ` Peter Maydell
2015-09-03  1:31 ` [Qemu-devel] [PATCH v15 31/33] target-tilegx: Handle v4int_l/h Richard Henderson
2015-09-03  1:31 ` [Qemu-devel] [PATCH v15 32/33] target-tilegx: Handle v1shli, v1shrui Richard Henderson
2015-09-03  1:31 ` [Qemu-devel] [PATCH v15 33/33] target-tilegx: Handle v1shl, v1shru, v1shrs Richard Henderson
2015-09-03 15:02   ` Eric Blake
2015-09-03 15:38     ` Richard Henderson

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=1441243885-7495-30-git-send-email-rth@twiddle.net \
    --to=rth@twiddle.net \
    --cc=peter.maydell@linaro.org \
    --cc=qemu-devel@nongnu.org \
    /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.