diff --git a/src/arch/arm.ins b/src/arch/arm.ins index 8084689..de27cde 100644 --- a/src/arch/arm.ins +++ b/src/arch/arm.ins @@ -94,6 +94,10 @@ #define OPSDTS(cond) (cond | (0x1 << 26)) #define OPSDTSF (32 << AOD_SIZE) +/* single data swap */ +#define OPSDS(cond) (cond | (0x2 << 23) | (0x9 << 4)) +#define OPSDSF (32 << AOD_SIZE) + /* instructions */ /* adc */ @@ -440,6 +444,7 @@ #if 1 /* FIXME implement correctly */ { "stc", 0x00000000, OPNOP, AOT_NONE, AOT_NONE, AOT_NONE }, #endif +/* stm */ { "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 }, @@ -456,6 +461,7 @@ { "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 */ { "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 }, @@ -491,7 +497,25 @@ { "subal", OPDATA(al,sub), OPDATAF,OP_R, OP_R, OP_R }, #if 1 /* FIXME implement correctly */ { "swi", 0x00000000, OPNOP, AOT_NONE, AOT_NONE, AOT_NONE }, -{ "swp", 0x00000000, OPNOP, AOT_NONE, AOT_NONE, AOT_NONE }, +#endif +/* swp */ +{ "swp", OPSDS(al), OPSDSF, OP_R, OP_R, OP_R }, +{ "swpeq", OPSDS(eq), OPSDSF, OP_R, OP_R, OP_R }, +{ "swpne", OPSDS(ne), OPSDSF, OP_R, OP_R, OP_R }, +{ "swpcs", OPSDS(cs), OPSDSF, OP_R, OP_R, OP_R }, +{ "swpcc", OPSDS(cc), OPSDSF, OP_R, OP_R, OP_R }, +{ "swpmi", OPSDS(mi), OPSDSF, OP_R, OP_R, OP_R }, +{ "swppl", OPSDS(pl), OPSDSF, OP_R, OP_R, OP_R }, +{ "swpvs", OPSDS(vs), OPSDSF, OP_R, OP_R, OP_R }, +{ "swpvc", OPSDS(vc), OPSDSF, OP_R, OP_R, OP_R }, +{ "swphi", OPSDS(hi), OPSDSF, OP_R, OP_R, OP_R }, +{ "swpls", OPSDS(ls), OPSDSF, OP_R, OP_R, OP_R }, +{ "swpge", OPSDS(ge), OPSDSF, OP_R, OP_R, OP_R }, +{ "swplt", OPSDS(lt), OPSDSF, OP_R, OP_R, OP_R }, +{ "swpgt", OPSDS(gt), OPSDSF, OP_R, OP_R, OP_R }, +{ "swple", OPSDS(le), OPSDSF, OP_R, OP_R, OP_R }, +{ "swpal", OPSDS(al), OPSDSF, OP_R, OP_R, OP_R }, +#if 1 /* FIXME implement correctly */ { "teq", 0x00000000, OPNOP, AOT_NONE, AOT_NONE, AOT_NONE }, { "tst", 0x00000000, OPNOP, AOT_NONE, AOT_NONE, AOT_NONE }, #endif diff --git a/test/arm.S b/test/arm.S index 20f7d6d..e0e8b5b 100644 --- a/test/arm.S +++ b/test/arm.S @@ -47,3 +47,5 @@ streq %r0, %r0, %r0 sub %r5, %r4, %r3 subeq %r5, %r4, %r3 + swp %r5, %r4, %r3 + swpeq %r5, %r4, %r3