Improving ARM support

This commit is contained in:
Pierre Pronchery 2011-06-12 00:39:19 +00:00
parent b815fb7805
commit b46fad75cd
2 changed files with 218 additions and 16 deletions

View File

@ -144,10 +144,23 @@
{ "bgt", OPB(gt), OPBF, OPB_S26, AOT_NONE, AOT_NONE },
{ "bge", OPB(ge), OPBF, OPB_S26, AOT_NONE, AOT_NONE },
{ "bal", OPB(al), OPBF, OPB_S26, AOT_NONE, AOT_NONE },
#if 1 /* FIXME really implement */
/* bic */
{ "bic", 0x00000000, OPNOP, OP_R, OP_R, OP_DATA2 },
#endif
{ "bic", OPDATA(al,bic), OPDATAF,OP_R, OP_R, OP_R },
{ "biceq", OPDATA(eq,bic), OPDATAF,OP_R, OP_R, OP_R },
{ "bicne", OPDATA(ne,bic), OPDATAF,OP_R, OP_R, OP_R },
{ "biccs", OPDATA(cs,bic), OPDATAF,OP_R, OP_R, OP_R },
{ "biccc", OPDATA(cc,bic), OPDATAF,OP_R, OP_R, OP_R },
{ "bicmi", OPDATA(mi,bic), OPDATAF,OP_R, OP_R, OP_R },
{ "bicpl", OPDATA(pl,bic), OPDATAF,OP_R, OP_R, OP_R },
{ "bicvs", OPDATA(vs,bic), OPDATAF,OP_R, OP_R, OP_R },
{ "bicvc", OPDATA(vc,bic), OPDATAF,OP_R, OP_R, OP_R },
{ "bichi", OPDATA(hi,bic), OPDATAF,OP_R, OP_R, OP_R },
{ "bicls", OPDATA(ls,bic), OPDATAF,OP_R, OP_R, OP_R },
{ "bicge", OPDATA(ge,bic), OPDATAF,OP_R, OP_R, OP_R },
{ "biclt", OPDATA(lt,bic), OPDATAF,OP_R, OP_R, OP_R },
{ "bicgt", OPDATA(gt,bic), OPDATAF,OP_R, OP_R, OP_R },
{ "bicle", OPDATA(le,bic), OPDATAF,OP_R, OP_R, OP_R },
{ "bical", OPDATA(al,bic), OPDATAF,OP_R, OP_R, OP_R },
/* bl */
{ "bl", OPBL(al), OPBLF, OPBL_S26, AOT_NONE, AOT_NONE },
{ "bleq", OPBL(eq), OPBLF, OPBL_S26, AOT_NONE, AOT_NONE },
@ -182,17 +195,85 @@
{ "bxgt", OPBX(gt), OPBXF, OP_R, AOT_NONE, AOT_NONE },
{ "bxge", OPBX(ge), OPBXF, OP_R, AOT_NONE, AOT_NONE },
{ "bxal", OPBX(al), OPBXF, OP_R, AOT_NONE, AOT_NONE },
#if 1 /* FIXME really implement */
#if 1 /* FIXME implement correctly */
/* cdp */
{ "cdp", 0x00000000, OPNOP, AOT_NONE, AOT_NONE, AOT_NONE },
{ "cmn", 0x00000000, OPNOP, AOT_NONE, AOT_NONE, AOT_NONE },
{ "cmp", 0x00000000, OPNOP, AOT_NONE, AOT_NONE, AOT_NONE },
{ "eor", 0x00000000, OPNOP, AOT_NONE, AOT_NONE, AOT_NONE },
#endif
/* cmn */
{ "cmn", OPDATA(al,cmn), OPDATAF,OP_R, OP_R, OP_R },
{ "cmneq", OPDATA(eq,cmn), OPDATAF,OP_R, OP_R, OP_R },
{ "cmnne", OPDATA(ne,cmn), OPDATAF,OP_R, OP_R, OP_R },
{ "cmncs", OPDATA(cs,cmn), OPDATAF,OP_R, OP_R, OP_R },
{ "cmncc", OPDATA(cc,cmn), OPDATAF,OP_R, OP_R, OP_R },
{ "cmnmi", OPDATA(mi,cmn), OPDATAF,OP_R, OP_R, OP_R },
{ "cmnpl", OPDATA(pl,cmn), OPDATAF,OP_R, OP_R, OP_R },
{ "cmnvs", OPDATA(vs,cmn), OPDATAF,OP_R, OP_R, OP_R },
{ "cmnvc", OPDATA(vc,cmn), OPDATAF,OP_R, OP_R, OP_R },
{ "cmnhi", OPDATA(hi,cmn), OPDATAF,OP_R, OP_R, OP_R },
{ "cmnls", OPDATA(ls,cmn), OPDATAF,OP_R, OP_R, OP_R },
{ "cmnge", OPDATA(ge,cmn), OPDATAF,OP_R, OP_R, OP_R },
{ "cmnlt", OPDATA(lt,cmn), OPDATAF,OP_R, OP_R, OP_R },
{ "cmngt", OPDATA(gt,cmn), OPDATAF,OP_R, OP_R, OP_R },
{ "cmnle", OPDATA(le,cmn), OPDATAF,OP_R, OP_R, OP_R },
{ "cmnal", OPDATA(al,cmn), OPDATAF,OP_R, OP_R, OP_R },
/* cmp */
{ "cmp", OPDATA(al,cmp), OPDATAF,OP_R, OP_R, OP_R },
{ "cmpeq", OPDATA(eq,cmp), OPDATAF,OP_R, OP_R, OP_R },
{ "cmpne", OPDATA(ne,cmp), OPDATAF,OP_R, OP_R, OP_R },
{ "cmpcs", OPDATA(cs,cmp), OPDATAF,OP_R, OP_R, OP_R },
{ "cmpcc", OPDATA(cc,cmp), OPDATAF,OP_R, OP_R, OP_R },
{ "cmpmi", OPDATA(mi,cmp), OPDATAF,OP_R, OP_R, OP_R },
{ "cmppl", OPDATA(pl,cmp), OPDATAF,OP_R, OP_R, OP_R },
{ "cmpvs", OPDATA(vs,cmp), OPDATAF,OP_R, OP_R, OP_R },
{ "cmpvc", OPDATA(vc,cmp), OPDATAF,OP_R, OP_R, OP_R },
{ "cmphi", OPDATA(hi,cmp), OPDATAF,OP_R, OP_R, OP_R },
{ "cmpls", OPDATA(ls,cmp), OPDATAF,OP_R, OP_R, OP_R },
{ "cmpge", OPDATA(ge,cmp), OPDATAF,OP_R, OP_R, OP_R },
{ "cmplt", OPDATA(lt,cmp), OPDATAF,OP_R, OP_R, OP_R },
{ "cmpgt", OPDATA(gt,cmp), OPDATAF,OP_R, OP_R, OP_R },
{ "cmple", OPDATA(le,cmp), OPDATAF,OP_R, OP_R, OP_R },
{ "cmpal", OPDATA(al,cmp), OPDATAF,OP_R, OP_R, OP_R },
/* eor */
{ "eor", OPDATA(al,eor), OPDATAF,OP_R, OP_R, OP_R },
{ "eoreq", OPDATA(eq,eor), OPDATAF,OP_R, OP_R, OP_R },
{ "eorne", OPDATA(ne,eor), OPDATAF,OP_R, OP_R, OP_R },
{ "eorcs", OPDATA(cs,eor), OPDATAF,OP_R, OP_R, OP_R },
{ "eorcc", OPDATA(cc,eor), OPDATAF,OP_R, OP_R, OP_R },
{ "eormi", OPDATA(mi,eor), OPDATAF,OP_R, OP_R, OP_R },
{ "eorpl", OPDATA(pl,eor), OPDATAF,OP_R, OP_R, OP_R },
{ "eorvs", OPDATA(vs,eor), OPDATAF,OP_R, OP_R, OP_R },
{ "eorvc", OPDATA(vc,eor), OPDATAF,OP_R, OP_R, OP_R },
{ "eorhi", OPDATA(hi,eor), OPDATAF,OP_R, OP_R, OP_R },
{ "eorls", OPDATA(ls,eor), OPDATAF,OP_R, OP_R, OP_R },
{ "eorge", OPDATA(ge,eor), OPDATAF,OP_R, OP_R, OP_R },
{ "eorlt", OPDATA(lt,eor), OPDATAF,OP_R, OP_R, OP_R },
{ "eorgt", OPDATA(gt,eor), OPDATAF,OP_R, OP_R, OP_R },
{ "eorle", OPDATA(le,eor), OPDATAF,OP_R, OP_R, OP_R },
{ "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 },
{ "ldr", 0x00000000, OPNOP, AOT_NONE, AOT_NONE, AOT_NONE },
{ "mla", 0x00000000, OPNOP, AOT_NONE, AOT_NONE, AOT_NONE },
{ "mov", 0x00000000, OPNOP, AOT_NONE, AOT_NONE, AOT_NONE },
#endif
/* mov */
{ "mov", OPDATA(al,mov), OPDATAF,OP_R, OP_R, OP_R },
{ "moveq", OPDATA(eq,mov), OPDATAF,OP_R, OP_R, OP_R },
{ "movne", OPDATA(ne,mov), OPDATAF,OP_R, OP_R, OP_R },
{ "movcs", OPDATA(cs,mov), OPDATAF,OP_R, OP_R, OP_R },
{ "movcc", OPDATA(cc,mov), OPDATAF,OP_R, OP_R, OP_R },
{ "movmi", OPDATA(mi,mov), OPDATAF,OP_R, OP_R, OP_R },
{ "movpl", OPDATA(pl,mov), OPDATAF,OP_R, OP_R, OP_R },
{ "movvs", OPDATA(vs,mov), OPDATAF,OP_R, OP_R, OP_R },
{ "movvc", OPDATA(vc,mov), OPDATAF,OP_R, OP_R, OP_R },
{ "movhi", OPDATA(hi,mov), OPDATAF,OP_R, OP_R, OP_R },
{ "movls", OPDATA(ls,mov), OPDATAF,OP_R, OP_R, OP_R },
{ "movge", OPDATA(ge,mov), OPDATAF,OP_R, OP_R, OP_R },
{ "movlt", OPDATA(lt,mov), OPDATAF,OP_R, OP_R, OP_R },
{ "movgt", OPDATA(gt,mov), OPDATAF,OP_R, OP_R, OP_R },
{ "movle", OPDATA(le,mov), OPDATAF,OP_R, OP_R, OP_R },
{ "moval", OPDATA(al,mov), OPDATAF,OP_R, OP_R, OP_R },
#if 1 /* FIXME implement correctly */
{ "mrc", 0x00000000, OPNOP, AOT_NONE, AOT_NONE, AOT_NONE },
{ "mrs", 0x00000000, OPNOP, OP_R, OP_R, AOT_NONE },
/* msr */
@ -213,16 +294,116 @@
{ "msrle", 0x00000000, OPNOP, OP_R, OP_R, AOT_NONE },
{ "msral", 0x00000000, OPNOP, OP_R, OP_R, AOT_NONE },
{ "mul", 0x00000000, OPNOP, AOT_NONE, AOT_NONE, AOT_NONE },
{ "mvn", 0x00000000, OPNOP, AOT_NONE, AOT_NONE, AOT_NONE },
{ "nop", 0x00000000, OPNOP, AOT_NONE, AOT_NONE, AOT_NONE },
{ "orr", 0x00000000, OPNOP, AOT_NONE, AOT_NONE, AOT_NONE },
{ "rsb", 0x00000000, OPNOP, AOT_NONE, AOT_NONE, AOT_NONE },
{ "rsc", 0x00000000, OPNOP, AOT_NONE, AOT_NONE, AOT_NONE },
{ "sbc", 0x00000000, OPNOP, AOT_NONE, AOT_NONE, AOT_NONE },
#endif
/* mvn */
{ "mvn", OPDATA(al,mvn), OPDATAF,OP_R, OP_R, OP_R },
{ "mvneq", OPDATA(eq,mvn), OPDATAF,OP_R, OP_R, OP_R },
{ "mvnne", OPDATA(ne,mvn), OPDATAF,OP_R, OP_R, OP_R },
{ "mvncs", OPDATA(cs,mvn), OPDATAF,OP_R, OP_R, OP_R },
{ "mvncc", OPDATA(cc,mvn), OPDATAF,OP_R, OP_R, OP_R },
{ "mvnmi", OPDATA(mi,mvn), OPDATAF,OP_R, OP_R, OP_R },
{ "mvnpl", OPDATA(pl,mvn), OPDATAF,OP_R, OP_R, OP_R },
{ "mvnvs", OPDATA(vs,mvn), OPDATAF,OP_R, OP_R, OP_R },
{ "mvnvc", OPDATA(vc,mvn), OPDATAF,OP_R, OP_R, OP_R },
{ "mvnhi", OPDATA(hi,mvn), OPDATAF,OP_R, OP_R, OP_R },
{ "mvnls", OPDATA(ls,mvn), OPDATAF,OP_R, OP_R, OP_R },
{ "mvnge", OPDATA(ge,mvn), OPDATAF,OP_R, OP_R, OP_R },
{ "mvnlt", OPDATA(lt,mvn), OPDATAF,OP_R, OP_R, OP_R },
{ "mvngt", OPDATA(gt,mvn), OPDATAF,OP_R, OP_R, OP_R },
{ "mvnle", OPDATA(le,mvn), OPDATAF,OP_R, OP_R, OP_R },
{ "mvnal", OPDATA(al,mvn), OPDATAF,OP_R, OP_R, OP_R },
{ "nop", OPDATA(al,mov), OPDATAF,AOT_NONE, AOT_NONE, AOT_NONE },
/* orr */
{ "orr", OPDATA(al,orr), OPDATAF,OP_R, OP_R, OP_R },
{ "orreq", OPDATA(eq,orr), OPDATAF,OP_R, OP_R, OP_R },
{ "orrne", OPDATA(ne,orr), OPDATAF,OP_R, OP_R, OP_R },
{ "orrcs", OPDATA(cs,orr), OPDATAF,OP_R, OP_R, OP_R },
{ "orrcc", OPDATA(cc,orr), OPDATAF,OP_R, OP_R, OP_R },
{ "orrmi", OPDATA(mi,orr), OPDATAF,OP_R, OP_R, OP_R },
{ "orrpl", OPDATA(pl,orr), OPDATAF,OP_R, OP_R, OP_R },
{ "orrvs", OPDATA(vs,orr), OPDATAF,OP_R, OP_R, OP_R },
{ "orrvc", OPDATA(vc,orr), OPDATAF,OP_R, OP_R, OP_R },
{ "orrhi", OPDATA(hi,orr), OPDATAF,OP_R, OP_R, OP_R },
{ "orrls", OPDATA(ls,orr), OPDATAF,OP_R, OP_R, OP_R },
{ "orrge", OPDATA(ge,orr), OPDATAF,OP_R, OP_R, OP_R },
{ "orrlt", OPDATA(lt,orr), OPDATAF,OP_R, OP_R, OP_R },
{ "orrgt", OPDATA(gt,orr), OPDATAF,OP_R, OP_R, OP_R },
{ "orrle", OPDATA(le,orr), OPDATAF,OP_R, OP_R, OP_R },
{ "orral", OPDATA(al,orr), OPDATAF,OP_R, OP_R, OP_R },
/* rsb */
{ "rsb", OPDATA(al,rsb), OPDATAF,OP_R, OP_R, OP_R },
{ "rsbeq", OPDATA(eq,rsb), OPDATAF,OP_R, OP_R, OP_R },
{ "rsbne", OPDATA(ne,rsb), OPDATAF,OP_R, OP_R, OP_R },
{ "rsbcs", OPDATA(cs,rsb), OPDATAF,OP_R, OP_R, OP_R },
{ "rsbcc", OPDATA(cc,rsb), OPDATAF,OP_R, OP_R, OP_R },
{ "rsbmi", OPDATA(mi,rsb), OPDATAF,OP_R, OP_R, OP_R },
{ "rsbpl", OPDATA(pl,rsb), OPDATAF,OP_R, OP_R, OP_R },
{ "rsbvs", OPDATA(vs,rsb), OPDATAF,OP_R, OP_R, OP_R },
{ "rsbvc", OPDATA(vc,rsb), OPDATAF,OP_R, OP_R, OP_R },
{ "rsbhi", OPDATA(hi,rsb), OPDATAF,OP_R, OP_R, OP_R },
{ "rsbls", OPDATA(ls,rsb), OPDATAF,OP_R, OP_R, OP_R },
{ "rsbge", OPDATA(ge,rsb), OPDATAF,OP_R, OP_R, OP_R },
{ "rsblt", OPDATA(lt,rsb), OPDATAF,OP_R, OP_R, OP_R },
{ "rsbgt", OPDATA(gt,rsb), OPDATAF,OP_R, OP_R, OP_R },
{ "rsble", OPDATA(le,rsb), OPDATAF,OP_R, OP_R, OP_R },
{ "rsbal", OPDATA(al,rsb), OPDATAF,OP_R, OP_R, OP_R },
/* rsc */
{ "rsc", OPDATA(al,rsc), OPDATAF,OP_R, OP_R, OP_R },
{ "rsceq", OPDATA(eq,rsc), OPDATAF,OP_R, OP_R, OP_R },
{ "rscne", OPDATA(ne,rsc), OPDATAF,OP_R, OP_R, OP_R },
{ "rsccs", OPDATA(cs,rsc), OPDATAF,OP_R, OP_R, OP_R },
{ "rsccc", OPDATA(cc,rsc), OPDATAF,OP_R, OP_R, OP_R },
{ "rscmi", OPDATA(mi,rsc), OPDATAF,OP_R, OP_R, OP_R },
{ "rscpl", OPDATA(pl,rsc), OPDATAF,OP_R, OP_R, OP_R },
{ "rscvs", OPDATA(vs,rsc), OPDATAF,OP_R, OP_R, OP_R },
{ "rscvc", OPDATA(vc,rsc), OPDATAF,OP_R, OP_R, OP_R },
{ "rschi", OPDATA(hi,rsc), OPDATAF,OP_R, OP_R, OP_R },
{ "rscls", OPDATA(ls,rsc), OPDATAF,OP_R, OP_R, OP_R },
{ "rscge", OPDATA(ge,rsc), OPDATAF,OP_R, OP_R, OP_R },
{ "rsclt", OPDATA(lt,rsc), OPDATAF,OP_R, OP_R, OP_R },
{ "rscgt", OPDATA(gt,rsc), OPDATAF,OP_R, OP_R, OP_R },
{ "rscle", OPDATA(le,rsc), OPDATAF,OP_R, OP_R, OP_R },
{ "rscal", OPDATA(al,rsc), OPDATAF,OP_R, OP_R, OP_R },
/* sbc */
{ "sbc", OPDATA(al,sbc), OPDATAF,OP_R, OP_R, OP_R },
{ "sbceq", OPDATA(eq,sbc), OPDATAF,OP_R, OP_R, OP_R },
{ "sbcne", OPDATA(ne,sbc), OPDATAF,OP_R, OP_R, OP_R },
{ "sbccs", OPDATA(cs,sbc), OPDATAF,OP_R, OP_R, OP_R },
{ "sbccc", OPDATA(cc,sbc), OPDATAF,OP_R, OP_R, OP_R },
{ "sbcmi", OPDATA(mi,sbc), OPDATAF,OP_R, OP_R, OP_R },
{ "sbcpl", OPDATA(pl,sbc), OPDATAF,OP_R, OP_R, OP_R },
{ "sbcvs", OPDATA(vs,sbc), OPDATAF,OP_R, OP_R, OP_R },
{ "sbcvc", OPDATA(vc,sbc), OPDATAF,OP_R, OP_R, OP_R },
{ "sbchi", OPDATA(hi,sbc), OPDATAF,OP_R, OP_R, OP_R },
{ "sbcls", OPDATA(ls,sbc), OPDATAF,OP_R, OP_R, OP_R },
{ "sbcge", OPDATA(ge,sbc), OPDATAF,OP_R, OP_R, OP_R },
{ "sbclt", OPDATA(lt,sbc), OPDATAF,OP_R, OP_R, OP_R },
{ "sbcgt", OPDATA(gt,sbc), OPDATAF,OP_R, OP_R, OP_R },
{ "sbcle", OPDATA(le,sbc), OPDATAF,OP_R, OP_R, OP_R },
{ "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 },
{ "str", 0x00000000, OPNOP, AOT_NONE, AOT_NONE, AOT_NONE },
{ "sub", 0x00000000, OPNOP, AOT_NONE, AOT_NONE, AOT_NONE },
#endif
/* sub */
{ "sub", OPDATA(al,sub), OPDATAF,OP_R, OP_R, OP_R },
{ "subeq", OPDATA(eq,sub), OPDATAF,OP_R, OP_R, OP_R },
{ "subne", OPDATA(ne,sub), OPDATAF,OP_R, OP_R, OP_R },
{ "subcs", OPDATA(cs,sub), OPDATAF,OP_R, OP_R, OP_R },
{ "subcc", OPDATA(cc,sub), OPDATAF,OP_R, OP_R, OP_R },
{ "submi", OPDATA(mi,sub), OPDATAF,OP_R, OP_R, OP_R },
{ "subpl", OPDATA(pl,sub), OPDATAF,OP_R, OP_R, OP_R },
{ "subvs", OPDATA(vs,sub), OPDATAF,OP_R, OP_R, OP_R },
{ "subvc", OPDATA(vc,sub), OPDATAF,OP_R, OP_R, OP_R },
{ "subhi", OPDATA(hi,sub), OPDATAF,OP_R, OP_R, OP_R },
{ "subls", OPDATA(ls,sub), OPDATAF,OP_R, OP_R, OP_R },
{ "subge", OPDATA(ge,sub), OPDATAF,OP_R, OP_R, OP_R },
{ "sublt", OPDATA(lt,sub), OPDATAF,OP_R, OP_R, OP_R },
{ "subgt", OPDATA(gt,sub), OPDATAF,OP_R, OP_R, OP_R },
{ "suble", OPDATA(le,sub), OPDATAF,OP_R, OP_R, OP_R },
{ "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 },
{ "teq", 0x00000000, OPNOP, AOT_NONE, AOT_NONE, AOT_NONE },

View File

@ -11,7 +11,28 @@
bleq $0xa0
bx %r0
bxeq %r0
bic %r0, %r0, $0x1f
bic %r0, %r0, %r0
biceq %r2, %r0, %r1
cmn %r5, %r4, %r3
cmneq %r5, %r4, %r3
cmp %r5, %r4, %r3
cmpeq %r5, %r4, %r3
eor %r5, %r4, %r3
eoreq %r5, %r4, %r3
mov %r5, %r4, %r3
moveq %r5, %r4, %r3
mrs %r0, %cpsr
msr %r0, %cpsr
mvn %r5, %r4, %r3
mvneq %r5, %r4, %r3
nop
orr %r5, %r4, %r3
orreq %r5, %r4, %r3
rsb %r5, %r4, %r3
rsbeq %r5, %r4, %r3
rsc %r5, %r4, %r3
rsceq %r5, %r4, %r3
sbc %r5, %r4, %r3
sbceq %r5, %r4, %r3
sub %r5, %r4, %r3
subeq %r5, %r4, %r3