From c45018e465c57a78d2e1ebcde242319b2261de56 Mon Sep 17 00:00:00 2001 From: Pierre Pronchery Date: Sun, 12 Jun 2011 15:03:26 +0000 Subject: [PATCH] Improving ARM support --- src/arch/arm.ins | 40 ++++++++++++++++++++++++++++++++++++++-- test/arm.S | 4 ++++ 2 files changed, 42 insertions(+), 2 deletions(-) diff --git a/src/arch/arm.ins b/src/arch/arm.ins index 532c96c..8084689 100644 --- a/src/arch/arm.ins +++ b/src/arch/arm.ins @@ -57,6 +57,12 @@ #define OPNOP AO_IMMEDIATE(0, 32, 0) #define OP_R AO_REGISTER(0, 32, 0) +/* block data transfer */ +#define OPBDTL(cond) (cond | (0x4 << 25) | (0x1 << 20)) +#define OPBDTLF (32 << AOD_SIZE) +#define OPBDTS(cond) (cond | (0x4 << 25)) +#define OPBDTSF (32 << AOD_SIZE) + /* branch, branch with link */ #define OPB(cond) (cond | (0x5 << 25)) #define OPBF (32 << AOD_SIZE) @@ -266,8 +272,23 @@ { "eoral", OPDATA(al,eor), OPDATAF,OP_R, OP_R, OP_R }, #if 1 /* FIXME implement correctly */ { "ldc", 0x00000000, OPNOP, AOT_NONE, AOT_NONE, AOT_NONE }, -{ "ldm", 0x00000000, OPNOP, AOT_NONE, AOT_NONE, AOT_NONE }, #endif +{ "ldm", OPBDTL(al), OPBDTLF,OP_R, OP_R, OP_R }, +{ "ldmeq", OPBDTL(eq), OPBDTLF,OP_R, OP_R, OP_R }, +{ "ldmne", OPBDTL(ne), OPBDTLF,OP_R, OP_R, OP_R }, +{ "ldmcs", OPBDTL(cs), OPBDTLF,OP_R, OP_R, OP_R }, +{ "ldmcc", OPBDTL(cc), OPBDTLF,OP_R, OP_R, OP_R }, +{ "ldmmi", OPBDTL(mi), OPBDTLF,OP_R, OP_R, OP_R }, +{ "ldmpl", OPBDTL(pl), OPBDTLF,OP_R, OP_R, OP_R }, +{ "ldmvs", OPBDTL(vs), OPBDTLF,OP_R, OP_R, OP_R }, +{ "ldmvc", OPBDTL(vc), OPBDTLF,OP_R, OP_R, OP_R }, +{ "ldmhi", OPBDTL(hi), OPBDTLF,OP_R, OP_R, OP_R }, +{ "ldmls", OPBDTL(ls), OPBDTLF,OP_R, OP_R, OP_R }, +{ "ldmge", OPBDTL(ge), OPBDTLF,OP_R, OP_R, OP_R }, +{ "ldmlt", OPBDTL(lt), OPBDTLF,OP_R, OP_R, OP_R }, +{ "ldmgt", OPBDTL(gt), OPBDTLF,OP_R, OP_R, OP_R }, +{ "ldmle", OPBDTL(ge), OPBDTLF,OP_R, OP_R, OP_R }, +{ "ldmal", OPBDTL(al), OPBDTLF,OP_R, OP_R, OP_R }, /* ldr */ { "ldr", OPSDTL(al), OPSDTLF,OP_R, OP_R, OP_R }, { "ldreq", OPSDTL(eq), OPSDTLF,OP_R, OP_R, OP_R }, @@ -418,8 +439,23 @@ { "sbcal", OPDATA(al,sbc), OPDATAF,OP_R, OP_R, OP_R }, #if 1 /* FIXME implement correctly */ { "stc", 0x00000000, OPNOP, AOT_NONE, AOT_NONE, AOT_NONE }, -{ "stm", 0x00000000, OPNOP, AOT_NONE, AOT_NONE, AOT_NONE }, #endif +{ "stm", OPBDTS(al), OPBDTSF,OP_R, OP_R, OP_R }, +{ "stmeq", OPBDTS(eq), OPBDTSF,OP_R, OP_R, OP_R }, +{ "stmne", OPBDTS(ne), OPBDTSF,OP_R, OP_R, OP_R }, +{ "stmcs", OPBDTS(cs), OPBDTSF,OP_R, OP_R, OP_R }, +{ "stmcc", OPBDTS(cc), OPBDTSF,OP_R, OP_R, OP_R }, +{ "stmmi", OPBDTS(mi), OPBDTSF,OP_R, OP_R, OP_R }, +{ "stmpl", OPBDTS(pl), OPBDTSF,OP_R, OP_R, OP_R }, +{ "stmvs", OPBDTS(vs), OPBDTSF,OP_R, OP_R, OP_R }, +{ "stmvc", OPBDTS(vc), OPBDTSF,OP_R, OP_R, OP_R }, +{ "stmhi", OPBDTS(hi), OPBDTSF,OP_R, OP_R, OP_R }, +{ "stmls", OPBDTS(ls), OPBDTSF,OP_R, OP_R, OP_R }, +{ "stmge", OPBDTS(ge), OPBDTSF,OP_R, OP_R, OP_R }, +{ "stmlt", OPBDTS(lt), OPBDTSF,OP_R, OP_R, OP_R }, +{ "stmgt", OPBDTS(gt), OPBDTSF,OP_R, OP_R, OP_R }, +{ "stmle", OPBDTS(le), OPBDTSF,OP_R, OP_R, OP_R }, +{ "stmal", OPBDTS(al), OPBDTSF,OP_R, OP_R, OP_R }, { "str", OPSDTS(al), OPSDTSF,OP_R, OP_R, OP_R }, { "streq", OPSDTS(eq), OPSDTSF,OP_R, OP_R, OP_R }, { "strne", OPSDTS(ne), OPSDTSF,OP_R, OP_R, OP_R }, diff --git a/test/arm.S b/test/arm.S index 2aeeb17..20f7d6d 100644 --- a/test/arm.S +++ b/test/arm.S @@ -20,6 +20,8 @@ cmpeq %r5, %r4, %r3 eor %r5, %r4, %r3 eoreq %r5, %r4, %r3 + ldm %r0, %r0, %r0 + ldmeq %r0, %r0, %r0 ldr %r0, %r0, %r0 ldreq %r0, %r0, %r0 mov %r5, %r4, %r3 @@ -39,6 +41,8 @@ rsceq %r5, %r4, %r3 sbc %r5, %r4, %r3 sbceq %r5, %r4, %r3 + stm %r0, %r0, %r0 + stmeq %r0, %r0, %r0 str %r0, %r0, %r0 streq %r0, %r0, %r0 sub %r5, %r4, %r3