[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH 16/20] target/arm: Convert conditional branch insns to decodetree
|
From: |
Peter Maydell |
|
Subject: |
[PATCH 16/20] target/arm: Convert conditional branch insns to decodetree |
|
Date: |
Fri, 12 May 2023 15:41:02 +0100 |
Convert the immediate conditional branch insn B.cond to
decodetree.
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
---
target/arm/tcg/a64.decode | 2 ++
target/arm/tcg/translate-a64.c | 30 ++++++------------------------
2 files changed, 8 insertions(+), 24 deletions(-)
diff --git a/target/arm/tcg/a64.decode b/target/arm/tcg/a64.decode
index 68dc820ece0..8514235a723 100644
--- a/target/arm/tcg/a64.decode
+++ b/target/arm/tcg/a64.decode
@@ -128,3 +128,5 @@ CBZ . 011010 . ................... ..... @cbz
@tbz . ...... nz:1 ..... .............. rt:5 &tbz imm=%imm14
bitpos=%imm31_19
TBZ . 011011 . ..... .............. ..... @tbz
+
+B_cond 0101010 0 ................... 0 cond:4 imm=%imm19
diff --git a/target/arm/tcg/translate-a64.c b/target/arm/tcg/translate-a64.c
index bd59d0616e3..724dca8c579 100644
--- a/target/arm/tcg/translate-a64.c
+++ b/target/arm/tcg/translate-a64.c
@@ -1371,36 +1371,21 @@ static bool trans_TBZ(DisasContext *s, arg_tbz *a)
return true;
}
-/* Conditional branch (immediate)
- * 31 25 24 23 5 4 3 0
- * +---------------+----+---------------------+----+------+
- * | 0 1 0 1 0 1 0 | o1 | imm19 | o0 | cond |
- * +---------------+----+---------------------+----+------+
- */
-static void disas_cond_b_imm(DisasContext *s, uint32_t insn)
+static bool trans_B_cond(DisasContext *s, arg_B_cond *a)
{
- unsigned int cond;
- int64_t diff;
-
- if ((insn & (1 << 4)) || (insn & (1 << 24))) {
- unallocated_encoding(s);
- return;
- }
- diff = sextract32(insn, 5, 19) * 4;
- cond = extract32(insn, 0, 4);
-
reset_btype(s);
- if (cond < 0x0e) {
+ if (a->cond < 0x0e) {
/* genuinely conditional branches */
DisasLabel match = gen_disas_label(s);
- arm_gen_test_cc(cond, match.label);
+ arm_gen_test_cc(a->cond, match.label);
gen_goto_tb(s, 0, 4);
set_disas_label(s, match);
- gen_goto_tb(s, 1, diff);
+ gen_goto_tb(s, 1, a->imm);
} else {
/* 0xe and 0xf are both "always" conditions */
- gen_goto_tb(s, 0, diff);
+ gen_goto_tb(s, 0, a->imm);
}
+ return true;
}
/* HINT instruction group, including various allocated HINTs */
@@ -2385,9 +2370,6 @@ static void disas_uncond_b_reg(DisasContext *s, uint32_t
insn)
static void disas_b_exc_sys(DisasContext *s, uint32_t insn)
{
switch (extract32(insn, 25, 7)) {
- case 0x2a: /* Conditional branch (immediate) */
- disas_cond_b_imm(s, insn);
- break;
case 0x6a: /* Exception generation / System */
if (insn & (1 << 24)) {
if (extract32(insn, 22, 2) == 0) {
--
2.34.1
- [PATCH 08/20] target/arm: Replace bitmask64 with MAKE_64BIT_MASK, (continued)
- [PATCH 08/20] target/arm: Replace bitmask64 with MAKE_64BIT_MASK, Peter Maydell, 2023/05/12
- [PATCH 09/20] target/arm: Convert Logical (immediate) to decodetree, Peter Maydell, 2023/05/12
- [PATCH 10/20] target/arm: Convert Move wide (immediate) to decodetree, Peter Maydell, 2023/05/12
- [PATCH 11/20] target/arm: Convert Bitfield to decodetree, Peter Maydell, 2023/05/12
- [PATCH 12/20] target/arm: Convert Extract instructions to decodetree, Peter Maydell, 2023/05/12
- [PATCH 13/20] target/arm: Convert unconditional branch immediate to decodetree, Peter Maydell, 2023/05/12
- [PATCH 14/20] target/arm: Convert CBZ, CBNZ to decodetree, Peter Maydell, 2023/05/12
- [PATCH 16/20] target/arm: Convert conditional branch insns to decodetree,
Peter Maydell <=
- [PATCH 15/20] target/arm: Convert TBZ, TBNZ to decodetree, Peter Maydell, 2023/05/12
- [PATCH 17/20] target/arm: Convert BR, BLR, RET to decodetree, Peter Maydell, 2023/05/12
- [PATCH 18/20] target/arm: Convert BRA[AB]Z, BLR[AB]Z, RETA[AB] to decodetree, Peter Maydell, 2023/05/12
- [PATCH 20/20] target/arm: Convert ERET, ERETAA, ERETAB to decodetree, Peter Maydell, 2023/05/12
- [PATCH 19/20] target/arm: Convert BRAA, BRAB, BLRAA, BLRAB to decodetree, Peter Maydell, 2023/05/12