blob: ec798f5c6372cf75da5a72c8a47d4a3bc3f466b9 [file]
//-------------------------------------------------------------------------------------------------------
// 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
typedef unsigned char AssemblyStep;
enum AssemblyStepDefs
{
STEP_DONE = 32,
STEP_ILLEGAL,
STEP_REG,
STEP_REG_PLUS_1,
STEP_HREG,
STEP_DREG,
STEP_SREG,
STEP_VMOV_IMM,
STEP_SWPREG,
STEP_DUMMY_REG,
STEP_STACKREG,
STEP_OPEQ,
STEP_OPEQ2,
STEP_NEXTOPN,
STEP_DST2,
STEP_CONSTANT,
STEP_FCONSTANT_Z,
STEP_T1_SETS_CR0,
STEP_SHIFTER,
STEP_DATA,
STEP_LDRI,
STEP_LDR,
STEP_STRI,
STEP_STR,
STEP_OPCODE,
STEP_HBIT,
STEP_LABEL,
STEP_CALL,
STEP_CONDCOD,
STEP_SBIT,
STEP_AM1,
STEP_IMM32,
STEP_IBIT,
STEP_IMM5_AM1,
STEP_IMM5,
STEP_AM,
STEP_AM2,
STEP_INDEXED,
STEP_BASED,
STEP_BASEREG,
STEP_INDEXREG,
STEP_STACKIMM,
STEP_IMM12_AM2,
STEP_AM3,
STEP_UIMM8_AM3,
STEP_UIMM16HS,
STEP_AM4,
STEP_SBZ,
STEP_LXN,
STEP_L24,
STEP_INDIR,
STEP_SYM,
STEP_IMM_W5,
STEP_IMM,
STEP_IMM_H5,
STEP_IMM_W7,
STEP_IMM_W8,
STEP_IMM_S8,
STEP_IMM_DPW8,
STEP_UIMM32,
STEP_UIMM8,
STEP_UIMM16,
STEP_UIMM24,
STEP_UIMM5,
STEP_UIMM_WB5,
STEP_UIMM3,
STEP_OFFSET,
STEP_REGLIST,
STEP_SHIFTER_TYPE,
STEP_SHIFTER_CONST,
STEP_SCALE_CONST,
STEP_FIXUP,
STEP_LOFFSET1,
STEP_LOFFSET2,
STEP_VALUE,
STEP_MULL,
STEP_MRS,
STEP_NAN,
STEP_AM5,
STEP_ZBIT,
STEP_ACC,
STEP_OPCODE3,
STEP_WORD,
STEP_COPROC,
STEP_EXTR,
STEP_IMM8,
STEP_WLDRI,
STEP_WSTRI,
STEP_MASK,
STEP_UIMM4,
STEP_BIT,
STEP_MODCONST_12,
STEP_T2_IMM_16,
STEP_T2_IMM_12,
STEP_T2_SHIFT_IMM_5,
STEP_T2_IMMSTACK_POS12_NEG8,
STEP_NOT_CONSTANT,
STEP_T2_CONST_SHIFT_TYPE,
STEP_T2_CONST_SHIFT_NUM,
STEP_T2_CONST_ROR,
STEP_T2_CONST_ROR_NUM,
STEP_T2_LSB,
STEP_T2_xBFX_WIDTH,
STEP_T2_BFx_WIDTH,
STEP_T2_MEMIMM_POS12_NEG8,
STEP_T2_REGLIST,
STEP_T2_MEM_TYPE,
STEP_T2_BRANCH20,
STEP_T2_BRANCH24,
STEP_T2_LXZ,
STEP_T2_CBZ,
STEP_T2_IT,
STEP_MOVW_reloc,
STEP_MOVT_reloc,
STEP_Shift_IMM5,
STEP_XT_CONST_ROR,
STEP_XT_CONST_ROR_NUM,
STEP_DREGLIST,
STEP_NREG,
STEP_QREG,
STEP_FAKEQREG,
STEP_IMM_OPCODE,
STEP_NEON_AM5,
STEP_UIMM16V7,
STEP_A7_LSB,
STEP_A7_xBFX_WIDTH,
STEP_A7_BFx_WIDTH,
STEP_NOSBIT,
STEP_T2_INDIRSETUP_PC_OFF,
STEP_AM_D_T,
STEP_AM_D_T_STACK,
STEP_T2_STACKSYM_IMM_12,
STEP_R12,
};
// used by : ADD, SUB
static const AssemblyStep Steps_T_Add_Sub_dnc [] =
{
STEP_REG, 0, STEP_NEXTOPN, STEP_REG, 3, STEP_NEXTOPN, STEP_CONSTANT, STEP_T1_SETS_CR0,
STEP_UIMM3, 6, STEP_OPCODE, STEP_DONE
};
// used by : ADD, SUB
static const AssemblyStep Steps_T_Add_Sub_ddc [] =
{
STEP_REG, 8, STEP_NEXTOPN, STEP_OPEQ, STEP_NEXTOPN, STEP_CONSTANT, STEP_T1_SETS_CR0,
STEP_UIMM8, STEP_OPCODE, STEP_DONE
};
// used by : ADD, SUB
static const AssemblyStep Steps_T_Add_Sub_dnm [] =
{
STEP_REG, 0, STEP_NEXTOPN, STEP_REG, 3, STEP_NEXTOPN, STEP_REG, 6,
STEP_OPCODE, STEP_DONE
};
// used by : ADD
static const AssemblyStep Steps_T_Add_High_dm [] =
{
STEP_HREG, 0, STEP_HBIT, 7, STEP_NEXTOPN, STEP_OPEQ, STEP_NEXTOPN,
STEP_HREG, 3, STEP_HBIT, 6, STEP_OPCODE, STEP_NOSBIT, STEP_DONE
};
// used by : ADD
static const AssemblyStep Steps_T_Add_SP_or_PC [] =
{
STEP_REG, 8, STEP_NEXTOPN, STEP_DUMMY_REG, STEP_NEXTOPN, STEP_CONSTANT,
STEP_IMM_DPW8, STEP_OPCODE, STEP_DONE
};
// used by : ADD, SUB
static const AssemblyStep Steps_T_Add_Sub_SP [] =
{
STEP_DUMMY_REG, STEP_NEXTOPN, STEP_DUMMY_REG, STEP_NEXTOPN, STEP_CONSTANT,
STEP_IMM_W7, STEP_OPCODE, STEP_DONE
};
// Thumb2 : used by some ALU instructions (ADD, ADC, ...)
// ALU rd, rd, rm
static const AssemblyStep Steps_T2_ALU_ddm [] =
{
STEP_REG, 24, STEP_NEXTOPN, STEP_NEXTOPN, STEP_REG, 16,
STEP_NEXTOPN, STEP_SBIT, 4,
STEP_OPCODE, STEP_DONE
};
// Thumb2 : used by ADDW
// ALU rd, rn, immediate12bits
static const AssemblyStep Steps_T2_ALU_dn_imm12 [] =
{
STEP_REG, 24, STEP_NEXTOPN, STEP_REG, 0, STEP_NEXTOPN,
STEP_CONSTANT, STEP_T2_IMM_12, STEP_OPCODE, STEP_DONE
};
// Thumb2: used by : B (unconditional) <label>
static const AssemblyStep Steps_T2_BranchUncond [] =
{
STEP_T2_BRANCH24, STEP_OPCODE, STEP_DONE
};
static const AssemblyStep Steps_T2_BranchCond [] =
{
STEP_T2_BRANCH20, STEP_OPCODE, STEP_DONE
};
// Thumb2: used by : BL
static const AssemblyStep Steps_T2_BL [] =
{
STEP_CALL, STEP_OPCODE, STEP_DONE
};
// used by : BL
static const AssemblyStep Steps_T_BL [] =
{
STEP_CALL, STEP_OPCODE, STEP_DONE
};
// used by : BLX
static const AssemblyStep Steps_T_BLX [] =
{
STEP_LABEL, STEP_OPCODE, STEP_DONE
};
// Thumb2: used by : BLX
static const AssemblyStep Steps_T2_BLX [] =
{
STEP_CALL, STEP_OPCODE, STEP_DONE
};
// used by : BX
static const AssemblyStep Steps_T_BX [] =
{
STEP_REG, 3, STEP_OPCODE, STEP_DONE
};
// used by : AND, MUL, BIC, ADC, SUB, SBC
static const AssemblyStep Steps_T_ALU_dm [] =
{
STEP_REG, 0, STEP_NEXTOPN, STEP_OPEQ, STEP_NEXTOPN, STEP_REG, 3, STEP_T1_SETS_CR0,
STEP_OPCODE, STEP_DONE
};
// used by : CMP
// used by : CMP(1),
static const AssemblyStep Steps_T_RR_dc [] =
{
STEP_REG, 8, STEP_NEXTOPN, STEP_CONSTANT,
STEP_UIMM8, STEP_OPCODE, STEP_DONE
};
// used by : CMP(3),
static const AssemblyStep Steps_T_HRR_ds [] =
{
STEP_HREG, 0, STEP_HBIT, 7, STEP_NEXTOPN,
STEP_HREG, 3, STEP_HBIT, 6, STEP_OPCODE, STEP_DONE
};
static const AssemblyStep Steps_T2_n_modc12 [] =
{
STEP_REG, 0, STEP_NEXTOPN, STEP_CONSTANT,
STEP_MODCONST_12, STEP_OPCODE, STEP_DONE
};
// used by : LDM
static const AssemblyStep Steps_T_LDM_rspx [] =
{
STEP_INDIR, STEP_REGLIST, STEP_OFFSET, STEP_OPCODE, STEP_DONE
};
// used by : LDM
static const AssemblyStep Steps_T_LDM_rrx [] =
{
STEP_INDIR, STEP_REGLIST, STEP_UIMM8, STEP_BASEREG, 8, STEP_OPCODE,
STEP_DONE
};
// thumb2: used by : LDM
static const AssemblyStep Steps_T2_LDM [] =
{
STEP_INDIR, STEP_REGLIST, STEP_T2_REGLIST, STEP_BASEREG, 0, STEP_OPCODE, STEP_DONE
};
// thumb2: used by : LDM
static const AssemblyStep Steps_T2_LDM_ONE [] =
{
STEP_INDIR, STEP_REGLIST, 28, STEP_OPCODE, STEP_DONE
};
// thumb2: used by : STM
static const AssemblyStep Steps_T2_STM_rsp_ONE [] =
{
STEP_REGLIST, 28, STEP_OPCODE, STEP_DONE
};
// used by : LDRRET (Thumb2)
static const AssemblyStep Steps_T2_LDRRET [] =
{
STEP_NEXTOPN, STEP_BASED,
STEP_T2_MEMIMM_POS12_NEG8, 16,
STEP_OPCODE, STEP_DONE
};
// Thumb2 : MLS Rd, Rn, Rm, Ra -> dst, R12, src2, src1.
static const AssemblyStep Steps_T2_mls_dnma [] =
{
// dst (Rd) R12 (Rn) src2 (Rm) src1 (Ra)
STEP_REG, 24, STEP_R12, 0, STEP_NEXTOPN, STEP_REG, 16, STEP_NEXTOPN, STEP_REG, 28,
STEP_OPCODE, STEP_DONE
};
// used by : MULA
static const AssemblyStep Steps_T2_MULA_dnsm [] =
{
STEP_REG, 24, STEP_NEXTOPN, STEP_REG, 0, STEP_NEXTOPN, STEP_REG, 16,
STEP_NEXTOPN, STEP_REG, 28, STEP_OPCODE, STEP_DONE
};
// Thumb2 : MUL rd, rn, rm
static const AssemblyStep Steps_T2_ALU_dnm_no_sbit [] =
{
STEP_REG, 24, STEP_NEXTOPN, STEP_REG, 0, STEP_NEXTOPN, STEP_REG, 16, STEP_NOSBIT,
STEP_OPCODE, STEP_DONE
};
// Thumb2 : SMULL/UMULL RdLo, RdHi, Rn, Rm -> dst, r12, src1, src1
static const AssemblyStep Steps_T2_ALU_mull_no_sbit [] =
{
// RdLo RdHi 0000 Rm__ | 1111 1011 1000 Rn__
// dst (RdLo) src1 (Rn) src2 (Rm)
STEP_REG, 28, STEP_NEXTOPN, STEP_REG, 0, STEP_NEXTOPN, STEP_REG, 16, STEP_R12, 24,
STEP_NOSBIT, STEP_OPCODE, STEP_DONE
};
// Thumb2 : used by some ALU instructions (MVN, ...)
// ALU rd, rn ,modified constant 12 bit
static const AssemblyStep Steps_T2_ALU_dm_Shift_c [] =
{
STEP_REG, 24, STEP_NEXTOPN, STEP_REG, 16, STEP_NEXTOPN, STEP_T2_CONST_SHIFT_TYPE, 20, STEP_NEXTOPN,
STEP_CONSTANT, STEP_T2_SHIFT_IMM_5, STEP_SBIT, 4, STEP_OPCODE, STEP_DONE
};
// used by : NEG, MVN
static const AssemblyStep Steps_T_Neg_Mvn_dm [] =
{
STEP_REG, 0, STEP_NEXTOPN, STEP_REG, 3, STEP_T1_SETS_CR0, STEP_OPCODE, STEP_DONE
};
static const AssemblyStep Steps_T_Ret_rr [] =
{
STEP_HREG, 0, STEP_HBIT, 7, STEP_NEXTOPN, STEP_HREG, 3, STEP_HBIT, 6,
STEP_OPCODE, STEP_DONE
};
// used by : RET
static const AssemblyStep Steps_T_IWRET_dm [] =
{
STEP_NEXTOPN, STEP_REG, 3, STEP_OPCODE, STEP_DONE
};
// used by : MOV,
static const AssemblyStep Steps_T_ALU_rc [] =
{
STEP_REG, 8, STEP_NEXTOPN, STEP_CONSTANT, STEP_UIMM8, STEP_T1_SETS_CR0,
STEP_OPCODE, STEP_DONE
};
// used by : MOV
static const AssemblyStep Steps_T_MovHigh_rr [] =
{
STEP_HREG, 0, STEP_HBIT, 7, STEP_NEXTOPN, STEP_HREG, 3, STEP_HBIT, 6,
STEP_OPCODE, STEP_DONE
};
// used by : STM
static const AssemblyStep Steps_T_STM_rspx [] =
{
STEP_INDIR, STEP_REGLIST, STEP_OFFSET, STEP_OPCODE, STEP_DONE
};
// used by : STM
static const AssemblyStep Steps_T_STM_rrx [] =
{
STEP_INDIR, STEP_REGLIST, STEP_UIMM8, STEP_BASEREG, 8, STEP_OPCODE, STEP_DONE
};
// used by : STM
static const AssemblyStep Steps_T2_STM_rrx [] =
{
STEP_INDIR, STEP_REGLIST, STEP_T2_REGLIST, STEP_BASEREG, 0, STEP_OPCODE, STEP_DONE
};
// used by : LDR
static const AssemblyStep Steps_T_LDRN_rcr [] =
{
STEP_REG, 0, STEP_NEXTOPN, STEP_BASED, STEP_BASEREG, 3,
STEP_IMM, 6, STEP_FIXUP, STEP_LDRI, STEP_OPCODE, STEP_DONE
};
// used by : LDR
static const AssemblyStep Steps_T_LDRN_rrr [] =
{
STEP_REG, 0, STEP_NEXTOPN, STEP_INDEXED, STEP_BASEREG, 3, STEP_INDEXREG, 6,
STEP_LDR, STEP_OPCODE, STEP_DONE
};
// used by : LDR
static const AssemblyStep Steps_T_LDRN_PC_or_SP [] =
{
STEP_REG, 8, STEP_NEXTOPN, STEP_INDIR, STEP_IMM_W8, STEP_OPCODE,
STEP_DONE
};
// used by : LDR
static const AssemblyStep Steps_T_LDRN_ri [] =
{
STEP_REG, 0, STEP_NEXTOPN, STEP_INDIR, STEP_IMM, 6, STEP_OPCODE,
STEP_DONE
};
// Thumb2 LDR rxf, [rd, +#immediate12]
// Thumb2 LDR rxf, [rd, -#immediate8]
static const AssemblyStep Steps_T2_LDR_OFF [] =
{
STEP_REG, 28, STEP_NEXTOPN, STEP_BASED, STEP_BASEREG, 0,
STEP_T2_MEMIMM_POS12_NEG8, 16,
STEP_T2_MEM_TYPE, STEP_OPCODE, STEP_DONE
};
// Thumb2 LDR rxf, symbol
static const AssemblyStep Steps_T2_LDR_Stack [] =
{
STEP_REG, 28, STEP_NEXTOPN, STEP_INDIR,
STEP_T2_IMMSTACK_POS12_NEG8, 16, STEP_T2_MEM_TYPE,
STEP_OPCODE, STEP_DONE
};
// Thumb2 LDR rxf, [rn, rm {LSL #<shift>}]
static const AssemblyStep Steps_T2_LDR_RegIndir [] =
{
STEP_REG, 28, STEP_NEXTOPN, STEP_INDEXED, STEP_BASEREG, 0,
STEP_INDEXREG, 16, STEP_T2_MEM_TYPE, STEP_SCALE_CONST, 20, STEP_OPCODE, STEP_DONE
};
// Thumb2 LEA
static const AssemblyStep Steps_T2_LEA_rrd [] =
{
STEP_REG, 24, STEP_NEXTOPN, STEP_T2_STACKSYM_IMM_12, 0, STEP_OPCODE, STEP_DONE
};
// used by : LEA
static const AssemblyStep Steps_T_LEA_rrd [] =
{
STEP_REG, 8, STEP_NEXTOPN, STEP_SYM, STEP_IMM_W8, STEP_OPCODE, STEP_DONE
};
// used by : LEA
static const AssemblyStep Steps_T_LEA_rspd [] =
{
STEP_REG, 8, STEP_NEXTOPN, STEP_SYM, STEP_IMM_W8, STEP_OPCODE, STEP_DONE
};
// used by : MOV
static const AssemblyStep Steps_T_ALU_dn [] =
{
STEP_REG, 0, STEP_NEXTOPN, STEP_REG, 3,
STEP_OPCODE, STEP_DONE
};
// used by : STR
static const AssemblyStep Steps_T_STRN_rcr [] =
{
STEP_BASED, STEP_BASEREG, 3, STEP_IMM, 6, STEP_STRI, STEP_NEXTOPN, STEP_REG, 0,
STEP_OPCODE, STEP_DONE
};
// used by : STR
static const AssemblyStep Steps_T_STRN_rcr_custom [] =
{
STEP_BASEREG, 3, STEP_IMM, 6, STEP_STRI, STEP_NEXTOPN, STEP_REG, 0,
STEP_OPCODE, STEP_DONE
};
// used by : STRWI
static const AssemblyStep Steps_T_STRN_rrr [] =
{
STEP_INDEXED, STEP_BASEREG, 3, STEP_INDEXREG, 6, STEP_NEXTOPN, STEP_REG,
0, STEP_STR, STEP_OPCODE, STEP_DONE
};
// used by : STRWI
static const AssemblyStep Steps_T_STRN_ri [] =
{
STEP_INDIR, STEP_IMM, 6, STEP_NEXTOPN, STEP_REG, 0, STEP_OPCODE,
STEP_DONE
};
// used by : STR (stack)
static const AssemblyStep Steps_T_STRN_spcr [] =
{
STEP_INDIR, STEP_IMM_W8, STEP_NEXTOPN, STEP_REG, 8, STEP_OPCODE, STEP_DONE
};
// Thumb2 STR rxf, [rd, +#immediate12]
// Thumb2 STR rxf, [rd, -#immediate8]
static const AssemblyStep Steps_T2_STR_OFF [] =
{
STEP_BASED, STEP_BASEREG, 0,
STEP_T2_MEMIMM_POS12_NEG8, 16, STEP_T2_MEM_TYPE,
STEP_NEXTOPN, STEP_REG, 28,
STEP_OPCODE, STEP_DONE
};
// Thumb2 STR rxf, [sp, #offset]
static const AssemblyStep Steps_T2_STR_Stack [] =
{
STEP_INDIR, STEP_T2_IMMSTACK_POS12_NEG8, 16, STEP_T2_MEM_TYPE,
STEP_NEXTOPN, STEP_REG, 28,
STEP_OPCODE, STEP_DONE
};
// Thumb2 STR rxf, [rn, rm, LSL #<shift>]
static const AssemblyStep Steps_T2_STR_RegIndir [] =
{
STEP_INDEXED, STEP_BASEREG, 0, STEP_INDEXREG, 16,
STEP_SCALE_CONST, 20, STEP_T2_MEM_TYPE, STEP_NEXTOPN, STEP_REG, 28,
STEP_OPCODE, STEP_DONE
};
// Thumb2 : used by : MOVW,
static const AssemblyStep Steps_T2_ALU_r_imm16 [] =
{
STEP_REG, 24, STEP_NEXTOPN, STEP_CONSTANT, STEP_T2_IMM_16,
STEP_OPCODE, STEP_DONE
};
// Thumb2 : used by : MOV_W, ...
static const AssemblyStep Steps_T2_ALU_r_modc12 [] =
{
STEP_REG, 24, STEP_NEXTOPN, STEP_CONSTANT, STEP_MODCONST_12,
STEP_OPCODE, STEP_DONE
};
// Thumb2 : used MVN
// ALU rd, rm
static const AssemblyStep Steps_T2_ALU_dm [] =
{
STEP_REG, 24, STEP_NEXTOPN, STEP_REG, 16, STEP_SBIT, 4,
STEP_OPCODE, STEP_DONE
};
// Thumb2 : used by some ALU instructions (ADD, ADC, ...)
// ALU rd, rn ,modified constant 12 bit
static const AssemblyStep Steps_T2_ALU_dn_modc12 [] =
{
STEP_REG, 24, STEP_NEXTOPN, STEP_REG, 0, STEP_NEXTOPN, STEP_CONSTANT,
STEP_MODCONST_12, STEP_SBIT, 4, STEP_OPCODE, STEP_DONE
};
// used by : ASR
static const AssemblyStep Steps_T_Shift_ds [] =
{
STEP_REG, 0, STEP_NEXTOPN, STEP_OPEQ, STEP_NEXTOPN, STEP_REG, 3, STEP_T1_SETS_CR0,
STEP_OPCODE, STEP_DONE
};
// used by : ASR
static const AssemblyStep Steps_T_Shift_dmc [] =
{
STEP_REG, 0, STEP_NEXTOPN, STEP_REG, 3, STEP_NEXTOPN, STEP_CONSTANT, STEP_T1_SETS_CR0,
STEP_UIMM5, 6, STEP_OPCODE, STEP_DONE
};
static const AssemblyStep Steps_T2_Shift_dmc [] =
{
STEP_REG, 24, STEP_NEXTOPN, STEP_REG, 16, STEP_NEXTOPN,
STEP_CONSTANT, STEP_T2_SHIFT_IMM_5, STEP_SBIT, 4, STEP_OPCODE, STEP_DONE
};
static const AssemblyStep Steps_T2_ALU_dnm [] =
{
STEP_REG, 24, STEP_NEXTOPN, STEP_REG, 0, STEP_NEXTOPN,
STEP_REG, 16, STEP_SBIT, 4,
STEP_OPCODE, STEP_DONE
};
// Thumbs : TEQ rn, rn LS_u(#1) (aka, TIOFLW)
static const AssemblyStep Steps_T2_ALU_nn [] =
{
STEP_REG, 0, STEP_REG, 16, STEP_OPCODE, STEP_DONE
};
// Thumb2 : TST rn, rm
static const AssemblyStep Steps_T2_ALU_nm [] =
{
STEP_REG, 0, STEP_NEXTOPN, STEP_REG, 16,
STEP_OPCODE, STEP_DONE
};
// Thumb2 : used by some ALU instructions (CMN, CMP, ...)
// ALU rd, rn, constant shift
static const AssemblyStep Steps_T2_ALU_nm_Shift_c [] =
{
STEP_REG, 0, STEP_NEXTOPN, STEP_REG, 16, STEP_NEXTOPN,
STEP_T2_CONST_SHIFT_TYPE, 20, STEP_NEXTOPN, STEP_CONSTANT, STEP_T2_SHIFT_IMM_5,
STEP_OPCODE, STEP_DONE
};
// Thumb2 : used by some ALU instructions (ADD, ADC, ...)
// ALU rd, rn, rm, constant shift
static const AssemblyStep Steps_T2_ALU_dnm_Shift_c [] =
{
STEP_REG, 24, STEP_NEXTOPN, STEP_REG, 0, STEP_NEXTOPN, STEP_REG, 16,
STEP_NEXTOPN, STEP_T2_CONST_SHIFT_TYPE, 20, STEP_NEXTOPN, STEP_CONSTANT, STEP_T2_SHIFT_IMM_5,
STEP_SBIT, 4,
STEP_OPCODE, STEP_DONE
};
static const AssemblyStep Steps_T2_ALU_dnn [] =
{
STEP_REG, 24, STEP_NEXTOPN, STEP_REG, 0, STEP_REG, 16,
STEP_OPCODE, STEP_DONE
};
// Thumb2 : used by : MOVW
static const AssemblyStep Steps_T2_MOVW_reloc [] =
{
STEP_REG, 24, STEP_NEXTOPN, STEP_MOVW_reloc,
STEP_OPCODE, STEP_DONE
};
static const AssemblyStep Steps_T2_MOVT_reloc [] =
{
STEP_REG, 24, STEP_NEXTOPN, STEP_MOVT_reloc,
STEP_OPCODE, STEP_DONE
};
// used by : TST, CMP, CMN
static const AssemblyStep Steps_T_RR_ds [] =
{
STEP_REG, 0, STEP_NEXTOPN, STEP_REG, 3,
STEP_OPCODE, STEP_DONE
};
static const AssemblyStep Steps_T_Dbg [] =
{
STEP_OPCODE, STEP_DONE,
};
static const AssemblyStep Steps_NOP [] =
{
STEP_OPCODE, STEP_DONE,
};
static const AssemblyStep Steps_DBL_Unary_dm [] =
{
STEP_DREG, 28, 6, STEP_NEXTOPN,
STEP_DREG, 16, 21,
STEP_OPCODE, STEP_DONE
};
static const AssemblyStep Steps_DBL_ALU_dnm [] =
{
STEP_DREG, 28, 6, STEP_NEXTOPN,
STEP_DREG, 0, 23, STEP_NEXTOPN,
STEP_DREG, 16, 21,
STEP_OPCODE, STEP_DONE
};
static const AssemblyStep Steps_DBL_Cmp_dm [] =
{
STEP_DREG, 28, 6, STEP_NEXTOPN,
STEP_DREG, 16, 21,
STEP_OPCODE, STEP_DONE
};
static const AssemblyStep Steps_FLT_FMRS_flags [] =
{
STEP_OPCODE, STEP_DONE
};
static const AssemblyStep Steps_FLT_FMRSR_flags [] =
{
STEP_REG, 28,
STEP_OPCODE, STEP_DONE
};
static const AssemblyStep Steps_A_LDRN_DBL_Am_rcr [] =
{
// Dn (dest of load)
//
STEP_DREG, 28, 6, STEP_NEXTOPN,
// [Rn + #offset]
//
STEP_BASED, STEP_IMM_S8, STEP_BASEREG, 0,
STEP_FIXUP, STEP_OPCODE, STEP_DONE
};
static const AssemblyStep Steps_A_LDRN_FLT_Am_rcr [] =
{
// Sn (dest of load)
//
STEP_SREG, 28, 06, STEP_NEXTOPN,
// [Rn + #offset]
//
STEP_BASED, STEP_IMM_S8, STEP_BASEREG, 0,
STEP_FIXUP, STEP_OPCODE, STEP_DONE
};
static const AssemblyStep Steps_A_DBL_STRN_Am_rcr [] =
{
// [Rn + #offset]
//
STEP_BASED, STEP_IMM_S8, STEP_BASEREG, 0, STEP_NEXTOPN,
// Dn (src for store)
//
STEP_DREG, 28, 6,
STEP_FIXUP, STEP_OPCODE, STEP_DONE
};
static const AssemblyStep Steps_A_FLT_STRN_Am_rcr [] =
{
// [Rn + #offset]
//
STEP_BASED, STEP_IMM_S8, STEP_BASEREG, 0, STEP_NEXTOPN,
// Sn (src for store)
//
STEP_SREG, 28, 6,
STEP_FIXUP, STEP_OPCODE, STEP_DONE
};
static const AssemblyStep Steps_FCVTDS_ds [] =
{
STEP_DREG, 28, 6, STEP_NEXTOPN,
STEP_SREG, 16, 21,
STEP_OPCODE, STEP_DONE
};
static const AssemblyStep Steps_FCVTSD_sd [] =
{
STEP_SREG, 28, 6, STEP_NEXTOPN,
STEP_DREG, 16, 21,
STEP_OPCODE, STEP_DONE
};
static const AssemblyStep Steps_FITOD_ds [] =
{
STEP_DREG, 28, 6, STEP_NEXTOPN,
STEP_SREG, 16, 21,
STEP_OPCODE, STEP_DONE
};
static const AssemblyStep Steps_FDTOI_sd [] =
{
STEP_SREG, 28, 6, STEP_NEXTOPN,
STEP_DREG, 16, 21,
STEP_OPCODE, STEP_DONE
};
static const AssemblyStep Steps_FLT_FMSR_sr [] =
{
STEP_SREG, 0, 23, STEP_NEXTOPN,
STEP_REG, 28,
STEP_OPCODE, STEP_DONE
};
static const AssemblyStep Steps_FLT_FMRS_rs [] =
{
STEP_REG, 28, STEP_NEXTOPN,
STEP_SREG, 0, 23,
STEP_OPCODE, STEP_DONE
};
static const AssemblyStep Steps_T2_PLD_offset [] =
{
STEP_BASED, STEP_BASEREG, 0,
STEP_T2_MEMIMM_POS12_NEG8, 16,
STEP_OPCODE, STEP_DONE
};
// Thumb2 PLD_W [rn, rm]
static const AssemblyStep Steps_T2_PLD_RegIndir [] =
{
STEP_INDEXED, STEP_BASEREG, 0,
STEP_INDEXREG, 16,
STEP_OPCODE, STEP_DONE
};
static const AssemblyStep Steps_A_DBL_LDM[] =
{
STEP_BASED, STEP_AM5, STEP_BASEREG, 0, STEP_DREGLIST,
STEP_FIXUP, STEP_OPCODE, STEP_DONE
};
static const AssemblyStep Steps_A_DBL_STM[] =
{
STEP_BASED, STEP_AM5, STEP_BASEREG, 0, STEP_DREGLIST,
STEP_FIXUP, STEP_OPCODE, STEP_DONE
};