[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH v3 09/12] target-arm: A64: add support for BR, BLR a
From: |
Peter Maydell |
Subject: |
[Qemu-devel] [PATCH v3 09/12] target-arm: A64: add support for BR, BLR and RET insns |
Date: |
Thu, 5 Dec 2013 12:39:37 +0000 |
From: Alexander Graf <address@hidden>
Implement BR, BLR and RET. This is all of the 'unconditional
branch (register)' instruction category except for ERET
and DPRS (which are system mode only).
Signed-off-by: Alexander Graf <address@hidden>
[claudio: reimplemented on top of new decoder structure]
Signed-off-by: Claudio Fontana <address@hidden>
Signed-off-by: Peter Maydell <address@hidden>
Reviewed-by: Richard Henderson <address@hidden>
---
target-arm/translate-a64.c | 43 +++++++++++++++++++++++++++++++++++++++++--
1 file changed, 41 insertions(+), 2 deletions(-)
diff --git a/target-arm/translate-a64.c b/target-arm/translate-a64.c
index bab890d..ce2f841 100644
--- a/target-arm/translate-a64.c
+++ b/target-arm/translate-a64.c
@@ -384,10 +384,49 @@ static void disas_exc(DisasContext *s, uint32_t insn)
unsupported_encoding(s, insn);
}
-/* Unconditional branch (register) */
+/* C3.2.7 Unconditional branch (register)
+ * 31 25 24 21 20 16 15 10 9 5 4 0
+ * +---------------+-------+-------+-------+------+-------+
+ * | 1 1 0 1 0 1 1 | opc | op2 | op3 | Rn | op4 |
+ * +---------------+-------+-------+-------+------+-------+
+ */
static void disas_uncond_b_reg(DisasContext *s, uint32_t insn)
{
- unsupported_encoding(s, insn);
+ unsigned int opc, op2, op3, rn, op4;
+
+ opc = extract32(insn, 21, 4);
+ op2 = extract32(insn, 16, 5);
+ op3 = extract32(insn, 10, 6);
+ rn = extract32(insn, 5, 5);
+ op4 = extract32(insn, 0, 5);
+
+ if (op4 != 0x0 || op3 != 0x0 || op2 != 0x1f) {
+ unallocated_encoding(s);
+ return;
+ }
+
+ switch (opc) {
+ case 0: /* BR */
+ case 2: /* RET */
+ break;
+ case 1: /* BLR */
+ tcg_gen_movi_i64(cpu_reg(s, 30), s->pc);
+ break;
+ case 4: /* ERET */
+ case 5: /* DRPS */
+ if (rn != 0x1f) {
+ unallocated_encoding(s);
+ } else {
+ unsupported_encoding(s, insn);
+ }
+ return;
+ default:
+ unallocated_encoding(s);
+ return;
+ }
+
+ tcg_gen_mov_i64(cpu_pc, cpu_reg(s, rn));
+ s->is_jmp = DISAS_JUMP;
}
/* C3.2 Branches, exception generating and system instructions */
--
1.7.9.5
- [Qemu-devel] [PATCH v3 00/12] target-arm: A64 decoder, foundation plus branches, Peter Maydell, 2013/12/05
- [Qemu-devel] [PATCH v3 09/12] target-arm: A64: add support for BR, BLR and RET insns,
Peter Maydell <=
- [Qemu-devel] [PATCH v3 10/12] target-arm: A64: add support for conditional branches, Peter Maydell, 2013/12/05
- [Qemu-devel] [PATCH v3 02/12] target-arm: A64: add set_pc cpu method, Peter Maydell, 2013/12/05
- [Qemu-devel] [PATCH v3 06/12] target-arm: A64: provide skeleton for a64 insn decoding, Peter Maydell, 2013/12/05
- [Qemu-devel] [PATCH v3 12/12] target-arm: A64: add support for compare and branch imm, Peter Maydell, 2013/12/05
- [Qemu-devel] [PATCH v3 03/12] target-arm: A64: provide functions for accessing FPCR and FPSR, Peter Maydell, 2013/12/05
- [Qemu-devel] [PATCH v3 07/12] target-arm: A64: expand decoding skeleton for system instructions, Peter Maydell, 2013/12/05
- [Qemu-devel] [PATCH v3 01/12] target-arm: Split A64 from A32/T32 gen_intermediate_code_internal(), Peter Maydell, 2013/12/05
- [Qemu-devel] [PATCH v3 04/12] target-arm: Support fp registers in gdb stub, Peter Maydell, 2013/12/05
- [Qemu-devel] [PATCH v3 05/12] target-arm: A64: add stubs for a64 specific helpers, Peter Maydell, 2013/12/05