Improving ARM support

This commit is contained in:
Pierre Pronchery 2011-06-12 12:30:27 +00:00
parent 03f5786aca
commit 2b85e9fddc
2 changed files with 45 additions and 2 deletions

View File

@ -82,6 +82,12 @@
#define OPMULA(cond) (cond | (0x1 << 21) | (0x9 << 4)) #define OPMULA(cond) (cond | (0x1 << 21) | (0x9 << 4))
#define OPMULAF (32 << AOD_SIZE) #define OPMULAF (32 << AOD_SIZE)
/* single data transfer */
#define OPSDTL(cond) (cond | (0x1 << 26) | (0x1 << 20))
#define OPSDTLF (32 << AOD_SIZE)
#define OPSDTS(cond) (cond | (0x1 << 26))
#define OPSDTSF (32 << AOD_SIZE)
/* instructions */ /* instructions */
/* adc */ /* adc */
@ -261,7 +267,25 @@
#if 1 /* FIXME implement correctly */ #if 1 /* FIXME implement correctly */
{ "ldc", 0x00000000, OPNOP, AOT_NONE, AOT_NONE, AOT_NONE }, { "ldc", 0x00000000, OPNOP, AOT_NONE, AOT_NONE, AOT_NONE },
{ "ldm", 0x00000000, OPNOP, AOT_NONE, AOT_NONE, AOT_NONE }, { "ldm", 0x00000000, OPNOP, AOT_NONE, AOT_NONE, AOT_NONE },
{ "ldr", 0x00000000, OPNOP, AOT_NONE, AOT_NONE, AOT_NONE }, #endif
/* ldr */
{ "ldr", OPSDTL(al), OPSDTLF,OP_R, OP_R, OP_R },
{ "ldreq", OPSDTL(eq), OPSDTLF,OP_R, OP_R, OP_R },
{ "ldrne", OPSDTL(ne), OPSDTLF,OP_R, OP_R, OP_R },
{ "ldrcs", OPSDTL(cs), OPSDTLF,OP_R, OP_R, OP_R },
{ "ldrcc", OPSDTL(cc), OPSDTLF,OP_R, OP_R, OP_R },
{ "ldrmi", OPSDTL(mi), OPSDTLF,OP_R, OP_R, OP_R },
{ "ldrpl", OPSDTL(pl), OPSDTLF,OP_R, OP_R, OP_R },
{ "ldrvs", OPSDTL(vs), OPSDTLF,OP_R, OP_R, OP_R },
{ "ldrvc", OPSDTL(vc), OPSDTLF,OP_R, OP_R, OP_R },
{ "ldrhi", OPSDTL(hi), OPSDTLF,OP_R, OP_R, OP_R },
{ "ldrls", OPSDTL(ls), OPSDTLF,OP_R, OP_R, OP_R },
{ "ldrge", OPSDTL(ge), OPSDTLF,OP_R, OP_R, OP_R },
{ "ldrlt", OPSDTL(lt), OPSDTLF,OP_R, OP_R, OP_R },
{ "ldrgt", OPSDTL(gt), OPSDTLF,OP_R, OP_R, OP_R },
{ "ldrle", OPSDTL(le), OPSDTLF,OP_R, OP_R, OP_R },
{ "ldral", OPSDTL(al), OPSDTLF,OP_R, OP_R, OP_R },
#if 1 /* FIXME implement correctly */
{ "mla", 0x00000000, OPNOP, AOT_NONE, AOT_NONE, AOT_NONE }, { "mla", 0x00000000, OPNOP, AOT_NONE, AOT_NONE, AOT_NONE },
#endif #endif
/* mov */ /* mov */
@ -395,8 +419,23 @@
#if 1 /* FIXME implement correctly */ #if 1 /* FIXME implement correctly */
{ "stc", 0x00000000, OPNOP, AOT_NONE, AOT_NONE, AOT_NONE }, { "stc", 0x00000000, OPNOP, AOT_NONE, AOT_NONE, AOT_NONE },
{ "stm", 0x00000000, OPNOP, AOT_NONE, AOT_NONE, AOT_NONE }, { "stm", 0x00000000, OPNOP, AOT_NONE, AOT_NONE, AOT_NONE },
{ "str", 0x00000000, OPNOP, AOT_NONE, AOT_NONE, AOT_NONE },
#endif #endif
{ "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 },
{ "strcs", OPSDTS(cs), OPSDTSF,OP_R, OP_R, OP_R },
{ "strcc", OPSDTS(cc), OPSDTSF,OP_R, OP_R, OP_R },
{ "strmi", OPSDTS(mi), OPSDTSF,OP_R, OP_R, OP_R },
{ "strpl", OPSDTS(pl), OPSDTSF,OP_R, OP_R, OP_R },
{ "strvs", OPSDTS(vs), OPSDTSF,OP_R, OP_R, OP_R },
{ "strvc", OPSDTS(vc), OPSDTSF,OP_R, OP_R, OP_R },
{ "strhi", OPSDTS(hi), OPSDTSF,OP_R, OP_R, OP_R },
{ "strls", OPSDTS(ls), OPSDTSF,OP_R, OP_R, OP_R },
{ "strge", OPSDTS(ge), OPSDTSF,OP_R, OP_R, OP_R },
{ "strlt", OPSDTS(lt), OPSDTSF,OP_R, OP_R, OP_R },
{ "strgt", OPSDTS(gt), OPSDTSF,OP_R, OP_R, OP_R },
{ "strle", OPSDTS(le), OPSDTSF,OP_R, OP_R, OP_R },
{ "stral", OPSDTS(al), OPSDTSF,OP_R, OP_R, OP_R },
/* sub */ /* sub */
{ "sub", OPDATA(al,sub), OPDATAF,OP_R, OP_R, OP_R }, { "sub", OPDATA(al,sub), OPDATAF,OP_R, OP_R, OP_R },
{ "subeq", OPDATA(eq,sub), OPDATAF,OP_R, OP_R, OP_R }, { "subeq", OPDATA(eq,sub), OPDATAF,OP_R, OP_R, OP_R },

View File

@ -20,6 +20,8 @@
cmpeq %r5, %r4, %r3 cmpeq %r5, %r4, %r3
eor %r5, %r4, %r3 eor %r5, %r4, %r3
eoreq %r5, %r4, %r3 eoreq %r5, %r4, %r3
ldr %r0, %r0, %r0
ldreq %r0, %r0, %r0
mov %r5, %r4, %r3 mov %r5, %r4, %r3
moveq %r5, %r4, %r3 moveq %r5, %r4, %r3
mrs %r0, %cpsr mrs %r0, %cpsr
@ -37,5 +39,7 @@
rsceq %r5, %r4, %r3 rsceq %r5, %r4, %r3
sbc %r5, %r4, %r3 sbc %r5, %r4, %r3
sbceq %r5, %r4, %r3 sbceq %r5, %r4, %r3
str %r0, %r0, %r0
streq %r0, %r0, %r0
sub %r5, %r4, %r3 sub %r5, %r4, %r3
subeq %r5, %r4, %r3 subeq %r5, %r4, %r3