Much improved ARM support

This commit is contained in:
Pierre Pronchery 2011-06-16 07:59:59 +00:00
parent 0b81e9475d
commit 4068b60e1a
3 changed files with 507 additions and 211 deletions

View File

@ -40,12 +40,12 @@ static int _arm_write(ArchPlugin * plugin, ArchInstruction * instruction,
switch(instruction->opcode & 0x0fffffff) /* ignore condition code */
{
/* branch, branch with link */
case OPB(0):
case OPBL(0):
case OPB(0): /* b */
case OPBL(0): /* bl */
opcode |= call->operands[0].value.immediate.value;
break;
/* branch and exchange */
case OPBX(0):
case OPBX(0): /* bx */
/* first operand, Rn */
p = call->operands[0].value._register.name;
if((ar = helper->get_register_by_name_size(helper->arch,
@ -54,16 +54,16 @@ static int _arm_write(ArchPlugin * plugin, ArchInstruction * instruction,
opcode |= ar->id;
break;
/* data processing */
case OPDP(0, and):
case OPDP(0, eor):
case OPDP(0, sub):
case OPDP(0, rsb):
case OPDP(0, add):
case OPDP(0, adc):
case OPDP(0, sbc):
case OPDP(0, rsc):
case OPDP(0, orr):
case OPDP(0, bic):
case OPDP(0, and): /* and */
case OPDP(0, eor): /* eor */
case OPDP(0, sub): /* sub */
case OPDP(0, rsb): /* rsb */
case OPDP(0, add): /* add */
case OPDP(0, adc): /* adc */
case OPDP(0, sbc): /* sbc */
case OPDP(0, rsc): /* rsc */
case OPDP(0, orr): /* orr */
case OPDP(0, bic): /* bic */
case OPDPS(0, and): /* ands */
case OPDPS(0, eor): /* eors */
case OPDPS(0, sub): /* subs */
@ -93,16 +93,16 @@ static int _arm_write(ArchPlugin * plugin, ArchInstruction * instruction,
return -1;
opcode |= ar->id;
break;
case OPDPI(0, and):
case OPDPI(0, eor):
case OPDPI(0, sub):
case OPDPI(0, rsb):
case OPDPI(0, add):
case OPDPI(0, adc):
case OPDPI(0, sbc):
case OPDPI(0, rsc):
case OPDPI(0, orr):
case OPDPI(0, bic):
case OPDPI(0, and): /* and (immediate) */
case OPDPI(0, eor): /* eor (immediate) */
case OPDPI(0, sub): /* sub (immediate) */
case OPDPI(0, rsb): /* rsb (immediate) */
case OPDPI(0, add): /* add (immediate) */
case OPDPI(0, adc): /* adc (immediate) */
case OPDPI(0, sbc): /* sbc (immediate) */
case OPDPI(0, rsc): /* rsc (immediate) */
case OPDPI(0, orr): /* orr (immediate) */
case OPDPI(0, bic): /* bic (immediate) */
case OPDPIS(0, and): /* ands (immediate) */
case OPDPIS(0, eor): /* eors (immediate) */
case OPDPIS(0, sub): /* subs (immediate) */
@ -128,10 +128,10 @@ static int _arm_write(ArchPlugin * plugin, ArchInstruction * instruction,
/* third operand */
opcode |= call->operands[2].value.immediate.value;
break;
case OPDP(0, tst):
case OPDP(0, teq):
case OPDP(0, cmp):
case OPDP(0, cmn):
case OPDP(0, tst): /* tst */
case OPDP(0, teq): /* teq */
case OPDP(0, cmp): /* cmp */
case OPDP(0, cmn): /* cmn */
case OPDPS(0, tst): /* tsts */
case OPDPS(0, teq): /* teqs */
case OPDPS(0, cmp): /* cmps */
@ -149,10 +149,10 @@ static int _arm_write(ArchPlugin * plugin, ArchInstruction * instruction,
return -1;
opcode |= ar->id;
break;
case OPDPI(0, tst):
case OPDPI(0, teq):
case OPDPI(0, cmp):
case OPDPI(0, cmn):
case OPDPI(0, tst): /* tst (immediate) */
case OPDPI(0, teq): /* teq (immediate) */
case OPDPI(0, cmp): /* cmp (immediate) */
case OPDPI(0, cmn): /* cmn (immediate) */
case OPDPIS(0, tst): /* tsts (immediate) */
case OPDPIS(0, teq): /* teqs (immediate) */
case OPDPIS(0, cmp): /* cmps (immediate) */
@ -166,11 +166,12 @@ static int _arm_write(ArchPlugin * plugin, ArchInstruction * instruction,
/* second operand */
opcode |= call->operands[1].value.immediate.value;
break;
case OPDP(0, mov):
case OPDP(0, mov): /* mov */
case OPDPS(0, mov): /* movs */
case OPDP(0, mvn):
case OPDP(0, mvn): /* mvn */
case OPDPS(0, mvn): /* mvns */
if(call->operands_cnt == 0) /* nop */
/* take care of nop */
if(call->operands_cnt == 0)
break;
/* first operand, Rd */
p = call->operands[0].value._register.name;
@ -217,6 +218,139 @@ static int _arm_write(ArchPlugin * plugin, ArchInstruction * instruction,
return -1;
opcode |= ar->id;
break;
/* multiply and multiply-accumulate */
case OPMUL(0): /* mul */
case OPMULS(0): /* muls */
case OPMULA(0): /* mla */
case OPMULAS(0): /* mlas */
/* first operand, Rd */
p = call->operands[0].value._register.name;
if((ar = helper->get_register_by_name_size(helper->arch,
p, 32)) == NULL)
return -1;
opcode |= (ar->id << 16);
/* second operand, Rm */
p = call->operands[1].value._register.name;
if((ar = helper->get_register_by_name_size(helper->arch,
p, 32)) == NULL)
return -1;
opcode |= ar->id;
/* third operand, Rs */
p = call->operands[2].value._register.name;
if((ar = helper->get_register_by_name_size(helper->arch,
p, 32)) == NULL)
return -1;
opcode |= (ar->id << 8);
break;
/* single data transfer */
case OPSDTL(0): /* ldr */
case OPSDTS(0): /* str */
case OPSDTLB(0): /* ldrb */
case OPSDTSB(0): /* strb */
/* first operand, Rd */
p = call->operands[0].value._register.name;
if((ar = helper->get_register_by_name_size(helper->arch,
p, 32)) == NULL)
return -1;
opcode |= (ar->id << 12);
/* second operand, Rn */
p = call->operands[1].value._register.name;
if((ar = helper->get_register_by_name_size(helper->arch,
p, 32)) == NULL)
return -1;
opcode |= (ar->id << 16);
/* third operand, Rm */
p = call->operands[2].value._register.name;
if((ar = helper->get_register_by_name_size(helper->arch,
p, 32)) == NULL)
return -1;
opcode |= ar->id;
break;
/* block data transfer */
case OPBDTL(0): /* ldm */
case OPBDTS(0): /* stm */
/* first operand, Rn */
p = call->operands[0].value._register.name;
if((ar = helper->get_register_by_name_size(helper->arch,
p, 32)) == NULL)
return -1;
opcode |= (ar->id << 16);
/* second operand, register list */
opcode |= call->operands[1].value.immediate.value;
break;
/* single data swap */
case OPSDS(0):
case OPSDSB(0):
/* first operand, Rd */
p = call->operands[0].value._register.name;
if((ar = helper->get_register_by_name_size(helper->arch,
p, 32)) == NULL)
return -1;
opcode |= (ar->id << 12);
/* second operand, Rm */
p = call->operands[1].value._register.name;
if((ar = helper->get_register_by_name_size(helper->arch,
p, 32)) == NULL)
return -1;
opcode |= ar->id;
/* third operand, Rn */
p = call->operands[2].value._register.name;
if((ar = helper->get_register_by_name_size(helper->arch,
p, 32)) == NULL)
return -1;
opcode |= (ar->id << 16);
break;
/* software interrupt */
case OPSI(0):
opcode |= call->operands[0].value.immediate.value;
break;
/* coprocessor data operation */
case OPCDO(0):
/* first operand, coprocessor number */
opcode |= (call->operands[0].value.immediate.value
<< 8);
/* second operand, coprocessor operation code */
opcode |= (call->operands[1].value.immediate.value
<< 20);
/* third operand, CRd */
p = call->operands[2].value._register.name;
if((ar = helper->get_register_by_name_size(helper->arch,
p, 32)) == NULL)
return -1;
opcode |= (ar->id << 12);
break;
/* coprocessor data transfers */
case OPCDTL(0):
case OPCDTS(0):
/* first operand, coprocessor number */
opcode |= (call->operands[0].value.immediate.value
<< 8);
/* second operand, CRd */
p = call->operands[1].value._register.name;
if((ar = helper->get_register_by_name_size(helper->arch,
p, 32)) == NULL)
return -1;
opcode |= (ar->id << 12);
/* third operand, address */
opcode |= call->operands[2].value.immediate.value;
break;
/* coprocessor register transfers */
case OPCRTL(0):
case OPCRTS(0):
/* first operand, coprocessor number */
opcode |= (call->operands[0].value.immediate.value
<< 8);
/* second operand, opcode */
opcode |= (call->operands[1].value.immediate.value
<< 21);
/* third operand, Rd */
p = call->operands[2].value._register.name;
if((ar = helper->get_register_by_name_size(helper->arch,
p, 32)) == NULL)
return -1;
opcode |= (ar->id << 12);
/* FIXME implement */
break;
#if 1 /* FIXME really implement */
default:
break;

View File

@ -35,6 +35,7 @@
/* opcodes */
#define OPNOP AO_IMMEDIATE(0, 32, 0)
#define OP_DR AO_DREGISTER(0, 0, 32, 0)
#define OP_R AO_REGISTER(0, 32, 0)
#define OP_R_CPSR AO_REGISTER(AOF_IMPLICIT, 32, REG_cpsr_id)
#define OP_R_SPSR AO_REGISTER(AOF_IMPLICIT, 32, REG_spsr_id)
@ -42,6 +43,7 @@
/* block data transfer */
#define OPBDTL(cond) (cond | (0x4 << 25) | (0x1 << 20))
#define OPBDTLF (32 << AOD_SIZE)
#define OPBDT_U16 AO_IMMEDIATE(0, 16, 0)
#define OPBDTS(cond) (cond | (0x4 << 25))
#define OPBDTSF (32 << AOD_SIZE)
@ -57,17 +59,30 @@
#define OPBX(cond) (cond | (0x12fff1 << 4))
#define OPBXF (32 << AOD_SIZE)
/* coprocessor data operation */
#define OPCDO(cond) (cond | (0xe << 24))
#define OPCDOF (32 << AOD_SIZE)
#define OPCDO_U4 AO_IMMEDIATE(0, 4, 0)
/* coprocessor data transfers */
#define OPCDTL(cond) (cond | (0x6 << 25) | (0x1 << 20))
#define OPCDTLF (32 << AOD_SIZE)
#define OPCDTL_U4 AO_IMMEDIATE(0, 4, 0)
#define OPCDTL_U8 AO_IMMEDIATE(0, 8, 0)
#define OPCDTS(cond) (cond | (0x6 << 25))
#define OPCDTSF (32 << AOD_SIZE)
#define OPCDTS_U4 AO_IMMEDIATE(0, 4, 0)
#define OPCDTS_U8 AO_IMMEDIATE(0, 8, 0)
/* coprocessor register transfers */
#define OPCRTL(cond) (cond | (0xe << 24) | (0x1 << 20) | (0x1 << 4))
#define OPCRTLF (32 << AOD_SIZE)
#define OPCRTL_U3 AO_IMMEDIATE(0, 3, 0)
#define OPCRTL_U4 AO_IMMEDIATE(0, 4, 0)
#define OPCRTS(cond) (cond | (0xe << 24) | (0x1 << 4))
#define OPCRTSF (32 << AOD_SIZE)
#define OPCRTS_U3 AO_IMMEDIATE(0, 3, 0)
#define OPCRTS_U4 AO_IMMEDIATE(0, 4, 0)
/* data processing */
/* operations */
@ -106,6 +121,8 @@
#define OPMULSF (32 << AOD_SIZE)
#define OPMULA(cond) (cond | (0x1 << 21) | (0x9 << 4))
#define OPMULAF (32 << AOD_SIZE)
#define OPMULAS(cond) (cond | (0x1 << 21) | (0x1 << 20) | (0x9 << 4))
#define OPMULASF (32 << AOD_SIZE)
/* psr transfer */
#define OPPT(cond) (cond | (0x2 << 23) | (0xf << 16))
@ -114,14 +131,21 @@
#define OPPTIF (32 << AOD_SIZE)
/* single data transfer */
#define OPSDTL(cond) (cond | (0x1 << 26) | (0x1 << 20))
#define OPSDTL(cond) (cond | (0x1 << 26) | (0x1 << 25) | (0x1 << 20))
#define OPSDTLF (32 << AOD_SIZE)
#define OPSDTS(cond) (cond | (0x1 << 26))
#define OPSDTS(cond) (cond | (0x1 << 26) | (0x1 << 25))
#define OPSDTSF (32 << AOD_SIZE)
#define OPSDTLB(cond) (cond | (0x1 << 26) | (0x1 << 25) | (0x1 << 22) \
| (0x1 << 20))
#define OPSDTLBF (32 << AOD_SIZE)
#define OPSDTSB(cond) (cond | (0x1 << 26) | (0x1 << 25) | (0x1 << 22))
#define OPSDTSBF (32 << AOD_SIZE)
/* single data swap */
#define OPSDS(cond) (cond | (0x2 << 23) | (0x9 << 4))
#define OPSDSF (32 << AOD_SIZE)
#define OPSDSB(cond) (cond | (0x2 << 23) | (0x1 << 22) | (0x9 << 4))
#define OPSDSBF (32 << AOD_SIZE)
/* software interrupt */
#define OPSI(cond) (cond | (0xf << 24))
@ -340,7 +364,7 @@
{ "bge", OPB(ge), OPBF, OPB_S26, AOT_NONE, AOT_NONE },
{ "blt", OPB(lt), OPBF, OPB_S26, AOT_NONE, AOT_NONE },
{ "bgt", OPB(gt), OPBF, OPB_S26, AOT_NONE, AOT_NONE },
{ "bge", OPB(ge), OPBF, OPB_S26, AOT_NONE, AOT_NONE },
{ "ble", OPB(le), OPBF, OPB_S26, AOT_NONE, AOT_NONE },
{ "bal", OPB(al), OPBF, OPB_S26, AOT_NONE, AOT_NONE },
/* bic */
{ "bic", OPDP(al,bic), OPDPF, OP_R, OP_R, OP_R },
@ -422,7 +446,7 @@
{ "blge", OPBL(ge), OPBLF, OPBL_S26, AOT_NONE, AOT_NONE },
{ "bllt", OPBL(lt), OPBLF, OPBL_S26, AOT_NONE, AOT_NONE },
{ "blgt", OPBL(gt), OPBLF, OPBL_S26, AOT_NONE, AOT_NONE },
{ "blge", OPBL(ge), OPBLF, OPBL_S26, AOT_NONE, AOT_NONE },
{ "blle", OPBL(le), OPBLF, OPBL_S26, AOT_NONE, AOT_NONE },
{ "blal", OPBL(al), OPBLF, OPBL_S26, AOT_NONE, AOT_NONE },
/* bx */
{ "bx", OPBX(al), OPBXF, OP_R, AOT_NONE, AOT_NONE },
@ -439,12 +463,25 @@
{ "bxge", OPBX(ge), OPBXF, OP_R, AOT_NONE, AOT_NONE },
{ "bxlt", OPBX(lt), OPBXF, OP_R, AOT_NONE, AOT_NONE },
{ "bxgt", OPBX(gt), OPBXF, OP_R, AOT_NONE, AOT_NONE },
{ "bxge", OPBX(ge), OPBXF, OP_R, AOT_NONE, AOT_NONE },
{ "bxle", OPBX(le), OPBXF, OP_R, AOT_NONE, AOT_NONE },
{ "bxal", OPBX(al), OPBXF, OP_R, AOT_NONE, AOT_NONE },
#if 1 /* FIXME implement correctly */
/* cdp */
{ "cdp", 0x00000000, OPNOP, AOT_NONE, AOT_NONE, AOT_NONE },
#endif
{ "cdp", OPCDO(al), OPCDOF, OPCDO_U4, OPCDO_U4, OP_R },
{ "cdpeq", OPCDO(eq), OPCDOF, OPCDO_U4, OPCDO_U4, OP_R },
{ "cdpne", OPCDO(ne), OPCDOF, OPCDO_U4, OPCDO_U4, OP_R },
{ "cdpcs", OPCDO(cs), OPCDOF, OPCDO_U4, OPCDO_U4, OP_R },
{ "cdpcc", OPCDO(cc), OPCDOF, OPCDO_U4, OPCDO_U4, OP_R },
{ "cdpmi", OPCDO(mi), OPCDOF, OPCDO_U4, OPCDO_U4, OP_R },
{ "cdppl", OPCDO(pl), OPCDOF, OPCDO_U4, OPCDO_U4, OP_R },
{ "cdpvs", OPCDO(vs), OPCDOF, OPCDO_U4, OPCDO_U4, OP_R },
{ "cdpvc", OPCDO(vc), OPCDOF, OPCDO_U4, OPCDO_U4, OP_R },
{ "cdphi", OPCDO(hi), OPCDOF, OPCDO_U4, OPCDO_U4, OP_R },
{ "cdpls", OPCDO(ls), OPCDOF, OPCDO_U4, OPCDO_U4, OP_R },
{ "cdpge", OPCDO(ge), OPCDOF, OPCDO_U4, OPCDO_U4, OP_R },
{ "cdplt", OPCDO(lt), OPCDOF, OPCDO_U4, OPCDO_U4, OP_R },
{ "cdpgt", OPCDO(gt), OPCDOF, OPCDO_U4, OPCDO_U4, OP_R },
{ "cdple", OPCDO(le), OPCDOF, OPCDO_U4, OPCDO_U4, OP_R },
{ "cdpal", OPCDO(al), OPCDOF, OPCDO_U4, OPCDO_U4, OP_R },
/* cmn */
{ "cmn", OPDP(al,cmn), OPDPF, OP_R, OP_R, AOT_NONE },
{ "cmneq", OPDP(eq,cmn), OPDPF, OP_R, OP_R, AOT_NONE },
@ -641,76 +678,123 @@
{ "eorles", OPDPIS(le,eor), OPDPISF,OP_R, OP_R, OPDPIS_U12 },
{ "eorals", OPDPIS(al,eor), OPDPISF,OP_R, OP_R, OPDPIS_U12 },
/* ldc */
{ "ldc", OPCDTL(al), OPCDTLF,OP_R, OP_R, OP_R },
{ "ldceq", OPCDTL(eq), OPCDTLF,OP_R, OP_R, OP_R },
{ "ldcne", OPCDTL(ne), OPCDTLF,OP_R, OP_R, OP_R },
{ "ldccs", OPCDTL(cs), OPCDTLF,OP_R, OP_R, OP_R },
{ "ldccc", OPCDTL(cc), OPCDTLF,OP_R, OP_R, OP_R },
{ "ldcmi", OPCDTL(mi), OPCDTLF,OP_R, OP_R, OP_R },
{ "ldcpl", OPCDTL(pl), OPCDTLF,OP_R, OP_R, OP_R },
{ "ldcvs", OPCDTL(vs), OPCDTLF,OP_R, OP_R, OP_R },
{ "ldcvc", OPCDTL(vc), OPCDTLF,OP_R, OP_R, OP_R },
{ "ldchi", OPCDTL(hi), OPCDTLF,OP_R, OP_R, OP_R },
{ "ldcls", OPCDTL(ls), OPCDTLF,OP_R, OP_R, OP_R },
{ "ldcge", OPCDTL(ge), OPCDTLF,OP_R, OP_R, OP_R },
{ "ldclt", OPCDTL(lt), OPCDTLF,OP_R, OP_R, OP_R },
{ "ldcgt", OPCDTL(gt), OPCDTLF,OP_R, OP_R, OP_R },
{ "ldcle", OPCDTL(le), OPCDTLF,OP_R, OP_R, OP_R },
{ "ldcal", OPCDTL(al), OPCDTLF,OP_R, OP_R, OP_R },
{ "ldc", OPCDTL(al), OPCDTLF,OPCDTL_U4,OP_R, OPCDTL_U8 },
{ "ldceq", OPCDTL(eq), OPCDTLF,OPCDTL_U4,OP_R, OPCDTL_U8 },
{ "ldcne", OPCDTL(ne), OPCDTLF,OPCDTL_U4,OP_R, OPCDTL_U8 },
{ "ldccs", OPCDTL(cs), OPCDTLF,OPCDTL_U4,OP_R, OPCDTL_U8 },
{ "ldccc", OPCDTL(cc), OPCDTLF,OPCDTL_U4,OP_R, OPCDTL_U8 },
{ "ldcmi", OPCDTL(mi), OPCDTLF,OPCDTL_U4,OP_R, OPCDTL_U8 },
{ "ldcpl", OPCDTL(pl), OPCDTLF,OPCDTL_U4,OP_R, OPCDTL_U8 },
{ "ldcvs", OPCDTL(vs), OPCDTLF,OPCDTL_U4,OP_R, OPCDTL_U8 },
{ "ldcvc", OPCDTL(vc), OPCDTLF,OPCDTL_U4,OP_R, OPCDTL_U8 },
{ "ldchi", OPCDTL(hi), OPCDTLF,OPCDTL_U4,OP_R, OPCDTL_U8 },
{ "ldcls", OPCDTL(ls), OPCDTLF,OPCDTL_U4,OP_R, OPCDTL_U8 },
{ "ldcge", OPCDTL(ge), OPCDTLF,OPCDTL_U4,OP_R, OPCDTL_U8 },
{ "ldclt", OPCDTL(lt), OPCDTLF,OPCDTL_U4,OP_R, OPCDTL_U8 },
{ "ldcgt", OPCDTL(gt), OPCDTLF,OPCDTL_U4,OP_R, OPCDTL_U8 },
{ "ldcle", OPCDTL(le), OPCDTLF,OPCDTL_U4,OP_R, OPCDTL_U8 },
{ "ldcal", OPCDTL(al), OPCDTLF,OPCDTL_U4,OP_R, OPCDTL_U8 },
/* ldm */
{ "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 },
{ "ldm", OPBDTL(al), OPBDTLF,OP_R, OPBDT_U16,AOT_NONE },
{ "ldmeq", OPBDTL(eq), OPBDTLF,OP_R, OPBDT_U16,AOT_NONE },
{ "ldmne", OPBDTL(ne), OPBDTLF,OP_R, OPBDT_U16,AOT_NONE },
{ "ldmcs", OPBDTL(cs), OPBDTLF,OP_R, OPBDT_U16,AOT_NONE },
{ "ldmcc", OPBDTL(cc), OPBDTLF,OP_R, OPBDT_U16,AOT_NONE },
{ "ldmmi", OPBDTL(mi), OPBDTLF,OP_R, OPBDT_U16,AOT_NONE },
{ "ldmpl", OPBDTL(pl), OPBDTLF,OP_R, OPBDT_U16,AOT_NONE },
{ "ldmvs", OPBDTL(vs), OPBDTLF,OP_R, OPBDT_U16,AOT_NONE },
{ "ldmvc", OPBDTL(vc), OPBDTLF,OP_R, OPBDT_U16,AOT_NONE },
{ "ldmhi", OPBDTL(hi), OPBDTLF,OP_R, OPBDT_U16,AOT_NONE },
{ "ldmls", OPBDTL(ls), OPBDTLF,OP_R, OPBDT_U16,AOT_NONE },
{ "ldmge", OPBDTL(ge), OPBDTLF,OP_R, OPBDT_U16,AOT_NONE },
{ "ldmlt", OPBDTL(lt), OPBDTLF,OP_R, OPBDT_U16,AOT_NONE },
{ "ldmgt", OPBDTL(gt), OPBDTLF,OP_R, OPBDT_U16,AOT_NONE },
{ "ldmle", OPBDTL(ge), OPBDTLF,OP_R, OPBDT_U16,AOT_NONE },
{ "ldmal", OPBDTL(al), OPBDTLF,OP_R, OPBDT_U16,AOT_NONE },
/* 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 },
{ "ldr", OPSDTL(al), OPSDTLF,OP_R, OP_DR, OP_R },
{ "ldreq", OPSDTL(eq), OPSDTLF,OP_R, OP_DR, OP_R },
{ "ldrne", OPSDTL(ne), OPSDTLF,OP_R, OP_DR, OP_R },
{ "ldrcs", OPSDTL(cs), OPSDTLF,OP_R, OP_DR, OP_R },
{ "ldrcc", OPSDTL(cc), OPSDTLF,OP_R, OP_DR, OP_R },
{ "ldrmi", OPSDTL(mi), OPSDTLF,OP_R, OP_DR, OP_R },
{ "ldrpl", OPSDTL(pl), OPSDTLF,OP_R, OP_DR, OP_R },
{ "ldrvs", OPSDTL(vs), OPSDTLF,OP_R, OP_DR, OP_R },
{ "ldrvc", OPSDTL(vc), OPSDTLF,OP_R, OP_DR, OP_R },
{ "ldrhi", OPSDTL(hi), OPSDTLF,OP_R, OP_DR, OP_R },
{ "ldrls", OPSDTL(ls), OPSDTLF,OP_R, OP_DR, OP_R },
{ "ldrge", OPSDTL(ge), OPSDTLF,OP_R, OP_DR, OP_R },
{ "ldrlt", OPSDTL(lt), OPSDTLF,OP_R, OP_DR, OP_R },
{ "ldrgt", OPSDTL(gt), OPSDTLF,OP_R, OP_DR, OP_R },
{ "ldrle", OPSDTL(le), OPSDTLF,OP_R, OP_DR, OP_R },
{ "ldral", OPSDTL(al), OPSDTLF,OP_R, OP_DR, OP_R },
/* ldrb */
{ "ldrb", OPSDTLB(al), OPSDTLBF,OP_R, OP_DR, OP_R },
{ "ldreqb", OPSDTLB(eq), OPSDTLBF,OP_R, OP_DR, OP_R },
{ "ldrneb", OPSDTLB(ne), OPSDTLBF,OP_R, OP_DR, OP_R },
{ "ldrcsb", OPSDTLB(cs), OPSDTLBF,OP_R, OP_DR, OP_R },
{ "ldrccb", OPSDTLB(cc), OPSDTLBF,OP_R, OP_DR, OP_R },
{ "ldrmib", OPSDTLB(mi), OPSDTLBF,OP_R, OP_DR, OP_R },
{ "ldrplb", OPSDTLB(pl), OPSDTLBF,OP_R, OP_DR, OP_R },
{ "ldrvsb", OPSDTLB(vs), OPSDTLBF,OP_R, OP_DR, OP_R },
{ "ldrvcb", OPSDTLB(vc), OPSDTLBF,OP_R, OP_DR, OP_R },
{ "ldrhib", OPSDTLB(hi), OPSDTLBF,OP_R, OP_DR, OP_R },
{ "ldrlsb", OPSDTLB(ls), OPSDTLBF,OP_R, OP_DR, OP_R },
{ "ldrgeb", OPSDTLB(ge), OPSDTLBF,OP_R, OP_DR, OP_R },
{ "ldrltb", OPSDTLB(lt), OPSDTLBF,OP_R, OP_DR, OP_R },
{ "ldrgtb", OPSDTLB(gt), OPSDTLBF,OP_R, OP_DR, OP_R },
{ "ldrleb", OPSDTLB(le), OPSDTLBF,OP_R, OP_DR, OP_R },
{ "ldralb", OPSDTLB(al), OPSDTLBF,OP_R, OP_DR, OP_R },
/* mcr */
{ "mcr", OPCRTS(al), OPCRTSF,OP_R, OP_R, OP_R },
{ "mcreq", OPCRTS(eq), OPCRTSF,OP_R, OP_R, OP_R },
{ "mcrne", OPCRTS(ne), OPCRTSF,OP_R, OP_R, OP_R },
{ "mcrcs", OPCRTS(cs), OPCRTSF,OP_R, OP_R, OP_R },
{ "mcrcc", OPCRTS(cc), OPCRTSF,OP_R, OP_R, OP_R },
{ "mcrmi", OPCRTS(mi), OPCRTSF,OP_R, OP_R, OP_R },
{ "mcrpl", OPCRTS(pl), OPCRTSF,OP_R, OP_R, OP_R },
{ "mcrvs", OPCRTS(vs), OPCRTSF,OP_R, OP_R, OP_R },
{ "mcrvc", OPCRTS(vc), OPCRTSF,OP_R, OP_R, OP_R },
{ "mcrhi", OPCRTS(hi), OPCRTSF,OP_R, OP_R, OP_R },
{ "mcrls", OPCRTS(ls), OPCRTSF,OP_R, OP_R, OP_R },
{ "mcrge", OPCRTS(ge), OPCRTSF,OP_R, OP_R, OP_R },
{ "mcrlt", OPCRTS(lt), OPCRTSF,OP_R, OP_R, OP_R },
{ "mcrgt", OPCRTS(gt), OPCRTSF,OP_R, OP_R, OP_R },
{ "mcrle", OPCRTS(le), OPCRTSF,OP_R, OP_R, OP_R },
{ "mcral", OPCRTS(al), OPCRTSF,OP_R, OP_R, OP_R },
#if 1 /* FIXME implement correctly */
{ "mla", 0x00000000, OPNOP, AOT_NONE, AOT_NONE, AOT_NONE },
#endif
{ "mcr", OPCRTS(al), OPCRTSF,OPCRTS_U4,OPCRTS_U3,OP_R },
{ "mcreq", OPCRTS(eq), OPCRTSF,OPCRTS_U4,OPCRTS_U3,OP_R },
{ "mcrne", OPCRTS(ne), OPCRTSF,OPCRTS_U4,OPCRTS_U3,OP_R },
{ "mcrcs", OPCRTS(cs), OPCRTSF,OPCRTS_U4,OPCRTS_U3,OP_R },
{ "mcrcc", OPCRTS(cc), OPCRTSF,OPCRTS_U4,OPCRTS_U3,OP_R },
{ "mcrmi", OPCRTS(mi), OPCRTSF,OPCRTS_U4,OPCRTS_U3,OP_R },
{ "mcrpl", OPCRTS(pl), OPCRTSF,OPCRTS_U4,OPCRTS_U3,OP_R },
{ "mcrvs", OPCRTS(vs), OPCRTSF,OPCRTS_U4,OPCRTS_U3,OP_R },
{ "mcrvc", OPCRTS(vc), OPCRTSF,OPCRTS_U4,OPCRTS_U3,OP_R },
{ "mcrhi", OPCRTS(hi), OPCRTSF,OPCRTS_U4,OPCRTS_U3,OP_R },
{ "mcrls", OPCRTS(ls), OPCRTSF,OPCRTS_U4,OPCRTS_U3,OP_R },
{ "mcrge", OPCRTS(ge), OPCRTSF,OPCRTS_U4,OPCRTS_U3,OP_R },
{ "mcrlt", OPCRTS(lt), OPCRTSF,OPCRTS_U4,OPCRTS_U3,OP_R },
{ "mcrgt", OPCRTS(gt), OPCRTSF,OPCRTS_U4,OPCRTS_U3,OP_R },
{ "mcrle", OPCRTS(le), OPCRTSF,OPCRTS_U4,OPCRTS_U3,OP_R },
{ "mcral", OPCRTS(al), OPCRTSF,OPCRTS_U4,OPCRTS_U3,OP_R },
/* mla */
{ "mla", OPMULA(al), OPMULAF,OP_R, OP_R, OP_R },
{ "mlaeq", OPMULA(eq), OPMULAF,OP_R, OP_R, OP_R },
{ "mlane", OPMULA(ne), OPMULAF,OP_R, OP_R, OP_R },
{ "mlacs", OPMULA(cs), OPMULAF,OP_R, OP_R, OP_R },
{ "mlacc", OPMULA(cc), OPMULAF,OP_R, OP_R, OP_R },
{ "mlami", OPMULA(mi), OPMULAF,OP_R, OP_R, OP_R },
{ "mlapl", OPMULA(pl), OPMULAF,OP_R, OP_R, OP_R },
{ "mlavs", OPMULA(vs), OPMULAF,OP_R, OP_R, OP_R },
{ "mlavc", OPMULA(vc), OPMULAF,OP_R, OP_R, OP_R },
{ "mlahi", OPMULA(hi), OPMULAF,OP_R, OP_R, OP_R },
{ "mlals", OPMULA(ls), OPMULAF,OP_R, OP_R, OP_R },
{ "mlage", OPMULA(ge), OPMULAF,OP_R, OP_R, OP_R },
{ "mlalt", OPMULA(lt), OPMULAF,OP_R, OP_R, OP_R },
{ "mlagt", OPMULA(gt), OPMULAF,OP_R, OP_R, OP_R },
{ "mlale", OPMULA(le), OPMULAF,OP_R, OP_R, OP_R },
{ "mlaal", OPMULA(al), OPMULAF,OP_R, OP_R, OP_R },
{ "mlas", OPMULAS(al), OPMULASF,OP_R, OP_R, OP_R },
{ "mlaeqs", OPMULAS(eq), OPMULASF,OP_R, OP_R, OP_R },
{ "mlanes", OPMULAS(ne), OPMULASF,OP_R, OP_R, OP_R },
{ "mlacss", OPMULAS(cs), OPMULASF,OP_R, OP_R, OP_R },
{ "mlaccs", OPMULAS(cc), OPMULASF,OP_R, OP_R, OP_R },
{ "mlamis", OPMULAS(mi), OPMULASF,OP_R, OP_R, OP_R },
{ "mlapls", OPMULAS(pl), OPMULASF,OP_R, OP_R, OP_R },
{ "mlavss", OPMULAS(vs), OPMULASF,OP_R, OP_R, OP_R },
{ "mlavcs", OPMULAS(vc), OPMULASF,OP_R, OP_R, OP_R },
{ "mlahis", OPMULAS(hi), OPMULASF,OP_R, OP_R, OP_R },
{ "mlalss", OPMULAS(ls), OPMULASF,OP_R, OP_R, OP_R },
{ "mlages", OPMULAS(ge), OPMULASF,OP_R, OP_R, OP_R },
{ "mlalts", OPMULAS(lt), OPMULASF,OP_R, OP_R, OP_R },
{ "mlagts", OPMULAS(gt), OPMULASF,OP_R, OP_R, OP_R },
{ "mlales", OPMULAS(le), OPMULASF,OP_R, OP_R, OP_R },
{ "mlaals", OPMULAS(al), OPMULASF,OP_R, OP_R, OP_R },
/* mov */
{ "mov", OPDP(al,mov), OPDPF, OP_R, OP_R, AOT_NONE },
{ "moveq", OPDP(eq,mov), OPDPF, OP_R, OP_R, AOT_NONE },
@ -777,22 +861,22 @@
{ "movles", OPDPIS(le,mov), OPDPISF,OP_R, OPDPI_U12,AOT_NONE },
{ "movals", OPDPIS(al,mov), OPDPISF,OP_R, OPDPI_U12,AOT_NONE },
/* mrc */
{ "mrc", OPCRTL(al), OPCRTLF,OP_R, OP_R, OP_R },
{ "mrceq", OPCRTL(eq), OPCRTLF,OP_R, OP_R, OP_R },
{ "mrcne", OPCRTL(ne), OPCRTLF,OP_R, OP_R, OP_R },
{ "mrccs", OPCRTL(cs), OPCRTLF,OP_R, OP_R, OP_R },
{ "mrccc", OPCRTL(cc), OPCRTLF,OP_R, OP_R, OP_R },
{ "mrcmi", OPCRTL(mi), OPCRTLF,OP_R, OP_R, OP_R },
{ "mrcpl", OPCRTL(pl), OPCRTLF,OP_R, OP_R, OP_R },
{ "mrcvs", OPCRTL(vs), OPCRTLF,OP_R, OP_R, OP_R },
{ "mrcvc", OPCRTL(vc), OPCRTLF,OP_R, OP_R, OP_R },
{ "mrchi", OPCRTL(hi), OPCRTLF,OP_R, OP_R, OP_R },
{ "mrcls", OPCRTL(ls), OPCRTLF,OP_R, OP_R, OP_R },
{ "mrcge", OPCRTL(ge), OPCRTLF,OP_R, OP_R, OP_R },
{ "mrclt", OPCRTL(lt), OPCRTLF,OP_R, OP_R, OP_R },
{ "mrcgt", OPCRTL(gt), OPCRTLF,OP_R, OP_R, OP_R },
{ "mrcle", OPCRTL(le), OPCRTLF,OP_R, OP_R, OP_R },
{ "mrcal", OPCRTL(al), OPCRTLF,OP_R, OP_R, OP_R },
{ "mrc", OPCRTL(al), OPCRTLF,OPCRTL_U4,OPCRTL_U3,OP_R },
{ "mrceq", OPCRTL(eq), OPCRTLF,OPCRTL_U4,OPCRTL_U3,OP_R },
{ "mrcne", OPCRTL(ne), OPCRTLF,OPCRTL_U4,OPCRTL_U3,OP_R },
{ "mrccs", OPCRTL(cs), OPCRTLF,OPCRTL_U4,OPCRTL_U3,OP_R },
{ "mrccc", OPCRTL(cc), OPCRTLF,OPCRTL_U4,OPCRTL_U3,OP_R },
{ "mrcmi", OPCRTL(mi), OPCRTLF,OPCRTL_U4,OPCRTL_U3,OP_R },
{ "mrcpl", OPCRTL(pl), OPCRTLF,OPCRTL_U4,OPCRTL_U3,OP_R },
{ "mrcvs", OPCRTL(vs), OPCRTLF,OPCRTL_U4,OPCRTL_U3,OP_R },
{ "mrcvc", OPCRTL(vc), OPCRTLF,OPCRTL_U4,OPCRTL_U3,OP_R },
{ "mrchi", OPCRTL(hi), OPCRTLF,OPCRTL_U4,OPCRTL_U3,OP_R },
{ "mrcls", OPCRTL(ls), OPCRTLF,OPCRTL_U4,OPCRTL_U3,OP_R },
{ "mrcge", OPCRTL(ge), OPCRTLF,OPCRTL_U4,OPCRTL_U3,OP_R },
{ "mrclt", OPCRTL(lt), OPCRTLF,OPCRTL_U4,OPCRTL_U3,OP_R },
{ "mrcgt", OPCRTL(gt), OPCRTLF,OPCRTL_U4,OPCRTL_U3,OP_R },
{ "mrcle", OPCRTL(le), OPCRTLF,OPCRTL_U4,OPCRTL_U3,OP_R },
{ "mrcal", OPCRTL(al), OPCRTLF,OPCRTL_U4,OPCRTL_U3,OP_R },
/* mrs */
{ "mrs", OPPT(al), OPPTF, OP_R, OP_R_CPSR,AOT_NONE },
{ "mrseq", OPPT(eq), OPPTF, OP_R, OP_R_CPSR,AOT_NONE },
@ -861,8 +945,38 @@
{ "msral", OPPTI(al), OPPTIF, OP_R_SPSR,OP_R, AOT_NONE },
/* mul */
{ "mul", OPMUL(al), OPMULF, OP_R, OP_R, OP_R },
{ "muleq", OPMUL(eq), OPMULF, OP_R, OP_R, OP_R },
{ "mulne", OPMUL(ne), OPMULF, OP_R, OP_R, OP_R },
{ "mulcs", OPMUL(cs), OPMULF, OP_R, OP_R, OP_R },
{ "mulcc", OPMUL(cc), OPMULF, OP_R, OP_R, OP_R },
{ "mulmi", OPMUL(mi), OPMULF, OP_R, OP_R, OP_R },
{ "mulpl", OPMUL(pl), OPMULF, OP_R, OP_R, OP_R },
{ "mulvs", OPMUL(vs), OPMULF, OP_R, OP_R, OP_R },
{ "mulvc", OPMUL(vc), OPMULF, OP_R, OP_R, OP_R },
{ "mulhi", OPMUL(hi), OPMULF, OP_R, OP_R, OP_R },
{ "mulls", OPMUL(ls), OPMULF, OP_R, OP_R, OP_R },
{ "mulge", OPMUL(ge), OPMULF, OP_R, OP_R, OP_R },
{ "mullt", OPMUL(lt), OPMULF, OP_R, OP_R, OP_R },
{ "mulgt", OPMUL(gt), OPMULF, OP_R, OP_R, OP_R },
{ "mulle", OPMUL(le), OPMULF, OP_R, OP_R, OP_R },
{ "mulal", OPMUL(al), OPMULF, OP_R, OP_R, OP_R },
/* muls */
{ "muls", OPMULS(al), OPMULSF,OP_R, OP_R, OP_R },
{ "muleqs", OPMULS(eq), OPMULSF,OP_R, OP_R, OP_R },
{ "mulnes", OPMULS(ne), OPMULSF,OP_R, OP_R, OP_R },
{ "mulcss", OPMULS(cs), OPMULSF,OP_R, OP_R, OP_R },
{ "mulccs", OPMULS(cc), OPMULSF,OP_R, OP_R, OP_R },
{ "mulmis", OPMULS(mi), OPMULSF,OP_R, OP_R, OP_R },
{ "mulpls", OPMULS(pl), OPMULSF,OP_R, OP_R, OP_R },
{ "mulvss", OPMULS(vs), OPMULSF,OP_R, OP_R, OP_R },
{ "mulvcs", OPMULS(vc), OPMULSF,OP_R, OP_R, OP_R },
{ "mulhis", OPMULS(hi), OPMULSF,OP_R, OP_R, OP_R },
{ "mullss", OPMULS(ls), OPMULSF,OP_R, OP_R, OP_R },
{ "mulges", OPMULS(ge), OPMULSF,OP_R, OP_R, OP_R },
{ "mullts", OPMULS(lt), OPMULSF,OP_R, OP_R, OP_R },
{ "mulgts", OPMULS(gt), OPMULSF,OP_R, OP_R, OP_R },
{ "mulles", OPMULS(le), OPMULSF,OP_R, OP_R, OP_R },
{ "mulals", OPMULS(al), OPMULSF,OP_R, OP_R, OP_R },
/* mvn */
{ "mvn", OPDP(al,mvn), OPDPF, OP_R, OP_R, AOT_NONE },
{ "mvneq", OPDP(eq,mvn), OPDPF, OP_R, OP_R, AOT_NONE },
@ -1191,56 +1305,73 @@
{ "sbcles", OPDPIS(le,sbc), OPDPISF,OP_R, OP_R, OPDPIS_U12 },
{ "sbcals", OPDPIS(al,sbc), OPDPISF,OP_R, OP_R, OPDPIS_U12 },
/* stc */
{ "stc", OPCDTS(al), OPCDTSF,OP_R, OP_R, OP_R },
{ "stceq", OPCDTS(eq), OPCDTSF,OP_R, OP_R, OP_R },
{ "stcne", OPCDTS(ne), OPCDTSF,OP_R, OP_R, OP_R },
{ "stccs", OPCDTS(cs), OPCDTSF,OP_R, OP_R, OP_R },
{ "stccc", OPCDTS(cc), OPCDTSF,OP_R, OP_R, OP_R },
{ "stcmi", OPCDTS(mi), OPCDTSF,OP_R, OP_R, OP_R },
{ "stcpl", OPCDTS(pl), OPCDTSF,OP_R, OP_R, OP_R },
{ "stcvs", OPCDTS(vs), OPCDTSF,OP_R, OP_R, OP_R },
{ "stcvc", OPCDTS(vc), OPCDTSF,OP_R, OP_R, OP_R },
{ "stchi", OPCDTS(hi), OPCDTSF,OP_R, OP_R, OP_R },
{ "stcls", OPCDTS(ls), OPCDTSF,OP_R, OP_R, OP_R },
{ "stcge", OPCDTS(ge), OPCDTSF,OP_R, OP_R, OP_R },
{ "stclt", OPCDTS(lt), OPCDTSF,OP_R, OP_R, OP_R },
{ "stcgt", OPCDTS(gt), OPCDTSF,OP_R, OP_R, OP_R },
{ "stcle", OPCDTS(le), OPCDTSF,OP_R, OP_R, OP_R },
{ "stcal", OPCDTS(al), OPCDTSF,OP_R, OP_R, OP_R },
{ "stc", OPCDTS(al), OPCDTSF,OPCDTS_U4,OP_R, OPCDTS_U8 },
{ "stceq", OPCDTS(eq), OPCDTSF,OPCDTS_U4,OP_R, OPCDTS_U8 },
{ "stcne", OPCDTS(ne), OPCDTSF,OPCDTS_U4,OP_R, OPCDTS_U8 },
{ "stccs", OPCDTS(cs), OPCDTSF,OPCDTS_U4,OP_R, OPCDTS_U8 },
{ "stccc", OPCDTS(cc), OPCDTSF,OPCDTS_U4,OP_R, OPCDTS_U8 },
{ "stcmi", OPCDTS(mi), OPCDTSF,OPCDTS_U4,OP_R, OPCDTS_U8 },
{ "stcpl", OPCDTS(pl), OPCDTSF,OPCDTS_U4,OP_R, OPCDTS_U8 },
{ "stcvs", OPCDTS(vs), OPCDTSF,OPCDTS_U4,OP_R, OPCDTS_U8 },
{ "stcvc", OPCDTS(vc), OPCDTSF,OPCDTS_U4,OP_R, OPCDTS_U8 },
{ "stchi", OPCDTS(hi), OPCDTSF,OPCDTS_U4,OP_R, OPCDTS_U8 },
{ "stcls", OPCDTS(ls), OPCDTSF,OPCDTS_U4,OP_R, OPCDTS_U8 },
{ "stcge", OPCDTS(ge), OPCDTSF,OPCDTS_U4,OP_R, OPCDTS_U8 },
{ "stclt", OPCDTS(lt), OPCDTSF,OPCDTS_U4,OP_R, OPCDTS_U8 },
{ "stcgt", OPCDTS(gt), OPCDTSF,OPCDTS_U4,OP_R, OPCDTS_U8 },
{ "stcle", OPCDTS(le), OPCDTSF,OPCDTS_U4,OP_R, OPCDTS_U8 },
{ "stcal", OPCDTS(al), OPCDTSF,OPCDTS_U4,OP_R, OPCDTS_U8 },
/* 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 },
{ "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 },
{ "stm", OPBDTS(al), OPBDTSF,OP_R, OPBDT_U16,AOT_NONE },
{ "stmeq", OPBDTS(eq), OPBDTSF,OP_R, OPBDT_U16,AOT_NONE },
{ "stmne", OPBDTS(ne), OPBDTSF,OP_R, OPBDT_U16,AOT_NONE },
{ "stmcs", OPBDTS(cs), OPBDTSF,OP_R, OPBDT_U16,AOT_NONE },
{ "stmcc", OPBDTS(cc), OPBDTSF,OP_R, OPBDT_U16,AOT_NONE },
{ "stmmi", OPBDTS(mi), OPBDTSF,OP_R, OPBDT_U16,AOT_NONE },
{ "stmpl", OPBDTS(pl), OPBDTSF,OP_R, OPBDT_U16,AOT_NONE },
{ "stmvs", OPBDTS(vs), OPBDTSF,OP_R, OPBDT_U16,AOT_NONE },
{ "stmvc", OPBDTS(vc), OPBDTSF,OP_R, OPBDT_U16,AOT_NONE },
{ "stmhi", OPBDTS(hi), OPBDTSF,OP_R, OPBDT_U16,AOT_NONE },
{ "stmls", OPBDTS(ls), OPBDTSF,OP_R, OPBDT_U16,AOT_NONE },
{ "stmge", OPBDTS(ge), OPBDTSF,OP_R, OPBDT_U16,AOT_NONE },
{ "stmlt", OPBDTS(lt), OPBDTSF,OP_R, OPBDT_U16,AOT_NONE },
{ "stmgt", OPBDTS(gt), OPBDTSF,OP_R, OPBDT_U16,AOT_NONE },
{ "stmle", OPBDTS(ge), OPBDTSF,OP_R, OPBDT_U16,AOT_NONE },
{ "stmal", OPBDTS(al), OPBDTSF,OP_R, OPBDT_U16,AOT_NONE },
/* 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 },
{ "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 },
{ "str", OPSDTS(al), OPSDTSF,OP_R, OP_DR, OP_R },
{ "streq", OPSDTS(eq), OPSDTSF,OP_R, OP_DR, OP_R },
{ "strne", OPSDTS(ne), OPSDTSF,OP_R, OP_DR, OP_R },
{ "strcs", OPSDTS(cs), OPSDTSF,OP_R, OP_DR, OP_R },
{ "strcc", OPSDTS(cc), OPSDTSF,OP_R, OP_DR, OP_R },
{ "strmi", OPSDTS(mi), OPSDTSF,OP_R, OP_DR, OP_R },
{ "strpl", OPSDTS(pl), OPSDTSF,OP_R, OP_DR, OP_R },
{ "strvs", OPSDTS(vs), OPSDTSF,OP_R, OP_DR, OP_R },
{ "strvc", OPSDTS(vc), OPSDTSF,OP_R, OP_DR, OP_R },
{ "strhi", OPSDTS(hi), OPSDTSF,OP_R, OP_DR, OP_R },
{ "strls", OPSDTS(ls), OPSDTSF,OP_R, OP_DR, OP_R },
{ "strge", OPSDTS(ge), OPSDTSF,OP_R, OP_DR, OP_R },
{ "strlt", OPSDTS(lt), OPSDTSF,OP_R, OP_DR, OP_R },
{ "strgt", OPSDTS(gt), OPSDTSF,OP_R, OP_DR, OP_R },
{ "strle", OPSDTS(le), OPSDTSF,OP_R, OP_DR, OP_R },
{ "stral", OPSDTS(al), OPSDTSF,OP_R, OP_DR, OP_R },
/* strb */
{ "strb", OPSDTSB(al), OPSDTSBF,OP_R, OP_DR, OP_R },
{ "streqb", OPSDTSB(eq), OPSDTSBF,OP_R, OP_DR, OP_R },
{ "strneb", OPSDTSB(ne), OPSDTSBF,OP_R, OP_DR, OP_R },
{ "strcsb", OPSDTSB(cs), OPSDTSBF,OP_R, OP_DR, OP_R },
{ "strccb", OPSDTSB(cc), OPSDTSBF,OP_R, OP_DR, OP_R },
{ "strmib", OPSDTSB(mi), OPSDTSBF,OP_R, OP_DR, OP_R },
{ "strplb", OPSDTSB(pl), OPSDTSBF,OP_R, OP_DR, OP_R },
{ "strvsb", OPSDTSB(vs), OPSDTSBF,OP_R, OP_DR, OP_R },
{ "strvcb", OPSDTSB(vc), OPSDTSBF,OP_R, OP_DR, OP_R },
{ "strhib", OPSDTSB(hi), OPSDTSBF,OP_R, OP_DR, OP_R },
{ "strlsb", OPSDTSB(ls), OPSDTSBF,OP_R, OP_DR, OP_R },
{ "strgeb", OPSDTSB(ge), OPSDTSBF,OP_R, OP_DR, OP_R },
{ "strltb", OPSDTSB(lt), OPSDTSBF,OP_R, OP_DR, OP_R },
{ "strgtb", OPSDTSB(gt), OPSDTSBF,OP_R, OP_DR, OP_R },
{ "strleb", OPSDTSB(le), OPSDTSBF,OP_R, OP_DR, OP_R },
{ "stralb", OPSDTSB(al), OPSDTSBF,OP_R, OP_DR, OP_R },
/* sub */
{ "sub", OPDP(al,sub), OPDPF, OP_R, OP_R, OP_R },
{ "subeq", OPDP(eq,sub), OPDPF, OP_R, OP_R, OP_R },
@ -1324,22 +1455,39 @@
{ "swile", OPSI(le), OPSIF, OPSI_U24, AOT_NONE, AOT_NONE },
{ "swial", OPSI(al), OPSIF, OPSI_U24, AOT_NONE, AOT_NONE },
/* 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 },
{ "swp", OPSDS(al), OPSDSF, OP_R, OP_R, OP_DR },
{ "swpeq", OPSDS(eq), OPSDSF, OP_R, OP_R, OP_DR },
{ "swpne", OPSDS(ne), OPSDSF, OP_R, OP_R, OP_DR },
{ "swpcs", OPSDS(cs), OPSDSF, OP_R, OP_R, OP_DR },
{ "swpcc", OPSDS(cc), OPSDSF, OP_R, OP_R, OP_DR },
{ "swpmi", OPSDS(mi), OPSDSF, OP_R, OP_R, OP_DR },
{ "swppl", OPSDS(pl), OPSDSF, OP_R, OP_R, OP_DR },
{ "swpvs", OPSDS(vs), OPSDSF, OP_R, OP_R, OP_DR },
{ "swpvc", OPSDS(vc), OPSDSF, OP_R, OP_R, OP_DR },
{ "swphi", OPSDS(hi), OPSDSF, OP_R, OP_R, OP_DR },
{ "swpls", OPSDS(ls), OPSDSF, OP_R, OP_R, OP_DR },
{ "swpge", OPSDS(ge), OPSDSF, OP_R, OP_R, OP_DR },
{ "swplt", OPSDS(lt), OPSDSF, OP_R, OP_R, OP_DR },
{ "swpgt", OPSDS(gt), OPSDSF, OP_R, OP_R, OP_DR },
{ "swple", OPSDS(le), OPSDSF, OP_R, OP_R, OP_DR },
{ "swpal", OPSDS(al), OPSDSF, OP_R, OP_R, OP_DR },
/* swpb */
{ "swpb", OPSDSB(al), OPSDSBF,OP_R, OP_R, OP_DR },
{ "swpeqb", OPSDSB(eq), OPSDSBF,OP_R, OP_R, OP_DR },
{ "swpneb", OPSDSB(ne), OPSDSBF,OP_R, OP_R, OP_DR },
{ "swpcsb", OPSDSB(cs), OPSDSBF,OP_R, OP_R, OP_DR },
{ "swpccb", OPSDSB(cc), OPSDSBF,OP_R, OP_R, OP_DR },
{ "swpmib", OPSDSB(mi), OPSDSBF,OP_R, OP_R, OP_DR },
{ "swpplb", OPSDSB(pl), OPSDSBF,OP_R, OP_R, OP_DR },
{ "swpvsb", OPSDSB(vs), OPSDSBF,OP_R, OP_R, OP_DR },
{ "swpvcb", OPSDSB(vc), OPSDSBF,OP_R, OP_R, OP_DR },
{ "swphib", OPSDSB(hi), OPSDSBF,OP_R, OP_R, OP_DR },
{ "swplsb", OPSDSB(ls), OPSDSBF,OP_R, OP_R, OP_DR },
{ "swpgeb", OPSDSB(ge), OPSDSBF,OP_R, OP_R, OP_DR },
{ "swpltb", OPSDSB(lt), OPSDSBF,OP_R, OP_R, OP_DR },
{ "swpgtb", OPSDSB(gt), OPSDSBF,OP_R, OP_R, OP_DR },
{ "swpleb", OPSDSB(le), OPSDSBF,OP_R, OP_R, OP_DR },
{ "swpalb", OPSDSB(al), OPSDSBF,OP_R, OP_R, OP_DR },
/* teq */
{ "teq", OPDP(al,teq), OPDPF, OP_R, OP_R, AOT_NONE },
{ "teqeq", OPDP(eq,teq), OPDPF, OP_R, OP_R, AOT_NONE },

View File

@ -38,6 +38,8 @@
bleq $0xa0
bx %r1
bxeq %r2
cdp $0x1, $0xf, %r0
cdpeq $0x2, $0xe, %r0
cmn %r5, %r4
cmneq %r5, %r4
cmn %r5, $0x1
@ -62,14 +64,20 @@
eoreqs %r3, %r4, %r5
eors %r3, %r4, $0x0
eoreqs %r3, %r4, $0x1
ldc %r0, %r0, %r0
ldceq %r0, %r0, %r0
ldm %r0, %r0, %r0
ldmeq %r0, %r0, %r0
ldr %r0, %r0, %r0
ldreq %r0, %r0, %r0
mcr %r0, %r0, %r0
mcreq %r0, %r0, %r0
ldc $0x1, %r2, $0x42
ldceq $0x2, %r1, $0x42
ldm %r2, $0x4442
ldmeq %r1, $0x4341
ldr %r4, [%r3], %r2
ldreq %r4, [%r3], %r2
ldrb %r4, [%r3], %r2
ldreqb %r4, [%r3], %r2
mcr $0x1, $0x4, %r3
mcreq $0x2, $0x3, %r1
mla %r3, %r1, %r2
mlaeq %r3, %r1, %r2
mlas %r3, %r1, %r2
mlaeqs %r3, %r1, %r2
mov %r4, %r0
moveq %r5, %r1
mov %r6, $0x1
@ -78,8 +86,8 @@
moveqs %r9, %r5
movs %r10, $0x3
moveqs %r11, $0x4
mrc %r0, %r0, %r0
mrceq %r0, %r0, %r0
mrc $0x1, $0x4, %r3
mrceq $0x2, $0x3, %r1
mrs %r0, %cpsr
mrseq %r1, %cpsr
mrs %r2, %spsr
@ -88,8 +96,10 @@
msreq %cpsr, %r5
msr %spsr, %r6
msreq %spsr, %r7
mul %r0, %r1, %r2
muls %r0, %r1, %r2
mul %r3, %r1, %r2
muleq %r3, %r1, %r2
muls %r3, %r1, %r2
muleqs %r3, %r1, %r2
mvn %r5, %r4
mvneq %r5, %r4
mvn %r5, $0x1
@ -131,12 +141,14 @@
sbceqs %r3, %r4, %r5
sbcs %r3, %r4, $0x0
sbceqs %r3, %r4, $0x1
stc %r0, %r0, %r0
stceq %r0, %r0, %r0
stm %r0, %r0, %r0
stmeq %r0, %r0, %r0
str %r0, %r0, %r0
streq %r0, %r0, %r0
stc $0x1, %r2, $0x42
stceq $0x2, %r1, $0x42
stm %r2, $0x4442
stmeq %r1, $0x4341
str %r7, [%r5], %r6
streq %r7, [%r5], %r6
strb %r7, [%r5], %r6
streqb %r7, [%r5], %r6
sub %r3, %r4, %r5
subeq %r3, %r4, %r5
sub %r3, %r4, $0x0
@ -145,10 +157,12 @@
subeqs %r3, %r4, %r5
subs %r3, %r4, $0x0
subeqs %r3, %r4, $0x1
swi $0x0
swine $0x0
swp %r5, %r4, %r3
swpeq %r5, %r4, %r3
swi $0x42
swine $0x43
swp %r5, %r4, [%r3]
swpeq %r5, %r4, [%r3]
swpb %r5, %r4, [%r3]
swpeqb %r5, %r4, [%r3]
teq %r5, %r4
teqeq %r5, %r4
teq %r5, $0x1