All of lore.kernel.org
 help / color / mirror / Atom feed
From: Aleksandar Markovic <aleksandar.markovic@rt-rk.com>
To: qemu-devel@nongnu.org
Cc: peter.maydell@linaro.org, amarkovic@wavecomp.com
Subject: [Qemu-devel] [PULL v2 11/44] target/mips: MXU: Add handler for an align instruction
Date: Mon, 31 Dec 2018 15:56:07 +0100	[thread overview]
Message-ID: <1546268200-26966-12-git-send-email-aleksandar.markovic@rt-rk.com> (raw)
In-Reply-To: <1546268200-26966-1-git-send-email-aleksandar.markovic@rt-rk.com>

From: Aleksandar Markovic <amarkovic@wavecomp.com>

Add translation handler for S32ALNI MXU instruction.

Reviewed-by: Stefan Markovic <smarkovic@wavecomp.com>
Signed-off-by: Aleksandar Markovic <amarkovic@wavecomp.com>
---
 target/mips/translate.c | 197 +++++++++++++++++++++++++++++++++++++++++++++++-
 1 file changed, 194 insertions(+), 3 deletions(-)

diff --git a/target/mips/translate.c b/target/mips/translate.c
index 3b94521..4dcab34 100644
--- a/target/mips/translate.c
+++ b/target/mips/translate.c
@@ -25098,6 +25098,199 @@ static void gen_mxu_Q8MAX_Q8MIN(DisasContext *ctx)
 
 
 /*
+ *                 MXU instruction category: align
+ *                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ *
+ *                       S32ALN     S32ALNI
+ */
+
+/*
+ *  S32ALNI XRc, XRb, XRa, optn3
+ *    Arrange bytes from XRb and XRc according to one of five sets of
+ *    rules determined by optn3, and place the result in XRa.
+ *
+ *   1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0
+ *  +-----------+-----+---+-----+-------+-------+-------+-----------+
+ *  |  SPECIAL2 |optn3|0 0|x x x|  XRc  |  XRb  |  XRa  |MXU__POOL16|
+ *  +-----------+-----+---+-----+-------+-------+-------+-----------+
+ *
+ */
+static void gen_mxu_S32ALNI(DisasContext *ctx)
+{
+    uint32_t optn3, pad, XRc, XRb, XRa;
+
+    optn3 = extract32(ctx->opcode,  23, 3);
+    pad   = extract32(ctx->opcode,  21, 2);
+    XRc   = extract32(ctx->opcode, 14, 4);
+    XRb   = extract32(ctx->opcode, 10, 4);
+    XRa   = extract32(ctx->opcode,  6, 4);
+
+    if (unlikely(pad != 0)) {
+        /* opcode padding incorrect -> do nothing */
+    } else if (unlikely(XRa == 0)) {
+        /* destination is zero register -> do nothing */
+    } else if (unlikely((XRb == 0) && (XRc == 0))) {
+        /* both operands zero registers -> just set destination to all 0s */
+        tcg_gen_movi_i32(mxu_gpr[XRa - 1], 0);
+    } else if (unlikely(XRb == 0)) {
+        /* XRb zero register -> just appropriatelly shift XRc into XRa */
+        switch (optn3) {
+        case MXU_OPTN3_PTN0:
+            tcg_gen_movi_i32(mxu_gpr[XRa - 1], 0);
+            break;
+        case MXU_OPTN3_PTN1:
+        case MXU_OPTN3_PTN2:
+        case MXU_OPTN3_PTN3:
+            tcg_gen_shri_i32(mxu_gpr[XRa - 1], mxu_gpr[XRc - 1],
+                             8 * (4 - optn3));
+            break;
+        case MXU_OPTN3_PTN4:
+            tcg_gen_mov_i32(mxu_gpr[XRa - 1], mxu_gpr[XRc - 1]);
+            break;
+        }
+    } else if (unlikely(XRc == 0)) {
+        /* XRc zero register -> just appropriatelly shift XRb into XRa */
+        switch (optn3) {
+        case MXU_OPTN3_PTN0:
+            tcg_gen_mov_i32(mxu_gpr[XRa - 1], mxu_gpr[XRb - 1]);
+            break;
+        case MXU_OPTN3_PTN1:
+        case MXU_OPTN3_PTN2:
+        case MXU_OPTN3_PTN3:
+            tcg_gen_shri_i32(mxu_gpr[XRa - 1], mxu_gpr[XRb - 1], 8 * optn3);
+            break;
+        case MXU_OPTN3_PTN4:
+            tcg_gen_movi_i32(mxu_gpr[XRa - 1], 0);
+            break;
+        }
+    } else if (unlikely(XRb == XRc)) {
+        /* both operands same -> just rotation or moving from any of them */
+        switch (optn3) {
+        case MXU_OPTN3_PTN0:
+        case MXU_OPTN3_PTN4:
+            tcg_gen_mov_i32(mxu_gpr[XRa - 1], mxu_gpr[XRb - 1]);
+            break;
+        case MXU_OPTN3_PTN1:
+        case MXU_OPTN3_PTN2:
+        case MXU_OPTN3_PTN3:
+            tcg_gen_rotli_i32(mxu_gpr[XRa - 1], mxu_gpr[XRb - 1], 8 * optn3);
+            break;
+        }
+    } else {
+        /* the most general case */
+        switch (optn3) {
+        case MXU_OPTN3_PTN0:
+            {
+                /*                                         */
+                /*         XRb                XRc          */
+                /*  +---------------+                      */
+                /*  | A   B   C   D |    E   F   G   H     */
+                /*  +-------+-------+                      */
+                /*          |                              */
+                /*         XRa                             */
+                /*                                         */
+
+                tcg_gen_mov_i32(mxu_gpr[XRa - 1], mxu_gpr[XRb - 1]);
+            }
+            break;
+        case MXU_OPTN3_PTN1:
+            {
+                /*                                         */
+                /*         XRb                 XRc         */
+                /*      +-------------------+              */
+                /*    A | B   C   D       E | F   G   H    */
+                /*      +---------+---------+              */
+                /*                |                        */
+                /*               XRa                       */
+                /*                                         */
+
+                TCGv_i32 t0 = tcg_temp_new();
+                TCGv_i32 t1 = tcg_temp_new();
+
+                tcg_gen_andi_i32(t0, mxu_gpr[XRb - 1], 0x00FFFFFF);
+                tcg_gen_shli_i32(t0, t0, 8);
+
+                tcg_gen_andi_i32(t1, mxu_gpr[XRc - 1], 0xFF000000);
+                tcg_gen_shri_i32(t1, t1, 24);
+
+                tcg_gen_or_i32(mxu_gpr[XRa - 1], t0, t1);
+
+                tcg_temp_free(t1);
+                tcg_temp_free(t0);
+            }
+            break;
+        case MXU_OPTN3_PTN2:
+            {
+                /*                                         */
+                /*         XRb                 XRc         */
+                /*          +-------------------+          */
+                /*    A   B | C   D       E   F | G   H    */
+                /*          +---------+---------+          */
+                /*                    |                    */
+                /*                   XRa                   */
+                /*                                         */
+
+                TCGv_i32 t0 = tcg_temp_new();
+                TCGv_i32 t1 = tcg_temp_new();
+
+                tcg_gen_andi_i32(t0, mxu_gpr[XRb - 1], 0x0000FFFF);
+                tcg_gen_shli_i32(t0, t0, 16);
+
+                tcg_gen_andi_i32(t1, mxu_gpr[XRc - 1], 0xFFFF0000);
+                tcg_gen_shri_i32(t1, t1, 16);
+
+                tcg_gen_or_i32(mxu_gpr[XRa - 1], t0, t1);
+
+                tcg_temp_free(t1);
+                tcg_temp_free(t0);
+            }
+            break;
+        case MXU_OPTN3_PTN3:
+            {
+                /*                                         */
+                /*         XRb                 XRc         */
+                /*              +-------------------+      */
+                /*    A   B   C | D       E   F   G | H    */
+                /*              +---------+---------+      */
+                /*                        |                */
+                /*                       XRa               */
+                /*                                         */
+
+                TCGv_i32 t0 = tcg_temp_new();
+                TCGv_i32 t1 = tcg_temp_new();
+
+                tcg_gen_andi_i32(t0, mxu_gpr[XRb - 1], 0x000000FF);
+                tcg_gen_shli_i32(t0, t0, 24);
+
+                tcg_gen_andi_i32(t1, mxu_gpr[XRc - 1], 0xFFFFFF00);
+                tcg_gen_shri_i32(t1, t1, 8);
+
+                tcg_gen_or_i32(mxu_gpr[XRa - 1], t0, t1);
+
+                tcg_temp_free(t1);
+                tcg_temp_free(t0);
+            }
+            break;
+        case MXU_OPTN3_PTN4:
+            {
+                /*                                         */
+                /*         XRb                 XRc         */
+                /*                     +---------------+   */
+                /*    A   B   C   D    | E   F   G   H |   */
+                /*                     +-------+-------+   */
+                /*                             |           */
+                /*                            XRa          */
+                /*                                         */
+
+                tcg_gen_mov_i32(mxu_gpr[XRa - 1], mxu_gpr[XRc - 1]);
+            }
+            break;
+        }
+    }
+}
+
+
+/*
  * Decoding engine for MXU
  * =======================
  */
@@ -25759,9 +25952,7 @@ static void decode_opc_mxu__pool16(CPUMIPSState *env, DisasContext *ctx)
         generate_exception_end(ctx, EXCP_RI);
         break;
     case OPC_MXU_S32ALNI:
-        /* TODO: Implement emulation of S32ALNI instruction. */
-        MIPS_INVAL("OPC_MXU_S32ALNI");
-        generate_exception_end(ctx, EXCP_RI);
+        gen_mxu_S32ALNI(ctx);
         break;
     case OPC_MXU_S32LUI:
         /* TODO: Implement emulation of S32LUI instruction. */
-- 
2.7.4

  parent reply	other threads:[~2018-12-31 14:58 UTC|newest]

Thread overview: 51+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-12-31 14:55 [Qemu-devel] [PULL v2 00/44] MIPS pull request for December 2018 - v2 Aleksandar Markovic
2018-12-31 14:55 ` [Qemu-devel] [PULL v2 01/44] MAINTAINERS: target/mips: Add MIPS files under default-configs directory Aleksandar Markovic
2018-12-31 14:55 ` [Qemu-devel] [PULL v2 02/44] MAINTAINERS: target/mips: Add filter for mips in email subjects Aleksandar Markovic
2018-12-31 14:55 ` [Qemu-devel] [PULL v2 03/44] MAINTAINERS: target/mips: Reorder items alphabetically Aleksandar Markovic
2018-12-31 14:56 ` [Qemu-devel] [PULL v2 04/44] MAINTAINERS: Add Aleksandar Rikalo as a reviewer for MIPS content Aleksandar Markovic
2018-12-31 14:56 ` [Qemu-devel] [PULL v2 05/44] atomics: Set ATOMIC_REG_SIZE=8 for MIPS n32 Aleksandar Markovic
2018-12-31 14:56 ` [Qemu-devel] [PULL v2 06/44] target/mips: MXU: Add missing opcodes/decoding for LX* instructions Aleksandar Markovic
2018-12-31 14:56 ` [Qemu-devel] [PULL v2 07/44] target/mips: MXU: Add generic naming for optn2 constants Aleksandar Markovic
2018-12-31 14:56 ` [Qemu-devel] [PULL v2 08/44] target/mips: MXU: Improve the comment containing MXU overview Aleksandar Markovic
2018-12-31 14:56 ` [Qemu-devel] [PULL v2 09/44] target/mips: MXU: Add handlers for logic instructions Aleksandar Markovic
2018-12-31 14:56 ` [Qemu-devel] [PULL v2 10/44] target/mips: MXU: Add handlers for max/min instructions Aleksandar Markovic
2018-12-31 14:56 ` Aleksandar Markovic [this message]
2018-12-31 14:56 ` [Qemu-devel] [PULL v2 12/44] target/mips: Support R5900 three-operand MADD and MADDU instructions Aleksandar Markovic
2018-12-31 14:56 ` [Qemu-devel] [PULL v2 13/44] target/mips: Support R5900 three-operand MADD1 and MADDU1 instructions Aleksandar Markovic
2018-12-31 14:56 ` [Qemu-devel] [PULL v2 14/44] disas: nanoMIPS: Fix types and format strings Aleksandar Markovic
2018-12-31 14:56 ` [Qemu-devel] [PULL v2 15/44] disas: nanoMIPS: Fix preamble text in nanomips.* files Aleksandar Markovic
2018-12-31 14:56 ` [Qemu-devel] [PULL v2 16/44] disas: nanoMIPS: Remove functions that are not used Aleksandar Markovic
2018-12-31 14:56 ` [Qemu-devel] [PULL v2 17/44] disas: nanoMIPS: Fix a function misnomer Aleksandar Markovic
2018-12-31 14:56 ` [Qemu-devel] [PULL v2 18/44] disas: nanoMIPS: Fix order of some invocations Aleksandar Markovic
2018-12-31 14:56 ` [Qemu-devel] [PULL v2 19/44] disas: nanoMIPS: Name some functions in a more descriptive way Aleksandar Markovic
2018-12-31 14:56 ` [Qemu-devel] [PULL v2 20/44] disas: nanoMIPS: Fix an FP-related misnomer 1 Aleksandar Markovic
2018-12-31 14:56 ` [Qemu-devel] [PULL v2 21/44] disas: nanoMIPS: Fix an FP-related misnomer 2 Aleksandar Markovic
2018-12-31 14:56 ` [Qemu-devel] [PULL v2 22/44] disas: nanoMIPS: Fix an FP-related misnomer 3 Aleksandar Markovic
2018-12-31 14:56 ` [Qemu-devel] [PULL v2 23/44] disas: nanoMIPS: Name more functions in a more descriptive way Aleksandar Markovic
2018-12-31 14:56 ` [Qemu-devel] [PULL v2 24/44] disas: nanoMIPS: Fix order of more invocations Aleksandar Markovic
2018-12-31 14:56 ` [Qemu-devel] [PULL v2 25/44] disas: nanoMIPS: Rename the decoder of 'gpr3' gpr encoding type Aleksandar Markovic
2018-12-31 14:56 ` [Qemu-devel] [PULL v2 26/44] disas: nanoMIPS: Comment " Aleksandar Markovic
2018-12-31 14:56 ` [Qemu-devel] [PULL v2 27/44] disas: nanoMIPS: Rename the decoder of 'gpr3.src.store' " Aleksandar Markovic
2018-12-31 14:56 ` [Qemu-devel] [PULL v2 28/44] disas: nanoMIPS: Comment " Aleksandar Markovic
2018-12-31 14:56 ` [Qemu-devel] [PULL v2 29/44] disas: nanoMIPS: Rename the decoder of 'gpr4' " Aleksandar Markovic
2018-12-31 14:56 ` [Qemu-devel] [PULL v2 30/44] disas: nanoMIPS: Comment " Aleksandar Markovic
2018-12-31 14:56 ` [Qemu-devel] [PULL v2 31/44] disas: nanoMIPS: Rename the decoder of 'gpr4.zero' " Aleksandar Markovic
2018-12-31 14:56 ` [Qemu-devel] [PULL v2 32/44] disas: nanoMIPS: Comment " Aleksandar Markovic
2018-12-31 14:56 ` [Qemu-devel] [PULL v2 33/44] disas: nanoMIPS: Rename the decoder of 'gpr2.reg1' " Aleksandar Markovic
2018-12-31 14:56 ` [Qemu-devel] [PULL v2 34/44] disas: nanoMIPS: Comment " Aleksandar Markovic
2018-12-31 14:56 ` [Qemu-devel] [PULL v2 35/44] disas: nanoMIPS: Rename the decoder of 'gpr2.reg2' " Aleksandar Markovic
2018-12-31 14:56 ` [Qemu-devel] [PULL v2 36/44] disas: nanoMIPS: Comment " Aleksandar Markovic
2018-12-31 14:56 ` [Qemu-devel] [PULL v2 37/44] disas: nanoMIPS: Rename the decoder of 'gpr1' " Aleksandar Markovic
2018-12-31 14:56 ` [Qemu-devel] [PULL v2 38/44] disas: nanoMIPS: Comment " Aleksandar Markovic
2018-12-31 14:56 ` [Qemu-devel] [PULL v2 39/44] disas: nanoMIPS: Reorder declarations and definitions of gpr decoders Aleksandar Markovic
2018-12-31 14:56 ` [Qemu-devel] [PULL v2 40/44] disas: nanoMIPS: Add a note on documentation Aleksandar Markovic
2018-12-31 14:56 ` [Qemu-devel] [PULL v2 41/44] tests/tcg: mips: Test R5900 three-operand MADD Aleksandar Markovic
2018-12-31 14:56 ` [Qemu-devel] [PULL v2 42/44] tests/tcg: mips: Test R5900 three-operand MADD1 Aleksandar Markovic
2018-12-31 14:56 ` [Qemu-devel] [PULL v2 43/44] tests/tcg: mips: Test R5900 three-operand MADDU Aleksandar Markovic
2018-12-31 14:56 ` [Qemu-devel] [PULL v2 44/44] tests/tcg: mips: Test R5900 three-operand MADDU1 Aleksandar Markovic
2019-01-03 13:23 ` [Qemu-devel] [PULL v2 00/44] MIPS pull request for December 2018 - v2 Peter Maydell
2019-01-03 13:32   ` Philippe Mathieu-Daudé
2019-01-03 14:06     ` Thomas Huth
2019-01-03 22:29       ` Richard Henderson
2019-01-09 10:47       ` Daniel P. Berrangé
2019-01-03 13:54   ` Aleksandar Markovic

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=1546268200-26966-12-git-send-email-aleksandar.markovic@rt-rk.com \
    --to=aleksandar.markovic@rt-rk.com \
    --cc=amarkovic@wavecomp.com \
    --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.