All of lore.kernel.org
 help / color / mirror / Atom feed
From: Max Filippov <jcmvbkbc@gmail.com>
To: qemu-devel@nongnu.org
Cc: jcmvbkbc@gmail.com
Subject: [Qemu-devel] [PATCH v5 07/33] target-xtensa: implement conditional jumps
Date: Tue,  6 Sep 2011 03:55:31 +0400	[thread overview]
Message-ID: <1315266957-22979-8-git-send-email-jcmvbkbc@gmail.com> (raw)
In-Reply-To: <1315266957-22979-1-git-send-email-jcmvbkbc@gmail.com>

- BZ (comparison to zero);
- BI0 (comparison to signed immediate);
- BI1 (comparison to unsigned immediate);
- B (two registers comparison, bit sets comparison);
- BEQZ.N/BNEZ.N (narrow comparison to zero).

Signed-off-by: Max Filippov <jcmvbkbc@gmail.com>
---
 target-xtensa/translate.c |  164 +++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 164 insertions(+), 0 deletions(-)

diff --git a/target-xtensa/translate.c b/target-xtensa/translate.c
index 92547d2..9e26a65 100644
--- a/target-xtensa/translate.c
+++ b/target-xtensa/translate.c
@@ -121,6 +121,25 @@ static void gen_jumpi(DisasContext *dc, uint32_t dest, int slot)
     tcg_temp_free(tmp);
 }
 
+static void gen_brcond(DisasContext *dc, TCGCond cond,
+        TCGv_i32 t0, TCGv_i32 t1, uint32_t offset)
+{
+    int label = gen_new_label();
+
+    tcg_gen_brcond_i32(cond, t0, t1, label);
+    gen_jumpi(dc, dc->next_pc, 0);
+    gen_set_label(label);
+    gen_jumpi(dc, dc->pc + offset, 1);
+}
+
+static void gen_brcondi(DisasContext *dc, TCGCond cond,
+        TCGv_i32 t0, uint32_t t1, uint32_t offset)
+{
+    TCGv_i32 tmp = tcg_const_i32(t1);
+    gen_brcond(dc, cond, t0, tmp, offset);
+    tcg_temp_free(tmp);
+}
+
 static void disas_xtensa_insn(DisasContext *dc)
 {
 #define HAS_OPTION(opt) do { \
@@ -202,6 +221,14 @@ static void disas_xtensa_insn(DisasContext *dc)
     uint8_t b1 = ldub_code(dc->pc + 1);
     uint8_t b2 = ldub_code(dc->pc + 2);
 
+    static const uint32_t B4CONST[] = {
+        0xffffffff, 1, 2, 3, 4, 5, 6, 7, 8, 10, 12, 16, 32, 64, 128, 256
+    };
+
+    static const uint32_t B4CONSTU[] = {
+        32768, 65536, 2, 3, 4, 5, 6, 7, 8, 10, 12, 16, 32, 64, 128, 256
+    };
+
     if (OP0 >= 8) {
         dc->next_pc = dc->pc + 2;
         HAS_OPTION(XTENSA_OPTION_CODE_DENSITY);
@@ -395,10 +422,143 @@ static void disas_xtensa_insn(DisasContext *dc)
             gen_jumpi(dc, dc->pc + 4 + CALL_OFFSET_SE, 0);
             break;
 
+        case 1: /*BZ*/
+            {
+                static const TCGCond cond[] = {
+                    TCG_COND_EQ, /*BEQZ*/
+                    TCG_COND_NE, /*BNEZ*/
+                    TCG_COND_LT, /*BLTZ*/
+                    TCG_COND_GE, /*BGEZ*/
+                };
+
+                gen_brcondi(dc, cond[BRI12_M & 3], cpu_R[BRI12_S], 0,
+                        4 + BRI12_IMM12_SE);
+            }
+            break;
+
+        case 2: /*BI0*/
+            {
+                static const TCGCond cond[] = {
+                    TCG_COND_EQ, /*BEQI*/
+                    TCG_COND_NE, /*BNEI*/
+                    TCG_COND_LT, /*BLTI*/
+                    TCG_COND_GE, /*BGEI*/
+                };
+
+                gen_brcondi(dc, cond[BRI8_M & 3],
+                        cpu_R[BRI8_S], B4CONST[BRI8_R], 4 + BRI8_IMM8_SE);
+            }
+            break;
+
+        case 3: /*BI1*/
+            switch (BRI8_M) {
+            case 0: /*ENTRYw*/
+                HAS_OPTION(XTENSA_OPTION_WINDOWED_REGISTER);
+                break;
+
+            case 1: /*B1*/
+                switch (BRI8_R) {
+                case 0: /*BFp*/
+                    HAS_OPTION(XTENSA_OPTION_BOOLEAN);
+                    break;
+
+                case 1: /*BTp*/
+                    HAS_OPTION(XTENSA_OPTION_BOOLEAN);
+                    break;
+
+                case 8: /*LOOP*/
+                    break;
+
+                case 9: /*LOOPNEZ*/
+                    break;
+
+                case 10: /*LOOPGTZ*/
+                    break;
+
+                default: /*reserved*/
+                    break;
+
+                }
+                break;
+
+            case 2: /*BLTUI*/
+            case 3: /*BGEUI*/
+                gen_brcondi(dc, BRI8_M == 2 ? TCG_COND_LTU : TCG_COND_GEU,
+                        cpu_R[BRI8_S], B4CONSTU[BRI8_R], 4 + BRI8_IMM8_SE);
+                break;
+            }
+            break;
+
         }
         break;
 
     case 7: /*B*/
+        {
+            TCGCond eq_ne = (RRI8_R & 8) ? TCG_COND_NE : TCG_COND_EQ;
+
+            switch (RRI8_R & 7) {
+            case 0: /*BNONE*/ /*BANY*/
+                {
+                    TCGv_i32 tmp = tcg_temp_new_i32();
+                    tcg_gen_and_i32(tmp, cpu_R[RRI8_S], cpu_R[RRI8_T]);
+                    gen_brcondi(dc, eq_ne, tmp, 0, 4 + RRI8_IMM8_SE);
+                    tcg_temp_free(tmp);
+                }
+                break;
+
+            case 1: /*BEQ*/ /*BNE*/
+            case 2: /*BLT*/ /*BGE*/
+            case 3: /*BLTU*/ /*BGEU*/
+                {
+                    static const TCGCond cond[] = {
+                        [1] = TCG_COND_EQ,
+                        [2] = TCG_COND_LT,
+                        [3] = TCG_COND_LTU,
+                        [9] = TCG_COND_NE,
+                        [10] = TCG_COND_GE,
+                        [11] = TCG_COND_GEU,
+                    };
+                    gen_brcond(dc, cond[RRI8_R], cpu_R[RRI8_S], cpu_R[RRI8_T],
+                            4 + RRI8_IMM8_SE);
+                }
+                break;
+
+            case 4: /*BALL*/ /*BNALL*/
+                {
+                    TCGv_i32 tmp = tcg_temp_new_i32();
+                    tcg_gen_and_i32(tmp, cpu_R[RRI8_S], cpu_R[RRI8_T]);
+                    gen_brcond(dc, eq_ne, tmp, cpu_R[RRI8_T],
+                            4 + RRI8_IMM8_SE);
+                    tcg_temp_free(tmp);
+                }
+                break;
+
+            case 5: /*BBC*/ /*BBS*/
+                {
+                    TCGv_i32 bit = tcg_const_i32(1);
+                    TCGv_i32 tmp = tcg_temp_new_i32();
+                    tcg_gen_andi_i32(tmp, cpu_R[RRI8_T], 0x1f);
+                    tcg_gen_shl_i32(bit, bit, tmp);
+                    tcg_gen_and_i32(tmp, cpu_R[RRI8_S], bit);
+                    gen_brcondi(dc, eq_ne, tmp, 0, 4 + RRI8_IMM8_SE);
+                    tcg_temp_free(tmp);
+                    tcg_temp_free(bit);
+                }
+                break;
+
+            case 6: /*BBCI*/ /*BBSI*/
+            case 7:
+                {
+                    TCGv_i32 tmp = tcg_temp_new_i32();
+                    tcg_gen_andi_i32(tmp, cpu_R[RRI8_S],
+                            1 << (((RRI8_R & 1) << 4) | RRI8_T));
+                    gen_brcondi(dc, eq_ne, tmp, 0, 4 + RRI8_IMM8_SE);
+                    tcg_temp_free(tmp);
+                }
+                break;
+
+            }
+        }
         break;
 
 #define gen_narrow_load_store(type) do { \
@@ -431,6 +591,10 @@ static void disas_xtensa_insn(DisasContext *dc)
                     RRRN_R | (RRRN_T << 4) |
                     ((RRRN_T & 6) == 6 ? 0xffffff80 : 0));
         } else { /*BEQZ.Nn*/ /*BNEZ.Nn*/
+            TCGCond eq_ne = (RRRN_T & 4) ? TCG_COND_NE : TCG_COND_EQ;
+
+            gen_brcondi(dc, eq_ne, cpu_R[RRRN_S], 0,
+                    4 + (RRRN_R | ((RRRN_T & 3) << 4)));
         }
         break;
 
-- 
1.7.6

  parent reply	other threads:[~2011-09-05 23:56 UTC|newest]

Thread overview: 37+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2011-09-05 23:55 [Qemu-devel] [PATCH v5 00/32] target-xtensa: new target architecture Max Filippov
2011-09-05 23:55 ` [Qemu-devel] [PATCH v5 01/33] target-xtensa: add target stubs Max Filippov
2011-09-05 23:55 ` [Qemu-devel] [PATCH v5 02/33] target-xtensa: add target to the configure script Max Filippov
2011-09-05 23:55 ` [Qemu-devel] [PATCH v5 03/33] target-xtensa: implement disas_xtensa_insn Max Filippov
2011-09-05 23:55 ` [Qemu-devel] [PATCH v5 04/33] target-xtensa: implement narrow instructions Max Filippov
2011-09-05 23:55 ` [Qemu-devel] [PATCH v5 05/33] target-xtensa: implement RT0 group Max Filippov
2011-09-05 23:55 ` [Qemu-devel] [PATCH v5 06/33] target-xtensa: add sample board Max Filippov
2011-09-05 23:55 ` Max Filippov [this message]
2011-09-05 23:55 ` [Qemu-devel] [PATCH v5 08/33] target-xtensa: implement JX/RET0/CALLX Max Filippov
2011-09-05 23:55 ` [Qemu-devel] [PATCH v5 09/33] target-xtensa: add special and user registers Max Filippov
2011-09-05 23:55 ` [Qemu-devel] [PATCH v5 10/33] target-xtensa: implement RST3 group Max Filippov
2011-09-05 23:55 ` [Qemu-devel] [PATCH v5 11/33] target-xtensa: implement shifts (ST1 and RST1 groups) Max Filippov
2011-09-05 23:55 ` [Qemu-devel] [PATCH v5 12/33] target-xtensa: implement LSAI group Max Filippov
2011-09-05 23:55 ` [Qemu-devel] [PATCH v5 13/33] target-xtensa: mark reserved and TBD opcodes Max Filippov
2011-09-05 23:55 ` [Qemu-devel] [PATCH v5 14/33] target-xtensa: implement SYNC group Max Filippov
2011-09-05 23:55 ` [Qemu-devel] [PATCH v5 15/33] target-xtensa: implement CACHE group Max Filippov
2011-09-05 23:55 ` [Qemu-devel] [PATCH v5 16/33] target-xtensa: add PS register and access control Max Filippov
2011-09-05 23:55 ` [Qemu-devel] [PATCH v5 17/33] target-xtensa: implement exceptions Max Filippov
2011-09-05 23:55 ` [Qemu-devel] [PATCH v5 18/33] target-xtensa: implement RST2 group (32 bit mul/div/rem) Max Filippov
2011-09-05 23:55 ` [Qemu-devel] [PATCH v5 19/33] target-xtensa: implement windowed registers Max Filippov
2011-09-05 23:55 ` [Qemu-devel] [PATCH v5 20/33] target-xtensa: implement loop option Max Filippov
2011-09-05 23:55 ` [Qemu-devel] [PATCH v5 21/33] target-xtensa: implement extended L32R Max Filippov
2011-09-05 23:55 ` [Qemu-devel] [PATCH v5 22/33] target-xtensa: implement unaligned exception option Max Filippov
2011-09-05 23:55 ` [Qemu-devel] [PATCH v5 23/33] target-xtensa: implement SIMCALL Max Filippov
2011-09-05 23:55 ` [Qemu-devel] [PATCH v5 24/33] target-xtensa: implement interrupt option Max Filippov
2011-09-05 23:55 ` [Qemu-devel] [PATCH v5 25/33] target-xtensa: implement accurate window check Max Filippov
2011-09-05 23:55 ` [Qemu-devel] [PATCH v5 26/33] target-xtensa: implement CPENABLE and PRID SRs Max Filippov
2011-09-05 23:55 ` [Qemu-devel] [PATCH v5 27/33] target-xtensa: implement relocatable vectors Max Filippov
2011-09-05 23:55 ` [Qemu-devel] [PATCH v5 28/33] target-xtensa: add gdb support Max Filippov
2011-09-05 23:55 ` [Qemu-devel] [PATCH v5 29/33] target-xtensa: implement memory protection options Max Filippov
2011-09-05 23:55 ` [Qemu-devel] [PATCH v5 30/33] target-xtensa: implement boolean option Max Filippov
2011-09-05 23:55 ` [Qemu-devel] [PATCH v5 31/33] target-xtensa: add dc232b core and board Max Filippov
2011-09-05 23:55 ` [Qemu-devel] [PATCH v5 32/33] MAINTAINERS: add xtensa maintainer Max Filippov
2011-09-05 23:55 ` [Qemu-devel] [PATCH v5 33/33] target-xtensa: add regression testsuite Max Filippov
2011-09-10 18:36 ` [Qemu-devel] [PATCH v5 00/32] target-xtensa: new target architecture Blue Swirl
2011-09-10 20:55 ` Stefan Weil
2011-09-11 18:06   ` Max Filippov

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=1315266957-22979-8-git-send-email-jcmvbkbc@gmail.com \
    --to=jcmvbkbc@gmail.com \
    --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.