| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282 |
- //-------------------------------------------------------------------------------------------------------
- // Copyright (C) Microsoft. All rights reserved.
- // Licensed under the MIT license. See LICENSE.txt file in the project root for full license information.
- //-------------------------------------------------------------------------------------------------------
- #pragma once
- //
- // Contains constants and tables used by the encoder.
- //
- #include "AssemblyStep.h"
- // THUMB2 specific decl
- typedef unsigned int ENCODE_32;
- // THUMB1 specific decl.
- typedef unsigned short ENCODE_16;
- typedef unsigned char ENCODE_8;
- #define MaxCondBranchOffset ((1 << 20) - 2)
- #define RETURN_REG RegR0
- #define FIRST_INT_ARG_REG RegR0
- #define LAST_INT_ARG_REG RegR3
- #define NUM_INT_ARG_REGS\
- ((LAST_INT_ARG_REG - FIRST_INT_ARG_REG) + 1)
- #define FIRST_CALLEE_SAVED_GP_REG RegR4
- #define LAST_CALLEE_SAVED_GP_REG RegR10
- #define SCRATCH_REG RegR12
- #define ALT_LOCALS_PTR RegR7
- #define EH_STACK_SAVE_REG RegR6
- #define SP_ALLOC_SCRATCH_REG RegR4
- #define CATCH_OBJ_REG RegR1
- #define RETURN_DBL_REG RegD0
- #define FIRST_CALLEE_SAVED_DBL_REG RegD8
- #define LAST_CALLEE_SAVED_DBL_REG RegD15
- #define FIRST_CALLEE_SAVED_DBL_REG_NUM 8
- #define LAST_CALLEE_SAVED_DBL_REG_NUM 15
- #define CALLEE_SAVED_DOUBLE_REG_COUNT 8
- // See comment in LowerEntryInstr: even in a global function, we'll home r0 and r1
- #define MIN_HOMED_PARAM_REGS 2
- // THUMB Specific
- #define MAX_INT_REGISTERS_LOW 8
- #define LOW_INT_REGISTERS_MASK 0x7
- #define FRAME_REG RegR11
- #define DMOVE 0x0001
- #define DLOAD 0x0002
- #define DSTORE 0x0003
- #define DMASK 0x0007
- #define DHALFORSB 0x0020 // halfword or signed byte
- #define DCONDEXE 0x0040 // safe for conditional execution
- #define DSUPDATE 0x0100
- #define DSSUB 0x0200
- #define DSPOST 0x0400
- #define DSBIT 0x0800
- #define DQBR 0x1000 // Qualcomm buggy branch instructions see macro SOFTWARE_FIXFOR_HARDWARE_BUGWIN8_502326
- #define D____ (0)
- #define D___C (DCONDEXE)
- #define DQ__C (DQBR | DCONDEXE)
- #define D__SC (DSBIT)
- #define DM___ (DMOVE)
- #define DM__C (DMOVE | DCONDEXE)
- #define DL___ (DLOAD)
- #define DL__C (DLOAD | DCONDEXE)
- #define DLH__ (DLOAD | DHALFORSB)
- #define DLH_C (DLOAD | DHALFORSB | DCONDEXE)
- #define DS___ (DSTORE)
- #define DS__C (DSTORE | DCONDEXE)
- #define DSH__ (DSTORE | DHALFORSB)
- #define DSH_C (DSTORE | DHALFORSB | DCONDEXE)
- #define DLUP_C (DLOAD | DSUPDATE | DSPOST)
- #define DLUPQC (DLOAD | DSUPDATE | DSPOST | DQBR)
- #define DSUS_C (DSTORE | DSUPDATE | DSSUB)
- #define ISMOVE(o) ((EncoderMD::GetOpdope(o) & DMASK) == DMOVE)
- #define ISLOAD(o) ((EncoderMD::GetOpdope(o) & DMASK) == DLOAD)
- #define ISSTORE(o) ((EncoderMD::GetOpdope(o) & DMASK) == DSTORE)
- #define ISSHIFTERUPDATE(o) ((EncoderMD::GetOpdope(o) & DSUPDATE) != 0)
- #define ISSHIFTERSUB(o) ((EncoderMD::GetOpdope(o) & DSSUB) != 0)
- #define ISSHIFTERPOST(o) ((EncoderMD::GetOpdope(o) & DSPOST) != 0)
- #define SETS_SBIT(o) ((EncoderMD::GetOpdope(o) & DSBIT) != 0)
- #define ISQBUGGYBR(o) ((EncoderMD::GetOpdope(o) & DQBR) != 0)
- static const uint32 Opdope[] =
- {
- #define MACRO(name, jnLayout, attrib, byte2, form, opbyte, dope, ...) dope,
- #include "MdOpcodes.h"
- #undef MACRO
- };
- static const BYTE RegEncode[] =
- {
- #define REGDAT(Name, Listing, Encoding, ...) Encoding,
- #include "RegList.h"
- #undef REGDAT
- };
- #define REGBIT(reg) (1 << RegEncode[reg])
- #define TESTREGBIT(mask, reg) (((mask) & REGBIT(reg)) != 0)
- #define SETREGBIT(mask, reg) ((mask) |= REGBIT(reg))
- #define CLEARREGBIT(mask, reg) ((mask) &= ~REGBIT(reg))
- #define ZEROREGMASK(mask) ((mask) = 0)
- #define REGMASKEMPTY(mask) ((mask) == 0)
- #define CO_UIMMED8(intConst) ((intConst) & 0xff) // 8 bit unsigned immediate
- // Used by GenerateInstrs
- #define CASE_OPCODES_ALWAYS_THUMB2 \
- case Js::OpCode::ADDW: \
- case Js::OpCode::LDRRET: \
- case Js::OpCode::MLS: \
- case Js::OpCode::MOVT: \
- case Js::OpCode::MOVW: \
- case Js::OpCode::MOV_W: \
- case Js::OpCode::NOP_W: \
- case Js::OpCode::SDIV: \
- case Js::OpCode::SUBW: \
- case Js::OpCode::TIOFLW: \
- case Js::OpCode::CLRSIGN: \
- case Js::OpCode::SBCMPLNT: \
- case Js::OpCode::PLD: \
- case Js::OpCode::CLZ:
- #define CASE_OPCODES_NEVER_THUMB2 \
- case Js::OpCode::DEBUGBREAK: \
- case Js::OpCode::NOP: \
- case Js::OpCode::BLX: \
- case Js::OpCode::BX: \
- case Js::OpCode::RET:
- #define IS_LOWREG(RegNum) (RegNum < RegR8)
- #define IS_CONST_00000007(x) (((x) & ~0x00000007) == 0)
- #define IS_CONST_0000001F(x) (((x) & ~0x0000001f) == 0)
- #define IS_CONST_0000007F(x) (((x) & ~0x0000007f) == 0)
- #define IS_CONST_000000FF(x) (((x) & ~0x000000ff) == 0)
- #define IS_CONST_000003FF(x) (((x) & ~0x000003ff) == 0)
- #define IS_CONST_00000FFF(x) (((x) & ~0x00000fff) == 0)
- #define IS_CONST_0000FFFF(x) (((x) & ~0x0000ffff) == 0)
- #define IS_CONST_000FFFFF(x) (((x) & ~0x000fffff) == 0)
- #define IS_CONST_007FFFFF(x) (((x) & ~0x007fffff) == 0)
- #define IS_CONST_NEG_8(x) (((x) & ~0x0000007f) == ~0x0000007f)
- #define IS_CONST_NEG_12(x) (((x) & ~0x000007ff) == ~0x000007ff)
- #define IS_CONST_NEG_21(x) (((x) & ~0x000fffff) == ~0x000fffff)
- #define IS_CONST_NEG_24(x) (((x) & ~0x007fffff) == ~0x007fffff)
- #define IS_CONST_INT8(x) (IS_CONST_0000007F(x) || IS_CONST_NEG_8(x))
- #define IS_CONST_INT12(x) (IS_CONST_00000FFF(x) || IS_CONST_NEG_12(x))
- #define IS_CONST_INT21(x) (IS_CONST_000FFFFF(x) || IS_CONST_NEG_21(x))
- #define IS_CONST_INT24(x) (IS_CONST_007FFFFF(x) || IS_CONST_NEG_24(x))
- #define IS_CONST_UINT3(x) IS_CONST_00000007(x)
- #define IS_CONST_UINT5(x) IS_CONST_0000001F(x)
- #define IS_CONST_UINT7(x) IS_CONST_0000007F(x)
- #define IS_CONST_UINT8(x) IS_CONST_000000FF(x)
- #define IS_CONST_UINT10(x) IS_CONST_000003FF(x)
- #define IS_CONST_UINT12(x) IS_CONST_00000FFF(x)
- #define IS_CONST_UINT16(x) IS_CONST_0000FFFF(x)
- typedef struct _FormTable
- {
- int form;
- ENCODE_32 inst;
- const AssemblyStep * steps;
- } FormTable;
- #define FDST(_form) (FORM_ ## _form)
- #define FSET(_form, _bits) (FORM_ ## _form << _bits)
- #define FSRC(_form,_opnum) (FORM_ ## _form << ((_opnum) * FORM_BITS_PER_OPN))
- #define FDST2(_form,_opnum) (FORM_ ## _form << ((_opnum) * FORM_BITS_PER_OPN))
- #define FTHUMB2 (FORM_ ## THUMB2 << 28)
- #define FTHUMB (FORM_ ## THUMB << 28)
- #define THUMB2_THUMB1_FORM(FTP,IFORM) \
- ( (FTP) == (((IFORM) & 0x0FFFFFFF) | FTHUMB))
- // NOTE if we end up with a form with more than six operands the IFORM
- // encoding needs to be reworked. (runs out of bits)
- typedef enum tagIFORM
- {
- IFORM_A = 1, // This is used in mdtupdat.h, and must be IFORM type
- // CONSIDER: we seem to have some collisions here
- // (is there a way to cleanup this? we'd need more than 16 values)
- FORM_REG = 1,
- FORM_SREG = 2, // VFP single precision register
- FORM_DREG = 3, // VFP double precision register
- FORM_XREG = 7,
- FORM_WREG = 8, // maps to "wR"
- FORM_WCREG = 9, // maps to "wC"
- FORM_CONST = 4,
- FORM_INDIR = 5,
- FORM_LABEL = 6,
- FORM_CODE = 7,
- FORM_PC = 6,
- FORM_SP = 7,
- FORM_CC = 10,
- FORM_HREG = 2,
- FORM_ACC = 3,
- FORM_SR = 5,
- FORM_NREG = 11, // NEON 64bit register
- FORM_QREG = 12, // NEON 128bit register
- FORM_THUMB = 2,
- FORM_THUMB2 = 8,
- FORM_ARM = 4,
- FORM_BITS_PER_OPN = 4,
- FORM__________ = 0,
- FORM_2________ = FTHUMB2,
- FORM_T________ = FTHUMB,
- FORM_Trrc_____ = FTHUMB | FDST(REG) | FSRC(REG,1) | FSRC(CONST,2),
- FORM_Trc______ = FTHUMB | FDST(REG) | FSRC(CONST, 1),
- FORM_TrcC_____ = FTHUMB | FDST(REG) | FSRC(CONST, 1) | FSRC(CC,2),
- FORM_Trrr_____ = FTHUMB | FDST(REG) | FSRC(REG,1) | FSRC(REG,2),
- FORM_Trr______ = FTHUMB | FDST(REG) | FSRC(REG,1),
- FORM_TrC_____ = FTHUMB | FDST(REG) | FSRC(CC,1),
- FORM_TrrC_____ = FTHUMB | FDST(REG) | FSRC(REG,1) | FSRC(CC,2),
- FORM_Tr_______ = FTHUMB | FDST(REG),
- FORM_T_r______ = FTHUMB | FSRC(REG,1),
- FORM_T_rc_____ = FTHUMB | FSRC(REG,1) | FSRC(CONST, 2),
- FORM_T_rr_____ = FTHUMB | FSRC(REG,1) | FSRC(REG,2),
- FORM_Thr______ = FTHUMB | FSET(REG,28) | FSRC(REG,1),
- FORM_Th_r_____ = FTHUMB | FSET(REG,28) | FDST(REG),
- FORM_Th_rr____ = FTHUMB | FSET(REG,28) | FSRC(REG,1) | FSRC(REG,2),
- FORM_T_spr____ = FTHUMB | FSRC(SP,1) | FSRC(REG,2),
- FORM_Th_spr___ = FTHUMB | FSET(REG,28) | FSRC(SP,1) | FSRC(REG,2),
- // Thumb2
- FORM_2rrrcc___ = FTHUMB2 | FDST(REG) | FSRC(REG,1) | FSRC(REG,2) | FSRC(CONST,3) | FSRC(CONST,4),
- FORM_2rrrccC__ = FTHUMB2 | FDST(REG) | FSRC(REG,1) | FSRC(REG,2) | FSRC(CONST,3) | FSRC(CONST,4) | FSRC(CC,5),
- FORM_2rrc_____ = FTHUMB2 | FDST(REG) | FSRC(REG, 1) | FSRC(CONST, 2),
- FORM_2rrr_____ = FTHUMB2 | FDST(REG) | FSRC(REG,1) | FSRC(REG,2),
- FORM_2rrrc____ = FTHUMB2 | FDST(REG) | FSRC(REG,1) | FSRC(REG,2) | FSRC(CONST, 3),
- FORM_2rc______ = FTHUMB2 | FDST(REG) | FSRC(CONST, 1),
- FORM_2rcc_____ = FTHUMB2 | FDST(REG) | FSRC(CONST, 1) | FSRC(CONST, 2),
- FORM_2rrcc____ = FTHUMB2 | FDST(REG) | FSRC(REG,1) | FSRC(CONST, 2) | FSRC(CONST, 3),
- FORM_2rrcC____ = FTHUMB2 | FDST(REG) | FSRC(REG,1) | FSRC(CONST, 2) | FSRC(CC, 3),
- FORM_2rr______ = FTHUMB2 | FDST(REG) | FSRC(REG,1),
- FORM_2ipcc____ = FTHUMB2 | FDST(INDIR) | FSRC(PC,1) | FSRC(CONST,2),
- FORM_2ispc____ = FTHUMB2 | FDST(INDIR) | FSRC(SP,1) | FSRC(CONST,2),
- FORM_2risp____ = FTHUMB2 | FDST(REG) | FSRC(INDIR,1) | FSRC(SP,2),
- FORM_2rrC_____ = FTHUMB2 | FDST(REG) | FSRC(REG,1) | FSRC(CC,2),
- FORM_ThrC_____ = FTHUMB | FSET(REG,28) | FDST(REG) | FSRC(CC,1),
- FORM_ThrrC____ = FTHUMB | FSET(REG,28) | FDST(REG) | FSRC(REG,1) | FSRC(CC,2),
- FORM_TrhrC____ = FTHUMB | FDST(REG) | FSET(REG,28) |FSRC(REG,1) | FSRC(CC,2),
- FORM_ThrhrC___ = FTHUMB | FDST(REG) | FSET(REG,28) |FSRC(REG,1) | FSRC(CC,2),
- FORM_Tspsp____ = FTHUMB | FDST(SP) | FSRC(SP,1),
- FORM_2irr_____ = FTHUMB2 | FDST(INDIR) | FSRC(REG,1) | FSRC(REG,2),
- FORM_2ircrr___ = FTHUMB2 | FDST(INDIR) | FSRC(REG,1) | FSRC(CONST,2) | FSRC(REG,3) | FSRC(REG,4),
- FORM_2ispcrr__ = FTHUMB2 | FDST(INDIR) | FSRC(SP,1) | FSRC(CONST,2) | FSRC(REG,3) | FSRC(REG,4),
- // MOVW with relocation
- FORM_2rlsp____ = FTHUMB2 | FDST(REG) | FSRC(LABEL,1) | FSRC(SP,2),
- FORM_2re______ = FTHUMB2 | FDST(REG) | FSRC(CODE,1),
- FORM_2rl______ = FTHUMB2 | FDST(REG) | FSRC(LABEL,1),
- // MOVW with PAIR relocation
- FORM_2rlspc___ = FTHUMB2 | FDST(REG) | FSRC(LABEL,1) | FSRC(SP,2) | FSRC(CONST, 3),
- // MOVT with relocation
- FORM_2rlspr___ = FTHUMB2 | FDST(REG) | FSRC(LABEL,1) | FSRC(SP,2) | FSRC(REG,3),
- FORM_2rer_____ = FTHUMB2 | FDST(REG) | FSRC(CODE,1) | FSRC(REG,2),
- FORM_2rlr_____ = FTHUMB2 | FDST(REG) | FSRC(LABEL,1) | FSRC(REG,2),
- FORM_2rlsprc__ = FTHUMB2 | FDST(REG) | FSRC(LABEL,1) | FSRC(SP,2) | FSRC(REG,3) | FSRC(CONST, 4),
- //ADD
- FORM_Trpcc____ = FTHUMB | FDST(REG) | FSRC(PC,1) | FSRC(CONST,2),
- FORM_Trspc____ = FTHUMB | FDST(REG) | FSRC(SP,1) | FSRC(CONST,2),
- FORM_2rspc____ = FTHUMB2 | FDST(REG) | FSRC(SP,1) | FSRC(CONST,2),
- FORM_2sprc____ = FTHUMB2 | FDST(SP) | FSRC(REG,1) | FSRC(CONST,2),
- FORM_Tsphr____ = FTHUMB | FDST(SP) | FSET(REG, 28) | FSRC(REG,1),
- FORM_Trpc_____ = FTHUMB | FDST(REG) | FSRC(PC,1),
- //ADD, MOVH
- FORM_Trsp_____ = FTHUMB | FDST(REG) | FSRC(SP,1),
- FORM_Thrsp____ = FTHUMB | FSET(REG,28) |FDST(REG) | FSRC(SP,1),
- // ADD, SUB sp,sp,#imm
- FORM_2spspc___ = FTHUMB2 | FDST(SP) | FSRC(SP,1) | FSRC(CONST,2),
- FORM_2rrrC____ = FTHUMB2 | FDST(REG) | FSRC(REG,1) | FSRC(REG,2) | FSRC(CC,3),
- FORM_Tspspc___ = FTHUMB | FDST(SP) | FSRC(SP,1) | FSRC(CONST,2),
- FORM_Tspspr___ = FTHUMB | FDST(SP) | FSRC(SP,1) | FSRC(REG,2),
- FORM_Tspsphr__ = FTHUMB | FDST(SP) | FSET(REG, 28) | FSRC(SP,1) | FSRC(REG,2),
- FORM_Tpcpcr___ = FTHUMB | FDST(PC) | FSRC(PC,1) | FSRC(REG,2),
- //CMP
- FORM_2_r______ = FTHUMB2 | FSRC(REG,1),
- FORM_2_rr_____ = FTHUMB2 | FSRC(REG,1) |FSRC(REG,2),
- FORM_2_rc_____ = FTHUMB2 | FSRC(REG,1) |FSRC(CONST,2),
- //TBB, TBH
- FORM_2_irr____ = FTHUMB2 | FSRC(INDIR,1) | FSRC(REG,2) | FSRC(REG,3),
- FORM_2_irrc___ = FTHUMB2 | FSRC(INDIR,1) | FSRC(REG,2) | FSRC(REG,3) | FSRC(CONST,4),
- FORM_2_ipcr___ = FTHUMB2 | FSRC(INDIR,1) | FSRC(PC,2) | FSRC(REG,3),
- FORM_2_ipcrc__ = FTHUMB2 | FSRC(INDIR,1) | FSRC(PC,2) | FSRC(REG,3) | FSRC(CONST,4),
- //PLD
- FORM_2_irc____ = FTHUMB2 | FSRC(INDIR,1) | FSRC(REG,2) | FSRC(CONST,3),
- //B,BL,BCALL,BBL
- FORM_2l_______ = FTHUMB2 | FSRC(LABEL,1),
- FORM_2lC______ = FTHUMB2 | FSRC(LABEL,1) | FSRC(CC,2),
- FORM_2e_______ = FTHUMB2 | FSRC(CODE,1),
- FORM_Tl_______ = FTHUMB | FSRC(LABEL,1),
- FORM_TlC______ = FTHUMB | FSRC(LABEL,1) | FSRC(CC,2),
- FORM_Te_______ = FTHUMB | FSRC(CODE,1),
- //MULL, UMULL
- FORM_2rrrr____ = FTHUMB2 | FDST(REG) | FSRC(REG,1) | FSRC(REG,2) | FSRC(REG,3),
- //SMLAL, UMLAL
- FORM_2rrrrr___ = FTHUMB2 | FDST(REG) | FSRC(REG,1) | FSRC(REG,2) | FSRC(REG,3) | FSRC(REG,4),
- //LDRRET
- FORM_2pcispc__ = FTHUMB2 | FDST(PC) | FSRC(INDIR,1) | FSRC(SP,2) | FSRC(CONST,3),
- //LDR
- FORM_2rirc____ = FTHUMB2 | FDST(REG) | FSRC(INDIR,1) | FSRC(REG,2) | FSRC(CONST,3),
- FORM_2rispc___ = FTHUMB2 | FDST(REG) | FSRC(INDIR,1) | FSRC(SP,2) | FSRC(CONST,3),
- FORM_2ripcc___ = FTHUMB2 | FDST(REG) | FSRC(INDIR,1) | FSRC(PC,2) | FSRC(CONST,3),
- FORM_2rirr____ = FTHUMB2 | FDST(REG) | FSRC(INDIR,1) | FSRC(REG,2) | FSRC(REG,3),
- FORM_2rispr___ = FTHUMB2 | FDST(REG) | FSRC(INDIR,1) | FSRC(SP,2) | FSRC(REG,3),
- FORM_2rirrc___ = FTHUMB2 | FDST(REG) | FSRC(INDIR,1) | FSRC(REG,2) | FSRC(REG,3) | FSRC(CONST,4),
- FORM_Trirc____ = FTHUMB | FDST(REG) | FSRC(INDIR,1) | FSRC(REG,2) | FSRC(CONST,3),
- FORM_Trirr____ = FTHUMB | FDST(REG) | FSRC(INDIR,1) | FSRC(REG,2) | FSRC(REG,3),
- FORM_Tripcc___ = FTHUMB | FDST(REG) | FSRC(INDIR,1) | FSRC(PC,2) | FSRC(CONST,3),
- FORM_Trispc___ = FTHUMB | FDST(REG) | FSRC(INDIR,1) | FSRC(SP,2) | FSRC(CONST,3),
- //LDR SYM
- FORM_2ri______ = FTHUMB2 | FDST(REG) | FSRC(INDIR,1),
- FORM_2ripc____ = FTHUMB2 | FDST(REG) | FSRC(INDIR,1) | FSRC(PC,2),
- FORM_Tri______ = FTHUMB | FDST(REG) | FSRC(INDIR,1),
- FORM_Trisp____ = FTHUMB | FDST(REG) | FSRC(INDIR,1) | FSRC(SP,2),
- FORM_Tripc____ = FTHUMB | FDST(REG) | FSRC(INDIR,1) | FSRC(PC,2),
- //STR
- FORM_2ircr____ = FTHUMB2 | FDST(INDIR) | FSRC(REG,1) | FSRC(CONST,2) | FSRC(REG,3),
- FORM_2ispcr___ = FTHUMB2 | FDST(INDIR) | FSRC(SP,1) | FSRC(CONST,2) | FSRC(REG,3),
- FORM_2irrr____ = FTHUMB2 | FDST(INDIR) | FSRC(REG,1) | FSRC(REG,2) | FSRC(REG,3),
- FORM_2irrrc___ = FTHUMB2 | FDST(INDIR) | FSRC(REG,1) | FSRC(REG,2) | FSRC(REG,3) | FSRC(CONST,4),
- FORM_2isprr___ = FTHUMB2 | FDST(INDIR) | FSRC(SP,1) | FSRC(REG,2) | FSRC(REG,3),
- FORM_2ispr____ = FTHUMB2 | FDST(INDIR) | FSRC(SP,1) | FSRC(REG,2),
- FORM_2ir______ = FTHUMB2 | FDST(INDIR) | FSRC(REG,1),
- FORM_2irsp____ = FTHUMB2 | FDST(INDIR) | FSRC(REG,1) | FSRC(SP,2),
- FORM_Tircr____ = FTHUMB | FSRC(INDIR,0) | FSRC(REG,1) | FSRC(CONST,2) | FSRC(REG,3),
- FORM_Tirrr____ = FTHUMB | FDST(INDIR) | FSRC(REG,1) | FSRC(REG,2) | FSRC(REG,3),
- FORM_Tispcr___ = FTHUMB | FDST(INDIR) | FSRC(SP,1) | FSRC(CONST,2) | FSRC(REG,3),
- FORM_Tir______ = FTHUMB | FDST(INDIR) | FSRC(REG,1),
- FORM_Tispr____ = FTHUMB | FDST(INDIR) | FSRC(SP,1) | FSRC(REG,2),
- FORM_Tipcr____ = FTHUMB | FDST(INDIR) | FSRC(PC,1) | FSRC(REG,2),
- FORM_Tirsp____ = FTHUMB | FDST(INDIR) | FSRC(REG,1) | FSRC(SP,2),
- //STM/LDM
- FORM_Tispc____ = FTHUMB | FDST(INDIR) | FSRC(SP,1) | FSRC(CONST,2),
- FORM_Tirc_____ = FTHUMB | FDST(INDIR) | FSRC(REG,1) | FSRC(CONST,2),
- FORM_2pirc____ = FTHUMB2 | FSRC(INDIR,1) | FSRC(REG,2) | FSRC(CONST,3),
- FORM_2pirr____ = FTHUMB2 | FSRC(INDIR,1) | FSRC(REG,2) | FSRC(REG,3),
- FORM_2pirrc___ = FTHUMB2 | FSRC(INDIR,1) | FSRC(REG,2) | FSRC(REG,3) | FSRC(CONST,4),
- FORM_2irc_____ = FTHUMB2 | FDST(INDIR) | FSRC(REG,1) | FSRC(CONST,2),
- //LDMRET
- FORM_Tspispc__ = FTHUMB | FDST(SP) | FSRC(INDIR,1) | FSRC(SP,2) | FSRC(CONST,3),
- //MOVH
- FORM_Tspr_____ = FTHUMB | FDST(SP) | FSRC(REG,1),
- FORM_Thrr_____ = FTHUMB | FSET(REG,28) | FDST(REG) | FSRC(REG,1),
- FORM_2sphr____ = FTHUMB2 | FSET(REG,28) |FDST(SP) | FSRC(REG,1),
- FORM_2hrpc____ = FTHUMB2 | FSET(REG,28) | FDST(REG) | FSRC(PC,1),
- FORM_2rpc_____ = FTHUMB2 | FDST(REG) | FSRC(PC,1),
- //LDM
- FORM_Tric_____ = FTHUMB | FDST(REG) | FSRC(INDIR,1) | FSRC(CONST,1),
- FORM_Ticr_____ = FTHUMB | FDST(INDIR) | FSRC(CONST,1) | FSRC(REG,2),
- // CBZ
- FORM_2lr______ = FTHUMB2 | FSRC(LABEL,1) | FSRC(REG,2),
- FORM_2er______ = FTHUMB2 | FSRC(CODE,1) | FSRC(REG,2),
- //LEA
- FORM_Trl______ = FTHUMB | FDST(REG) | FSRC(LABEL,1),
- FORM_Trlsp____ = FTHUMB | FDST(REG) | FSRC(LABEL,1) | FSRC(SP,2),
- FORM_Tspl_____ = FTHUMB | FDST(SP) | FSRC(LABEL,1),
- //RET pc, r
- FORM_Tpchr____ = FTHUMB | FDST(PC) | FSET(REG,28) | FSRC(REG,1),
- FORM_Tpcr_____ = FTHUMB | FDST(PC) | FSRC(REG,1),
- FORM_Tpcriw___ = FTHUMB | FDST(PC) | FSRC(REG,1) | FSRC(REG,2),
- FORM_Tpchriw__ = FTHUMB | FDST(PC) | FSET(REG,28) | FSRC(REG,1) | FSRC(REG,2),
- //DCD
- FORM_Tlsp_____ = FTHUMB | FSRC(LABEL,1) | FSRC(SP,2),
- FORM_Tc_______ = FTHUMB | FSRC(CONST,1),
- FORM_2r_______ = FTHUMB2 | FDST(REG),
- FORM_2c_______ = FTHUMB2 | FSRC(CONST,1),
- FORM_Tcll_____ = FTHUMB | FSRC(CONST,1) | FSRC(LABEL,2) | FSRC(LABEL,3),
- FORM_Tcee_____ = FTHUMB | FSRC(CONST,1) | FSRC(CODE,2) | FSRC(CODE,3),
- FORM_2rrcrc___ = FTHUMB2 | FDST(REG) | FSRC(REG,1) | FSRC(CONST,2) | FSRC(REG,3) | FSRC(CONST,4),
- FORM_2rrrrcrc_ = FTHUMB2 | FDST(REG) | FSRC(REG,1) | FSRC(REG,2) | FSRC(REG,3) | FSRC(CONST,4) | FSRC(REG,5) | FSRC(CONST,6),
- // MRS, MSR
- FORM_2rsrc____ = FTHUMB2 | FDST(REG) | FSRC(SR,1) | FSRC(CONST, 2),
- FORM_2srrcc___ = FTHUMB2 | FDST(SR) | FSRC(REG,1) | FSRC(CONST, 2) | FSRC(CONST, 3),
- // MCRR, MRRC
- FORM_2cprr____ = FTHUMB2 | FSRC(CONST,1) | FSRC(REG,2) | FSRC(REG,3),
- FORM_2rcp_____ = FTHUMB2 | FDST(REG) | FSRC(CONST,1),
- // MAR, MRA
- FORM_2acprr___ = FTHUMB2 | FDST(ACC) | FSRC(CONST,1) | FSRC(REG,2) | FSRC(REG,3),
- FORM_2rcpa____ = FTHUMB2 | FDST(REG) | FSRC(CONST,1) | FSRC(ACC,2),
- // MCR, MRC
- FORM_2crcccc__ = FTHUMB2 | FSRC(CONST,1) | FSRC(REG,2) | FSRC(CONST, 3) | FSRC(CONST,4) | FSRC(CONST,5) | FSRC(CONST,6),
- FORM_2rccccc__ = FTHUMB2 | FDST(REG) | FSRC(CONST,1) | FSRC(CONST, 2) | FSRC(CONST,3) | FSRC(CONST,4) | FSRC(CONST,5),
- // WLDR
- FORM_2rcr_____ = FTHUMB2 | FDST(REG) | FSRC(CONST,1) | FSRC(REG,2),
- FORM_2rcrr____ = FTHUMB2 | FDST(REG) | FSRC(CONST,1) | FSRC(REG,2) | FSRC(REG,3),
- FORM_2rcrrr___ = FTHUMB2 | FDST(REG) | FSRC(CONST,1) | FSRC(REG,2) | FSRC(REG,3) | FSRC(REG,4),
- FORM_2rcrrrr__ = FTHUMB2 | FDST(REG) | FSRC(CONST,1) | FSRC(REG,2) | FSRC(REG,3) | FSRC(REG,4) | FSRC(REG,5),
- //FLOAT Forms
- FORM_2dd______ = FTHUMB2 | FDST(DREG) | FSRC(DREG,1),
- FORM_2ddd_____ = FTHUMB2 | FDST(DREG) | FSRC(DREG,1) | FSRC(DREG,2),
- FORM_2_dd_____ = FTHUMB2 | FSRC(DREG,1) | FSRC(DREG,2),
- FORM_2dr______ = FTHUMB2 | FDST(DREG) | FSRC(REG,1),
- FORM_2rd______ = FTHUMB2 | FDST(REG) | FSRC(DREG,1),
- FORM_2dirc____ = FTHUMB2 | FDST(DREG) | FSRC(INDIR,1) | FSRC(REG,2) | FSRC(CONST,3),
- FORM_2disp____ = FTHUMB2 | FDST(DREG) | FSRC(INDIR,1) | FSRC(SP,2),
- FORM_2dispc___ = FTHUMB2 | FDST(DREG) | FSRC(INDIR,1) | FSRC(SP,2) | FSRC(CONST,3),
- FORM_2ircd____ = FTHUMB2 | FDST(INDIR) | FSRC(REG,1) | FSRC(CONST,2) | FSRC(DREG,3),
- FORM_2ispd____ = FTHUMB2 | FDST(INDIR) | FSRC(SP,1) | FSRC(DREG,2),
- FORM_NOMORE = -1
- }IFORM;
- #define FT(_form, _inst, _steps) { FORM_ ## _form, _inst, _steps }
- static const FormTable Forms_ADD [] =
- {
- FT (2rrc_____, 0x0000F100, Steps_T2_ALU_dn_modc12),
- FT (2rrrcc___, 0x0000EB00, Steps_T2_ALU_dnm_Shift_c),
- FT (2rrrccC__, 0x0000EB40, Steps_T2_ALU_dnm_Shift_c),
- FT (2rrr_____, 0x0000EB00, Steps_T2_ALU_dnm),
- FT (2rrcC____, 0x0000F140, Steps_T2_ALU_dn_modc12),
- FT (2rrrC____, 0x0000EB40, Steps_T2_ALU_dnm),
- FT (2rrC_____, 0x0000EB40, Steps_T2_ALU_ddm),
- // Thumb2 and Thumb1 ADD(4)
- FT (ThrC_____, 0x4140, Steps_T_ALU_dm), // ADC rd, rd, rm
- FT (TrhrC____, 0x4140, Steps_T_ALU_dm), // ADC rd, rd, rm
- FT (ThrrC____, 0x4140, Steps_T_ALU_dm), // ADC rd, rd, rm
- FT (ThrhrC___, 0x4140, Steps_T_ALU_dm), // ADC rd, rd, rm
- FT (Trrc_____, 0x1c00, Steps_T_Add_Sub_dnc), // ADD rd, rn #<3_bit_immd>
- FT (Trc______, 0x3000, Steps_T_Add_Sub_ddc), // ADD rd, #<8_bit_immd>
- FT (Tr_______, 0x1800, Steps_T_Add_Sub_dnm), // ADD rd, rd, rm
- FT (Trr______, 0x1800, Steps_T_Add_Sub_dnm), // ADD rd, rd, rm
- FT (Trrr_____, 0x1800, Steps_T_Add_Sub_dnm), // ADD rd, rn, rm
- FT (Tpcpcr___, 0x4400, Steps_T_Add_High_dm), // ADD pc, rm, h1,h2
- FT (Tspspr___, 0x4400, Steps_T_Add_High_dm), // ADD sp, rm, h1,h2
- FT (Tspsphr__, 0x4400, Steps_T_Add_High_dm), // ADD sp, rm, h1,h2
- FT (Thrr_____, 0x4400, Steps_T_Add_High_dm), // ADD rd, rm, h1,h2
- FT (Thrsp____, 0x4400, Steps_T_Add_High_dm), // ADD rd, sp, h1
- FT (Trpc_____, 0x4400, Steps_T_Add_High_dm), // ADD rd, rm, h1, h2
- FT (Trsp_____, 0x4400, Steps_T_Add_High_dm), // ADD rd, rm, h1, h2
- FT (Tpchr____, 0x4400, Steps_T_Add_High_dm), // ADD rd, rm, h1, h2
- FT (Trpcc____, 0xa000, Steps_T_Add_SP_or_PC), // ADD rd, PC, #<8_bit_immd>
- FT (Trspc____, 0xa800, Steps_T_Add_SP_or_PC), // ADD rd, SP, #<8_bit_immd>
- FT (Tspspc___, 0xb000, Steps_T_Add_Sub_SP), // ADD SP, SP, #<7_bit_immd>
- FT (TrC_____, 0x4140, Steps_T_ALU_dm), // ADC rd, rd, rm
- FT (TrrC_____, 0x4140, Steps_T_ALU_dm), // ADC rd, rd, rm
- FT (NOMORE, 0x0, 0),
- };
- static const FormTable Forms_ADDW [] =
- {
- FT (2rrc_____, 0x0000F200, Steps_T2_ALU_dn_imm12),
- FT (2rspc____, 0x0000F200, Steps_T2_ALU_dn_imm12),
- FT (2spspc___, 0x0000F200, Steps_T2_ALU_dn_imm12),
- FT (2sprc____, 0x0000F200, Steps_T2_ALU_dn_imm12),
- FT (NOMORE, 0x0, 0),
- };
- static const FormTable Forms_ASR [] =
- {
- FT (2rrc_____, 0x0020ea4f, Steps_T2_Shift_dmc),
- FT (2rrr_____, 0xF000FA40, Steps_T2_ALU_dnm),
- FT (Trc______, 0x1000, Steps_T_Shift_dmc),
- FT (Trrc_____, 0x1000, Steps_T_Shift_dmc),
- FT (Trr______, 0x4100, Steps_T_Shift_ds),
- FT (Tr_______, 0x4100, Steps_T_Shift_ds),
- FT (NOMORE, 0x0, 0),
- };
- static const FormTable Forms_BX [] =
- {
- FT (Tr_______, 0x4700, Steps_T_BX),
- FT (T_r______, 0x4700, Steps_T_BX),
- FT (Thr______, 0x4700, Steps_T_BX),
- FT (NOMORE, 0x0, 0),
- };
- static const FormTable Forms_B [] =
- {
- FT (2l_______, 0x9000F000, Steps_T2_BranchUncond),
- // FT (2l_______, 0x9000F000, Steps_T2_Branch),
- // FT (2lC______, 0x8000F000, Steps_T2_Branch),
- // FT (Tl_______, 0xe000, Steps_T_Branch),
- // FT (TlC______, 0xd000, Steps_T_Branch),
- FT (NOMORE, 0x0, 0),
- };
- // B<C> explicit ///////////////////////////////////
- static const FormTable Forms_BEQ [] =
- {
- //FT (2l_______, 0x9000F000, Steps_T2_Branch),
- FT (2l_______, 0x8000F000, Steps_T2_BranchCond),
- //FT (Tl_______, 0xe000, Steps_T_Branch),
- //FT (TlC______, 0xd000, Steps_T_Branch),
- FT (NOMORE, 0x0, 0),
- };
- static const FormTable Forms_BNE [] =
- {
- FT (2l_______, 0x8000F040, Steps_T2_BranchCond),
- FT (NOMORE, 0x0, 0),
- };
- static const FormTable Forms_BLT [] =
- {
- FT (2l_______, 0x8000F2C0, Steps_T2_BranchCond),
- FT (NOMORE, 0x0, 0),
- };
- static const FormTable Forms_BGT [] =
- {
- FT (2l_______, 0x8000F300, Steps_T2_BranchCond),
- FT (NOMORE, 0x0, 0),
- };
- static const FormTable Forms_BLE [] =
- {
- FT (2l_______, 0x8000F340, Steps_T2_BranchCond),
- FT (NOMORE, 0x0, 0),
- };
- static const FormTable Forms_BGE [] =
- {
- FT (2l_______, 0x8000F280, Steps_T2_BranchCond),
- FT (NOMORE, 0x0, 0),
- };
- static const FormTable Forms_BCS [] =
- {
- FT (2l_______, 0x8000F080, Steps_T2_BranchCond),
- FT (NOMORE, 0x0, 0),
- };
- static const FormTable Forms_BCC [] =
- {
- FT (2l_______, 0x8000F0C0, Steps_T2_BranchCond),
- FT (NOMORE, 0x0, 0),
- };
- static const FormTable Forms_BHI [] =
- {
- FT (2l_______, 0x8000F200, Steps_T2_BranchCond),
- FT (NOMORE, 0x0, 0),
- };
- static const FormTable Forms_BLS [] =
- {
- FT (2l_______, 0x8000F240, Steps_T2_BranchCond),
- FT (NOMORE, 0x0, 0),
- };
- static const FormTable Forms_BMI [] =
- {
- FT (2l_______, 0x8000F100, Steps_T2_BranchCond),
- FT (NOMORE, 0x0, 0),
- };
- static const FormTable Forms_BPL [] =
- {
- FT (2l_______, 0x8000F140, Steps_T2_BranchCond),
- FT (NOMORE, 0x0, 0),
- };
- static const FormTable Forms_BVS [] =
- {
- FT (2l_______, 0x8000F180, Steps_T2_BranchCond),
- FT (NOMORE, 0x0, 0),
- };
- static const FormTable Forms_BVC [] =
- {
- FT (2l_______, 0x8000F1C0, Steps_T2_BranchCond),
- FT (NOMORE, 0x0, 0),
- };
- // End B<C> explicit ///////////////////////////////////
- static const FormTable Forms_BL [] =
- {
- FT (2e_______, 0xF800F000, Steps_T2_BL),
- FT (Tl_______, 0xf800f000, Steps_T_BL),
- FT (Te_______, 0xf800f000, Steps_T_BL),
- FT (NOMORE, 0x0, 0),
- };
- static const FormTable Forms_BLX [] =
- {
- FT (2e_______, 0xE800F000, Steps_T2_BLX),
- FT (Te_______, 0xf400e400, Steps_T_BLX),
- FT (T_r______, 0x4780, Steps_T_BX),
- FT (Tr_______, 0x4780, Steps_T_BX), //same src, dst
- FT (Thr______, 0x4780, Steps_T_BX),
- FT (Th_r_____, 0x4780, Steps_T_BX),
- FT (NOMORE, 0x0, 0),
- };
- static const FormTable Forms_CMP [] =
- {
- FT (2_rc_____, 0x0F00F1B0, Steps_T2_n_modc12),
- FT (2_rr_____, 0x0F00EBB0, Steps_T2_ALU_nm),
- //FT (2rrcc____, 0x0F00EBB0, Steps_T2_ALU_nm_Shift_c),
- FT (T_rc_____, 0x2800, Steps_T_RR_dc),
- FT (T_rr_____, 0x4280, Steps_T_RR_ds),
- FT (T_r______, 0x4280, Steps_T_RR_ds),
- FT (Th_rr____, 0x4500, Steps_T_HRR_ds),
- FT (T_spr____, 0x4500, Steps_T_HRR_ds),
- FT (Th_spr___, 0x4500, Steps_T_HRR_ds),
- FT (NOMORE, 0x0, 0),
- };
- static const FormTable Forms_CMP_ASR31 [] =
- {
- // CMP.W Rn, Rm, ASR #31
- // T3 .im3 1111 i2ty Rm__ 1110 1011 1011 Rn__, ty = 10, im3:i2 = 31
- // -> .111 1111 1110 Rm__ 1110 1011 1011 Rn__
- FT (2_rr_____, 0x7FE0EBB0, Steps_T2_ALU_nm),
- FT (NOMORE, 0x0, 0),
- };
- static const FormTable Forms_CLZ [] =
- {
- FT(2rr______, 0xF080FAB0, Steps_T2_ALU_dnn),
- FT (NOMORE, 0x0, 0),
- };
- static const FormTable Forms_CMN [] =
- {
- FT (2_rc_____, 0x0F00F110, Steps_T2_n_modc12),
- FT (2_rr_____, 0x0F00EB10, Steps_T2_ALU_nm),
- //FT (2rrcc____, 0x0F00EB10, Steps_T2_ALU_nm_Shift_c),
- FT (T_rr_____, 0x42c0, Steps_T_RR_ds),
- FT (T_r______, 0x42c0, Steps_T_RR_ds),
- FT (NOMORE, 0x0, 0),
- };
- static const FormTable Forms_EOR [] =
- {
- FT (2rrc_____, 0x0000F080, Steps_T2_ALU_dn_modc12),
- FT (2rrrcc___, 0x0000EA80, Steps_T2_ALU_dnm_Shift_c),
- FT (2rrr_____, 0x0000EA80, Steps_T2_ALU_dnm),
- FT (2rr______, 0x0000EA80, Steps_T2_ALU_dnm),
- FT (Trr______, 0x4040, Steps_T_ALU_dm),
- FT (Tr_______, 0x4040, Steps_T_ALU_dm),
- FT (NOMORE, 0x0, 0),
- };
- static const FormTable Forms_EOR_ASR31 [] =
- {
- // EOR.W Rd, Rn, Rm, ASR #31
- // T2 0im3 Rd__ i2ty Rm__ 1110 1010 100S Rn__, ty = 10, im3:i2=31=11111
- // -> 0111 0000 1110 Rm__ 1110 1010 1000 Rn__
- FT (2rrr_____, 0x70E0EA80, Steps_T2_ALU_dnm),
- FT (NOMORE, 0x0, 0),
- };
- static const FormTable Forms_CLRSIGN [] =
- {
- FT (2rr______, 0x70E0EA80, Steps_T2_ALU_dnn),
- FT (NOMORE, 0x0, 0),
- };
- static const FormTable Forms_LDM [] =
- {
- FT (2ipcc____, 0x0000E810, Steps_T2_LDM),
- FT (2irc_____, 0x0000E810, Steps_T2_LDM),
- FT (2ispc____, 0x0000E810, Steps_T2_LDM),
- FT (2rispc___, 0x0B04F85D, Steps_T2_LDM_ONE),
- FT (Tispc____, 0xbc00, Steps_T_LDM_rspx),
- FT (Tirc_____, 0xc800, Steps_T_LDM_rrx),
- FT (NOMORE, 0x0, 0),
- };
- static const FormTable Forms_LDIMM [] =
- {
- FT (Trc______, 0x2000, Steps_T_ALU_rc),
- FT (NOMORE, 0x0, 0),
- };
- static const FormTable Forms_LEA [] =
- {
- // Treat this as a Thumb2 add: r = ADDW sp,offset
- FT (2risp____, 0x0000F200, Steps_T2_LEA_rrd),
- // FT (Trl______, 0xa800, Steps_T_LEA_rrd),
- // FT (Trlsp____, 0xa800, Steps_T_LEA_rspd),
- // FT (Tspl_____, 0xa800, Steps_T_LEA_rspd),
- FT (NOMORE, 0x0, 0),
- };
- static const FormTable Forms_STM [] =
- {
- FT (2ispc____, 0x0000E800, Steps_T2_STM_rrx),
- FT (2irc_____, 0x0000E800, Steps_T2_STM_rrx),
- FT (2ispcr___, 0x0D04F84D, Steps_T2_STM_rsp_ONE),
- FT (Tispc____, 0xb400, Steps_T_STM_rspx),
- FT (Tirc_____, 0xc000, Steps_T_STM_rrx),
- FT (Tric_____, 0xc000, Steps_T_STM_rrx),
- FT (NOMORE, 0x0, 0),
- };
- static const FormTable Forms_LDRN [] =
- {
- FT (Trirc____, 0x0000, Steps_T_LDRN_rcr), //LDR rd, [rn, #5_bit_off]
- FT (Trirr____, 0x0000, Steps_T_LDRN_rrr), //LDR rd, [rn, rm]
- FT (Tripcc___, 0x4800, Steps_T_LDRN_PC_or_SP), //LDR rd, [PC, #8_bit_off]
- FT (Trispc___, 0x9800, Steps_T_LDRN_PC_or_SP), //LDR rd, [SP, #8_bit_off]
- FT (Trisp____, 0x9800, Steps_T_LDRN_PC_or_SP), //LDR rd, [rn, #5_bit_off]
- FT (Tripc____, 0x4800, Steps_T_LDRN_PC_or_SP), //LDR rd, [PC, #8_bit_off]
- FT (Tri______, 0x6838, Steps_T_LDRN_ri), //LDR rd, [rn, #5_bit_off]
- FT (NOMORE, 0x0, 0),
- };
- // Thumb2 LDR.W
- static const FormTable Forms_LDR_W [] =
- {
- FT (2rirc____, 0x0000F810, Steps_T2_LDR_OFF),
- FT (2risp____, 0x0000F810, Steps_T2_LDR_Stack),
- FT (2ripc____, 0x0100F810, Steps_T2_LDR_Stack),
- FT (2ri______, 0x0000F810, Steps_T2_LDR_Stack),
- FT (2rispc___, 0x0000F810, Steps_T2_LDR_OFF),
- FT (2ripcc___, 0x0000F810, Steps_T2_LDR_OFF),
- FT (2rispr___, 0x0000F810, Steps_T2_LDR_RegIndir),
- FT (2rirr____, 0x0000F810, Steps_T2_LDR_RegIndir),
- FT (2rirrc___, 0x0000F810, Steps_T2_LDR_RegIndir),
- FT (NOMORE, 0x0, 0),
- };
- static const FormTable Forms_LDRRET [] =
- {
- FT (2pcispc__, 0xf000f85d, Steps_T2_LDRRET), // LDR PC, [SP], #imm
- FT (NOMORE, 0x0, 0),
- };
- static const FormTable Forms_MOV [] =
- {
- FT (Trc______, 0x2000, Steps_T_ALU_rc),
- FT (Trr______, 0x4600, Steps_T_MovHigh_rr),
- FT (Tr_______, 0x4600, Steps_T_MovHigh_rr),
- FT (Thrsp____, 0x4600, Steps_T_MovHigh_rr),
- FT (Tsphr____, 0x4600, Steps_T_MovHigh_rr),
- FT (Th_r_____, 0x4600, Steps_T_MovHigh_rr),
- FT (Trsp_____, 0x4600, Steps_T_MovHigh_rr),
- FT (Tpchr____, 0x4600, Steps_T_MovHigh_rr),
- FT (Thrr_____, 0x4600, Steps_T_MovHigh_rr),
- FT (Tspr_____, 0x4600, Steps_T_MovHigh_rr),
- FT (Tspsp____, 0x4600, Steps_T_MovHigh_rr),
- FT (NOMORE, 0x0, 0),
- };
- static const FormTable Forms_MOV_W [] =
- {
- FT (2rc______, 0x0000F04F, Steps_T2_ALU_r_modc12),
- FT (2rr______, 0x0000EA4F, Steps_T2_ALU_dm),
- FT (NOMORE, 0x0, 0),
- };
- static const FormTable Forms_MOVW [] =
- {
- FT (2rc______, 0x0000F240, Steps_T2_ALU_r_imm16),
- FT (2rl______, 0x0000F240, Steps_T2_MOVW_reloc),
- FT (NOMORE, 0x0, 0),
- };
- // Thumb2 & ARMv7
- static const FormTable Forms_MOVT [] =
- {
- //UTC - FT (2rrc_____, 0x0000F2C0, Steps_T2_ALU_r_imm16),
- FT (2rc______, 0x0000F2C0, Steps_T2_ALU_r_imm16),
- FT (2rl______, 0x0000F2C0, Steps_T2_MOVT_reloc),
- FT (NOMORE, 0x0, 0),
- };
- static const FormTable Forms_RET [] =
- {
- FT (Tpcr_____, 0x4600, Steps_T_Ret_rr),
- FT (Tpchr____, 0x4600, Steps_T_Ret_rr),
- FT (Tpcriw___, 0x4700, Steps_T_IWRET_dm),
- FT (Tpchriw__, 0x4700, Steps_T_IWRET_dm),
- FT (NOMORE, 0x0, 0),
- };
- // initializing it similar to SDIV. won't be used as we split REM into SDIV and MLS
- static const FormTable Forms_REM [] =
- {
- FT (2rrr_____, 0xF0F0FB90, Steps_T2_ALU_dnm_no_sbit),
- FT (NOMORE, 0x0, 0),
- };
- // Thumb2 SUBW rd, rn #<12_bit_immediate>
- static const FormTable Forms_SUBW [] =
- {
- FT (2rrc_____, 0x0000F2A0, Steps_T2_ALU_dn_imm12),
- FT (2rspc____, 0x0000F2A0, Steps_T2_ALU_dn_imm12),
- FT (2spspc___, 0x0000F2A0, Steps_T2_ALU_dn_imm12),
- FT (NOMORE, 0x0, 0),
- };
- static const FormTable Forms_SUB [] =
- {
- FT (2rrc_____, 0x0000F1A0, Steps_T2_ALU_dn_modc12),
- //FT (2rrcc____, 0x0000EBA0, Steps_T2_ALU_ddm_Shift_c), //3rd operand Shifter operand not supported yet
- //FT (2rrrcc___, 0x0000EBA0, Steps_T2_ALU_dnm_Shift_c),
- //FT (2rrrccC__, 0x0000EB60, Steps_T2_ALU_dnm_Shift_c),
- FT (2rrr_____, 0x0000EBA0, Steps_T2_ALU_dnm),
- FT (2rrrC____, 0x0000EB60, Steps_T2_ALU_dnm), // SBC
- FT (2rrcC____, 0x0000F160, Steps_T2_ALU_dn_modc12), // SBC
- FT (Trrc_____, 0x1e00, Steps_T_Add_Sub_dnc), // SUB rd, rn #<3_bit_immd>
- FT (Trc______, 0x3800, Steps_T_Add_Sub_ddc), // SUB rd, #<8_bit_immd>
- FT (Tr_______, 0x1a00, Steps_T_Add_Sub_dnm), // ADD rd, rd, rm
- FT (Trr______, 0x1a00, Steps_T_Add_Sub_dnm), // SUB rd, rd, rm
- FT (Trrr_____, 0x1a00, Steps_T_Add_Sub_dnm), // SUB rd, rn, rm
- FT (Tspspc___, 0xb080, Steps_T_Add_Sub_SP), // SUB SP, SP, #<7_bit_immd>
- FT (TrrC_____, 0x4180, Steps_T_ALU_dm), // SBC
- FT (NOMORE, 0x0, 0),
- };
- static const FormTable Forms_SBCMPLNT [] =
- {
- FT (2rrr_____, 0x70E0EBA0, Steps_T2_ALU_dnm),
- FT (NOMORE, 0x0, 0),
- };
- static const FormTable Forms_STRN[] =
- {
- FT (Tircr____, 0x0000, Steps_T_STRN_rcr), // STR rd, [rn, #off]
- FT (Tirrr____, 0x0000, Steps_T_STRN_rrr), // STR rd, [rn, rm]
- FT (Tir______, 0x6038, Steps_T_STRN_ri), // STR rd, [rn, #8_bit_off]
- FT (Tispr____, 0x9000, Steps_T_STRN_spcr), // STR rd, [SP, #8_bit_off]
- FT (Tispcr___, 0x9000, Steps_T_STRN_spcr), // STR rd, [SP, #8_bit_off]
- FT (Tipcr____, 0x6000, Steps_T_STRN_spcr), // STR rd, [PC, #8_bit_off]
- FT (Tirsp____, 0x9000, Steps_T_STRN_spcr), // STR rd, [SP, #8_bit_off]
- FT (NOMORE, 0x0, 0),
- };
- static const FormTable Forms_STR_W [] =
- {
- FT (2ircr____, 0x0000F800, Steps_T2_STR_OFF),
- FT (2ispcr___, 0x0000F800, Steps_T2_STR_OFF),
- FT (2ispr____, 0x0000F800, Steps_T2_STR_Stack),
- FT (2irrr____, 0x0000F800, Steps_T2_STR_RegIndir),
- FT (2isprr___, 0x0000F800, Steps_T2_STR_RegIndir),
- FT (2irrrc___, 0x0000F800, Steps_T2_STR_RegIndir),
- FT (2ir______, 0x0000F800, Steps_T2_STR_Stack),
- FT (2irsp____, 0x0000F800, Steps_T2_STR_Stack),
- FT (NOMORE, 0x0, 0),
- };
- static const FormTable Forms_AND [] =
- {
- FT (2rrc_____, 0x0000F000, Steps_T2_ALU_dn_modc12),
- FT (2rrr_____, 0x0000EA00, Steps_T2_ALU_dnm),
- /*
- FT (2rrrcc___, 0x0000EA00, Steps_T2_ALU_dnm_Shift_c),
- FT (2rr______, 0x0000EA00, Steps_T2_ALU_dnm),
- */
- FT (Trr______, 0x4000, Steps_T_ALU_dm),
- FT (Tr_______, 0x4000, Steps_T_ALU_dm),
- FT (NOMORE, 0x0, 0),
- };
- static const FormTable Forms_LSL [] =
- {
- FT (2rrc_____, 0x0000ea4f, Steps_T2_Shift_dmc),
- FT (2rrr_____, 0xF000FA00, Steps_T2_ALU_dnm),
- FT (Trc______, 0x0000, Steps_T_Shift_dmc),
- FT (Trrc_____, 0x0000, Steps_T_Shift_dmc),
- FT (Trr______, 0x4080, Steps_T_Shift_ds),
- FT (Tr_______, 0x4080, Steps_T_Shift_ds),
- FT (NOMORE, 0x0, 0),
- };
- static const FormTable Forms_LSR [] =
- {
- FT (2rrc_____, 0x0010ea4f, Steps_T2_Shift_dmc),
- FT (2rrr_____, 0xF000FA20, Steps_T2_ALU_dnm),
- FT (Trc______, 0x0800, Steps_T_Shift_dmc),
- FT (Trrc_____, 0x0800, Steps_T_Shift_dmc),
- FT (Trr______, 0x40c0, Steps_T_Shift_ds),
- FT (Tr_______, 0x40c0, Steps_T_Shift_ds),
- FT (NOMORE, 0x0, 0),
- };
- static const FormTable Forms_MUL [] =
- {
- FT (2rrrr____, 0x0000FB00, Steps_T2_MULA_dnsm),
- FT (2rrr_____, 0xF000FB00, Steps_T2_ALU_dnm_no_sbit),
- FT (2rr______, 0xF000FB00, Steps_T2_ALU_dnm_no_sbit),
- FT (Trr______, 0x4340, Steps_T_ALU_dm),
- FT (NOMORE, 0x0, 0),
- };
- static const FormTable Forms_SMLAL [] =
- {
- // SMLAL RdLo, RdHi, Rn, Rm. We always use r12 as RdHi, as we don't currently support instructions with 4 operands.
- // RdLo RdHi 0000 Rm__ | 1111 1011 1100 Rn__
- FT (2rrr_____, 0x0000FBC0, Steps_T2_ALU_mull_no_sbit),
- FT (NOMORE, 0x0, 0),
- };
- static const FormTable Forms_SMULL [] =
- {
- // SMULL<c> RdLo, RdHi, Rn, Rm. We always use r12 as RdHi, as we don't currently support instructions with 4 operands.
- // RdLo RdHi 0000 Rm__ | 1111 1011 1000 Rn__
- FT (2rrr_____, 0x0000FB80, Steps_T2_ALU_mull_no_sbit),
- FT (NOMORE, 0x0, 0),
- };
- static const FormTable Forms_MLS [] =
- {
- FT (2rrr_____, 0x0010FB00, Steps_T2_mls_dnma),
- FT (NOMORE, 0x0, 0),
- };
- static const FormTable Forms_MVN [] =
- {
- FT (2rc______, 0x0000F06F, Steps_T2_ALU_r_modc12),
- FT (2rrcc____, 0x0000EA6F, Steps_T2_ALU_dm_Shift_c),
- FT (2rr______, 0x0000EA6F, Steps_T2_ALU_dm),
- FT (Tr_______, 0x43c0, Steps_T_Neg_Mvn_dm),
- FT (Trr______, 0x43c0, Steps_T_Neg_Mvn_dm),
- FT (NOMORE, 0x0, 0),
- };
- static const FormTable Forms_ORR [] =
- {
- FT (2rrc_____, 0x0000F040, Steps_T2_ALU_dn_modc12),
- FT (2rrrcc___, 0x0000EA40, Steps_T2_ALU_dnm_Shift_c),
- FT (2rrr_____, 0x0000EA40, Steps_T2_ALU_dnm),
- FT (2rr______, 0x0000EA40, Steps_T2_ALU_dnm),
- FT (Trr______, 0x4300, Steps_T_ALU_dm),
- FT (Tr_______, 0x4300, Steps_T_ALU_dm),
- FT (NOMORE, 0x0, 0),
- };
- static const FormTable Forms_RSB [] =
- {
- FT (2rrc_____, 0x0000F1C0, Steps_T2_ALU_dn_modc12),
- FT (2rrrcc___, 0x0000EBC0, Steps_T2_ALU_dnm_Shift_c),
- FT (2rrr_____, 0x0000EBC0, Steps_T2_ALU_dnm),
- FT (Tr_______, 0x4240, Steps_T_Neg_Mvn_dm),
- FT (Trr______, 0x4240, Steps_T_Neg_Mvn_dm),
- FT (NOMORE, 0x0, 0),
- };
- static const FormTable Forms_SDIV [] =
- {
- FT (2rrr_____, 0xF0F0FB90, Steps_T2_ALU_dnm_no_sbit),
- FT (NOMORE, 0x0, 0),
- };
- static const FormTable Forms_TST [] =
- {
- FT (2_rr_____, 0x0F00EA10, Steps_T2_ALU_nm),
- FT (2_rc_____, 0x0F00F010, Steps_T2_n_modc12),
- FT (2rrcc____, 0x0F00EA10, Steps_T2_ALU_nm_Shift_c),
- FT (T_rr_____, 0x4200, Steps_T_RR_ds),
- FT (T_r______, 0x4200, Steps_T_RR_ds),
- FT (NOMORE, 0x0, 0),
- };
- static const FormTable Forms_TIOFLW [] =
- {
- FT (2_r______, 0x0F40EA90, Steps_T2_ALU_nn),
- FT (NOMORE, 0x0, 0),
- };
- static const FormTable Forms_DBGBRK [] =
- {
- FT (T________, 0xdefe, Steps_T_Dbg),
- FT (NOMORE, 0x0, 0),
- };
- static const FormTable Forms_NOP [] =
- {
- FT (T________, 0x046c0, Steps_NOP),
- FT (NOMORE, 0x0, 0),
- };
- static const FormTable Forms_NOP_W [] =
- {
- FT (2________, 0x8000F3AF, Steps_NOP),
- FT (NOMORE, 0x0, 0),
- };
- static const FormTable Forms_VABS [] =
- {
- FT (2dd______, 0x0bc0eeb0, Steps_DBL_Unary_dm),
- FT (NOMORE, 0x0, 0),
- };
- static const FormTable Forms_VSQRT [] =
- {
- // VSQRT.F64 <Dd>, <Dm>
- // s = sz = double precision
- // D = register selector for dest = sz ? D:Vd : Vd:D
- // M = register selector for src = sz ? M:Vm : Vm:M
- // T1/A1 Vd__ 101s 11M0 Vm__ | 1110 1110 1D11 0001 (flipped low and hi 2 bytes from as it's in the manual)
- // -> 0000 1011 1100 0000 | 1110 1110 1011 0001
- // Note: using 2dd form as for Thumb2, although the manual says there is only T1/A1 form --
- // the instr is essentially same as in Thumb2 (4 bytes).
- FT (2dd______, 0x0bc0eeb1, Steps_DBL_Unary_dm),
- FT (NOMORE, 0x0, 0),
- };
- static const FormTable Forms_VADDF64 [] =
- {
- FT (2ddd_____, 0x0b00ee30, Steps_DBL_ALU_dnm),
- FT (NOMORE, 0x0, 0),
- };
- static const FormTable Forms_VSUBF64 [] =
- {
- FT (2ddd_____, 0x0b40ee30, Steps_DBL_ALU_dnm),
- FT (NOMORE, 0x0, 0),
- };
- static const FormTable Forms_VMULF64 [] =
- {
- FT (2ddd_____, 0x0b00ee20, Steps_DBL_ALU_dnm),
- FT (NOMORE, 0x0, 0),
- };
- static const FormTable Forms_VDIVF64 [] =
- {
- FT (2ddd_____, 0x0b00ee80, Steps_DBL_ALU_dnm),
- FT (NOMORE, 0x0, 0),
- };
- static const FormTable Forms_VCMPF64 [] =
- {
- FT (2_dd_____, 0x0b40eeb4, Steps_DBL_Cmp_dm),
- FT (NOMORE, 0x0, 0),
- };
- // This always moves FPSCR to ARM Status register.
- // APSR_nzcv is encoded as Rt = ’1111’, and the instruction transfers the FPSCR N, Z, C, and
- // V flags to the APSR N, Z, C, and V flags.
- static const FormTable Forms_VMRS [] =
- {
- FT (2________, 0xfa10eef1, Steps_FLT_FMRS_flags),
- FT (NOMORE, 0x0, 0),
- };
- static const FormTable Forms_VMRSR [] =
- {
- FT (2r_______, 0x0a10eef1, Steps_FLT_FMRSR_flags),
- FT (NOMORE, 0x0, 0),
- };
- static const FormTable Forms_VMSR [] =
- {
- FT (2_r______, 0x0a10eee1, Steps_FLT_FMRSR_flags),
- FT (NOMORE, 0x0, 0),
- };
- static const FormTable Forms_VNEGF64 [] =
- {
- FT (2dd______, 0x0b40eeb1, Steps_DBL_Unary_dm),
- FT (NOMORE, 0x0, 0),
- };
- static const FormTable Forms_VLDR [] =
- {
- FT (2dirc____, 0x0b00ec10, Steps_A_LDRN_DBL_Am_rcr), //VLDR rd,[rn,#off]
- FT (2disp____, 0x0b00ec10, Steps_A_LDRN_DBL_Am_rcr), //VLDR rd,[SP,#off]
- FT (NOMORE, 0x0, 0),
- };
- static const FormTable Forms_VLDR32 [] =
- {
- FT (2dirc____, 0x0a00ec10, Steps_A_LDRN_FLT_Am_rcr), //FLDS rd,[rn,#off]
- FT (2disp____, 0x0a00ec10, Steps_A_LDRN_FLT_Am_rcr), //FLDS rd,[SP,#off]
- FT (NOMORE, 0x0, 0),
- };
- // used by floating point STRs
- static const FormTable Forms_VSTR[] =
- {
- FT (2ircd____, 0x0b00ec00, Steps_A_DBL_STRN_Am_rcr), //VSTR dd, [rn, #off]
- FT (2ispd____, 0x0b00ec00, Steps_A_DBL_STRN_Am_rcr), //VSTR dd, [SP, #off]
- FT (NOMORE, 0x0, 0),
- };
- // used by floating point STRs
- static const FormTable Forms_VSTR32[] =
- {
- FT (2ircd____, 0x0a00ec00, Steps_A_FLT_STRN_Am_rcr), //FSTS sd, [rn, #off]
- FT (2ispd____, 0x0a00ec00, Steps_A_FLT_STRN_Am_rcr), //FSTS sd, [SP, #off]
- FT (NOMORE, 0x0, 0),
- };
- static const FormTable Forms_VMOV[] =
- {
- FT (2dd______, 0x0b40eeb0, Steps_DBL_Unary_dm),
- FT (NOMORE, 0x0, 0),
- };
- // This moves data between ARM core registers & VFP registers.
- static const FormTable Forms_VMOVARMVFP[] =
- {
- FT (2dr______, 0x0a10ee00, Steps_FLT_FMSR_sr),
- FT (2rd______, 0x0a10ee10, Steps_FLT_FMRS_rs),
- FT (NOMORE, 0x0, 0),
- };
- static const FormTable Forms_VCVTF64F32 [] =
- {
- FT (2dd______, 0x0ac0eeb7, Steps_FCVTDS_ds),
- FT (NOMORE, 0x0, 0),
- };
- static const FormTable Forms_VCVTF32F64 [] =
- {
- FT (2dd______, 0x0bc0eeb7, Steps_FCVTSD_sd),
- FT (NOMORE, 0x0, 0),
- };
- static const FormTable Forms_VCVTF64S32 [] =
- {
- FT (2dd______, 0x0bc0eeb8, Steps_FITOD_ds),
- FT (NOMORE, 0x0, 0),
- };
- static const FormTable Forms_VCVTF64U32 [] =
- {
- FT (2dd______, 0x0b40eeb8, Steps_FITOD_ds),
- FT (NOMORE, 0x0, 0),
- };
- static const FormTable Forms_VCVTS32F64 [] =
- {
- FT (2dd______, 0x0bc0eebd, Steps_FDTOI_sd),
- FT (NOMORE, 0x0, 0),
- };
- static const FormTable Forms_VCVTRS32F64 [] =
- {
- FT (2dd______, 0x0b40eebd, Steps_FDTOI_sd),
- FT (NOMORE, 0x0, 0),
- };
- static const FormTable Forms_PLD [] =
- {
- FT (2_irc____, 0xF000F810, Steps_T2_PLD_offset),
- FT (2_irr____, 0xF000F810, Steps_T2_PLD_RegIndir),
- FT (NOMORE, 0x0, 0),
- } ;
- // used by floating point LDMs
- static const FormTable Forms_VPOP[] =
- {
- FT (2irc_____, 0x0b00ec10, Steps_A_DBL_LDM), //FLDMD rn, {dreg list}
- FT (2ispc____, 0x0b00ec10, Steps_A_DBL_LDM), //FLDMD SP, {dreg list}
- FT (2rirc____, 0x0b00ec10, Steps_A_DBL_LDM), //FLDMD rn, {single register}
- FT (2rispc___, 0x0b00ec10, Steps_A_DBL_LDM), //FLDMD SP, {single register}
- FT (NOMORE, 0x0, 0),
- };
- // used by floating point STMs
- static const FormTable Forms_VPUSH[] =
- {
- FT (2irc_____, 0x0b00ec00, Steps_A_DBL_STM), //FSTMD rn, {dreg list}
- FT (2ispc____, 0x0b00ec00, Steps_A_DBL_STM), //FSTMD SP, {dreg list}
- FT (2ircr____, 0x0b00ec00, Steps_A_DBL_STM), //FSTMD rn, {single register}
- FT (2ispcr___, 0x0b00ec00, Steps_A_DBL_STM), //FSTMD SP, {single register}
- FT (NOMORE, 0x0, 0),
- };
- static const FormTable Forms_BIC [] =
- {
- FT (2rrc_____, 0x0000F020, Steps_T2_ALU_dn_modc12),
- FT (2rrrcc___, 0x0000EA20, Steps_T2_ALU_dnm_Shift_c),
- FT (2rrr_____, 0x0000EA20, Steps_T2_ALU_dnm),
- FT (2rr______, 0x0000EA20, Steps_T2_ALU_dnm),
- FT (Trr______, 0x4380, Steps_T_ALU_dm),
- FT (Tr_______, 0x4380, Steps_T_ALU_dm),
- FT (NOMORE, 0x0, 0),
- };
|