From 5c3093a93769ddeb4a231cb10fbf9dfea20f5996 Mon Sep 17 00:00:00 2001 From: Jeppe Johansen <jeppe@j-software.dk> Date: Fri, 26 Dec 2014 18:35:15 +0000 Subject: [PATCH] Add most non-VFP Thumb-2 instruction entries for the ARM internal writer. git-svn-id: branches/laksen/armiw@29329 - --- compiler/arm/aasmcpu.pas | 674 ++++++++++++++++- compiler/arm/armatt.inc | 4 +- compiler/arm/armins.dat | 359 +++++++-- compiler/arm/armnop.inc | 2 +- compiler/arm/armop.inc | 4 +- compiler/arm/armtab.inc | 1525 +++++++++++++++++++++++++++++++++++++- compiler/arm/cpubase.pas | 16 +- compiler/arm/cpuelf.pas | 2 + compiler/ogbase.pas | 1 + 9 files changed, 2503 insertions(+), 84 deletions(-) diff --git a/compiler/arm/aasmcpu.pas b/compiler/arm/aasmcpu.pas index e871568fd8..92eca4a1aa 100644 --- a/compiler/arm/aasmcpu.pas +++ b/compiler/arm/aasmcpu.pas @@ -30,7 +30,8 @@ uses aasmbase,aasmtai,aasmdata,aasmsym, ogbase, symtype, - cpubase,cpuinfo,cgbase,cgutils; + cpubase,cpuinfo,cgbase,cgutils, + sysutils; const { "mov reg,reg" source operand number } @@ -74,6 +75,7 @@ uses OT_IMM80 = $00002010; OT_IMMTINY = $00002100; OT_IMMSHIFTER= $00002200; + OT_IMMEDIATEZERO = $10002200; OT_IMMEDIATE24 = OT_IMM24; OT_SHIFTIMM = OT_SHIFTEROP or OT_IMMSHIFTER; OT_SHIFTIMMEDIATE = OT_SHIFTIMM; @@ -137,6 +139,7 @@ uses IF_ARM32 = $00010000; IF_THUMB = $00020000; IF_THUMB32 = $00040000; + IF_WIDE = $00080000; IF_ARMvMASK = $0FF00000; IF_ARMv4 = $00100000; @@ -791,21 +794,10 @@ implementation end; - var - IF_ArmInsVersion: longword; - - procedure BuildInsTabCache; var i : longint; begin - if GenerateThumb2Code then - IF_ArmInsVersion:=IF_THUMB32 - else if GenerateThumbCode then - IF_ArmInsVersion:=IF_THUMB - else - IF_ArmInsVersion:=IF_ARM32; - new(instabcache); FillChar(instabcache^,sizeof(tinstabcache),$ff); i:=0; @@ -1973,8 +1965,9 @@ implementation ot:=ot or OT_AM4 else ot:=ot or OT_AM3; - end - else if (ref^.base<>NR_NO) and + end; + + if (ref^.base<>NR_NO) and (opcode in [A_LDREX,A_LDREXB,A_LDREXH,A_LDREXD, A_STREX,A_STREXB,A_STREXH,A_STREXD]) and ( @@ -2040,7 +2033,11 @@ implementation top_const : begin ot:=OT_IMMEDIATE; - if is_shifter_const(val,dummy) then + if (val=0) then + ot:=ot_immediatezero + else if is_shifter_const(val,dummy) then + ot:=OT_IMMSHIFTER + else if GenerateThumb2Code and is_thumb32_imm(val) then ot:=OT_IMMSHIFTER else ot:=OT_IMM32 @@ -2115,6 +2112,13 @@ implementation exit; end; + { Check wideformat flag } + if ((p^.flags and IF_WIDE)<>0) <> wideformat then + begin + //matches:=0; + //exit; + end; + { Check that no spurious colons or TOs are present } for i:=0 to p^.ops-1 do if (oper[i]^.ot and (not p^.optypes[i]) and (OT_COLON or OT_TO))<>0 then @@ -2154,7 +2158,7 @@ implementation { update condition flags or floating point single } if (oppostfix=PF_S) and - not(p^.code[0] in [#$04..#$0F,#$14..#$16,#$29,#$30]) then + not(p^.code[0] in [#$04..#$0F,#$14..#$16,#$29,#$30, #$80..#$82]) then begin Matches:=0; exit; @@ -2174,7 +2178,7 @@ implementation // ldr,str,ldrb,strb #$17, // stm,ldm - #$26, + #$26,#$8C, // vldm/vstm #$44 ]) then @@ -2544,6 +2548,73 @@ implementation end; end; + procedure encodethumbimm(imm: longword); + var + imm12, tmp: tcgint; + shift: integer; + found: boolean; + begin + found:=true; + if (imm and $FF) = imm then + imm12:=imm + else if ((imm shr 16)=(imm and $FFFF)) and + ((imm and $FF00FF00) = 0) then + imm12:=(imm and $ff) or ($1 shl 8) + else if ((imm shr 16)=(imm and $FFFF)) and + ((imm and $00FF00FF) = 0) then + imm12:=((imm shr 8) and $ff) or ($2 shl 8) + else if ((imm shr 16)=(imm and $FFFF)) and + (((imm shr 8) and $FF)=(imm and $FF)) then + imm12:=(imm and $ff) or ($3 shl 8) + else + begin + found:=false; + for shift:=1 to 31 do + begin + tmp:=RolDWord(imm,shift); + if ((tmp and $FF)=tmp) and + ((tmp and $80)=$80) then + begin + imm12:=(tmp and $7F) or (shift shl 7); + found:=true; + break; + end; + end; + end; + + if found then + begin + bytes:=bytes or (imm12 and $FF); + bytes:=bytes or (((imm12 shr 8) and $7) shl 12); + bytes:=bytes or (((imm12 shr 11) and $1) shl 26); + end + else + Message1(asmw_e_value_exceeds_bounds, IntToStr(imm)); + end; + + procedure setthumbshift(op: byte; is_sat: boolean = false); + var + shift,typ: byte; + begin + case oper[op]^.shifterop^.shiftmode of + SM_LSL: begin typ:=0; shift:=oper[op]^.shifterop^.shiftimm; end; + SM_LSR: begin typ:=1; shift:=oper[op]^.shifterop^.shiftimm; if shift=32 then shift:=0; end; + SM_ASR: begin typ:=2; shift:=oper[op]^.shifterop^.shiftimm; if shift=32 then shift:=0; end; + SM_ROR: begin typ:=3; shift:=oper[op]^.shifterop^.shiftimm; if shift=0 then message(asmw_e_invalid_opcode_and_operands); end; + SM_RRX: begin typ:=3; shift:=oper[op]^.shifterop^.shiftimm; shift:=0; end; + end; + + if is_sat then + begin + bytes:=bytes or ((typ and 1) shl 5); + bytes:=bytes or ((typ shr 1) shl 21); + end + else + bytes:=bytes or (typ shl 4); + bytes:=bytes or (shift and $3) shl 6; + bytes:=bytes or ((shift and $1C) shr 2) shl 12; + end; + begin bytes:=$0; bytelen:=4; @@ -4122,6 +4193,570 @@ implementation end; end; end; + #$80: { Thumb-2: Dataprocessing } + begin + bytes:=0; + { set instruction code } + bytes:=bytes or (ord(insentry^.code[1]) shl 24); + bytes:=bytes or (ord(insentry^.code[2]) shl 16); + bytes:=bytes or (ord(insentry^.code[3]) shl 8); + bytes:=bytes or ord(insentry^.code[4]); + + if ops=1 then + begin + if oper[0]^.typ=top_reg then + bytes:=bytes or (getsupreg(oper[0]^.reg) shl 16) + else if oper[0]^.typ=top_const then + bytes:=bytes or (oper[0]^.val and $F); + end + else if (ops=2) and + (opcode in [A_CMP,A_CMN,A_TEQ,A_TST]) then + begin + bytes:=bytes or (getsupreg(oper[0]^.reg) shl 16); + + if oper[1]^.typ=top_const then + encodethumbimm(oper[1]^.val) + else if oper[1]^.typ=top_reg then + bytes:=bytes or (getsupreg(oper[1]^.reg) shl 0); + end + else if (ops=3) and + (opcode in [A_CMP,A_CMN,A_TEQ,A_TST]) then + begin + bytes:=bytes or (getsupreg(oper[0]^.reg) shl 16); + bytes:=bytes or (getsupreg(oper[1]^.reg) shl 0); + + if oper[2]^.typ=top_shifterop then + setthumbshift(2) + else if oper[2]^.typ=top_reg then + bytes:=bytes or (getsupreg(oper[2]^.reg) shl 12); + end + else if (ops=2) and + (opcode in [A_REV,A_RBIT,A_REV16,A_REVSH,A_CLZ]) then + begin + bytes:=bytes or (getsupreg(oper[0]^.reg) shl 8); + bytes:=bytes or (getsupreg(oper[1]^.reg) shl 16); + bytes:=bytes or (getsupreg(oper[1]^.reg) shl 0); + end + else if ops=2 then + begin + bytes:=bytes or (getsupreg(oper[0]^.reg) shl 8); + + if oper[1]^.typ=top_const then + encodethumbimm(oper[1]^.val) + else if oper[1]^.typ=top_reg then + bytes:=bytes or (getsupreg(oper[1]^.reg) shl 0); + end + else if ops=3 then + begin + bytes:=bytes or (getsupreg(oper[0]^.reg) shl 8); + bytes:=bytes or (getsupreg(oper[1]^.reg) shl 16); + + if oper[2]^.typ=top_const then + encodethumbimm(oper[2]^.val) + else if oper[2]^.typ=top_reg then + bytes:=bytes or (getsupreg(oper[2]^.reg) shl 0); + end + else if ops=4 then + begin + bytes:=bytes or (getsupreg(oper[0]^.reg) shl 8); + bytes:=bytes or (getsupreg(oper[1]^.reg) shl 16); + bytes:=bytes or (getsupreg(oper[2]^.reg) shl 0); + + if oper[3]^.typ=top_shifterop then + setthumbshift(3) + else if oper[3]^.typ=top_reg then + bytes:=bytes or (getsupreg(oper[3]^.reg) shl 12); + end; + + if oppostfix=PF_S then + bytes:=bytes or (1 shl 20) + else if oppostfix=PF_X then + bytes:=bytes or (1 shl 4) + else if oppostfix=PF_R then + bytes:=bytes or (1 shl 4); + end; + #$81: { Thumb-2: Dataprocessing misc } + begin + bytes:=0; + { set instruction code } + bytes:=bytes or (ord(insentry^.code[1]) shl 24); + bytes:=bytes or (ord(insentry^.code[2]) shl 16); + bytes:=bytes or (ord(insentry^.code[3]) shl 8); + bytes:=bytes or ord(insentry^.code[4]); + + if ops=3 then + begin + bytes:=bytes or (getsupreg(oper[0]^.reg) shl 8); + bytes:=bytes or (getsupreg(oper[1]^.reg) shl 16); + + if oper[2]^.typ=top_const then + begin + bytes:=bytes or (oper[2]^.val and $FF); + bytes:=bytes or ((oper[2]^.val and $700) shr 8) shl 12; + bytes:=bytes or ((oper[2]^.val and $800) shr 11) shl 26; + end; + end + else if ops=2 then + begin + bytes:=bytes or (getsupreg(oper[0]^.reg) shl 8); + + if oper[1]^.typ=top_const then + begin + offset:=oper[1]^.val; + end + else if oper[1]^.typ=top_ref then + begin + offset:=0; + currsym:=objdata.symbolref(oper[1]^.ref^.symbol); + if assigned(currsym) then + offset:=currsym.offset-insoffset-8; + offset:=offset+oper[1]^.ref^.offset; + + offset:=offset; + end; + + bytes:=bytes or (offset and $FF); + bytes:=bytes or ((offset and $700) shr 8) shl 12; + bytes:=bytes or ((offset and $800) shr 11) shl 26; + bytes:=bytes or ((offset and $F000) shr 12) shl 16; + end; + + if oppostfix=PF_S then + bytes:=bytes or (1 shl 20); + end; + #$82: { Thumb-2: Shifts } + begin + bytes:=0; + { set instruction code } + bytes:=bytes or (ord(insentry^.code[1]) shl 24); + bytes:=bytes or (ord(insentry^.code[2]) shl 16); + bytes:=bytes or (ord(insentry^.code[3]) shl 8); + bytes:=bytes or ord(insentry^.code[4]); + + bytes:=bytes or (getsupreg(oper[0]^.reg) shl 8); + if oper[1]^.typ=top_reg then + begin + offset:=2; + bytes:=bytes or (getsupreg(oper[1]^.reg) shl 0); + end + else + offset:=1; + + if oper[offset]^.typ=top_const then + begin + bytes:=bytes or (oper[offset]^.val and $3) shl 6; + bytes:=bytes or (oper[offset]^.val and $1C) shl 10; + end + else if oper[offset]^.typ=top_reg then + bytes:=bytes or (getsupreg(oper[offset]^.reg) shl 16); + + if (ops>=(offset+2)) and + (oper[offset+1]^.typ=top_const) then + bytes:=bytes or (oper[offset+1]^.val and $1F); + + if oppostfix=PF_S then + bytes:=bytes or (1 shl 20); + end; + #$84: { Thumb-2: Shifts(width-1) } + begin + bytes:=0; + { set instruction code } + bytes:=bytes or (ord(insentry^.code[1]) shl 24); + bytes:=bytes or (ord(insentry^.code[2]) shl 16); + bytes:=bytes or (ord(insentry^.code[3]) shl 8); + bytes:=bytes or ord(insentry^.code[4]); + + bytes:=bytes or (getsupreg(oper[0]^.reg) shl 8); + if oper[1]^.typ=top_reg then + begin + offset:=2; + bytes:=bytes or (getsupreg(oper[1]^.reg) shl 16); + end + else + offset:=1; + + if oper[offset]^.typ=top_const then + begin + bytes:=bytes or (oper[offset]^.val and $3) shl 6; + bytes:=bytes or (oper[offset]^.val and $1C) shl 10; + end; + + if (ops>=(offset+2)) and + (oper[offset+1]^.typ=top_const) then + begin + if opcode in [A_BFI,A_BFC] then + i_field:=oper[offset+1]^.val+oper[offset]^.val-1 + else + i_field:=oper[offset+1]^.val-1; + + bytes:=bytes or (i_field and $1F); + end; + + if oppostfix=PF_S then + bytes:=bytes or (1 shl 20); + end; + #$83: { Thumb-2: Saturation } + begin + bytes:=0; + { set instruction code } + bytes:=bytes or (ord(insentry^.code[1]) shl 24); + bytes:=bytes or (ord(insentry^.code[2]) shl 16); + bytes:=bytes or (ord(insentry^.code[3]) shl 8); + bytes:=bytes or ord(insentry^.code[4]); + + bytes:=bytes or (getsupreg(oper[0]^.reg) shl 8); + bytes:=bytes or (oper[1]^.val and $1F); + bytes:=bytes or (getsupreg(oper[2]^.reg) shl 16); + + if ops=4 then + setthumbshift(3,true); + end; + #$85: { Thumb-2: Long multiplications } + begin + bytes:=0; + { set instruction code } + bytes:=bytes or (ord(insentry^.code[1]) shl 24); + bytes:=bytes or (ord(insentry^.code[2]) shl 16); + bytes:=bytes or (ord(insentry^.code[3]) shl 8); + bytes:=bytes or ord(insentry^.code[4]); + + if ops=4 then + begin + bytes:=bytes or (getsupreg(oper[0]^.reg) shl 12); + bytes:=bytes or (getsupreg(oper[1]^.reg) shl 8); + bytes:=bytes or (getsupreg(oper[2]^.reg) shl 16); + bytes:=bytes or (getsupreg(oper[3]^.reg) shl 0); + end; + + if oppostfix=PF_S then + bytes:=bytes or (1 shl 20) + else if oppostfix=PF_X then + bytes:=bytes or (1 shl 4); + end; + #$86: { Thumb-2: Extension ops } + begin + bytes:=0; + { set instruction code } + bytes:=bytes or (ord(insentry^.code[1]) shl 24); + bytes:=bytes or (ord(insentry^.code[2]) shl 16); + bytes:=bytes or (ord(insentry^.code[3]) shl 8); + bytes:=bytes or ord(insentry^.code[4]); + + if ops=2 then + begin + bytes:=bytes or (getsupreg(oper[0]^.reg) shl 8); + bytes:=bytes or (getsupreg(oper[1]^.reg) shl 0); + end + else if ops=3 then + begin + if oper[2]^.typ=top_shifterop then + begin + bytes:=bytes or (getsupreg(oper[0]^.reg) shl 8); + bytes:=bytes or (getsupreg(oper[1]^.reg) shl 0); + bytes:=bytes or ((oper[2]^.shifterop^.shiftimm shr 3) shl 4); + end + else + begin + bytes:=bytes or (getsupreg(oper[0]^.reg) shl 8); + bytes:=bytes or (getsupreg(oper[1]^.reg) shl 16); + bytes:=bytes or (getsupreg(oper[2]^.reg) shl 0); + end; + end + else if ops=4 then + begin + if oper[3]^.typ=top_shifterop then + begin + bytes:=bytes or (getsupreg(oper[0]^.reg) shl 8); + bytes:=bytes or (getsupreg(oper[1]^.reg) shl 16); + bytes:=bytes or (getsupreg(oper[2]^.reg) shl 0); + bytes:=bytes or ((oper[3]^.shifterop^.shiftimm shr 3) shl 4); + end; + end; + end; + #$87: { Thumb-2: PLD/PLI } + begin + { set instruction code } + bytes:=bytes or (ord(insentry^.code[1]) shl 24); + bytes:=bytes or (ord(insentry^.code[2]) shl 16); + bytes:=bytes or (ord(insentry^.code[3]) shl 8); + bytes:=bytes or ord(insentry^.code[4]); + { set Rn and Rd } + bytes:=bytes or getsupreg(oper[0]^.ref^.base) shl 16; + if getregtype(oper[0]^.ref^.index)=R_INVALIDREGISTER then + begin + { set offset } + offset:=0; + currsym:=objdata.symbolref(oper[0]^.ref^.symbol); + if assigned(currsym) then + offset:=currsym.offset-insoffset-8; + offset:=offset+oper[0]^.ref^.offset; + if offset>=0 then + begin + { set U flag } + bytes:=bytes or (1 shl 23); + bytes:=bytes or (offset and $FFF); + end + else + begin + bytes:=bytes or ($3 shl 10); + + offset:=-offset; + bytes:=bytes or (offset and $FF); + end; + end + else + begin + bytes:=bytes or getsupreg(oper[0]^.ref^.index); + { set shift } + with oper[0]^.ref^ do + if shiftmode=SM_LSL then + bytes:=bytes or (shiftimm shl 4); + end; + end; + #$88: { Thumb-2: LDR/STR } + begin + { set instruction code } + bytes:=bytes or (ord(insentry^.code[1]) shl 24); + bytes:=bytes or (ord(insentry^.code[2]) shl 16); + bytes:=bytes or (ord(insentry^.code[3]) shl 8); + bytes:=bytes or (ord(insentry^.code[4]) shl 0); + { set Rn and Rd } + bytes:=bytes or getsupreg(oper[0]^.reg) shl 12; + bytes:=bytes or getsupreg(oper[1]^.ref^.base) shl 16; + if getregtype(oper[1]^.ref^.index)=R_INVALIDREGISTER then + begin + { set offset } + offset:=0; + currsym:=objdata.symbolref(oper[1]^.ref^.symbol); + if assigned(currsym) then + offset:=currsym.offset-insoffset-8; + offset:=(offset+oper[1]^.ref^.offset) shr ord(insentry^.code[5]); + if offset>=0 then + begin + if not (opcode in [A_LDRT,A_LDRSBT,A_LDRSHT,A_LDRBT,A_LDRHT]) then + bytes:=bytes or (1 shl 23); + { set U flag } + if (oper[1]^.ref^.addressmode<>AM_OFFSET) then + bytes:=bytes or (1 shl 9); + bytes:=bytes or offset + end + else + begin + bytes:=bytes or (1 shl 11); + + offset:=-offset; + bytes:=bytes or offset + end; + end + else + begin + { set I flag } + bytes:=bytes or (1 shl 25); + bytes:=bytes or getsupreg(oper[1]^.ref^.index); + { set shift } + with oper[1]^.ref^ do + if shiftmode<>SM_None then + bytes:=bytes or (shiftimm shl 4); + end; + + if not (opcode in [A_LDRT,A_LDRSBT,A_LDRSHT,A_LDRBT,A_LDRHT]) then + begin + { set W bit } + if oper[1]^.ref^.addressmode<>AM_OFFSET then + bytes:=bytes or (1 shl 8); + { set P bit if necessary } + if oper[1]^.ref^.addressmode<>AM_POSTINDEXED then + bytes:=bytes or (1 shl 10); + end; + end; + #$89: { Thumb-2: LDRD/STRD } + begin + { set instruction code } + bytes:=bytes or (ord(insentry^.code[1]) shl 24); + bytes:=bytes or (ord(insentry^.code[2]) shl 16); + bytes:=bytes or (ord(insentry^.code[3]) shl 8); + bytes:=bytes or (ord(insentry^.code[4]) shl 0); + { set Rn and Rd } + bytes:=bytes or getsupreg(oper[0]^.reg) shl 12; + bytes:=bytes or getsupreg(oper[1]^.reg) shl 8; + bytes:=bytes or getsupreg(oper[2]^.ref^.base) shl 16; + if getregtype(oper[2]^.ref^.index)=R_INVALIDREGISTER then + begin + { set offset } + offset:=0; + currsym:=objdata.symbolref(oper[2]^.ref^.symbol); + if assigned(currsym) then + offset:=currsym.offset-insoffset-8; + offset:=(offset+oper[2]^.ref^.offset) div 4; + if offset>=0 then + begin + { set U flag } + bytes:=bytes or (1 shl 23); + bytes:=bytes or offset + end + else + begin + offset:=-offset; + bytes:=bytes or offset + end; + end + else + begin + message(asmw_e_invalid_opcode_and_operands); + end; + { set W bit } + if oper[2]^.ref^.addressmode<>AM_OFFSET then + bytes:=bytes or (1 shl 21); + { set P bit if necessary } + if oper[2]^.ref^.addressmode<>AM_POSTINDEXED then + bytes:=bytes or (1 shl 24); + end; + #$8A: { Thumb-2: LDREX } + begin + { set instruction code } + bytes:=bytes or (ord(insentry^.code[1]) shl 24); + bytes:=bytes or (ord(insentry^.code[2]) shl 16); + bytes:=bytes or (ord(insentry^.code[3]) shl 8); + bytes:=bytes or (ord(insentry^.code[4]) shl 0); + { set Rn and Rd } + bytes:=bytes or getsupreg(oper[0]^.reg) shl 12; + + if (ops=2) and (opcode in [A_LDREX]) then + begin + bytes:=bytes or getsupreg(oper[1]^.ref^.base) shl 16; + if getregtype(oper[1]^.ref^.index)=R_INVALIDREGISTER then + begin + { set offset } + offset:=0; + currsym:=objdata.symbolref(oper[1]^.ref^.symbol); + if assigned(currsym) then + offset:=currsym.offset-insoffset-8; + offset:=(offset+oper[1]^.ref^.offset) div 4; + if offset>=0 then + begin + bytes:=bytes or offset + end + else + begin + message(asmw_e_invalid_opcode_and_operands); + end; + end + else + begin + message(asmw_e_invalid_opcode_and_operands); + end; + end + else if (ops=2) then + begin + bytes:=bytes or getsupreg(oper[1]^.ref^.base) shl 16; + end + else + begin + bytes:=bytes or getsupreg(oper[1]^.reg) shl 8; + bytes:=bytes or getsupreg(oper[2]^.ref^.base) shl 16; + end; + end; + #$8B: { Thumb-2: STREX } + begin + { set instruction code } + bytes:=bytes or (ord(insentry^.code[1]) shl 24); + bytes:=bytes or (ord(insentry^.code[2]) shl 16); + bytes:=bytes or (ord(insentry^.code[3]) shl 8); + bytes:=bytes or (ord(insentry^.code[4]) shl 0); + { set Rn and Rd } + if (ops=3) and (opcode in [A_STREX]) then + begin + bytes:=bytes or getsupreg(oper[0]^.reg) shl 8; + bytes:=bytes or getsupreg(oper[1]^.reg) shl 12; + bytes:=bytes or getsupreg(oper[2]^.ref^.base) shl 16; + if getregtype(oper[2]^.ref^.index)=R_INVALIDREGISTER then + begin + { set offset } + offset:=0; + currsym:=objdata.symbolref(oper[2]^.ref^.symbol); + if assigned(currsym) then + offset:=currsym.offset-insoffset-8; + offset:=(offset+oper[2]^.ref^.offset) div 4; + if offset>=0 then + begin + bytes:=bytes or offset + end + else + begin + message(asmw_e_invalid_opcode_and_operands); + end; + end + else + begin + message(asmw_e_invalid_opcode_and_operands); + end; + end + else if (ops=3) then + begin + bytes:=bytes or getsupreg(oper[0]^.reg) shl 0; + bytes:=bytes or getsupreg(oper[1]^.reg) shl 12; + bytes:=bytes or getsupreg(oper[2]^.ref^.base) shl 16; + end + else + begin + bytes:=bytes or getsupreg(oper[0]^.reg) shl 0; + bytes:=bytes or getsupreg(oper[1]^.reg) shl 12; + bytes:=bytes or getsupreg(oper[2]^.reg) shl 8; + bytes:=bytes or getsupreg(oper[3]^.ref^.base) shl 16; + end; + end; + #$8C: { Thumb-2: LDM/STM } + begin + { set instruction code } + bytes:=bytes or (ord(insentry^.code[1]) shl 24); + bytes:=bytes or (ord(insentry^.code[2]) shl 16); + bytes:=bytes or (ord(insentry^.code[3]) shl 8); + bytes:=bytes or (ord(insentry^.code[4]) shl 0); + + if oper[0]^.typ=top_reg then + bytes:=bytes or (getsupreg(oper[0]^.reg) shl 16) + else + begin + bytes:=bytes or (getsupreg(oper[0]^.ref^.base) shl 16); + if oper[0]^.ref^.addressmode<>AM_OFFSET then + bytes:=bytes or (1 shl 21); + end; + + for r:=0 to 15 do + if r in oper[1]^.regset^ then + bytes:=bytes or (1 shl r); + + case oppostfix of + PF_None,PF_IA,PF_FD: bytes:=bytes or ($1 shl 23); + PF_DB,PF_EA: bytes:=bytes or ($2 shl 23); + end; + end; + #$8D: { Thumb-2: BL/BLX } + begin + { set instruction code } + bytes:=bytes or (ord(insentry^.code[1]) shl 24); + bytes:=bytes or (ord(insentry^.code[2]) shl 8); + { set offset } + if oper[0]^.typ=top_const then + offset:=(oper[0]^.val shr 1) and $FFFFFF + else + begin + currsym:=objdata.symbolref(oper[0]^.ref^.symbol); + if (currsym.bind<>AB_LOCAL) and (currsym.objsection<>objdata.CurrObjSec) then + begin + objdata.writereloc(oper[0]^.ref^.offset,0,currsym,RELOC_RELATIVE_24); + offset:=$FFFFFF + end + else + offset:=((currsym.offset-insoffset-8) shr 1) and $FFFFFF; + end; + + bytes:=bytes or ((offset shr 00) and $7FF) shl 0; + bytes:=bytes or ((offset shr 11) and $3FF) shl 16; + bytes:=bytes or (((offset shr 21) xor (offset shr 23) xor 1) and $1) shl 11; + bytes:=bytes or (((offset shr 22) xor (offset shr 23) xor 1) and $1) shl 13; + bytes:=bytes or ((offset shr 23) and $1) shl 26; + end; #$fe: // No written data begin exit; @@ -4134,6 +4769,11 @@ implementation internalerror(2005091102); end; end; + + { Todo: Decide whether the code above should take care of writing data in an order that makes senes } + if (insentry^.code[0] in [#$80..#$90]) and (bytelen=4) then + bytes:=((bytes shr 16) and $FFFF) or ((bytes and $FFFF) shl 16); + { we're finished, write code } objdata.writebytes(bytes,bytelen); end; diff --git a/compiler/arm/armatt.inc b/compiler/arm/armatt.inc index 6e97f23d51..4f122d6716 100644 --- a/compiler/arm/armatt.inc +++ b/compiler/arm/armatt.inc @@ -3,6 +3,7 @@ 'none', 'adc', 'add', +'addw', 'adf', 'adr', 'and', @@ -51,6 +52,7 @@ 'mvn', 'vmov', 'nop', +'orn', 'orr', 'rsb', 'rsc', @@ -107,9 +109,7 @@ 'ldrht', 'strht', 'ldrsbt', -'strsbt', 'ldrsht', -'strsht', 'fstd', 'fstm', 'fsts', diff --git a/compiler/arm/armins.dat b/compiler/arm/armins.dat index 7b5a7c6dda..67fbce55a1 100644 --- a/compiler/arm/armins.dat +++ b/compiler/arm/armins.dat @@ -88,6 +88,10 @@ void void none [ADCcc] reglo,reglo \x60\x41\x40 THUMB,ARMv4T +reg32,reg32,immshifter \x80\xF1\x40\x0\x0 THUMB32,ARMv6T2 +reg32,reg32,reg32 \x80\xEB\x40\x0\x0 THUMB32,WIDE,ARMv6T2 +reg32,reg32,reg32,shifterop \x80\xEB\x40\x0\x0 THUMB32,WIDE,ARMv6T2 + reg32,reg32,reg32 \4\x0\xA0 ARM32,ARMv4 reg32,reg32,reg32,shifterop \6\x0\xA0 ARM32,ARMv4 reg32,reg32,immshifter \7\x2\xA0 ARM32,ARMv4 @@ -104,10 +108,17 @@ regsp,regsp,immshifter \x64\xB0\x00 THUMB,ARMv4T reg32,regsp,reg32 \x64\x44\x68 THUMB,ARMv4T regsp,reg32 \x64\x44\x85 THUMB,ARMv4T +reg32,reg32,immshifter \x80\xF1\x0\x0\x0 THUMB32,WIDE,ARMv6T2 +reg32,reg32,reg32 \x80\xEB\x0\x0\x0 THUMB32,WIDE,ARMv6T2 +reg32,reg32,reg32,shifterop \x80\xEB\x0\x0\x0 THUMB32,WIDE,ARMv6T2 + reg32,reg32,reg32 \4\x0\x80 ARM32,ARMv4 reg32,reg32,reg32,shifterop \6\x0\x80 ARM32,ARMv4 reg32,reg32,immshifter \7\x2\x80 ARM32,ARMv4 +[ADDWcc] +reg32,reg32,immshifter \x81\xF2\x0\x0\x0 THUMB32,ARMv6T2 + [ADFcc] [ADRcc] @@ -115,11 +126,20 @@ reg32,reg32,immshifter \7\x2\x80 ARM32,ARMv4 ;reg32,imm32 \x33\x2\x0F ARM32,ARMv4 reglo,immshifter \x67\xA0\x0\2 THUMB,ARMv4T reglo,memam6 \x67\xA0\x0\2 THUMB,ARMv4T + +reg32,imm32 \x81\xF2\xAF\x0\x0 THUMB32,WIDE,ARMv6T2 +reg32,immshifter \x81\xF2\xAF\x0\x0 THUMB32,WIDE,ARMv6T2 +reg32,memam2 \x81\xF2\xAF\x0\x0 THUMB32,WIDE,ARMv6T2 + reg32,memam2 \x33\x2\x0F ARM32,ARMv4 [ANDcc] reglo,reglo \x60\x40\x00 THUMB,ARMv4T +reg32,reg32,immshifter \x80\xF0\x0\x0\x0 THUMB32,ARMv6T2 +reg32,reg32,reg32 \x80\xEA\x0\x0\x0 THUMB32,WIDE,ARMv6T2 +reg32,reg32,reg32,shifterop \x80\xEA\x0\x0\x0 THUMB32,WIDE,ARMv6T2 + reg32,reg32,reg32 \x4\x0\x00 ARM32,ARMv4 reg32,reg32,reg32,shifterop \x6\x0\x00 ARM32,ARMv4 reg32,reg32,immshifter \x7\x2\x00 ARM32,ARMv4 @@ -139,17 +159,29 @@ mem32 \x1\x0A ARM32,ARMv4 [BICcc] reglo,reglo \x60\x43\x80 THUMB,ARMv4T +reg32,reg32,immshifter \x80\xF0\x20\x0\x0 THUMB32,ARMv6T2 +reg32,reg32,reg32 \x80\xEA\x20\x0\x0 THUMB32,WIDE,ARMv6T2 +reg32,reg32,reg32,shifterop \x80\xEA\x20\x0\x0 THUMB32,WIDE,ARMv6T2 + reg32,reg32,reg32 \x6\x1\xC0 ARM32,ARMv4 reg32,reg32,reg32,shifterop \x6\x1\xC0 ARM32,ARMv4 reg32,reg32,immshifter \x7\x3\xC0 ARM32,ARMv4 [BLcc] +imm24 \x8D\xF0\xD0 THUMB32,ARMv6T2 +immshifter \x8D\xF0\xD0 THUMB32,ARMv6T2 +mem32 \x8D\xF0\xD0 THUMB32,ARMv6T2 + imm24 \x1\x0B ARM32,ARMv4 mem32 \x1\x0B ARM32,ARMv4 [BLX] reg32 \x62\x47\x80 THUMB,ARMv4T +immshifter \x8D\xF0\xC0 THUMB32,ARMv6T2 +imm24 \x8D\xF0\xC0 THUMB32,ARMv6T2 +mem32 \x8D\xF0\xC0 THUMB32,ARMv6T2 + imm24 \x28\xFA ARM32,ARMv5T mem32 \x28\xFA ARM32,ARMv5T reg32 \3\x01\x2F\xFF\x30 ARM32,ARMv5T @@ -170,6 +202,10 @@ reg8,reg8 \300\1\x10\101 ARM32,ARMv4 [CMNcc] reglo,reglo \x60\x42\xC0 THUMB,ARMv4T +reg32,immshifter \x80\xF1\x10\x0F\x00 THUMB32,ARMv6T2 +reg32,reg32 \x80\xEB\x10\x0F\x00 THUMB32,WIDE,ARMv6T2 +reg32,reg32,shifterop \x80\xEB\x10\x0F\x00 THUMB32,WIDE,ARMv6T2 + reg32,reg32 \xC\x1\x60 ARM32,ARMv4 reg32,reg32,shifterop \xE\x1\x60 ARM32,ARMv4 reg32,immshifter \xF\x1\x60 ARM32,ARMv4 @@ -180,6 +216,10 @@ reg32,reg32 \x61\x45\x0 THUMB,ARMv4T reglo,immshifter \x60\x28\x0 THUMB,ARMv4T +reg32,immshifter \x80\xF1\xB0\x0F\x00 THUMB32,WIDE,ARMv6T2 +reg32,reg32 \x80\xEB\xB0\x0F\x00 THUMB32,WIDE,ARMv6T2 +reg32,reg32,shifterop \x80\xEB\xB0\x0F\x00 THUMB32,WIDE,ARMv6T2 + reg32,reg32 \xC\x1\x40 ARM32,ARMv4 reg32,reg32,shifterop \xE\x1\x40 ARM32,ARMv4 reg32,immshifter \xF\x3\x40 ARM32,ARMv4 @@ -196,6 +236,7 @@ reg32,immshifter \xF\x3\x40 ARM32,ARMv4 reg32,imm8,fpureg \xF0\x02\x01 FPA [CLZcc] +reg32,reg32 \x80\xFA\xB0\xF0\x80 THUMB32,ARMv6T2 reg32,reg32 \x32\x01\x6F\xF\x10 ARM32,ARMv4 [CPS] @@ -205,6 +246,10 @@ reg32,reg32 \x32\x01\x6F\xF\x10 ARM32,ARMv4 [EORcc] reglo,reglo \x60\x40\x40 THUMB,ARMv4T +reg32,reg32,immshifter \x80\xF0\x80\x0\x0 THUMB32,ARMv6T2 +reg32,reg32,reg32 \x80\xEA\x80\x0\x0 THUMB32,WIDE,ARMv6T2 +reg32,reg32,reg32,shifterop \x80\xEA\x80\x0\x0 THUMB32,WIDE,ARMv6T2 + reg32,reg32,reg32 \4\x0\x20 ARM32,ARMv4 reg32,reg32,reg32,shifterop \6\x0\x20 ARM32,ARMv4 reg32,reg32,immshifter \7\x2\x20 ARM32,ARMv4 @@ -216,16 +261,21 @@ reg32,reg32 \321\300\1\x11\101 ARM32,ARMv4 memam4,reglist \x69\xC8 THUMB,ARMv4T reglo,reglist \x69\xC8 THUMB,ARMv4T +memam4,reglist \x8C\xE8\x10\x0\x0 THUMB32,WIDE,ARMv6T2 +reg32,reglist \x8C\xE8\x10\x0\x0 THUMB32,WIDE,ARMv6T2 + memam4,reglist \x26\x81 ARM32,ARMv4 reg32,reglist \x26\x81 ARM32,ARMv4 [LDRBTcc] -reg32,memam2 \x17\x04\x70 ARM32,ARMv4 -reg32,immshifter \x17\x04\x70 ARM32,ARMv4 +reg32,memam2 \x88\xF8\x10\xE\x0\0 THUMB32,ARMv6T2 +reg32,memam2 \x17\x04\x70 ARM32,ARMv4 +reg32,immshifter \x17\x04\x70 ARM32,ARMv4 [LDRBcc] reglo,memam3 \x65\x5C\x0\0 THUMB,ARMv4T reglo,memam4 \x66\x78\x0\0 THUMB,ARMv4T +reg32,memam2 \x88\xF8\x10\x0\x0\0 THUMB32,WIDE,ARMv6T2 reg32,memam2 \x17\x04\x50 ARM32,ARMv4 [LDRcc] @@ -233,29 +283,30 @@ reglo,memam3 \x65\x58\x0\2 THUMB,ARMv4T reglo,memam4 \x66\x68\x0\2 THUMB,ARMv4T reglo,memam5 \x67\x98\x0\2 THUMB,ARMv4T reglo,memam6 \x67\x48\x0\2 THUMB,ARMv4T - +reg32,memam2 \x88\xF8\x50\x0\x0\0 THUMB32,WIDE,ARMv6T2 reg32,memam2 \x17\x04\x10 ARM32,ARMv4 [LDRHcc] reglo,memam3 \x65\x5A\x0\1 THUMB,ARMv4T reglo,memam4 \x66\x88\x0\1 THUMB,ARMv4T - +reg32,memam2 \x88\xF8\x30\x0\x0\0 THUMB32,WIDE,ARMv6T2 reg32,memam2 \x22\x10\xB0 ARM32,ARMv4 [LDRSBcc] reglo,memam3 \x65\x56\x0\0 THUMB,ARMv4T - -reg32,memam2 \x22\x10\xD0 ARM32,ARMv4 -reg32,reg32 \x23\x50\xD0 ARM32,ARMv4 -reg32,reg32,imm32 \x24\x50\xD0 ARM32,ARMv4 -reg32,reg32,reg32 \x25\x10\xD0 ARM32,ARMv4 +reg32,memam2 \x88\xF9\x10\x0\x0\0 THUMB32,ARMv6T2 +reg32,memam2 \x22\x10\xD0 ARM32,ARMv4 +reg32,reg32 \x23\x50\xD0 ARM32,ARMv4 +reg32,reg32,imm32 \x24\x50\xD0 ARM32,ARMv4 +reg32,reg32,reg32 \x25\x10\xD0 ARM32,ARMv4 [LDRSHcc] reglo,memam3 \x65\x5E\x0\1 THUMB,ARMv4T - +reg32,memam2 \x88\xF9\x30\x0\x0\0 THUMB32,ARMv6T2 reg32,memam2 \x22\x10\xF0 ARM32,ARMv4 [LDRTcc] +reg32,memam2 \x88\xF8\x50\xE\x0\0 THUMB32,ARMv6T2 reg32,memam2 \x17\x04\x30 ARM32,ARMv4 [MCRcc] @@ -287,6 +338,7 @@ regf,immshifter,reg32,reg32,regf \x1D\xC\x50\x0 ARM32,ARMv5TE regf,immshifter,reg32,reg32,regf \x1D\xFC\x50\x0 ARM32,ARMv6 [MLAcc] +reg32,reg32,reg32,reg32 \x80\xFB\x0\x0\x0 THUMB32,ARMv6T2 reg32,reg32,reg32,reg32 \x15\x00\x20\x9 ARM32,ARMv4 [MOVcc] @@ -295,6 +347,10 @@ reg32,reg32 \x61\x46\xC0 THUMB,ARMv4T reglo,immshifter \x60\x20\x0 THUMB,ARMv4T +reg32,immshifter \x80\xF0\x4F\x0\x0 THUMB32,WIDE,ARMv6T2 + +reg32,reg32 \x80\xEA\x4F\x0\x0 THUMB32,WIDE,ARMv6T2 + reg32,shifterop \x8\x1\xA0 ARM32,ARMv4 reg32,reg32,shifterop \xA\x1\xA0 ARM32,ARMv4 reg32,immshifter \xB\x1\xA0 ARM32,ARMv4 @@ -308,7 +364,7 @@ regf,immshifter \x13\x03\x28\xF0 ARM32,ARMv4 [MULcc] reglo,reglo,reglo \x64\x43\x40 THUMB,ARMv4T - +reg32,reg32,reg32 \x80\xFB\x00\xF0\x00 THUMB32,ARMv6T2 reg32,reg32,reg32 \x14\x00\x00\x90 ARM32,ARMv4 [MVFcc] @@ -318,6 +374,9 @@ fpureg,immfpu \xF2 FPA [MVNcc] reglo,reglo \x60\x43\xc0 THUMB,ARMv4T +reg32,immshifter \x80\xF0\x6F\x0\x0 THUMB32,ARMv6T2 +reg32,reg32 \x80\xEA\x6F\x0\x0 THUMB32,WIDE,ARMv6T2 + reg32,reg32 \x8\x1\xE0 ARM32,ARMv4 reg32,reg32,shifterop \xA\x1\xE0 ARM32,ARMv4 reg32,immshifter \xB\x1\xE0 ARM32,ARMv4 @@ -338,16 +397,29 @@ vreg,reg32,reg32 \x40\xC\x40\xB\x10 ARM32,VFPv2 void \x61\xBF\x0 THUMB,ARMv6T2 void \x2F\x03\x20\xF0\x0 ARM32,ARMv6K +[ORNcc] +reg32,reg32,immshifter \x80\xF0\x60\x0\x0 THUMB32,ARMv6T2 +reg32,reg32,reg32 \x80\xEA\x60\x0\x0 THUMB32,WIDE,ARMv6T2 +reg32,reg32,reg32,shifterop \x80\xEA\x60\x0\x0 THUMB32,WIDE,ARMv6T2 + [ORRcc] reglo,reglo \x60\x43\x00 THUMB,ARMv4T +reg32,reg32,immshifter \x80\xF0\x40\x0\x0 THUMB32,ARMv6T2 +reg32,reg32,reg32 \x80\xEA\x40\x0\x0 THUMB32,WIDE,ARMv6T2 +reg32,reg32,reg32,shifterop \x80\xEA\x40\x0\x0 THUMB32,WIDE,ARMv6T2 + reg32,reg32,reg32 \4\x1\x80 ARM32,ARMv4 reg32,reg32,reg32,reg32 \5\x1\x80 ARM32,ARMv4 reg32,reg32,reg32,shifterop \6\x1\x80 ARM32,ARMv4 reg32,reg32,immshifter \7\x3\x80 ARM32,ARMv4 [RSBcc] -reglo,reglo,immshifter \x60\x42\x40 THUMB,ARMv4T +reglo,reglo,immzero \x60\x42\x40 THUMB,ARMv4T + +reg32,reg32,immshifter \x80\xF1\xC0\x0\x0 THUMB32,WIDE,ARMv6T2 +reg32,reg32,reg32 \x80\xEB\xC0\x0\x0 THUMB32,WIDE,ARMv6T2 +reg32,reg32,reg32,shifterop \x80\xEB\xC0\x0\x0 THUMB32,WIDE,ARMv6T2 reg32,reg32,reg32 \6\x0\x60 ARM32,ARMv4 reg32,reg32,reg32,shifterop \6\x0\x60 ARM32,ARMv4 @@ -362,6 +434,10 @@ reg32,reg32,immshifter \7\x2\xE0 ARM32,ARMv4 [SBCcc] reglo,reglo \x60\x41\x80 THUMB,ARMv4T +reg32,reg32,immshifter \x80\xF1\x60\x0\x0 THUMB32,WIDE,ARMv6T2 +reg32,reg32,reg32 \x80\xEB\x60\x0\x0 THUMB32,WIDE,ARMv6T2 +reg32,reg32,reg32,shifterop \x80\xEB\x60\x0\x0 THUMB32,WIDE,ARMv6T2 + reg32,reg32,reg32 \4\x0\xC0 ARM32,ARMv4 reg32,reg32,reg32,reg32 \5\x0\xC0 ARM32,ARMv4 reg32,reg32,reg32,imm \6\x0\xC0 ARM32,ARMv4 @@ -374,15 +450,20 @@ reg32,imm8,fpureg \xF0\x02\x00 FPA [SINcc] [SMLALcc] +reg32,reg32,reg32,reg32 \x85\xFB\xC0\x0\x0 THUMB32,ARMv6T2 reg32,reg32,reg32,reg32 \x16\x00\xE0\x9 ARM32,ARMv4 [SMULLcc] +reg32,reg32,reg32,reg32 \x85\xFB\x80\x0\x0 THUMB32,ARMv6T2 reg32,reg32,reg32,reg32 \x16\x00\xC0\x9 ARM32,ARMv4 [STMcc] memam4,reglist \x69\xC0 THUMB,ARMv4T reglo,reglist \x69\xC0 THUMB,ARMv4T +memam4,reglist \x8C\xE8\x00\x0\x0 THUMB32,WIDE,ARMv6T2 +reg32,reglist \x8C\xE8\x00\x0\x0 THUMB32,WIDE,ARMv6T2 + memam4,reglist \x26\x80 ARM32,ARMv4 reg32,reglist \x26\x80 ARM32,ARMv4 @@ -390,26 +471,28 @@ reg32,reglist \x26\x80 ARM32,ARMv4 reglo,memam3 \x65\x50\x0\2 THUMB,ARMv4T reglo,memam4 \x66\x60\x0\2 THUMB,ARMv4T reglo,memam5 \x67\x90\x0\2 THUMB,ARMv4T - +reg32,memam2 \x88\xF8\x40\x0\x0\0 THUMB32,WIDE,ARMv6T2 reg32,memam2 \x17\x04\x00 ARM32,ARMv4 [STRBcc] reglo,memam3 \x65\x54\x0\0 THUMB,ARMv4T reglo,memam4 \x66\x70\x0\0 THUMB,ARMv4T - -reg32,memam2 \x17\x04\x40 ARM32,ARMv4 +reg32,memam2 \x88\xF8\x00\x0\x0\0 THUMB32,WIDE,ARMv6T2 +reg32,memam2 \x17\x04\x40 ARM32,ARMv4 [STRBTcc] -reg32,memam2 \x17\x04\x60 ARM32,ARMv4 -reg32,immshifter \x17\x04\x60 ARM32,ARMv4 +reg32,memam2 \x88\xF8\x00\xE\x0\0 THUMB32,ARMv6T2 +reg32,memam2 \x17\x04\x60 ARM32,ARMv4 +reg32,immshifter \x17\x04\x60 ARM32,ARMv4 [STRHcc] reglo,memam3 \x65\x52\x0\1 THUMB,ARMv4T reglo,memam4 \x66\x80\x0\1 THUMB,ARMv4T - -reg32,memam2 \x22\x00\xB0 ARM32,ARMv4 +reg32,memam2 \x88\xF8\x20\x0\x0\0 THUMB32,WIDE,ARMv6T2 +reg32,memam2 \x22\x00\xB0 ARM32,ARMv4 [STRTcc] +reg32,memam2 \x88\xF8\x40\xE\x0\0 THUMB32,ARMv6T2 reg32,memam2 \x17\x04\x20 ARM32,ARMv4 [SUBcc] @@ -419,6 +502,10 @@ reglo,reglo,reglo \x60\x1A\x0 THUMB,ARMv4T reglo,reglo,immshifter \x60\x1E\x0 THUMB,ARMv4T reglo,imm8 \x60\x38\x0 THUMB,ARMv4T +reg32,reg32,immshifter \x80\xF1\xA0\x0\x0 THUMB32,WIDE,ARMv6T2 +reg32,reg32,reg32 \x80\xEB\xA0\x0\x0 THUMB32,WIDE,ARMv6T2 +reg32,reg32,reg32,shifterop \x80\xEB\xA0\x0\x0 THUMB32,WIDE,ARMv6T2 + reg32,reg32,shifterop \x4\x0\x40 ARM32,ARMv4 reg32,reg32,immshifter \x4\x0\x40 ARM32,ARMv4 reg32,reg32,reg32 \x4\x0\x40 ARM32,ARMv4 @@ -435,6 +522,10 @@ reg32,reg32,memam2 \x27\x10\x09 ARM32,ARMv4 reg32,reg32,memam2 \x27\x14\x09 ARM32,ARMv4 [TEQcc] +reg32,immshifter \x80\xF0\x90\x0F\x00 THUMB32,ARMv6T2 +reg32,reg32 \x80\xEA\x90\x0F\x00 THUMB32,ARMv6T2 +reg32,reg32,shifterop \x80\xEA\x90\x0F\x00 THUMB32,ARMv6T2 + reg32,reg32 \xC\x1\x20 ARM32,ARMv4 reg32,reg32,reg32 \xD\x1\x20 ARM32,ARMv4 reg32,reg32,shifterop \xE\x1\x20 ARM32,ARMv4 @@ -443,39 +534,52 @@ reg32,immshifter \xF\x3\x20 ARM32,ARMv4 [TSTcc] reglo,reglo \x60\x42\x00 THUMB,ARMv4T +reg32,immshifter \x80\xF0\x10\x0F\x00 THUMB32,ARMv6T2 +reg32,reg32 \x80\xEA\x10\x0F\x00 THUMB32,WIDE,ARMv6T2 +reg32,reg32,shifterop \x80\xEA\x10\x0F\x00 THUMB32,WIDE,ARMv6T2 + reg32,reg32 \xC\x1\x00 ARM32,ARMv4 reg32,reg32,reg32 \xD\x1\x00 ARM32,ARMv4 reg32,reg32,shifterop \xE\x1\x00 ARM32,ARMv4 reg32,immshifter \xF\x3\x00 ARM32,ARMv4 [UMLALcc] +reg32,reg32,reg32,reg32 \x85\xFB\xE0\x0\x00 THUMB32,ARMv6T2 reg32,reg32,reg32,reg32 \x16\x00\xA0\x9 ARM32,ARMv4 [UMULLcc] +reg32,reg32,reg32,reg32 \x85\xFB\xA0\x0\x0 THUMB32,ARMv6T2 reg32,reg32,reg32,reg32 \x16\x00\x80\x9 ARM32,ARMv4 [WFScc] ; EDSP instructions [LDRDcc] -reg32,reg32,memam2 \x19\x0\x0\x0\xD0 ARM32,ARMv4 +reg32,reg32,memam2 \x89\xE8\x50\x0\x0 THUMB32,ARMv6T2 +reg32,reg32,memam2 \x19\x0\x0\x0\xD0 ARM32,ARMv4 [PLD] +memam2 \x87\xF8\x10\xF0\x0 THUMB32,ARMv6T2 memam2 \x25\xF5\x50\xF0\x0 ARM32,ARMv5TE [PLDW] +memam2 \x87\xF8\x30\xF0\x0 THUMB32,ARMv7 memam2 \x25\xF5\x10\xF0\x0 ARM32,ARMv7 [QADDcc] +reg32,reg32,reg32 \x82\xFA\x80\xF0\x80 THUMB32,ARMv6T2 reg32,reg32,reg32 \x1A\x01\x00\x05 ARM32,ARMv5TE [QDADDcc] +reg32,reg32,reg32 \x82\xFA\x80\xF0\x90 THUMB32,ARMv6T2 reg32,reg32,reg32 \x1A\x01\x40\x05 ARM32,ARMv5TE [QDSUBcc] +reg32,reg32,reg32 \x82\xFA\x80\xF0\xB0 THUMB32,ARMv6T2 reg32,reg32,reg32 \x1A\x01\x60\x05 ARM32,ARMv5TE [QSUBcc] +reg32,reg32,reg32 \x82\xFA\x80\xF0\xA0 THUMB32,ARMv6T2 reg32,reg32,reg32 \x1A\x01\x20\x05 ARM32,ARMv5TE [SMLABBcc] @@ -545,24 +649,25 @@ reg32,reg32,reg32 \x14\x1\x20\xA0 ARM32,ARMv5TE reg32,reg32,reg32 \x14\x1\x20\xE0 ARM32,ARMv5TE [STRDcc] -reg32,reg32,memam2 \x19\x0\x0\x0\xF0 ARM32,ARMv4 +reg32,reg32,memam2 \x89\xE8\x40\x0\x0 THUMB32,ARMv6T2 +reg32,reg32,memam2 \x19\x0\x0\x0\xF0 ARM32,ARMv4 [LDRHTcc] -reg32,memam2 \x19\x0\x30\x0\xB0 ARM32,ARMv4 +reg32,memam2 \x88\xF8\x30\xE\x0\0 THUMB32,ARMv6T2 +reg32,memam2 \x19\x0\x30\x0\xB0 ARM32,ARMv4 [STRHTcc] -reg32,memam2 \x1E\x0\x20\x0\xB0 ARM32,ARMv4 +reg32,memam2 \x88\xF8\x20\xE\x0\0 THUMB32,ARMv6T2 + +reg32,memam2 \x88\xF8\x20\xE\x0\0 THUMB32,ARMv6T2 +reg32,memam2 \x1E\x0\x20\x0\xB0 ARM32,ARMv4 [LDRSBTcc] -reg32,memam2 \x1E\x0\x30\x0\xD0 ARM32,ARMv4 - -[STRSBTcc] -reg32,memam2 \x1E\x0\x30\x0\xD0 ARM32,ARMv4 +reg32,memam2 \x88\xF9\x10\xE\x0\0 THUMB32,ARMv6T2 +reg32,memam2 \x1E\x0\x30\x0\xD0 ARM32,ARMv4 [LDRSHTcc] -reg32,memam2 \x1E\x0\x30\x0\xF0 ARM32,ARMv4 - -[STRSHTcc] +reg32,memam2 \x88\xF9\x30\xE\x0\0 THUMB32,ARMv6T2 reg32,memam2 \x1E\x0\x30\x0\xF0 ARM32,ARMv4 [FSTDcc] @@ -574,89 +679,133 @@ reg32,memam2 \x1E\x0\x30\x0\xF0 ARM32,ARMv4 ; ARMv6 [BFCcc] +reg32,immshifter,immshifter \x84\xF3\x6F\x0\x0 THUMB32,ARMv6T2 +reg32,immshifter,imm32 \x84\xF3\x6F\x0\x0 THUMB32,ARMv6T2 + reg32,immshifter,immshifter \x2D\x7\xC0\x0\x1F ARM32,ARMv4 reg32,immshifter,imm32 \x2D\x7\xC0\x0\x1F ARM32,ARMv4 [BFIcc] +reg32,reg32,immshifter,immshifter \x84\xF3\x60\x0\x0 THUMB32,ARMv6T2 +reg32,reg32,immshifter,imm32 \x84\xF3\x60\x0\x0 THUMB32,ARMv6T2 + reg32,reg32,immshifter,immshifter \x2D\x7\xC0\x0\x10 ARM32,ARMv4 reg32,reg32,immshifter,imm32 \x2D\x7\xC0\x0\x10 ARM32,ARMv4 [CLREX] +void \x80\xF3\xBF\x8F\x2F THUMB32,ARMv7 void \x2F\xF5\x7F\xF0\x1F ARM32,ARMv6K [LDREXcc] +reg32,memam6 \x8A\xE8\x50\x0F\x00 THUMB32,ARMv6T2 reg32,memam6 \x18\x01\x90\x0F\x9F ARM32,ARMv4 + [LDREXBcc] +reg32,memam6 \x8A\xE8\xD0\x0F\x4F THUMB32,ARMv7 reg32,memam6 \x18\x01\xD0\x0F\x9F ARM32,ARMv4 + [LDREXDcc] +reg32,reg32,memam6 \x8A\xE8\xD0\x00\x7F THUMB32,ARMv7 reg32,reg32,memam6 \x18\x01\xB0\x0F\x9F ARM32,ARMv4 + [LDREXHcc] +reg32,memam6 \x8A\xE8\xD0\x0F\x5F THUMB32,ARMv7 reg32,memam6 \x18\x01\xF0\x0F\x9F ARM32,ARMv4 [STREXcc] +reg32,reg32,memam6 \x8B\xE8\x40\x00\x00 THUMB32,ARMv6T2 reg32,reg32,memam6 \x18\x01\x80\x0F\x90 ARM32,ARMv4 + [STREXBcc] +reg32,reg32,memam6 \x8B\xE8\xC0\x0F\x40 THUMB32,ARMv7 reg32,reg32,memam6 \x18\x01\xC0\x0F\x90 ARM32,ARMv4 + [STREXDcc] +reg32,reg32,reg32,memam6 \x8B\xE8\xC0\x00\x70 THUMB32,ARMv7 reg32,reg32,reg32,memam6 \x18\x01\xA0\x0F\x90 ARM32,ARMv4 + [STREXHcc] +reg32,reg32,memam6 \x8B\xE8\xC0\x0F\x50 THUMB32,ARMv7 reg32,reg32,memam6 \x18\x01\xE0\x0F\x90 ARM32,ARMv4 [MLScc] +reg32,reg32,reg32,reg32 \x80\xFB\x0\x0\x10 THUMB32,ARMv6T2 reg32,reg32,reg32,reg32 \x15\x00\x60\x9 ARM32,ARMv6T2 [PKHBTcc] +reg32,reg32,reg32 \x80\xEA\xC0\x0\x0 THUMB32,ARMv6T2 +reg32,reg32,reg32,shifterop \x80\xEA\xC0\x0\x0 THUMB32,ARMv6T2 + reg32,reg32,reg32 \x16\x6\x80\x1 ARM32,ARMv6 reg32,reg32,reg32,shifterop \x16\x6\x80\x1 ARM32,ARMv6 [PKHTBcc] +reg32,reg32,reg32 \x80\xEA\xC0\x0\x10 THUMB32,ARMv6T2 +reg32,reg32,reg32,shifterop \x80\xEA\xC0\x0\x10 THUMB32,ARMv6T2 + reg32,reg32,reg32 \x16\x6\x80\x1 ARM32,ARMv6 reg32,reg32,reg32,shifterop \x16\x6\x80\x5 ARM32,ARMv6 [PLI] +memam2 \x87\xF9\x10\xF0\x0 THUMB32,ARMv7 memam2 \x25\xF4\x50\xF0\x0 ARM32,ARMv7 [QADD16cc] +reg32,reg32,reg32 \x80\xFA\x90\xF0\x10 THUMB32,ARMv6T2 reg32,reg32,reg32 \x16\x06\x20\xF1 ARM32,ARMv6 [QADD8cc] +reg32,reg32,reg32 \x80\xFA\x80\xF0\x10 THUMB32,ARMv6T2 reg32,reg32,reg32 \x16\x06\x20\xF9 ARM32,ARMv6 [QASXcc] +reg32,reg32,reg32 \x80\xFA\xA0\xF0\x10 THUMB32,ARMv6T2 reg32,reg32,reg32 \x16\x06\x20\xF3 ARM32,ARMv6 [QSAXcc] +reg32,reg32,reg32 \x80\xFA\xE0\xF0\x10 THUMB32,ARMv6T2 reg32,reg32,reg32 \x16\x06\x20\xF5 ARM32,ARMv6 [QSUB16cc] +reg32,reg32,reg32 \x80\xFA\xD0\xF0\x10 THUMB32,ARMv6T2 reg32,reg32,reg32 \x16\x06\x20\xF7 ARM32,ARMv6 [QSUB8cc] +reg32,reg32,reg32 \x80\xFA\xC0\xF0\x10 THUMB32,ARMv6T2 reg32,reg32,reg32 \x16\x06\x20\xFF ARM32,ARMv6 [RBITcc] +reg32,reg32 \x80\xFA\x90\xF0\xA0 THUMB32,ARMv6T2 reg32,reg32 \x32\x6\xFF\xF\x30 ARM32,ARMv6T2 [REVcc] reglo,reglo \x61\xBA\x00 THUMB,ARMv6 +reg32,reg32 \x80\xFA\x90\xF0\x80 THUMB32,WIDE,ARMv6T2 reg32,reg32 \x32\x6\xBF\xF\x30 ARM32,ARMv6 [REV16cc] reglo,reglo \x61\xBA\x40 THUMB,ARMv6 +reg32,reg32 \x80\xFA\x90\xF0\x90 THUMB32,WIDE,ARMv6T2 reg32,reg32 \x32\x6\xBF\xF\xB0 ARM32,ARMv6 [REVSHcc] reglo,reglo \x61\xBA\xC0 THUMB,ARMv6 +reg32,reg32 \x80\xFA\x90\xF0\xB0 THUMB32,WIDE,ARMv6T2 reg32,reg32 \x32\x6\xFF\xF\xB0 ARM32,ARMv6 [SADD16cc] +reg32,reg32,reg32 \x80\xFA\90\xF0\x0 THUMB32,ARMv6T2 reg32,reg32,reg32 \x16\x06\x10\xF1 ARM32,ARMv6 [SADD8cc] +reg32,reg32,reg32 \x80\xFA\80\xF0\x0 THUMB32,ARMv6T2 reg32,reg32,reg32 \x16\x06\x10\xF9 ARM32,ARMv6 [SASXcc] +reg32,reg32,reg32 \x80\xFA\A0\xF0\x0 THUMB32,ARMv6T2 reg32,reg32,reg32 \x16\x06\x10\xF3 ARM32,ARMv6 [SBFXcc] +reg32,reg32,immshifter,immshifter \x84\xF3\x40\x0\x0 THUMB32,ARMv6T2 reg32,reg32,immshifter,immshifter \x2D\x7\xA0\x0\x50 ARM32,ARMv6T2 [SELcc] +reg32,reg32,reg32 \x80\xFA\xA0\xF0\x80 THUMB32,ARMv6T2 reg32,reg32,reg32 \x16\x06\x80\xFB ARM32,ARMv6 [SETEND] @@ -670,6 +819,9 @@ void \x2F\x3\x20\xF0\x4 ARM32,ARMv6K reglo,reglo,immshifter \x60\x1\x0 THUMB,ARMv4T reglo,reglo \x60\x41\x0 THUMB,ARMv4T +reg32,reg32,immshifter \x82\xEA\x4F\x0\x20 THUMB32,WIDE,ARMv6T2 +reg32,reg32,reg32 \x80\xFA\x40\xF0\x0 THUMB32,WIDE,ARMv6T2 + reg32,reg32,reg32 \x30\x1\xA0\x0\x50 ARM32,ARMv4 reg32,reg32,immshifter \x30\x1\xA0\x0\x40 ARM32,ARMv4 @@ -677,6 +829,9 @@ reg32,reg32,immshifter \x30\x1\xA0\x0\x40 ARM32,ARMv4 reglo,reglo,immshifter \x60\x8\x0 THUMB,ARMv4T reglo,reglo \x60\x40\xC0 THUMB,ARMv4T +reg32,reg32,immshifter \x82\xEA\x4F\x0\x10 THUMB32,WIDE,ARMv6T2 +reg32,reg32,reg32 \x80\xFA\x20\xF0\x0 THUMB32,WIDE,ARMv6T2 + reg32,reg32,reg32 \x30\x1\xA0\x0\x30 ARM32,ARMv4 reg32,reg32,immshifter \x30\x1\xA0\x0\x20 ARM32,ARMv4 @@ -684,208 +839,302 @@ reg32,reg32,immshifter \x30\x1\xA0\x0\x20 ARM32,ARMv4 reglo,reglo,immshifter \x60\x0\x0 THUMB,ARMv4T reglo,reglo \x60\x40\x80 THUMB,ARMv4T +reg32,reg32,immshifter \x82\xEA\x4F\x0\x20 THUMB32,ARMv6T2 +reg32,reg32,reg32 \x80\xFA\x60\xF0\x0 THUMB32,WIDE,ARMv6T2 + reg32,reg32,reg32 \x30\x1\xA0\x0\x10 ARM32,ARMv4 reg32,reg32,immshifter \x30\x1\xA0\x0\x00 ARM32,ARMv4 [RORcc] reglo,reglo \x60\x41\xC0 THUMB,ARMv4T +reg32,reg32,immshifter \x82\xEA\x4F\x0\x30 THUMB32,WIDE,ARMv6T2 +reg32,reg32,reg32 \x80\xFA\x60\xF0\x0 THUMB32,WIDE,ARMv6T2 + reg32,reg32,reg32 \x30\x1\xA0\x0\x70 ARM32,ARMv4 reg32,reg32,immshifter \x30\x1\xA0\x0\x60 ARM32,ARMv4 [RRXcc] +reg32,reg32 \x80\xEA\x4F\x00\x30 THUMB32,ARMv6T2 reg32,reg32 \x30\x1\xA0\x0\x60 ARM32,ARMv4 [UMAALcc] +reg32,reg32,reg32,reg32 \x85\xFB\xE0\x0\x60 THUMB32,ARMv6T2 reg32,reg32,reg32,reg32 \x16\x0\x40\x9 ARM32,ARMv6 [SHADD16cc] +reg32,reg32,reg32 \x80\xFA\x90\xF0\x20 THUMB32,ARMv6T2 reg32,reg32,reg32 \x16\x06\x30\xF1 ARM32,ARMv6 [SHADD8cc] +reg32,reg32,reg32 \x80\xFA\x80\xF0\x20 THUMB32,ARMv6T2 reg32,reg32,reg32 \x16\x06\x30\xF9 ARM32,ARMv6 [SHASXcc] +reg32,reg32,reg32 \x80\xFA\xA0\xF0\x20 THUMB32,ARMv6T2 reg32,reg32,reg32 \x16\x06\x30\xF3 ARM32,ARMv6 [SHSAXcc] +reg32,reg32,reg32 \x80\xFA\xE0\xF0\x20 THUMB32,ARMv6T2 reg32,reg32,reg32 \x16\x06\x30\xF5 ARM32,ARMv6 [SHSUB16cc] +reg32,reg32,reg32 \x80\xFA\xD0\xF0\x20 THUMB32,ARMv6T2 reg32,reg32,reg32 \x16\x06\x30\xF7 ARM32,ARMv6 [SHSUB8cc] +reg32,reg32,reg32 \x80\xFA\xC0\xF0\x20 THUMB32,ARMv6T2 reg32,reg32,reg32 \x16\x06\x30\xFF ARM32,ARMv6 [SMLADcc] +reg32,reg32,reg32,reg32 \x80\xFB\x20\x0\x00 THUMB32,ARMv6T2 reg32,reg32,reg32,reg32 \x15\x7\x00\x1 ARM32,ARMv6 [SMLALDcc] +reg32,reg32,reg32,reg32 \x85\xFB\xC0\x0\xC0 THUMB32,ARMv6T2 reg32,reg32,reg32,reg32 \x16\x7\x40\x1 ARM32,ARMv4 [SMLSDcc] +reg32,reg32,reg32,reg32 \x80\xFB\x40\x0\x00 THUMB32,ARMv6T2 reg32,reg32,reg32,reg32 \x15\x7\x00\x5 ARM32,ARMv6 [SMLSLDcc] +reg32,reg32,reg32,reg32 \x85\xFB\xD0\x0\xC0 THUMB32,ARMv6T2 reg32,reg32,reg32,reg32 \x16\x7\x40\x5 ARM32,ARMv6 [SMMLAcc] +reg32,reg32,reg32,reg32 \x80\xFB\x50\x0\x00 THUMB32,ARMv6T2 reg32,reg32,reg32,reg32 \x15\x7\x50\x1 ARM32,ARMv6 [SMMLScc] +reg32,reg32,reg32,reg32 \x80\xFB\x60\x0\x00 THUMB32,ARMv6T2 reg32,reg32,reg32,reg32 \x15\x7\x50\xD ARM32,ARMv6 [SMMULcc] +reg32,reg32,reg32 \x80\xFB\x50\xF0\x0 THUMB32,ARMv6T2 reg32,reg32,reg32 \x15\x7\x50\x1\xF ARM32,ARMv6 [SMUADcc] +reg32,reg32,reg32 \x80\xFB\x20\xF0\x0 THUMB32,ARMv6T2 reg32,reg32,reg32 \x15\x7\x00\x1\xF ARM32,ARMv6 [SMUSDcc] +reg32,reg32,reg32 \x80\xFB\x40\xF0\x0 THUMB32,ARMv6T2 reg32,reg32,reg32 \x15\x7\x00\x5\xF ARM32,ARMv6 [SRScc] [SSATcc] -reg32,immshifter,reg32 \x2A\x6\xA0\x0\x10 ARM32,ARMv6 -reg32,immshifter,reg32,shifterop \x2A\x6\xA0\x0\x10 ARM32,ARMv6 +reg32,immshifter,reg32 \x83\xF3\x00\x0\x0 THUMB32,ARMv6T2 +reg32,immshifter,reg32,shifterop \x83\xF3\x00\x0\x0 THUMB32,ARMv6T2 + +reg32,immshifter,reg32 \x2A\x6\xA0\x0\x10 ARM32,ARMv6 +reg32,immshifter,reg32,shifterop \x2A\x6\xA0\x0\x10 ARM32,ARMv6 [SSAT16cc] -reg32,immshifter,reg32 \x2A\x6\xA0\xF\x30 ARM32,ARMv6 +reg32,immshifter,reg32 \x83\xF3\x20\x0\x0 THUMB32,ARMv6T2 +reg32,immshifter,reg32 \x2A\x6\xA0\xF\x30 ARM32,ARMv6 [SSAXcc] -reg32,reg32,reg32 \x16\x06\x10\xF5 ARM32,ARMv6 +reg32,reg32,reg32 \x80\xFA\xE0\xF0\x0 THUMB32,ARMv6T2 +reg32,reg32,reg32 \x16\x06\x10\xF5 ARM32,ARMv6 [SSUB16cc] -reg32,reg32,reg32 \x16\x06\x10\xF7 ARM32,ARMv6 +reg32,reg32,reg32 \x80\xFA\xD0\xF0\x0 THUMB32,ARMv6T2 +reg32,reg32,reg32 \x16\x06\x10\xF7 ARM32,ARMv6 [SSUB8cc] -reg32,reg32,reg32 \x16\x06\x10\xFF ARM32,ARMv6 +reg32,reg32,reg32 \x80\xFA\xC0\xF0\x0 THUMB32,ARMv6T2 +reg32,reg32,reg32 \x16\x06\x10\xFF ARM32,ARMv6 [SXTABcc] -reg32,reg32,reg32 \x16\x06\xA0\x07 ARM32,ARMv6 -reg32,reg32,reg32,shifterop \x16\x06\xA0\x07 ARM32,ARMv6 +reg32,reg32,reg32 \x86\xFA\x40\xF0\x80 THUMB32,ARMv6T2 +reg32,reg32,reg32,shifterop \x86\xFA\x40\xF0\x80 THUMB32,ARMv6T2 + +reg32,reg32,reg32 \x16\x06\xA0\x07 ARM32,ARMv6 +reg32,reg32,reg32,shifterop \x16\x06\xA0\x07 ARM32,ARMv6 [SXTAB16cc] -reg32,reg32,reg32 \x16\x06\x80\x07 ARM32,ARMv6 -reg32,reg32,reg32,shifterop \x16\x06\x80\x07 ARM32,ARMv6 +reg32,reg32,reg32 \x86\xFA\x20\xF0\x80 THUMB32,ARMv6T2 +reg32,reg32,reg32,shifterop \x86\xFA\x20\xF0\x80 THUMB32,ARMv6T2 + +reg32,reg32,reg32 \x16\x06\x80\x07 ARM32,ARMv6 +reg32,reg32,reg32,shifterop \x16\x06\x80\x07 ARM32,ARMv6 [SXTAHcc] -reg32,reg32,reg32 \x16\x06\xB0\x07 ARM32,ARMv6 -reg32,reg32,reg32,shifterop \x16\x06\xB0\x07 ARM32,ARMv6 +reg32,reg32,reg32 \x86\xFA\x00\xF0\x80 THUMB32,ARMv6T2 +reg32,reg32,reg32,shifterop \x86\xFA\x00\xF0\x80 THUMB32,ARMv6T2 + +reg32,reg32,reg32 \x16\x06\xB0\x07 ARM32,ARMv6 +reg32,reg32,reg32,shifterop \x16\x06\xB0\x07 ARM32,ARMv6 [UBFXcc] -reg32,reg32,immshifter,immshifter \x2D\x7\xE0\x0\x50 ARM32,ARMv4 +reg32,reg32,immshifter,immshifter \x84\xF3\xC0\x0\x0 THUMB32,ARMv6T2 +reg32,reg32,immshifter,immshifter \x2D\x7\xE0\x0\x50 ARM32,ARMv4 [UXTABcc] -reg32,reg32,reg32 \x16\x6\xE0\x7 ARM32,ARMv6 -reg32,reg32,reg32,shifterop \x16\x6\xE0\x7 ARM32,ARMv6 +reg32,reg32,reg32 \x86\xFA\x50\xF0\x80 THUMB32,ARMv6T2 +reg32,reg32,reg32,shifterop \x86\xFA\x50\xF0\x80 THUMB32,ARMv6T2 + +reg32,reg32,reg32 \x16\x6\xE0\x7 ARM32,ARMv6 +reg32,reg32,reg32,shifterop \x16\x6\xE0\x7 ARM32,ARMv6 [UXTAB16cc] +reg32,reg32,reg32 \x86\xFA\x30\xF0\x80 THUMB32,ARMv6T2 +reg32,reg32,reg32,shifterop \x86\xFA\x30\xF0\x80 THUMB32,ARMv6T2 + +reg32,reg32,reg32 \x86\xFA\x40\xF0\x80 THUMB32,ARMv6T2 +reg32,reg32,reg32,shifterop \x86\xFA\x40\xF0\x80 THUMB32,ARMv6T2 + reg32,reg32,reg32 \x16\x6\xC0\x7 ARM32,ARMv6 reg32,reg32,reg32,shifterop \x16\x6\xC0\x7 ARM32,ARMv6 [UXTAHcc] +reg32,reg32,reg32 \x86\xFA\x10\xF0\x80 THUMB32,ARMv6T2 +reg32,reg32,reg32,shifterop \x86\xFA\x10\xF0\x80 THUMB32,ARMv6T2 + reg32,reg32,reg32 \x16\x6\xF0\x7 ARM32,ARMv6 reg32,reg32,reg32,shifterop \x16\x6\xF0\x7 ARM32,ARMv6 [SXTBcc] reglo,reglo \x61\xB2\x40 THUMB,ARMv6 +reg32,reg32 \x86\xFA\x4F\xF0\x80 THUMB32,WIDE,ARMv6T2 +reg32,reg32,shifterop \x86\xFA\x4F\xF0\x80 THUMB32,WIDE,ARMv6T2 + reg32,reg32 \x1B\x6\xAF\x7 ARM32,ARMv6 reg32,reg32,shifterop \x1B\x6\xAF\x7 ARM32,ARMv6 [SXTB16cc] +reg32,reg32 \x86\xFA\x2F\xF0\x80 THUMB32,ARMv6T2 +reg32,reg32,shifterop \x86\xFA\x2F\xF0\x80 THUMB32,ARMv6T2 + reg32,reg32 \x1B\x6\x8F\x7 ARM32,ARMv6 reg32,reg32,shifterop \x1B\x6\x8F\x7 ARM32,ARMv6 [SXTHcc] reglo,reglo \x61\xB2\x00 THUMB,ARMv6 +reg32,reg32 \x86\xFA\x0F\xF0\x80 THUMB32,WIDE,ARMv6T2 +reg32,reg32,shifterop \x86\xFA\x0F\xF0\x80 THUMB32,WIDE,ARMv6T2 + reg32,reg32 \x1B\x6\xBF\x7 ARM32,ARMv6 reg32,reg32,shifterop \x1B\x6\xBF\x7 ARM32,ARMv6 [UXTBcc] reglo,reglo \x61\xB2\xC0 THUMB,ARMv6 +reg32,reg32 \x86\xFA\x5F\xF0\x80 THUMB32,WIDE,ARMv6T2 +reg32,reg32,shifterop \x86\xFA\x5F\xF0\x80 THUMB32,WIDE,ARMv6T2 + reg32,reg32 \x1B\x6\xEF\x7 ARM32,ARMv6 reg32,reg32,shifterop \x1B\x6\xEF\x7 ARM32,ARMv6 [UXTB16cc] +reg32,reg32 \x86\xFA\x3F\xF0\x80 THUMB32,ARMv6T2 +reg32,reg32,shifterop \x86\xFA\x3F\xF0\x80 THUMB32,ARMv6T2 + reg32,reg32 \x1B\x6\xCF\x7 ARM32,ARMv6 reg32,reg32,shifterop \x1B\x6\xCF\x7 ARM32,ARMv6 [UXTHcc] reglo,reglo \x61\xB2\x80 THUMB,ARMv6 +reg32,reg32 \x86\xFA\x1F\xF0\x80 THUMB32,WIDE,ARMv6T2 +reg32,reg32,shifterop \x86\xFA\x1F\xF0\x80 THUMB32,WIDE,ARMv6T2 + reg32,reg32 \x1B\x6\xFF\x7 ARM32,ARMv6 reg32,reg32,shifterop \x1B\x6\xFF\x7 ARM32,ARMv6 [UADD16cc] +reg32,reg32,reg32 \x80\xFA\x90\xF0\x40 THUMB32,ARMv6T2 reg32,reg32,reg32 \x16\x06\x50\xF1 ARM32,ARMv6 [UADD8cc] +reg32,reg32,reg32 \x80\xFA\x80\xF0\x40 THUMB32,ARMv6T2 reg32,reg32,reg32 \x16\x06\x50\xF9 ARM32,ARMv6 [UASXcc] +reg32,reg32,reg32 \x80\xFA\xA0\xF0\x40 THUMB32,ARMv6T2 reg32,reg32,reg32 \x16\x06\x50\xF3 ARM32,ARMv6 [UHADD16cc] +reg32,reg32,reg32 \x80\xFA\x90\xF0\x60 THUMB32,ARMv6T2 reg32,reg32,reg32 \x16\x06\x70\xF1 ARM32,ARMv6 [UHADD8cc] +reg32,reg32,reg32 \x80\xFA\x80\xF0\x60 THUMB32,ARMv6T2 reg32,reg32,reg32 \x16\x06\x70\xF9 ARM32,ARMv6 [UHASXcc] +reg32,reg32,reg32 \x80\xFA\xA0\xF0\x60 THUMB32,ARMv6T2 reg32,reg32,reg32 \x16\x06\x70\xF3 ARM32,ARMv6 [UHSAXcc] +reg32,reg32,reg32 \x80\xFA\xE0\xF0\x60 THUMB32,ARMv6T2 reg32,reg32,reg32 \x16\x06\x70\xF5 ARM32,ARMv6 [UHSUB16cc] +reg32,reg32,reg32 \x80\xFA\xD0\xF0\x60 THUMB32,ARMv6T2 reg32,reg32,reg32 \x16\x06\x70\xF7 ARM32,ARMv6 [UHSUB8cc] +reg32,reg32,reg32 \x80\xFA\xC0\xF0\x60 THUMB32,ARMv6T2 reg32,reg32,reg32 \x16\x06\x70\xFF ARM32,ARMv6 [UQADD16cc] +reg32,reg32,reg32 \x80\xFA\x90\xF0\x50 THUMB32,ARMv6T2 reg32,reg32,reg32 \x16\x06\x60\xF1 ARM32,ARMv6 [UQADD8] +reg32,reg32,reg32 \x80\xFA\x80\xF0\x50 THUMB32,ARMv6T2 reg32,reg32,reg32 \x16\x06\x60\xF9 ARM32,ARMv6 [UQASXcc] +reg32,reg32,reg32 \x80\xFA\xA0\xF0\x50 THUMB32,ARMv6T2 reg32,reg32,reg32 \x16\x06\x60\xF3 ARM32,ARMv6 [UQSAXcc] +reg32,reg32,reg32 \x80\xFA\xE0\xF0\x50 THUMB32,ARMv6T2 reg32,reg32,reg32 \x16\x06\x60\xF5 ARM32,ARMv6 [UQSUB16cc] +reg32,reg32,reg32 \x80\xFA\xD0\xF0\x50 THUMB32,ARMv6T2 reg32,reg32,reg32 \x16\x06\x60\xF7 ARM32,ARMv6 [UQSUB8cc] +reg32,reg32,reg32 \x80\xFA\xC0\xF0\x50 THUMB32,ARMv6T2 reg32,reg32,reg32 \x16\x06\x60\xFF ARM32,ARMv6 [USAD8cc] +reg32,reg32,reg32 \x80\xFB\x70\xF0\x00 THUMB32,ARMv6T2 reg32,reg32,reg32 \x15\x07\x80\x01\xF ARM32,ARMv6 [USADA8cc] +reg32,reg32,reg32,reg32 \x80\xFB\x70\x0\x00 THUMB32,ARMv6T2 reg32,reg32,reg32,reg32 \x15\x07\x80\x01 ARM32,ARMv6 [USATcc] -reg32,immshifter,reg32 \x2A\x6\xE0\x0\x10 ARM32,ARMv6 -reg32,immshifter,reg32,shifterop \x2A\x6\xE0\x0\x10 ARM32,ARMv6 +reg32,immshifter,reg32 \x83\xF3\x80\x0\x0 THUMB32,ARMv6T2 +reg32,immshifter,reg32,shifterop \x83\xF3\x80\x0\x0 THUMB32,ARMv6T2 + +reg32,immshifter,reg32 \x2A\x6\xE0\x0\x10 ARM32,ARMv6 +reg32,immshifter,reg32,shifterop \x2A\x6\xE0\x0\x10 ARM32,ARMv6 [USAT16cc] -reg32,immshifter,reg32 \x2A\x6\xE0\xF\x30 ARM32,ARMv6 +reg32,immshifter,reg32 \x83\xF3\xA0\x0\x0 THUMB32,ARMv6T2 +reg32,immshifter,reg32 \x2A\x6\xE0\xF\x30 ARM32,ARMv6 [USAXcc] +reg32,reg32,reg32 \x80\xFA\xE0\xF0\x40 THUMB32,ARMv6T2 reg32,reg32,reg32 \x16\x06\x50\xF5 ARM32,ARMv6 [USUB16cc] +reg32,reg32,reg32 \x80\xFA\xD0\xF0\x40 THUMB32,ARMv6T2 reg32,reg32,reg32 \x16\x06\x50\xF7 ARM32,ARMv6 [USUB8cc] +reg32,reg32,reg32 \x80\xFA\xC0\xF0\x40 THUMB32,ARMv6T2 reg32,reg32,reg32 \x16\x06\x50\xFF ARM32,ARMv6 [WFEcc] @@ -1030,10 +1279,15 @@ reglist \x69\xB4 THUMB,ARMv4T reglist \x26\x80 ARM32,ARMv4 [SDIVcc] +reg32,reg32,reg32 \x80\xFB\x90\xF0\xF0 THUMB32,ARMv7R,ARMv7M [UDIVcc] +reg32,reg32,reg32 \x80\xFB\xB0\xF0\xF0 THUMB32,ARMv7R,ARMv7M [MOVTcc] +reg32,imm \x81\xF2\xC0\x0\x0 THUMB32,ARMv6T2 +reg32,immshifter \x81\xF2\xC0\x0\x0 THUMB32,ARMv6T2 + reg32,imm \x2C\x3\x40 ARM32,ARMv6T2 reg32,immshifter \x2C\x3\x40 ARM32,ARMv6T2 @@ -1086,9 +1340,12 @@ condition \xFE ARM32,ARMv4 [TBH] [MOVW] -reg32,imm \x2C\x3\x0 ARM32,ARMv6T2 +reg32,imm32 \x2C\x3\x0 ARM32,ARMv6T2 reg32,immshifter \x2C\x3\x0 ARM32,ARMv6T2 +reg32,imm32 \x81\xF2\x40\x0\x0 THUMB32,ARMv6T2 +reg32,immshifter \x81\xF2\x40\x0\x0 THUMB32,ARMv6T2 + [CBZ] reglo,immshifter \x68\xB1 THUMB,ARMv6T2 reglo,memam2 \x68\xB1 THUMB,ARMv6T2 @@ -1162,12 +1419,15 @@ vreg,vreg \x42\xE\xB1\xA\xC0 ARM32,VFPv2 vreg,vreg,vreg \x42\xE\x30\xA\x40 ARM32,VFPv2 [DMB] +immshifter \x80\xF3\xBF\x8F\x50 THUMB32,ARMv7 immshifter \x2E\xF5\x7F\xF0\x50 ARM32,ARMv7 [ISB] +immshifter \x80\xF3\xBF\x8F\x60 THUMB32,ARMv7 immshifter \x2E\xF5\x7F\xF0\x60 ARM32,ARMv7 [DSB] +immshifter \x80\xF3\xBF\x8F\x40 THUMB32,ARMv7 immshifter \x2E\xF5\x7F\xF0\x40 ARM32,ARMv7 [SMC] @@ -1183,6 +1443,7 @@ imm32 \x2\x0F ARM32,ARMv4 immshifter \x2\x0F ARM32,ARMv4 [BXJcc] +reg32 \x80\xF3\xC0\x8F\x0 THUMB32,ARMv6T2 reg32 \x3\x01\x2F\xFF\x20 ARM32,ARMv5TEJ ; Undefined mnemonic diff --git a/compiler/arm/armnop.inc b/compiler/arm/armnop.inc index c03d3c0279..08c8741171 100644 --- a/compiler/arm/armnop.inc +++ b/compiler/arm/armnop.inc @@ -1,2 +1,2 @@ { don't edit, this file is generated from armins.dat } -421; +636; diff --git a/compiler/arm/armop.inc b/compiler/arm/armop.inc index e5340f20c6..91e4d409ef 100644 --- a/compiler/arm/armop.inc +++ b/compiler/arm/armop.inc @@ -3,6 +3,7 @@ A_NONE, A_ADC, A_ADD, +A_ADDW, A_ADF, A_ADR, A_AND, @@ -51,6 +52,7 @@ A_MVF, A_MVN, A_VMOV, A_NOP, +A_ORN, A_ORR, A_RSB, A_RSC, @@ -107,9 +109,7 @@ A_STRD, A_LDRHT, A_STRHT, A_LDRSBT, -A_STRSBT, A_LDRSHT, -A_STRSHT, A_FSTD, A_FSTM, A_FSTS, diff --git a/compiler/arm/armtab.inc b/compiler/arm/armtab.inc index 91c20ab57c..fa80ff0138 100644 --- a/compiler/arm/armtab.inc +++ b/compiler/arm/armtab.inc @@ -14,6 +14,27 @@ code : #96#65#64; flags : if_thumb or if_armv4t ), + ( + opcode : A_ADC; + ops : 3; + optypes : (ot_reg32,ot_reg32,ot_immediateshifter,ot_none,ot_none,ot_none); + code : #128#241#64#0#0; + flags : if_thumb32 or if_armv6t2 + ), + ( + opcode : A_ADC; + ops : 3; + optypes : (ot_reg32,ot_reg32,ot_reg32,ot_none,ot_none,ot_none); + code : #128#235#64#0#0; + flags : if_thumb32 or if_wide or if_armv6t2 + ), + ( + opcode : A_ADC; + ops : 4; + optypes : (ot_reg32,ot_reg32,ot_reg32,ot_shifterop,ot_none,ot_none); + code : #128#235#64#0#0; + flags : if_thumb32 or if_wide or if_armv6t2 + ), ( opcode : A_ADC; ops : 3; @@ -91,6 +112,27 @@ code : #100#68#133; flags : if_thumb or if_armv4t ), + ( + opcode : A_ADD; + ops : 3; + optypes : (ot_reg32,ot_reg32,ot_immediateshifter,ot_none,ot_none,ot_none); + code : #128#241#0#0#0; + flags : if_thumb32 or if_wide or if_armv6t2 + ), + ( + opcode : A_ADD; + ops : 3; + optypes : (ot_reg32,ot_reg32,ot_reg32,ot_none,ot_none,ot_none); + code : #128#235#0#0#0; + flags : if_thumb32 or if_wide or if_armv6t2 + ), + ( + opcode : A_ADD; + ops : 4; + optypes : (ot_reg32,ot_reg32,ot_reg32,ot_shifterop,ot_none,ot_none); + code : #128#235#0#0#0; + flags : if_thumb32 or if_wide or if_armv6t2 + ), ( opcode : A_ADD; ops : 3; @@ -112,6 +154,13 @@ code : #7#2#128; flags : if_arm32 or if_armv4 ), + ( + opcode : A_ADDW; + ops : 3; + optypes : (ot_reg32,ot_reg32,ot_immediateshifter,ot_none,ot_none,ot_none); + code : #129#242#0#0#0; + flags : if_thumb32 or if_armv6t2 + ), ( opcode : A_ADR; ops : 2; @@ -126,6 +175,27 @@ code : #103#160#0#2; flags : if_thumb or if_armv4t ), + ( + opcode : A_ADR; + ops : 2; + optypes : (ot_reg32,ot_immediate or ot_bits32,ot_none,ot_none,ot_none,ot_none); + code : #129#242#175#0#0; + flags : if_thumb32 or if_wide or if_armv6t2 + ), + ( + opcode : A_ADR; + ops : 2; + optypes : (ot_reg32,ot_immediateshifter,ot_none,ot_none,ot_none,ot_none); + code : #129#242#175#0#0; + flags : if_thumb32 or if_wide or if_armv6t2 + ), + ( + opcode : A_ADR; + ops : 2; + optypes : (ot_reg32,ot_memoryam2,ot_none,ot_none,ot_none,ot_none); + code : #129#242#175#0#0; + flags : if_thumb32 or if_wide or if_armv6t2 + ), ( opcode : A_ADR; ops : 2; @@ -140,6 +210,27 @@ code : #96#64#0; flags : if_thumb or if_armv4t ), + ( + opcode : A_AND; + ops : 3; + optypes : (ot_reg32,ot_reg32,ot_immediateshifter,ot_none,ot_none,ot_none); + code : #128#240#0#0#0; + flags : if_thumb32 or if_armv6t2 + ), + ( + opcode : A_AND; + ops : 3; + optypes : (ot_reg32,ot_reg32,ot_reg32,ot_none,ot_none,ot_none); + code : #128#234#0#0#0; + flags : if_thumb32 or if_wide or if_armv6t2 + ), + ( + opcode : A_AND; + ops : 4; + optypes : (ot_reg32,ot_reg32,ot_reg32,ot_shifterop,ot_none,ot_none); + code : #128#234#0#0#0; + flags : if_thumb32 or if_wide or if_armv6t2 + ), ( opcode : A_AND; ops : 3; @@ -224,6 +315,27 @@ code : #96#67#128; flags : if_thumb or if_armv4t ), + ( + opcode : A_BIC; + ops : 3; + optypes : (ot_reg32,ot_reg32,ot_immediateshifter,ot_none,ot_none,ot_none); + code : #128#240#32#0#0; + flags : if_thumb32 or if_armv6t2 + ), + ( + opcode : A_BIC; + ops : 3; + optypes : (ot_reg32,ot_reg32,ot_reg32,ot_none,ot_none,ot_none); + code : #128#234#32#0#0; + flags : if_thumb32 or if_wide or if_armv6t2 + ), + ( + opcode : A_BIC; + ops : 4; + optypes : (ot_reg32,ot_reg32,ot_reg32,ot_shifterop,ot_none,ot_none); + code : #128#234#32#0#0; + flags : if_thumb32 or if_wide or if_armv6t2 + ), ( opcode : A_BIC; ops : 3; @@ -245,6 +357,27 @@ code : #7#3#192; flags : if_arm32 or if_armv4 ), + ( + opcode : A_BL; + ops : 1; + optypes : (ot_immediate24,ot_none,ot_none,ot_none,ot_none,ot_none); + code : #141#240#208; + flags : if_thumb32 or if_armv6t2 + ), + ( + opcode : A_BL; + ops : 1; + optypes : (ot_immediateshifter,ot_none,ot_none,ot_none,ot_none,ot_none); + code : #141#240#208; + flags : if_thumb32 or if_armv6t2 + ), + ( + opcode : A_BL; + ops : 1; + optypes : (ot_memory or ot_bits32,ot_none,ot_none,ot_none,ot_none,ot_none); + code : #141#240#208; + flags : if_thumb32 or if_armv6t2 + ), ( opcode : A_BL; ops : 1; @@ -266,6 +399,27 @@ code : #98#71#128; flags : if_thumb or if_armv4t ), + ( + opcode : A_BLX; + ops : 1; + optypes : (ot_immediateshifter,ot_none,ot_none,ot_none,ot_none,ot_none); + code : #141#240#192; + flags : if_thumb32 or if_armv6t2 + ), + ( + opcode : A_BLX; + ops : 1; + optypes : (ot_immediate24,ot_none,ot_none,ot_none,ot_none,ot_none); + code : #141#240#192; + flags : if_thumb32 or if_armv6t2 + ), + ( + opcode : A_BLX; + ops : 1; + optypes : (ot_memory or ot_bits32,ot_none,ot_none,ot_none,ot_none,ot_none); + code : #141#240#192; + flags : if_thumb32 or if_armv6t2 + ), ( opcode : A_BLX; ops : 1; @@ -336,6 +490,27 @@ code : #96#66#192; flags : if_thumb or if_armv4t ), + ( + opcode : A_CMN; + ops : 2; + optypes : (ot_reg32,ot_immediateshifter,ot_none,ot_none,ot_none,ot_none); + code : #128#241#16#15#0; + flags : if_thumb32 or if_armv6t2 + ), + ( + opcode : A_CMN; + ops : 2; + optypes : (ot_reg32,ot_reg32,ot_none,ot_none,ot_none,ot_none); + code : #128#235#16#15#0; + flags : if_thumb32 or if_wide or if_armv6t2 + ), + ( + opcode : A_CMN; + ops : 3; + optypes : (ot_reg32,ot_reg32,ot_shifterop,ot_none,ot_none,ot_none); + code : #128#235#16#15#0; + flags : if_thumb32 or if_wide or if_armv6t2 + ), ( opcode : A_CMN; ops : 2; @@ -378,6 +553,27 @@ code : #96#40#0; flags : if_thumb or if_armv4t ), + ( + opcode : A_CMP; + ops : 2; + optypes : (ot_reg32,ot_immediateshifter,ot_none,ot_none,ot_none,ot_none); + code : #128#241#176#15#0; + flags : if_thumb32 or if_wide or if_armv6t2 + ), + ( + opcode : A_CMP; + ops : 2; + optypes : (ot_reg32,ot_reg32,ot_none,ot_none,ot_none,ot_none); + code : #128#235#176#15#0; + flags : if_thumb32 or if_wide or if_armv6t2 + ), + ( + opcode : A_CMP; + ops : 3; + optypes : (ot_reg32,ot_reg32,ot_shifterop,ot_none,ot_none,ot_none); + code : #128#235#176#15#0; + flags : if_thumb32 or if_wide or if_armv6t2 + ), ( opcode : A_CMP; ops : 2; @@ -406,6 +602,13 @@ code : #240#2#1; flags : if_fpa ), + ( + opcode : A_CLZ; + ops : 2; + optypes : (ot_reg32,ot_reg32,ot_none,ot_none,ot_none,ot_none); + code : #128#250#176#240#128; + flags : if_thumb32 or if_armv6t2 + ), ( opcode : A_CLZ; ops : 2; @@ -420,6 +623,27 @@ code : #96#64#64; flags : if_thumb or if_armv4t ), + ( + opcode : A_EOR; + ops : 3; + optypes : (ot_reg32,ot_reg32,ot_immediateshifter,ot_none,ot_none,ot_none); + code : #128#240#128#0#0; + flags : if_thumb32 or if_armv6t2 + ), + ( + opcode : A_EOR; + ops : 3; + optypes : (ot_reg32,ot_reg32,ot_reg32,ot_none,ot_none,ot_none); + code : #128#234#128#0#0; + flags : if_thumb32 or if_wide or if_armv6t2 + ), + ( + opcode : A_EOR; + ops : 4; + optypes : (ot_reg32,ot_reg32,ot_reg32,ot_shifterop,ot_none,ot_none); + code : #128#234#128#0#0; + flags : if_thumb32 or if_wide or if_armv6t2 + ), ( opcode : A_EOR; ops : 3; @@ -462,6 +686,20 @@ code : #105#200; flags : if_thumb or if_armv4t ), + ( + opcode : A_LDM; + ops : 2; + optypes : (ot_memoryam4,ot_reglist,ot_none,ot_none,ot_none,ot_none); + code : #140#232#16#0#0; + flags : if_thumb32 or if_wide or if_armv6t2 + ), + ( + opcode : A_LDM; + ops : 2; + optypes : (ot_reg32,ot_reglist,ot_none,ot_none,ot_none,ot_none); + code : #140#232#16#0#0; + flags : if_thumb32 or if_wide or if_armv6t2 + ), ( opcode : A_LDM; ops : 2; @@ -476,6 +714,13 @@ code : #38#129; flags : if_arm32 or if_armv4 ), + ( + opcode : A_LDRBT; + ops : 2; + optypes : (ot_reg32,ot_memoryam2,ot_none,ot_none,ot_none,ot_none); + code : #136#248#16#14#0#0; + flags : if_thumb32 or if_armv6t2 + ), ( opcode : A_LDRBT; ops : 2; @@ -504,6 +749,13 @@ code : #102#120#0#0; flags : if_thumb or if_armv4t ), + ( + opcode : A_LDRB; + ops : 2; + optypes : (ot_reg32,ot_memoryam2,ot_none,ot_none,ot_none,ot_none); + code : #136#248#16#0#0#0; + flags : if_thumb32 or if_wide or if_armv6t2 + ), ( opcode : A_LDRB; ops : 2; @@ -539,6 +791,13 @@ code : #103#72#0#2; flags : if_thumb or if_armv4t ), + ( + opcode : A_LDR; + ops : 2; + optypes : (ot_reg32,ot_memoryam2,ot_none,ot_none,ot_none,ot_none); + code : #136#248#80#0#0#0; + flags : if_thumb32 or if_wide or if_armv6t2 + ), ( opcode : A_LDR; ops : 2; @@ -560,6 +819,13 @@ code : #102#136#0#1; flags : if_thumb or if_armv4t ), + ( + opcode : A_LDRH; + ops : 2; + optypes : (ot_reg32,ot_memoryam2,ot_none,ot_none,ot_none,ot_none); + code : #136#248#48#0#0#0; + flags : if_thumb32 or if_wide or if_armv6t2 + ), ( opcode : A_LDRH; ops : 2; @@ -574,6 +840,13 @@ code : #101#86#0#0; flags : if_thumb or if_armv4t ), + ( + opcode : A_LDRSB; + ops : 2; + optypes : (ot_reg32,ot_memoryam2,ot_none,ot_none,ot_none,ot_none); + code : #136#249#16#0#0#0; + flags : if_thumb32 or if_armv6t2 + ), ( opcode : A_LDRSB; ops : 2; @@ -609,6 +882,13 @@ code : #101#94#0#1; flags : if_thumb or if_armv4t ), + ( + opcode : A_LDRSH; + ops : 2; + optypes : (ot_reg32,ot_memoryam2,ot_none,ot_none,ot_none,ot_none); + code : #136#249#48#0#0#0; + flags : if_thumb32 or if_armv6t2 + ), ( opcode : A_LDRSH; ops : 2; @@ -616,6 +896,13 @@ code : #34#16#240; flags : if_arm32 or if_armv4 ), + ( + opcode : A_LDRT; + ops : 2; + optypes : (ot_reg32,ot_memoryam2,ot_none,ot_none,ot_none,ot_none); + code : #136#248#80#14#0#0; + flags : if_thumb32 or if_armv6t2 + ), ( opcode : A_LDRT; ops : 2; @@ -707,6 +994,13 @@ code : #29#252#80#0; flags : if_arm32 or if_armv6 ), + ( + opcode : A_MLA; + ops : 4; + optypes : (ot_reg32,ot_reg32,ot_reg32,ot_reg32,ot_none,ot_none); + code : #128#251#0#0#0; + flags : if_thumb32 or if_armv6t2 + ), ( opcode : A_MLA; ops : 4; @@ -735,6 +1029,20 @@ code : #96#32#0; flags : if_thumb or if_armv4t ), + ( + opcode : A_MOV; + ops : 2; + optypes : (ot_reg32,ot_immediateshifter,ot_none,ot_none,ot_none,ot_none); + code : #128#240#79#0#0; + flags : if_thumb32 or if_wide or if_armv6t2 + ), + ( + opcode : A_MOV; + ops : 2; + optypes : (ot_reg32,ot_reg32,ot_none,ot_none,ot_none,ot_none); + code : #128#234#79#0#0; + flags : if_thumb32 or if_wide or if_armv6t2 + ), ( opcode : A_MOV; ops : 2; @@ -784,6 +1092,13 @@ code : #100#67#64; flags : if_thumb or if_armv4t ), + ( + opcode : A_MUL; + ops : 3; + optypes : (ot_reg32,ot_reg32,ot_reg32,ot_none,ot_none,ot_none); + code : #128#251#0#240#0; + flags : if_thumb32 or if_armv6t2 + ), ( opcode : A_MUL; ops : 3; @@ -812,6 +1127,20 @@ code : #96#67#192; flags : if_thumb or if_armv4t ), + ( + opcode : A_MVN; + ops : 2; + optypes : (ot_reg32,ot_immediateshifter,ot_none,ot_none,ot_none,ot_none); + code : #128#240#111#0#0; + flags : if_thumb32 or if_armv6t2 + ), + ( + opcode : A_MVN; + ops : 2; + optypes : (ot_reg32,ot_reg32,ot_none,ot_none,ot_none,ot_none); + code : #128#234#111#0#0; + flags : if_thumb32 or if_wide or if_armv6t2 + ), ( opcode : A_MVN; ops : 2; @@ -896,6 +1225,27 @@ code : #47#3#32#240#0; flags : if_arm32 or if_armv6k ), + ( + opcode : A_ORN; + ops : 3; + optypes : (ot_reg32,ot_reg32,ot_immediateshifter,ot_none,ot_none,ot_none); + code : #128#240#96#0#0; + flags : if_thumb32 or if_armv6t2 + ), + ( + opcode : A_ORN; + ops : 3; + optypes : (ot_reg32,ot_reg32,ot_reg32,ot_none,ot_none,ot_none); + code : #128#234#96#0#0; + flags : if_thumb32 or if_wide or if_armv6t2 + ), + ( + opcode : A_ORN; + ops : 4; + optypes : (ot_reg32,ot_reg32,ot_reg32,ot_shifterop,ot_none,ot_none); + code : #128#234#96#0#0; + flags : if_thumb32 or if_wide or if_armv6t2 + ), ( opcode : A_ORR; ops : 2; @@ -903,6 +1253,27 @@ code : #96#67#0; flags : if_thumb or if_armv4t ), + ( + opcode : A_ORR; + ops : 3; + optypes : (ot_reg32,ot_reg32,ot_immediateshifter,ot_none,ot_none,ot_none); + code : #128#240#64#0#0; + flags : if_thumb32 or if_armv6t2 + ), + ( + opcode : A_ORR; + ops : 3; + optypes : (ot_reg32,ot_reg32,ot_reg32,ot_none,ot_none,ot_none); + code : #128#234#64#0#0; + flags : if_thumb32 or if_wide or if_armv6t2 + ), + ( + opcode : A_ORR; + ops : 4; + optypes : (ot_reg32,ot_reg32,ot_reg32,ot_shifterop,ot_none,ot_none); + code : #128#234#64#0#0; + flags : if_thumb32 or if_wide or if_armv6t2 + ), ( opcode : A_ORR; ops : 3; @@ -934,10 +1305,31 @@ ( opcode : A_RSB; ops : 3; - optypes : (ot_reglo,ot_reglo,ot_immediateshifter,ot_none,ot_none,ot_none); + optypes : (ot_reglo,ot_reglo,ot_immediatezero,ot_none,ot_none,ot_none); code : #96#66#64; flags : if_thumb or if_armv4t ), + ( + opcode : A_RSB; + ops : 3; + optypes : (ot_reg32,ot_reg32,ot_immediateshifter,ot_none,ot_none,ot_none); + code : #128#241#192#0#0; + flags : if_thumb32 or if_wide or if_armv6t2 + ), + ( + opcode : A_RSB; + ops : 3; + optypes : (ot_reg32,ot_reg32,ot_reg32,ot_none,ot_none,ot_none); + code : #128#235#192#0#0; + flags : if_thumb32 or if_wide or if_armv6t2 + ), + ( + opcode : A_RSB; + ops : 4; + optypes : (ot_reg32,ot_reg32,ot_reg32,ot_shifterop,ot_none,ot_none); + code : #128#235#192#0#0; + flags : if_thumb32 or if_wide or if_armv6t2 + ), ( opcode : A_RSB; ops : 3; @@ -994,6 +1386,27 @@ code : #96#65#128; flags : if_thumb or if_armv4t ), + ( + opcode : A_SBC; + ops : 3; + optypes : (ot_reg32,ot_reg32,ot_immediateshifter,ot_none,ot_none,ot_none); + code : #128#241#96#0#0; + flags : if_thumb32 or if_wide or if_armv6t2 + ), + ( + opcode : A_SBC; + ops : 3; + optypes : (ot_reg32,ot_reg32,ot_reg32,ot_none,ot_none,ot_none); + code : #128#235#96#0#0; + flags : if_thumb32 or if_wide or if_armv6t2 + ), + ( + opcode : A_SBC; + ops : 4; + optypes : (ot_reg32,ot_reg32,ot_reg32,ot_shifterop,ot_none,ot_none); + code : #128#235#96#0#0; + flags : if_thumb32 or if_wide or if_armv6t2 + ), ( opcode : A_SBC; ops : 3; @@ -1036,6 +1449,13 @@ code : #240#2#0; flags : if_fpa ), + ( + opcode : A_SMLAL; + ops : 4; + optypes : (ot_reg32,ot_reg32,ot_reg32,ot_reg32,ot_none,ot_none); + code : #133#251#192#0#0; + flags : if_thumb32 or if_armv6t2 + ), ( opcode : A_SMLAL; ops : 4; @@ -1043,6 +1463,13 @@ code : #22#0#224#9; flags : if_arm32 or if_armv4 ), + ( + opcode : A_SMULL; + ops : 4; + optypes : (ot_reg32,ot_reg32,ot_reg32,ot_reg32,ot_none,ot_none); + code : #133#251#128#0#0; + flags : if_thumb32 or if_armv6t2 + ), ( opcode : A_SMULL; ops : 4; @@ -1064,6 +1491,20 @@ code : #105#192; flags : if_thumb or if_armv4t ), + ( + opcode : A_STM; + ops : 2; + optypes : (ot_memoryam4,ot_reglist,ot_none,ot_none,ot_none,ot_none); + code : #140#232#0#0#0; + flags : if_thumb32 or if_wide or if_armv6t2 + ), + ( + opcode : A_STM; + ops : 2; + optypes : (ot_reg32,ot_reglist,ot_none,ot_none,ot_none,ot_none); + code : #140#232#0#0#0; + flags : if_thumb32 or if_wide or if_armv6t2 + ), ( opcode : A_STM; ops : 2; @@ -1099,6 +1540,13 @@ code : #103#144#0#2; flags : if_thumb or if_armv4t ), + ( + opcode : A_STR; + ops : 2; + optypes : (ot_reg32,ot_memoryam2,ot_none,ot_none,ot_none,ot_none); + code : #136#248#64#0#0#0; + flags : if_thumb32 or if_wide or if_armv6t2 + ), ( opcode : A_STR; ops : 2; @@ -1120,6 +1568,13 @@ code : #102#112#0#0; flags : if_thumb or if_armv4t ), + ( + opcode : A_STRB; + ops : 2; + optypes : (ot_reg32,ot_memoryam2,ot_none,ot_none,ot_none,ot_none); + code : #136#248#0#0#0#0; + flags : if_thumb32 or if_wide or if_armv6t2 + ), ( opcode : A_STRB; ops : 2; @@ -1127,6 +1582,13 @@ code : #23#4#64; flags : if_arm32 or if_armv4 ), + ( + opcode : A_STRBT; + ops : 2; + optypes : (ot_reg32,ot_memoryam2,ot_none,ot_none,ot_none,ot_none); + code : #136#248#0#14#0#0; + flags : if_thumb32 or if_armv6t2 + ), ( opcode : A_STRBT; ops : 2; @@ -1155,6 +1617,13 @@ code : #102#128#0#1; flags : if_thumb or if_armv4t ), + ( + opcode : A_STRH; + ops : 2; + optypes : (ot_reg32,ot_memoryam2,ot_none,ot_none,ot_none,ot_none); + code : #136#248#32#0#0#0; + flags : if_thumb32 or if_wide or if_armv6t2 + ), ( opcode : A_STRH; ops : 2; @@ -1162,6 +1631,13 @@ code : #34#0#176; flags : if_arm32 or if_armv4 ), + ( + opcode : A_STRT; + ops : 2; + optypes : (ot_reg32,ot_memoryam2,ot_none,ot_none,ot_none,ot_none); + code : #136#248#64#14#0#0; + flags : if_thumb32 or if_armv6t2 + ), ( opcode : A_STRT; ops : 2; @@ -1197,6 +1673,27 @@ code : #96#56#0; flags : if_thumb or if_armv4t ), + ( + opcode : A_SUB; + ops : 3; + optypes : (ot_reg32,ot_reg32,ot_immediateshifter,ot_none,ot_none,ot_none); + code : #128#241#160#0#0; + flags : if_thumb32 or if_wide or if_armv6t2 + ), + ( + opcode : A_SUB; + ops : 3; + optypes : (ot_reg32,ot_reg32,ot_reg32,ot_none,ot_none,ot_none); + code : #128#235#160#0#0; + flags : if_thumb32 or if_wide or if_armv6t2 + ), + ( + opcode : A_SUB; + ops : 4; + optypes : (ot_reg32,ot_reg32,ot_reg32,ot_shifterop,ot_none,ot_none); + code : #128#235#160#0#0; + flags : if_thumb32 or if_wide or if_armv6t2 + ), ( opcode : A_SUB; ops : 3; @@ -1253,6 +1750,27 @@ code : #39#20#9; flags : if_arm32 or if_armv4 ), + ( + opcode : A_TEQ; + ops : 2; + optypes : (ot_reg32,ot_immediateshifter,ot_none,ot_none,ot_none,ot_none); + code : #128#240#144#15#0; + flags : if_thumb32 or if_armv6t2 + ), + ( + opcode : A_TEQ; + ops : 2; + optypes : (ot_reg32,ot_reg32,ot_none,ot_none,ot_none,ot_none); + code : #128#234#144#15#0; + flags : if_thumb32 or if_armv6t2 + ), + ( + opcode : A_TEQ; + ops : 3; + optypes : (ot_reg32,ot_reg32,ot_shifterop,ot_none,ot_none,ot_none); + code : #128#234#144#15#0; + flags : if_thumb32 or if_armv6t2 + ), ( opcode : A_TEQ; ops : 2; @@ -1288,6 +1806,27 @@ code : #96#66#0; flags : if_thumb or if_armv4t ), + ( + opcode : A_TST; + ops : 2; + optypes : (ot_reg32,ot_immediateshifter,ot_none,ot_none,ot_none,ot_none); + code : #128#240#16#15#0; + flags : if_thumb32 or if_armv6t2 + ), + ( + opcode : A_TST; + ops : 2; + optypes : (ot_reg32,ot_reg32,ot_none,ot_none,ot_none,ot_none); + code : #128#234#16#15#0; + flags : if_thumb32 or if_wide or if_armv6t2 + ), + ( + opcode : A_TST; + ops : 3; + optypes : (ot_reg32,ot_reg32,ot_shifterop,ot_none,ot_none,ot_none); + code : #128#234#16#15#0; + flags : if_thumb32 or if_wide or if_armv6t2 + ), ( opcode : A_TST; ops : 2; @@ -1316,6 +1855,13 @@ code : #15#3#0; flags : if_arm32 or if_armv4 ), + ( + opcode : A_UMLAL; + ops : 4; + optypes : (ot_reg32,ot_reg32,ot_reg32,ot_reg32,ot_none,ot_none); + code : #133#251#224#0#0; + flags : if_thumb32 or if_armv6t2 + ), ( opcode : A_UMLAL; ops : 4; @@ -1323,6 +1869,13 @@ code : #22#0#160#9; flags : if_arm32 or if_armv4 ), + ( + opcode : A_UMULL; + ops : 4; + optypes : (ot_reg32,ot_reg32,ot_reg32,ot_reg32,ot_none,ot_none); + code : #133#251#160#0#0; + flags : if_thumb32 or if_armv6t2 + ), ( opcode : A_UMULL; ops : 4; @@ -1330,6 +1883,13 @@ code : #22#0#128#9; flags : if_arm32 or if_armv4 ), + ( + opcode : A_LDRD; + ops : 3; + optypes : (ot_reg32,ot_reg32,ot_memoryam2,ot_none,ot_none,ot_none); + code : #137#232#80#0#0; + flags : if_thumb32 or if_armv6t2 + ), ( opcode : A_LDRD; ops : 3; @@ -1337,6 +1897,13 @@ code : #25#0#0#0#208; flags : if_arm32 or if_armv4 ), + ( + opcode : A_PLD; + ops : 1; + optypes : (ot_memoryam2,ot_none,ot_none,ot_none,ot_none,ot_none); + code : #135#248#16#240#0; + flags : if_thumb32 or if_armv6t2 + ), ( opcode : A_PLD; ops : 1; @@ -1344,6 +1911,13 @@ code : #37#245#80#240#0; flags : if_arm32 or if_armv5te ), + ( + opcode : A_PLDW; + ops : 1; + optypes : (ot_memoryam2,ot_none,ot_none,ot_none,ot_none,ot_none); + code : #135#248#48#240#0; + flags : if_thumb32 or if_armv7 + ), ( opcode : A_PLDW; ops : 1; @@ -1351,6 +1925,13 @@ code : #37#245#16#240#0; flags : if_arm32 or if_armv7 ), + ( + opcode : A_QADD; + ops : 3; + optypes : (ot_reg32,ot_reg32,ot_reg32,ot_none,ot_none,ot_none); + code : #130#250#128#240#128; + flags : if_thumb32 or if_armv6t2 + ), ( opcode : A_QADD; ops : 3; @@ -1358,6 +1939,13 @@ code : #26#1#0#5; flags : if_arm32 or if_armv5te ), + ( + opcode : A_QDADD; + ops : 3; + optypes : (ot_reg32,ot_reg32,ot_reg32,ot_none,ot_none,ot_none); + code : #130#250#128#240#144; + flags : if_thumb32 or if_armv6t2 + ), ( opcode : A_QDADD; ops : 3; @@ -1365,6 +1953,13 @@ code : #26#1#64#5; flags : if_arm32 or if_armv5te ), + ( + opcode : A_QDSUB; + ops : 3; + optypes : (ot_reg32,ot_reg32,ot_reg32,ot_none,ot_none,ot_none); + code : #130#250#128#240#176; + flags : if_thumb32 or if_armv6t2 + ), ( opcode : A_QDSUB; ops : 3; @@ -1372,6 +1967,13 @@ code : #26#1#96#5; flags : if_arm32 or if_armv5te ), + ( + opcode : A_QSUB; + ops : 3; + optypes : (ot_reg32,ot_reg32,ot_reg32,ot_none,ot_none,ot_none); + code : #130#250#128#240#160; + flags : if_thumb32 or if_armv6t2 + ), ( opcode : A_QSUB; ops : 3; @@ -1533,6 +2135,13 @@ code : #20#1#32#224; flags : if_arm32 or if_armv5te ), + ( + opcode : A_STRD; + ops : 3; + optypes : (ot_reg32,ot_reg32,ot_memoryam2,ot_none,ot_none,ot_none); + code : #137#232#64#0#0; + flags : if_thumb32 or if_armv6t2 + ), ( opcode : A_STRD; ops : 3; @@ -1540,6 +2149,13 @@ code : #25#0#0#0#240; flags : if_arm32 or if_armv4 ), + ( + opcode : A_LDRHT; + ops : 2; + optypes : (ot_reg32,ot_memoryam2,ot_none,ot_none,ot_none,ot_none); + code : #136#248#48#14#0#0; + flags : if_thumb32 or if_armv6t2 + ), ( opcode : A_LDRHT; ops : 2; @@ -1547,6 +2163,20 @@ code : #25#0#48#0#176; flags : if_arm32 or if_armv4 ), + ( + opcode : A_STRHT; + ops : 2; + optypes : (ot_reg32,ot_memoryam2,ot_none,ot_none,ot_none,ot_none); + code : #136#248#32#14#0#0; + flags : if_thumb32 or if_armv6t2 + ), + ( + opcode : A_STRHT; + ops : 2; + optypes : (ot_reg32,ot_memoryam2,ot_none,ot_none,ot_none,ot_none); + code : #136#248#32#14#0#0; + flags : if_thumb32 or if_armv6t2 + ), ( opcode : A_STRHT; ops : 2; @@ -1554,6 +2184,13 @@ code : #30#0#32#0#176; flags : if_arm32 or if_armv4 ), + ( + opcode : A_LDRSBT; + ops : 2; + optypes : (ot_reg32,ot_memoryam2,ot_none,ot_none,ot_none,ot_none); + code : #136#249#16#14#0#0; + flags : if_thumb32 or if_armv6t2 + ), ( opcode : A_LDRSBT; ops : 2; @@ -1562,11 +2199,11 @@ flags : if_arm32 or if_armv4 ), ( - opcode : A_STRSBT; + opcode : A_LDRSHT; ops : 2; optypes : (ot_reg32,ot_memoryam2,ot_none,ot_none,ot_none,ot_none); - code : #30#0#48#0#208; - flags : if_arm32 or if_armv4 + code : #136#249#48#14#0#0; + flags : if_thumb32 or if_armv6t2 ), ( opcode : A_LDRSHT; @@ -1576,11 +2213,18 @@ flags : if_arm32 or if_armv4 ), ( - opcode : A_STRSHT; - ops : 2; - optypes : (ot_reg32,ot_memoryam2,ot_none,ot_none,ot_none,ot_none); - code : #30#0#48#0#240; - flags : if_arm32 or if_armv4 + opcode : A_BFC; + ops : 3; + optypes : (ot_reg32,ot_immediateshifter,ot_immediateshifter,ot_none,ot_none,ot_none); + code : #132#243#111#0#0; + flags : if_thumb32 or if_armv6t2 + ), + ( + opcode : A_BFC; + ops : 3; + optypes : (ot_reg32,ot_immediateshifter,ot_immediate or ot_bits32,ot_none,ot_none,ot_none); + code : #132#243#111#0#0; + flags : if_thumb32 or if_armv6t2 ), ( opcode : A_BFC; @@ -1596,6 +2240,20 @@ code : #45#7#192#0#31; flags : if_arm32 or if_armv4 ), + ( + opcode : A_BFI; + ops : 4; + optypes : (ot_reg32,ot_reg32,ot_immediateshifter,ot_immediateshifter,ot_none,ot_none); + code : #132#243#96#0#0; + flags : if_thumb32 or if_armv6t2 + ), + ( + opcode : A_BFI; + ops : 4; + optypes : (ot_reg32,ot_reg32,ot_immediateshifter,ot_immediate or ot_bits32,ot_none,ot_none); + code : #132#243#96#0#0; + flags : if_thumb32 or if_armv6t2 + ), ( opcode : A_BFI; ops : 4; @@ -1610,6 +2268,13 @@ code : #45#7#192#0#16; flags : if_arm32 or if_armv4 ), + ( + opcode : A_CLREX; + ops : 0; + optypes : (ot_none,ot_none,ot_none,ot_none,ot_none,ot_none); + code : #128#243#191#143#47; + flags : if_thumb32 or if_armv7 + ), ( opcode : A_CLREX; ops : 0; @@ -1617,6 +2282,13 @@ code : #47#245#127#240#31; flags : if_arm32 or if_armv6k ), + ( + opcode : A_LDREX; + ops : 2; + optypes : (ot_reg32,ot_memoryam6,ot_none,ot_none,ot_none,ot_none); + code : #138#232#80#15#0; + flags : if_thumb32 or if_armv6t2 + ), ( opcode : A_LDREX; ops : 2; @@ -1624,6 +2296,13 @@ code : #24#1#144#15#159; flags : if_arm32 or if_armv4 ), + ( + opcode : A_LDREXB; + ops : 2; + optypes : (ot_reg32,ot_memoryam6,ot_none,ot_none,ot_none,ot_none); + code : #138#232#208#15#79; + flags : if_thumb32 or if_armv7 + ), ( opcode : A_LDREXB; ops : 2; @@ -1631,6 +2310,13 @@ code : #24#1#208#15#159; flags : if_arm32 or if_armv4 ), + ( + opcode : A_LDREXD; + ops : 3; + optypes : (ot_reg32,ot_reg32,ot_memoryam6,ot_none,ot_none,ot_none); + code : #138#232#208#0#127; + flags : if_thumb32 or if_armv7 + ), ( opcode : A_LDREXD; ops : 3; @@ -1638,6 +2324,13 @@ code : #24#1#176#15#159; flags : if_arm32 or if_armv4 ), + ( + opcode : A_LDREXH; + ops : 2; + optypes : (ot_reg32,ot_memoryam6,ot_none,ot_none,ot_none,ot_none); + code : #138#232#208#15#95; + flags : if_thumb32 or if_armv7 + ), ( opcode : A_LDREXH; ops : 2; @@ -1645,6 +2338,13 @@ code : #24#1#240#15#159; flags : if_arm32 or if_armv4 ), + ( + opcode : A_STREX; + ops : 3; + optypes : (ot_reg32,ot_reg32,ot_memoryam6,ot_none,ot_none,ot_none); + code : #139#232#64#0#0; + flags : if_thumb32 or if_armv6t2 + ), ( opcode : A_STREX; ops : 3; @@ -1652,6 +2352,13 @@ code : #24#1#128#15#144; flags : if_arm32 or if_armv4 ), + ( + opcode : A_STREXB; + ops : 3; + optypes : (ot_reg32,ot_reg32,ot_memoryam6,ot_none,ot_none,ot_none); + code : #139#232#192#15#64; + flags : if_thumb32 or if_armv7 + ), ( opcode : A_STREXB; ops : 3; @@ -1659,6 +2366,13 @@ code : #24#1#192#15#144; flags : if_arm32 or if_armv4 ), + ( + opcode : A_STREXD; + ops : 4; + optypes : (ot_reg32,ot_reg32,ot_reg32,ot_memoryam6,ot_none,ot_none); + code : #139#232#192#0#112; + flags : if_thumb32 or if_armv7 + ), ( opcode : A_STREXD; ops : 4; @@ -1666,6 +2380,13 @@ code : #24#1#160#15#144; flags : if_arm32 or if_armv4 ), + ( + opcode : A_STREXH; + ops : 3; + optypes : (ot_reg32,ot_reg32,ot_memoryam6,ot_none,ot_none,ot_none); + code : #139#232#192#15#80; + flags : if_thumb32 or if_armv7 + ), ( opcode : A_STREXH; ops : 3; @@ -1673,6 +2394,13 @@ code : #24#1#224#15#144; flags : if_arm32 or if_armv4 ), + ( + opcode : A_MLS; + ops : 4; + optypes : (ot_reg32,ot_reg32,ot_reg32,ot_reg32,ot_none,ot_none); + code : #128#251#0#0#16; + flags : if_thumb32 or if_armv6t2 + ), ( opcode : A_MLS; ops : 4; @@ -1680,6 +2408,20 @@ code : #21#0#96#9; flags : if_arm32 or if_armv6t2 ), + ( + opcode : A_PKHBT; + ops : 3; + optypes : (ot_reg32,ot_reg32,ot_reg32,ot_none,ot_none,ot_none); + code : #128#234#192#0#0; + flags : if_thumb32 or if_armv6t2 + ), + ( + opcode : A_PKHBT; + ops : 4; + optypes : (ot_reg32,ot_reg32,ot_reg32,ot_shifterop,ot_none,ot_none); + code : #128#234#192#0#0; + flags : if_thumb32 or if_armv6t2 + ), ( opcode : A_PKHBT; ops : 3; @@ -1694,6 +2436,20 @@ code : #22#6#128#1; flags : if_arm32 or if_armv6 ), + ( + opcode : A_PKHTB; + ops : 3; + optypes : (ot_reg32,ot_reg32,ot_reg32,ot_none,ot_none,ot_none); + code : #128#234#192#0#16; + flags : if_thumb32 or if_armv6t2 + ), + ( + opcode : A_PKHTB; + ops : 4; + optypes : (ot_reg32,ot_reg32,ot_reg32,ot_shifterop,ot_none,ot_none); + code : #128#234#192#0#16; + flags : if_thumb32 or if_armv6t2 + ), ( opcode : A_PKHTB; ops : 3; @@ -1708,6 +2464,13 @@ code : #22#6#128#5; flags : if_arm32 or if_armv6 ), + ( + opcode : A_PLI; + ops : 1; + optypes : (ot_memoryam2,ot_none,ot_none,ot_none,ot_none,ot_none); + code : #135#249#16#240#0; + flags : if_thumb32 or if_armv7 + ), ( opcode : A_PLI; ops : 1; @@ -1715,6 +2478,13 @@ code : #37#244#80#240#0; flags : if_arm32 or if_armv7 ), + ( + opcode : A_QADD16; + ops : 3; + optypes : (ot_reg32,ot_reg32,ot_reg32,ot_none,ot_none,ot_none); + code : #128#250#144#240#16; + flags : if_thumb32 or if_armv6t2 + ), ( opcode : A_QADD16; ops : 3; @@ -1722,6 +2492,13 @@ code : #22#6#32#241; flags : if_arm32 or if_armv6 ), + ( + opcode : A_QADD8; + ops : 3; + optypes : (ot_reg32,ot_reg32,ot_reg32,ot_none,ot_none,ot_none); + code : #128#250#128#240#16; + flags : if_thumb32 or if_armv6t2 + ), ( opcode : A_QADD8; ops : 3; @@ -1729,6 +2506,13 @@ code : #22#6#32#249; flags : if_arm32 or if_armv6 ), + ( + opcode : A_QASX; + ops : 3; + optypes : (ot_reg32,ot_reg32,ot_reg32,ot_none,ot_none,ot_none); + code : #128#250#160#240#16; + flags : if_thumb32 or if_armv6t2 + ), ( opcode : A_QASX; ops : 3; @@ -1736,6 +2520,13 @@ code : #22#6#32#243; flags : if_arm32 or if_armv6 ), + ( + opcode : A_QSAX; + ops : 3; + optypes : (ot_reg32,ot_reg32,ot_reg32,ot_none,ot_none,ot_none); + code : #128#250#224#240#16; + flags : if_thumb32 or if_armv6t2 + ), ( opcode : A_QSAX; ops : 3; @@ -1743,6 +2534,13 @@ code : #22#6#32#245; flags : if_arm32 or if_armv6 ), + ( + opcode : A_QSUB16; + ops : 3; + optypes : (ot_reg32,ot_reg32,ot_reg32,ot_none,ot_none,ot_none); + code : #128#250#208#240#16; + flags : if_thumb32 or if_armv6t2 + ), ( opcode : A_QSUB16; ops : 3; @@ -1750,6 +2548,13 @@ code : #22#6#32#247; flags : if_arm32 or if_armv6 ), + ( + opcode : A_QSUB8; + ops : 3; + optypes : (ot_reg32,ot_reg32,ot_reg32,ot_none,ot_none,ot_none); + code : #128#250#192#240#16; + flags : if_thumb32 or if_armv6t2 + ), ( opcode : A_QSUB8; ops : 3; @@ -1757,6 +2562,13 @@ code : #22#6#32#255; flags : if_arm32 or if_armv6 ), + ( + opcode : A_RBIT; + ops : 2; + optypes : (ot_reg32,ot_reg32,ot_none,ot_none,ot_none,ot_none); + code : #128#250#144#240#160; + flags : if_thumb32 or if_armv6t2 + ), ( opcode : A_RBIT; ops : 2; @@ -1771,6 +2583,13 @@ code : #97#186#0; flags : if_thumb or if_armv6 ), + ( + opcode : A_REV; + ops : 2; + optypes : (ot_reg32,ot_reg32,ot_none,ot_none,ot_none,ot_none); + code : #128#250#144#240#128; + flags : if_thumb32 or if_wide or if_armv6t2 + ), ( opcode : A_REV; ops : 2; @@ -1785,6 +2604,13 @@ code : #97#186#64; flags : if_thumb or if_armv6 ), + ( + opcode : A_REV16; + ops : 2; + optypes : (ot_reg32,ot_reg32,ot_none,ot_none,ot_none,ot_none); + code : #128#250#144#240#144; + flags : if_thumb32 or if_wide or if_armv6t2 + ), ( opcode : A_REV16; ops : 2; @@ -1799,6 +2625,13 @@ code : #97#186#192; flags : if_thumb or if_armv6 ), + ( + opcode : A_REVSH; + ops : 2; + optypes : (ot_reg32,ot_reg32,ot_none,ot_none,ot_none,ot_none); + code : #128#250#144#240#176; + flags : if_thumb32 or if_wide or if_armv6t2 + ), ( opcode : A_REVSH; ops : 2; @@ -1806,6 +2639,13 @@ code : #50#6#255#15#176; flags : if_arm32 or if_armv6 ), + ( + opcode : A_SADD16; + ops : 3; + optypes : (ot_reg32,ot_reg32,ot_reg32,ot_none,ot_none,ot_none); + code : #128#250#72#240#0; + flags : if_thumb32 or if_armv6t2 + ), ( opcode : A_SADD16; ops : 3; @@ -1813,6 +2653,13 @@ code : #22#6#16#241; flags : if_arm32 or if_armv6 ), + ( + opcode : A_SADD8; + ops : 3; + optypes : (ot_reg32,ot_reg32,ot_reg32,ot_none,ot_none,ot_none); + code : #128#250#64#240#0; + flags : if_thumb32 or if_armv6t2 + ), ( opcode : A_SADD8; ops : 3; @@ -1820,6 +2667,13 @@ code : #22#6#16#249; flags : if_arm32 or if_armv6 ), + ( + opcode : A_SASX; + ops : 3; + optypes : (ot_reg32,ot_reg32,ot_reg32,ot_none,ot_none,ot_none); + code : #128#250#80#240#0; + flags : if_thumb32 or if_armv6t2 + ), ( opcode : A_SASX; ops : 3; @@ -1827,6 +2681,13 @@ code : #22#6#16#243; flags : if_arm32 or if_armv6 ), + ( + opcode : A_SBFX; + ops : 4; + optypes : (ot_reg32,ot_reg32,ot_immediateshifter,ot_immediateshifter,ot_none,ot_none); + code : #132#243#64#0#0; + flags : if_thumb32 or if_armv6t2 + ), ( opcode : A_SBFX; ops : 4; @@ -1834,6 +2695,13 @@ code : #45#7#160#0#80; flags : if_arm32 or if_armv6t2 ), + ( + opcode : A_SEL; + ops : 3; + optypes : (ot_reg32,ot_reg32,ot_reg32,ot_none,ot_none,ot_none); + code : #128#250#160#240#128; + flags : if_thumb32 or if_armv6t2 + ), ( opcode : A_SEL; ops : 3; @@ -1876,6 +2744,20 @@ code : #96#65#0; flags : if_thumb or if_armv4t ), + ( + opcode : A_ASR; + ops : 3; + optypes : (ot_reg32,ot_reg32,ot_immediateshifter,ot_none,ot_none,ot_none); + code : #130#234#79#0#32; + flags : if_thumb32 or if_wide or if_armv6t2 + ), + ( + opcode : A_ASR; + ops : 3; + optypes : (ot_reg32,ot_reg32,ot_reg32,ot_none,ot_none,ot_none); + code : #128#250#64#240#0; + flags : if_thumb32 or if_wide or if_armv6t2 + ), ( opcode : A_ASR; ops : 3; @@ -1904,6 +2786,20 @@ code : #96#64#192; flags : if_thumb or if_armv4t ), + ( + opcode : A_LSR; + ops : 3; + optypes : (ot_reg32,ot_reg32,ot_immediateshifter,ot_none,ot_none,ot_none); + code : #130#234#79#0#16; + flags : if_thumb32 or if_wide or if_armv6t2 + ), + ( + opcode : A_LSR; + ops : 3; + optypes : (ot_reg32,ot_reg32,ot_reg32,ot_none,ot_none,ot_none); + code : #128#250#32#240#0; + flags : if_thumb32 or if_wide or if_armv6t2 + ), ( opcode : A_LSR; ops : 3; @@ -1932,6 +2828,20 @@ code : #96#64#128; flags : if_thumb or if_armv4t ), + ( + opcode : A_LSL; + ops : 3; + optypes : (ot_reg32,ot_reg32,ot_immediateshifter,ot_none,ot_none,ot_none); + code : #130#234#79#0#32; + flags : if_thumb32 or if_armv6t2 + ), + ( + opcode : A_LSL; + ops : 3; + optypes : (ot_reg32,ot_reg32,ot_reg32,ot_none,ot_none,ot_none); + code : #128#250#96#240#0; + flags : if_thumb32 or if_wide or if_armv6t2 + ), ( opcode : A_LSL; ops : 3; @@ -1953,6 +2863,20 @@ code : #96#65#192; flags : if_thumb or if_armv4t ), + ( + opcode : A_ROR; + ops : 3; + optypes : (ot_reg32,ot_reg32,ot_immediateshifter,ot_none,ot_none,ot_none); + code : #130#234#79#0#48; + flags : if_thumb32 or if_wide or if_armv6t2 + ), + ( + opcode : A_ROR; + ops : 3; + optypes : (ot_reg32,ot_reg32,ot_reg32,ot_none,ot_none,ot_none); + code : #128#250#96#240#0; + flags : if_thumb32 or if_wide or if_armv6t2 + ), ( opcode : A_ROR; ops : 3; @@ -1967,6 +2891,13 @@ code : #48#1#160#0#96; flags : if_arm32 or if_armv4 ), + ( + opcode : A_RRX; + ops : 2; + optypes : (ot_reg32,ot_reg32,ot_none,ot_none,ot_none,ot_none); + code : #128#234#79#0#48; + flags : if_thumb32 or if_armv6t2 + ), ( opcode : A_RRX; ops : 2; @@ -1974,6 +2905,13 @@ code : #48#1#160#0#96; flags : if_arm32 or if_armv4 ), + ( + opcode : A_UMAAL; + ops : 4; + optypes : (ot_reg32,ot_reg32,ot_reg32,ot_reg32,ot_none,ot_none); + code : #133#251#224#0#96; + flags : if_thumb32 or if_armv6t2 + ), ( opcode : A_UMAAL; ops : 4; @@ -1981,6 +2919,13 @@ code : #22#0#64#9; flags : if_arm32 or if_armv6 ), + ( + opcode : A_SHADD16; + ops : 3; + optypes : (ot_reg32,ot_reg32,ot_reg32,ot_none,ot_none,ot_none); + code : #128#250#144#240#32; + flags : if_thumb32 or if_armv6t2 + ), ( opcode : A_SHADD16; ops : 3; @@ -1988,6 +2933,13 @@ code : #22#6#48#241; flags : if_arm32 or if_armv6 ), + ( + opcode : A_SHADD8; + ops : 3; + optypes : (ot_reg32,ot_reg32,ot_reg32,ot_none,ot_none,ot_none); + code : #128#250#128#240#32; + flags : if_thumb32 or if_armv6t2 + ), ( opcode : A_SHADD8; ops : 3; @@ -1995,6 +2947,13 @@ code : #22#6#48#249; flags : if_arm32 or if_armv6 ), + ( + opcode : A_SHASX; + ops : 3; + optypes : (ot_reg32,ot_reg32,ot_reg32,ot_none,ot_none,ot_none); + code : #128#250#160#240#32; + flags : if_thumb32 or if_armv6t2 + ), ( opcode : A_SHASX; ops : 3; @@ -2002,6 +2961,13 @@ code : #22#6#48#243; flags : if_arm32 or if_armv6 ), + ( + opcode : A_SHSAX; + ops : 3; + optypes : (ot_reg32,ot_reg32,ot_reg32,ot_none,ot_none,ot_none); + code : #128#250#224#240#32; + flags : if_thumb32 or if_armv6t2 + ), ( opcode : A_SHSAX; ops : 3; @@ -2009,6 +2975,13 @@ code : #22#6#48#245; flags : if_arm32 or if_armv6 ), + ( + opcode : A_SHSUB16; + ops : 3; + optypes : (ot_reg32,ot_reg32,ot_reg32,ot_none,ot_none,ot_none); + code : #128#250#208#240#32; + flags : if_thumb32 or if_armv6t2 + ), ( opcode : A_SHSUB16; ops : 3; @@ -2016,6 +2989,13 @@ code : #22#6#48#247; flags : if_arm32 or if_armv6 ), + ( + opcode : A_SHSUB8; + ops : 3; + optypes : (ot_reg32,ot_reg32,ot_reg32,ot_none,ot_none,ot_none); + code : #128#250#192#240#32; + flags : if_thumb32 or if_armv6t2 + ), ( opcode : A_SHSUB8; ops : 3; @@ -2023,6 +3003,13 @@ code : #22#6#48#255; flags : if_arm32 or if_armv6 ), + ( + opcode : A_SMLAD; + ops : 4; + optypes : (ot_reg32,ot_reg32,ot_reg32,ot_reg32,ot_none,ot_none); + code : #128#251#32#0#0; + flags : if_thumb32 or if_armv6t2 + ), ( opcode : A_SMLAD; ops : 4; @@ -2030,6 +3017,13 @@ code : #21#7#0#1; flags : if_arm32 or if_armv6 ), + ( + opcode : A_SMLALD; + ops : 4; + optypes : (ot_reg32,ot_reg32,ot_reg32,ot_reg32,ot_none,ot_none); + code : #133#251#192#0#192; + flags : if_thumb32 or if_armv6t2 + ), ( opcode : A_SMLALD; ops : 4; @@ -2037,6 +3031,13 @@ code : #22#7#64#1; flags : if_arm32 or if_armv4 ), + ( + opcode : A_SMLSD; + ops : 4; + optypes : (ot_reg32,ot_reg32,ot_reg32,ot_reg32,ot_none,ot_none); + code : #128#251#64#0#0; + flags : if_thumb32 or if_armv6t2 + ), ( opcode : A_SMLSD; ops : 4; @@ -2044,6 +3045,13 @@ code : #21#7#0#5; flags : if_arm32 or if_armv6 ), + ( + opcode : A_SMLSLD; + ops : 4; + optypes : (ot_reg32,ot_reg32,ot_reg32,ot_reg32,ot_none,ot_none); + code : #133#251#208#0#192; + flags : if_thumb32 or if_armv6t2 + ), ( opcode : A_SMLSLD; ops : 4; @@ -2051,6 +3059,13 @@ code : #22#7#64#5; flags : if_arm32 or if_armv6 ), + ( + opcode : A_SMMLA; + ops : 4; + optypes : (ot_reg32,ot_reg32,ot_reg32,ot_reg32,ot_none,ot_none); + code : #128#251#80#0#0; + flags : if_thumb32 or if_armv6t2 + ), ( opcode : A_SMMLA; ops : 4; @@ -2058,6 +3073,13 @@ code : #21#7#80#1; flags : if_arm32 or if_armv6 ), + ( + opcode : A_SMMLS; + ops : 4; + optypes : (ot_reg32,ot_reg32,ot_reg32,ot_reg32,ot_none,ot_none); + code : #128#251#96#0#0; + flags : if_thumb32 or if_armv6t2 + ), ( opcode : A_SMMLS; ops : 4; @@ -2065,6 +3087,13 @@ code : #21#7#80#13; flags : if_arm32 or if_armv6 ), + ( + opcode : A_SMMUL; + ops : 3; + optypes : (ot_reg32,ot_reg32,ot_reg32,ot_none,ot_none,ot_none); + code : #128#251#80#240#0; + flags : if_thumb32 or if_armv6t2 + ), ( opcode : A_SMMUL; ops : 3; @@ -2072,6 +3101,13 @@ code : #21#7#80#1#15; flags : if_arm32 or if_armv6 ), + ( + opcode : A_SMUAD; + ops : 3; + optypes : (ot_reg32,ot_reg32,ot_reg32,ot_none,ot_none,ot_none); + code : #128#251#32#240#0; + flags : if_thumb32 or if_armv6t2 + ), ( opcode : A_SMUAD; ops : 3; @@ -2079,6 +3115,13 @@ code : #21#7#0#1#15; flags : if_arm32 or if_armv6 ), + ( + opcode : A_SMUSD; + ops : 3; + optypes : (ot_reg32,ot_reg32,ot_reg32,ot_none,ot_none,ot_none); + code : #128#251#64#240#0; + flags : if_thumb32 or if_armv6t2 + ), ( opcode : A_SMUSD; ops : 3; @@ -2086,6 +3129,20 @@ code : #21#7#0#5#15; flags : if_arm32 or if_armv6 ), + ( + opcode : A_SSAT; + ops : 3; + optypes : (ot_reg32,ot_immediateshifter,ot_reg32,ot_none,ot_none,ot_none); + code : #131#243#0#0#0; + flags : if_thumb32 or if_armv6t2 + ), + ( + opcode : A_SSAT; + ops : 4; + optypes : (ot_reg32,ot_immediateshifter,ot_reg32,ot_shifterop,ot_none,ot_none); + code : #131#243#0#0#0; + flags : if_thumb32 or if_armv6t2 + ), ( opcode : A_SSAT; ops : 3; @@ -2100,6 +3157,13 @@ code : #42#6#160#0#16; flags : if_arm32 or if_armv6 ), + ( + opcode : A_SSAT16; + ops : 3; + optypes : (ot_reg32,ot_immediateshifter,ot_reg32,ot_none,ot_none,ot_none); + code : #131#243#32#0#0; + flags : if_thumb32 or if_armv6t2 + ), ( opcode : A_SSAT16; ops : 3; @@ -2107,6 +3171,13 @@ code : #42#6#160#15#48; flags : if_arm32 or if_armv6 ), + ( + opcode : A_SSAX; + ops : 3; + optypes : (ot_reg32,ot_reg32,ot_reg32,ot_none,ot_none,ot_none); + code : #128#250#224#240#0; + flags : if_thumb32 or if_armv6t2 + ), ( opcode : A_SSAX; ops : 3; @@ -2114,6 +3185,13 @@ code : #22#6#16#245; flags : if_arm32 or if_armv6 ), + ( + opcode : A_SSUB16; + ops : 3; + optypes : (ot_reg32,ot_reg32,ot_reg32,ot_none,ot_none,ot_none); + code : #128#250#208#240#0; + flags : if_thumb32 or if_armv6t2 + ), ( opcode : A_SSUB16; ops : 3; @@ -2121,6 +3199,13 @@ code : #22#6#16#247; flags : if_arm32 or if_armv6 ), + ( + opcode : A_SSUB8; + ops : 3; + optypes : (ot_reg32,ot_reg32,ot_reg32,ot_none,ot_none,ot_none); + code : #128#250#192#240#0; + flags : if_thumb32 or if_armv6t2 + ), ( opcode : A_SSUB8; ops : 3; @@ -2128,6 +3213,20 @@ code : #22#6#16#255; flags : if_arm32 or if_armv6 ), + ( + opcode : A_SXTAB; + ops : 3; + optypes : (ot_reg32,ot_reg32,ot_reg32,ot_none,ot_none,ot_none); + code : #134#250#64#240#128; + flags : if_thumb32 or if_armv6t2 + ), + ( + opcode : A_SXTAB; + ops : 4; + optypes : (ot_reg32,ot_reg32,ot_reg32,ot_shifterop,ot_none,ot_none); + code : #134#250#64#240#128; + flags : if_thumb32 or if_armv6t2 + ), ( opcode : A_SXTAB; ops : 3; @@ -2142,6 +3241,20 @@ code : #22#6#160#7; flags : if_arm32 or if_armv6 ), + ( + opcode : A_SXTAB16; + ops : 3; + optypes : (ot_reg32,ot_reg32,ot_reg32,ot_none,ot_none,ot_none); + code : #134#250#32#240#128; + flags : if_thumb32 or if_armv6t2 + ), + ( + opcode : A_SXTAB16; + ops : 4; + optypes : (ot_reg32,ot_reg32,ot_reg32,ot_shifterop,ot_none,ot_none); + code : #134#250#32#240#128; + flags : if_thumb32 or if_armv6t2 + ), ( opcode : A_SXTAB16; ops : 3; @@ -2156,6 +3269,20 @@ code : #22#6#128#7; flags : if_arm32 or if_armv6 ), + ( + opcode : A_SXTAH; + ops : 3; + optypes : (ot_reg32,ot_reg32,ot_reg32,ot_none,ot_none,ot_none); + code : #134#250#0#240#128; + flags : if_thumb32 or if_armv6t2 + ), + ( + opcode : A_SXTAH; + ops : 4; + optypes : (ot_reg32,ot_reg32,ot_reg32,ot_shifterop,ot_none,ot_none); + code : #134#250#0#240#128; + flags : if_thumb32 or if_armv6t2 + ), ( opcode : A_SXTAH; ops : 3; @@ -2170,6 +3297,13 @@ code : #22#6#176#7; flags : if_arm32 or if_armv6 ), + ( + opcode : A_UBFX; + ops : 4; + optypes : (ot_reg32,ot_reg32,ot_immediateshifter,ot_immediateshifter,ot_none,ot_none); + code : #132#243#192#0#0; + flags : if_thumb32 or if_armv6t2 + ), ( opcode : A_UBFX; ops : 4; @@ -2177,6 +3311,20 @@ code : #45#7#224#0#80; flags : if_arm32 or if_armv4 ), + ( + opcode : A_UXTAB; + ops : 3; + optypes : (ot_reg32,ot_reg32,ot_reg32,ot_none,ot_none,ot_none); + code : #134#250#80#240#128; + flags : if_thumb32 or if_armv6t2 + ), + ( + opcode : A_UXTAB; + ops : 4; + optypes : (ot_reg32,ot_reg32,ot_reg32,ot_shifterop,ot_none,ot_none); + code : #134#250#80#240#128; + flags : if_thumb32 or if_armv6t2 + ), ( opcode : A_UXTAB; ops : 3; @@ -2191,6 +3339,34 @@ code : #22#6#224#7; flags : if_arm32 or if_armv6 ), + ( + opcode : A_UXTAB16; + ops : 3; + optypes : (ot_reg32,ot_reg32,ot_reg32,ot_none,ot_none,ot_none); + code : #134#250#48#240#128; + flags : if_thumb32 or if_armv6t2 + ), + ( + opcode : A_UXTAB16; + ops : 4; + optypes : (ot_reg32,ot_reg32,ot_reg32,ot_shifterop,ot_none,ot_none); + code : #134#250#48#240#128; + flags : if_thumb32 or if_armv6t2 + ), + ( + opcode : A_UXTAB16; + ops : 3; + optypes : (ot_reg32,ot_reg32,ot_reg32,ot_none,ot_none,ot_none); + code : #134#250#64#240#128; + flags : if_thumb32 or if_armv6t2 + ), + ( + opcode : A_UXTAB16; + ops : 4; + optypes : (ot_reg32,ot_reg32,ot_reg32,ot_shifterop,ot_none,ot_none); + code : #134#250#64#240#128; + flags : if_thumb32 or if_armv6t2 + ), ( opcode : A_UXTAB16; ops : 3; @@ -2205,6 +3381,20 @@ code : #22#6#192#7; flags : if_arm32 or if_armv6 ), + ( + opcode : A_UXTAH; + ops : 3; + optypes : (ot_reg32,ot_reg32,ot_reg32,ot_none,ot_none,ot_none); + code : #134#250#16#240#128; + flags : if_thumb32 or if_armv6t2 + ), + ( + opcode : A_UXTAH; + ops : 4; + optypes : (ot_reg32,ot_reg32,ot_reg32,ot_shifterop,ot_none,ot_none); + code : #134#250#16#240#128; + flags : if_thumb32 or if_armv6t2 + ), ( opcode : A_UXTAH; ops : 3; @@ -2226,6 +3416,20 @@ code : #97#178#64; flags : if_thumb or if_armv6 ), + ( + opcode : A_SXTB; + ops : 2; + optypes : (ot_reg32,ot_reg32,ot_none,ot_none,ot_none,ot_none); + code : #134#250#79#240#128; + flags : if_thumb32 or if_wide or if_armv6t2 + ), + ( + opcode : A_SXTB; + ops : 3; + optypes : (ot_reg32,ot_reg32,ot_shifterop,ot_none,ot_none,ot_none); + code : #134#250#79#240#128; + flags : if_thumb32 or if_wide or if_armv6t2 + ), ( opcode : A_SXTB; ops : 2; @@ -2240,6 +3444,20 @@ code : #27#6#175#7; flags : if_arm32 or if_armv6 ), + ( + opcode : A_SXTB16; + ops : 2; + optypes : (ot_reg32,ot_reg32,ot_none,ot_none,ot_none,ot_none); + code : #134#250#47#240#128; + flags : if_thumb32 or if_armv6t2 + ), + ( + opcode : A_SXTB16; + ops : 3; + optypes : (ot_reg32,ot_reg32,ot_shifterop,ot_none,ot_none,ot_none); + code : #134#250#47#240#128; + flags : if_thumb32 or if_armv6t2 + ), ( opcode : A_SXTB16; ops : 2; @@ -2261,6 +3479,20 @@ code : #97#178#0; flags : if_thumb or if_armv6 ), + ( + opcode : A_SXTH; + ops : 2; + optypes : (ot_reg32,ot_reg32,ot_none,ot_none,ot_none,ot_none); + code : #134#250#15#240#128; + flags : if_thumb32 or if_wide or if_armv6t2 + ), + ( + opcode : A_SXTH; + ops : 3; + optypes : (ot_reg32,ot_reg32,ot_shifterop,ot_none,ot_none,ot_none); + code : #134#250#15#240#128; + flags : if_thumb32 or if_wide or if_armv6t2 + ), ( opcode : A_SXTH; ops : 2; @@ -2282,6 +3514,20 @@ code : #97#178#192; flags : if_thumb or if_armv6 ), + ( + opcode : A_UXTB; + ops : 2; + optypes : (ot_reg32,ot_reg32,ot_none,ot_none,ot_none,ot_none); + code : #134#250#95#240#128; + flags : if_thumb32 or if_wide or if_armv6t2 + ), + ( + opcode : A_UXTB; + ops : 3; + optypes : (ot_reg32,ot_reg32,ot_shifterop,ot_none,ot_none,ot_none); + code : #134#250#95#240#128; + flags : if_thumb32 or if_wide or if_armv6t2 + ), ( opcode : A_UXTB; ops : 2; @@ -2296,6 +3542,20 @@ code : #27#6#239#7; flags : if_arm32 or if_armv6 ), + ( + opcode : A_UXTB16; + ops : 2; + optypes : (ot_reg32,ot_reg32,ot_none,ot_none,ot_none,ot_none); + code : #134#250#63#240#128; + flags : if_thumb32 or if_armv6t2 + ), + ( + opcode : A_UXTB16; + ops : 3; + optypes : (ot_reg32,ot_reg32,ot_shifterop,ot_none,ot_none,ot_none); + code : #134#250#63#240#128; + flags : if_thumb32 or if_armv6t2 + ), ( opcode : A_UXTB16; ops : 2; @@ -2317,6 +3577,20 @@ code : #97#178#128; flags : if_thumb or if_armv6 ), + ( + opcode : A_UXTH; + ops : 2; + optypes : (ot_reg32,ot_reg32,ot_none,ot_none,ot_none,ot_none); + code : #134#250#31#240#128; + flags : if_thumb32 or if_wide or if_armv6t2 + ), + ( + opcode : A_UXTH; + ops : 3; + optypes : (ot_reg32,ot_reg32,ot_shifterop,ot_none,ot_none,ot_none); + code : #134#250#31#240#128; + flags : if_thumb32 or if_wide or if_armv6t2 + ), ( opcode : A_UXTH; ops : 2; @@ -2331,6 +3605,13 @@ code : #27#6#255#7; flags : if_arm32 or if_armv6 ), + ( + opcode : A_UADD16; + ops : 3; + optypes : (ot_reg32,ot_reg32,ot_reg32,ot_none,ot_none,ot_none); + code : #128#250#144#240#64; + flags : if_thumb32 or if_armv6t2 + ), ( opcode : A_UADD16; ops : 3; @@ -2338,6 +3619,13 @@ code : #22#6#80#241; flags : if_arm32 or if_armv6 ), + ( + opcode : A_UADD8; + ops : 3; + optypes : (ot_reg32,ot_reg32,ot_reg32,ot_none,ot_none,ot_none); + code : #128#250#128#240#64; + flags : if_thumb32 or if_armv6t2 + ), ( opcode : A_UADD8; ops : 3; @@ -2345,6 +3633,13 @@ code : #22#6#80#249; flags : if_arm32 or if_armv6 ), + ( + opcode : A_UASX; + ops : 3; + optypes : (ot_reg32,ot_reg32,ot_reg32,ot_none,ot_none,ot_none); + code : #128#250#160#240#64; + flags : if_thumb32 or if_armv6t2 + ), ( opcode : A_UASX; ops : 3; @@ -2352,6 +3647,13 @@ code : #22#6#80#243; flags : if_arm32 or if_armv6 ), + ( + opcode : A_UHADD16; + ops : 3; + optypes : (ot_reg32,ot_reg32,ot_reg32,ot_none,ot_none,ot_none); + code : #128#250#144#240#96; + flags : if_thumb32 or if_armv6t2 + ), ( opcode : A_UHADD16; ops : 3; @@ -2359,6 +3661,13 @@ code : #22#6#112#241; flags : if_arm32 or if_armv6 ), + ( + opcode : A_UHADD8; + ops : 3; + optypes : (ot_reg32,ot_reg32,ot_reg32,ot_none,ot_none,ot_none); + code : #128#250#128#240#96; + flags : if_thumb32 or if_armv6t2 + ), ( opcode : A_UHADD8; ops : 3; @@ -2366,6 +3675,13 @@ code : #22#6#112#249; flags : if_arm32 or if_armv6 ), + ( + opcode : A_UHASX; + ops : 3; + optypes : (ot_reg32,ot_reg32,ot_reg32,ot_none,ot_none,ot_none); + code : #128#250#160#240#96; + flags : if_thumb32 or if_armv6t2 + ), ( opcode : A_UHASX; ops : 3; @@ -2373,6 +3689,13 @@ code : #22#6#112#243; flags : if_arm32 or if_armv6 ), + ( + opcode : A_UHSAX; + ops : 3; + optypes : (ot_reg32,ot_reg32,ot_reg32,ot_none,ot_none,ot_none); + code : #128#250#224#240#96; + flags : if_thumb32 or if_armv6t2 + ), ( opcode : A_UHSAX; ops : 3; @@ -2380,6 +3703,13 @@ code : #22#6#112#245; flags : if_arm32 or if_armv6 ), + ( + opcode : A_UHSUB16; + ops : 3; + optypes : (ot_reg32,ot_reg32,ot_reg32,ot_none,ot_none,ot_none); + code : #128#250#208#240#96; + flags : if_thumb32 or if_armv6t2 + ), ( opcode : A_UHSUB16; ops : 3; @@ -2387,6 +3717,13 @@ code : #22#6#112#247; flags : if_arm32 or if_armv6 ), + ( + opcode : A_UHSUB8; + ops : 3; + optypes : (ot_reg32,ot_reg32,ot_reg32,ot_none,ot_none,ot_none); + code : #128#250#192#240#96; + flags : if_thumb32 or if_armv6t2 + ), ( opcode : A_UHSUB8; ops : 3; @@ -2394,6 +3731,13 @@ code : #22#6#112#255; flags : if_arm32 or if_armv6 ), + ( + opcode : A_UQADD16; + ops : 3; + optypes : (ot_reg32,ot_reg32,ot_reg32,ot_none,ot_none,ot_none); + code : #128#250#144#240#80; + flags : if_thumb32 or if_armv6t2 + ), ( opcode : A_UQADD16; ops : 3; @@ -2401,6 +3745,13 @@ code : #22#6#96#241; flags : if_arm32 or if_armv6 ), + ( + opcode : A_UQADD8; + ops : 3; + optypes : (ot_reg32,ot_reg32,ot_reg32,ot_none,ot_none,ot_none); + code : #128#250#128#240#80; + flags : if_thumb32 or if_armv6t2 + ), ( opcode : A_UQADD8; ops : 3; @@ -2408,6 +3759,13 @@ code : #22#6#96#249; flags : if_arm32 or if_armv6 ), + ( + opcode : A_UQASX; + ops : 3; + optypes : (ot_reg32,ot_reg32,ot_reg32,ot_none,ot_none,ot_none); + code : #128#250#160#240#80; + flags : if_thumb32 or if_armv6t2 + ), ( opcode : A_UQASX; ops : 3; @@ -2415,6 +3773,13 @@ code : #22#6#96#243; flags : if_arm32 or if_armv6 ), + ( + opcode : A_UQSAX; + ops : 3; + optypes : (ot_reg32,ot_reg32,ot_reg32,ot_none,ot_none,ot_none); + code : #128#250#224#240#80; + flags : if_thumb32 or if_armv6t2 + ), ( opcode : A_UQSAX; ops : 3; @@ -2422,6 +3787,13 @@ code : #22#6#96#245; flags : if_arm32 or if_armv6 ), + ( + opcode : A_UQSUB16; + ops : 3; + optypes : (ot_reg32,ot_reg32,ot_reg32,ot_none,ot_none,ot_none); + code : #128#250#208#240#80; + flags : if_thumb32 or if_armv6t2 + ), ( opcode : A_UQSUB16; ops : 3; @@ -2429,6 +3801,13 @@ code : #22#6#96#247; flags : if_arm32 or if_armv6 ), + ( + opcode : A_UQSUB8; + ops : 3; + optypes : (ot_reg32,ot_reg32,ot_reg32,ot_none,ot_none,ot_none); + code : #128#250#192#240#80; + flags : if_thumb32 or if_armv6t2 + ), ( opcode : A_UQSUB8; ops : 3; @@ -2436,6 +3815,13 @@ code : #22#6#96#255; flags : if_arm32 or if_armv6 ), + ( + opcode : A_USAD8; + ops : 3; + optypes : (ot_reg32,ot_reg32,ot_reg32,ot_none,ot_none,ot_none); + code : #128#251#112#240#0; + flags : if_thumb32 or if_armv6t2 + ), ( opcode : A_USAD8; ops : 3; @@ -2443,6 +3829,13 @@ code : #21#7#128#1#15; flags : if_arm32 or if_armv6 ), + ( + opcode : A_USADA8; + ops : 4; + optypes : (ot_reg32,ot_reg32,ot_reg32,ot_reg32,ot_none,ot_none); + code : #128#251#112#0#0; + flags : if_thumb32 or if_armv6t2 + ), ( opcode : A_USADA8; ops : 4; @@ -2450,6 +3843,20 @@ code : #21#7#128#1; flags : if_arm32 or if_armv6 ), + ( + opcode : A_USAT; + ops : 3; + optypes : (ot_reg32,ot_immediateshifter,ot_reg32,ot_none,ot_none,ot_none); + code : #131#243#128#0#0; + flags : if_thumb32 or if_armv6t2 + ), + ( + opcode : A_USAT; + ops : 4; + optypes : (ot_reg32,ot_immediateshifter,ot_reg32,ot_shifterop,ot_none,ot_none); + code : #131#243#128#0#0; + flags : if_thumb32 or if_armv6t2 + ), ( opcode : A_USAT; ops : 3; @@ -2464,6 +3871,13 @@ code : #42#6#224#0#16; flags : if_arm32 or if_armv6 ), + ( + opcode : A_USAT16; + ops : 3; + optypes : (ot_reg32,ot_immediateshifter,ot_reg32,ot_none,ot_none,ot_none); + code : #131#243#160#0#0; + flags : if_thumb32 or if_armv6t2 + ), ( opcode : A_USAT16; ops : 3; @@ -2471,6 +3885,13 @@ code : #42#6#224#15#48; flags : if_arm32 or if_armv6 ), + ( + opcode : A_USAX; + ops : 3; + optypes : (ot_reg32,ot_reg32,ot_reg32,ot_none,ot_none,ot_none); + code : #128#250#224#240#64; + flags : if_thumb32 or if_armv6t2 + ), ( opcode : A_USAX; ops : 3; @@ -2478,6 +3899,13 @@ code : #22#6#80#245; flags : if_arm32 or if_armv6 ), + ( + opcode : A_USUB16; + ops : 3; + optypes : (ot_reg32,ot_reg32,ot_reg32,ot_none,ot_none,ot_none); + code : #128#250#208#240#64; + flags : if_thumb32 or if_armv6t2 + ), ( opcode : A_USUB16; ops : 3; @@ -2485,6 +3913,13 @@ code : #22#6#80#247; flags : if_arm32 or if_armv6 ), + ( + opcode : A_USUB8; + ops : 3; + optypes : (ot_reg32,ot_reg32,ot_reg32,ot_none,ot_none,ot_none); + code : #128#250#192#240#64; + flags : if_thumb32 or if_armv6t2 + ), ( opcode : A_USUB8; ops : 3; @@ -2562,6 +3997,34 @@ code : #38#128; flags : if_arm32 or if_armv4 ), + ( + opcode : A_SDIV; + ops : 3; + optypes : (ot_reg32,ot_reg32,ot_reg32,ot_none,ot_none,ot_none); + code : #128#251#144#240#240; + flags : if_thumb32 or if_armv7r or if_armv7m + ), + ( + opcode : A_UDIV; + ops : 3; + optypes : (ot_reg32,ot_reg32,ot_reg32,ot_none,ot_none,ot_none); + code : #128#251#176#240#240; + flags : if_thumb32 or if_armv7r or if_armv7m + ), + ( + opcode : A_MOVT; + ops : 2; + optypes : (ot_reg32,ot_immediate,ot_none,ot_none,ot_none,ot_none); + code : #129#242#192#0#0; + flags : if_thumb32 or if_armv6t2 + ), + ( + opcode : A_MOVT; + ops : 2; + optypes : (ot_reg32,ot_immediateshifter,ot_none,ot_none,ot_none,ot_none); + code : #129#242#192#0#0; + flags : if_thumb32 or if_armv6t2 + ), ( opcode : A_MOVT; ops : 2; @@ -2684,7 +4147,7 @@ ( opcode : A_MOVW; ops : 2; - optypes : (ot_reg32,ot_immediate,ot_none,ot_none,ot_none,ot_none); + optypes : (ot_reg32,ot_immediate or ot_bits32,ot_none,ot_none,ot_none,ot_none); code : #44#3#0; flags : if_arm32 or if_armv6t2 ), @@ -2695,6 +4158,20 @@ code : #44#3#0; flags : if_arm32 or if_armv6t2 ), + ( + opcode : A_MOVW; + ops : 2; + optypes : (ot_reg32,ot_immediate or ot_bits32,ot_none,ot_none,ot_none,ot_none); + code : #129#242#64#0#0; + flags : if_thumb32 or if_armv6t2 + ), + ( + opcode : A_MOVW; + ops : 2; + optypes : (ot_reg32,ot_immediateshifter,ot_none,ot_none,ot_none,ot_none); + code : #129#242#64#0#0; + flags : if_thumb32 or if_armv6t2 + ), ( opcode : A_CBZ; ops : 2; @@ -2877,6 +4354,13 @@ code : #66#14#48#10#64; flags : if_arm32 or if_vfpv2 ), + ( + opcode : A_DMB; + ops : 1; + optypes : (ot_immediateshifter,ot_none,ot_none,ot_none,ot_none,ot_none); + code : #128#243#191#143#80; + flags : if_thumb32 or if_armv7 + ), ( opcode : A_DMB; ops : 1; @@ -2884,6 +4368,13 @@ code : #46#245#127#240#80; flags : if_arm32 or if_armv7 ), + ( + opcode : A_ISB; + ops : 1; + optypes : (ot_immediateshifter,ot_none,ot_none,ot_none,ot_none,ot_none); + code : #128#243#191#143#96; + flags : if_thumb32 or if_armv7 + ), ( opcode : A_ISB; ops : 1; @@ -2891,6 +4382,13 @@ code : #46#245#127#240#96; flags : if_arm32 or if_armv7 ), + ( + opcode : A_DSB; + ops : 1; + optypes : (ot_immediateshifter,ot_none,ot_none,ot_none,ot_none,ot_none); + code : #128#243#191#143#64; + flags : if_thumb32 or if_armv7 + ), ( opcode : A_DSB; ops : 1; @@ -2926,6 +4424,13 @@ code : #2#15; flags : if_arm32 or if_armv4 ), + ( + opcode : A_BXJ; + ops : 1; + optypes : (ot_reg32,ot_none,ot_none,ot_none,ot_none,ot_none); + code : #128#243#192#143#0; + flags : if_thumb32 or if_armv6t2 + ), ( opcode : A_BXJ; ops : 1; diff --git a/compiler/arm/cpubase.pas b/compiler/arm/cpubase.pas index e9e16b5a9e..42baec5360 100644 --- a/compiler/arm/cpubase.pas +++ b/compiler/arm/cpubase.pas @@ -606,10 +606,20 @@ unit cpubase; ) then result:=true {Can an 8-bit value be shifted accordingly?} - else if is_shifter_const(d,imm) then - result:=true else - result:=false; + begin + result:=false; + for i:=1 to 31 do + begin + t:=RolDWord(imm,i); + if ((t and $FF)=t) and + ((t and $80)=$80) then + begin + result:=true; + exit; + end; + end; + end; end; function is_continuous_mask(d : aint;var lsb, width: byte) : boolean; diff --git a/compiler/arm/cpuelf.pas b/compiler/arm/cpuelf.pas index 3909850603..3226885b4c 100644 --- a/compiler/arm/cpuelf.pas +++ b/compiler/arm/cpuelf.pas @@ -329,6 +329,8 @@ implementation result:=R_ARM_JUMP24; RELOC_RELATIVE_24_THUMB: result:=R_ARM_CALL; + RELOC_RELATIVE_CALL_THUMB: + result:=R_ARM_THM_CALL; else result:=0; writeln(objrel.typ); diff --git a/compiler/ogbase.pas b/compiler/ogbase.pas index f83a3b54ac..914e878fbf 100644 --- a/compiler/ogbase.pas +++ b/compiler/ogbase.pas @@ -69,6 +69,7 @@ interface {$ifdef arm} RELOC_RELATIVE_24, RELOC_RELATIVE_24_THUMB, + RELOC_RELATIVE_CALL_THUMB, {$endif arm} { Relative relocation } RELOC_RELATIVE,