[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH v4 04/32] target-xtensa: implement narrow instructio
From: |
Max Filippov |
Subject: |
[Qemu-devel] [PATCH v4 04/32] target-xtensa: implement narrow instructions |
Date: |
Fri, 2 Sep 2011 00:45:32 +0400 |
Instructions with op0 >= 8 are 2 bytes long, others are 3 bytes long.
Signed-off-by: Max Filippov <address@hidden>
---
target-xtensa/translate.c | 54 +++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 54 insertions(+), 0 deletions(-)
diff --git a/target-xtensa/translate.c b/target-xtensa/translate.c
index 83d8837..7404098 100644
--- a/target-xtensa/translate.c
+++ b/target-xtensa/translate.c
@@ -106,6 +106,11 @@ static void gen_jump_slot(DisasContext *dc, TCGv dest, int
slot)
dc->is_jmp = DISAS_UPDATE;
}
+static void gen_jump(DisasContext *dc, TCGv dest)
+{
+ gen_jump_slot(dc, dest, -1);
+}
+
static void gen_jumpi(DisasContext *dc, uint32_t dest, int slot)
{
TCGv_i32 tmp = tcg_const_i32(dest);
@@ -377,22 +382,71 @@ static void disas_xtensa_insn(DisasContext *dc)
case 7: /*B*/
break;
+#define gen_narrow_load_store(type) do { \
+ TCGv_i32 addr = tcg_temp_new_i32(); \
+ tcg_gen_addi_i32(addr, cpu_R[RRRN_S], RRRN_R << 2); \
+ tcg_gen_qemu_##type(cpu_R[RRRN_T], addr, 0); \
+ tcg_temp_free(addr); \
+ } while (0)
+
case 8: /*L32I.Nn*/
+ gen_narrow_load_store(ld32u);
break;
case 9: /*S32I.Nn*/
+ gen_narrow_load_store(st32);
break;
+#undef gen_narrow_load_store
case 10: /*ADD.Nn*/
+ tcg_gen_add_i32(cpu_R[RRRN_R], cpu_R[RRRN_S], cpu_R[RRRN_T]);
break;
case 11: /*ADDI.Nn*/
+ tcg_gen_addi_i32(cpu_R[RRRN_R], cpu_R[RRRN_S], RRRN_T ? RRRN_T : -1);
break;
case 12: /*ST2n*/
+ if (RRRN_T < 8) { /*MOVI.Nn*/
+ tcg_gen_movi_i32(cpu_R[RRRN_S],
+ RRRN_R | (RRRN_T << 4) |
+ ((RRRN_T & 6) == 6 ? 0xffffff80 : 0));
+ } else { /*BEQZ.Nn*/ /*BNEZ.Nn*/
+ }
break;
case 13: /*ST3n*/
+ switch (RRRN_R) {
+ case 0: /*MOV.Nn*/
+ tcg_gen_mov_i32(cpu_R[RRRN_T], cpu_R[RRRN_S]);
+ break;
+
+ case 15: /*S3*/
+ switch (RRRN_T) {
+ case 0: /*RET.Nn*/
+ gen_jump(dc, cpu_R[0]);
+ break;
+
+ case 1: /*RETW.Nn*/
+ break;
+
+ case 2: /*BREAK.Nn*/
+ break;
+
+ case 3: /*NOP.Nn*/
+ break;
+
+ case 6: /*ILL.Nn*/
+ break;
+
+ default: /*reserved*/
+ break;
+ }
+ break;
+
+ default: /*reserved*/
+ break;
+ }
break;
default: /*reserved*/
--
1.7.6
- [Qemu-devel] [PATCH v4 00/32] target-xtensa: new target architecture, Max Filippov, 2011/09/01
- [Qemu-devel] [PATCH v4 02/32] target-xtensa: add target to the configure script, Max Filippov, 2011/09/01
- [Qemu-devel] [PATCH v4 05/32] target-xtensa: implement RT0 group, Max Filippov, 2011/09/01
- [Qemu-devel] [PATCH v4 04/32] target-xtensa: implement narrow instructions,
Max Filippov <=
- [Qemu-devel] [PATCH v4 06/32] target-xtensa: add sample board, Max Filippov, 2011/09/01
- [Qemu-devel] [PATCH v4 07/32] target-xtensa: implement conditional jumps, Max Filippov, 2011/09/01
- [Qemu-devel] [PATCH v4 03/32] target-xtensa: implement disas_xtensa_insn, Max Filippov, 2011/09/01
- [Qemu-devel] [PATCH v4 08/32] target-xtensa: implement JX/RET0/CALLX, Max Filippov, 2011/09/01
- [Qemu-devel] [PATCH v4 09/32] target-xtensa: add special and user registers, Max Filippov, 2011/09/01
- [Qemu-devel] [PATCH v4 01/32] target-xtensa: add target stubs, Max Filippov, 2011/09/01
- [Qemu-devel] [PATCH v4 10/32] target-xtensa: implement RST3 group, Max Filippov, 2011/09/01