From b46fad75cdd20250e973087d0c9d3e9943c173ef Mon Sep 17 00:00:00 2001 From: Pierre Pronchery Date: Sun, 12 Jun 2011 00:39:19 +0000 Subject: [PATCH] Improving ARM support --- src/arch/arm.ins | 211 +++++++++++++++++++++++++++++++++++++++++++---- test/arm.S | 23 +++++- 2 files changed, 218 insertions(+), 16 deletions(-) diff --git a/src/arch/arm.ins b/src/arch/arm.ins index 8fe2533..833c375 100644 --- a/src/arch/arm.ins +++ b/src/arch/arm.ins @@ -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 }, diff --git a/test/arm.S b/test/arm.S index a01c510..3b76769 100644 --- a/test/arm.S +++ b/test/arm.S @@ -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