blob: 3612ecc0cfc071b2d0b376c6fc690d7b0d05172f [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2009, 2010 Nokia and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Nokia - Initial API and implementation
*******************************************************************************/
package org.eclipse.cdt.debug.edc.internal.arm.disassembler;
/**
* ARM Opcode map.
*/
public class OpcodeARM {
public enum Index {
// 32-bit ARM instructions
arm_adc__imm, arm_adc__reg, arm_adc__rsr,
arm_add__imm, arm_add__reg, arm_add__rsr,
arm_adr__higher, arm_adr__lower,
arm_and__imm, arm_and__reg, arm_and__rsr,
arm_asr__imm, arm_asr__reg,
arm_b,
arm_bfc,
arm_bfi,
arm_bic__imm, arm_bic__reg, arm_bic__rsr,
arm_bkpt,
arm_bl,
arm_blx__imm, arm_blx__reg,
arm_bx,
arm_bxj,
arm_cdp,
arm_cdp2,
arm_clrex,
arm_clz,
arm_cmn__imm, arm_cmn__reg, arm_cmn__rsr,
arm_cmp__imm, arm_cmp__reg, arm_cmp__rsr,
arm_cps,
arm_dbg,
arm_dmb,
arm_dsb,
arm_eor__imm, arm_eor__reg, arm_eor__rsr,
arm_isb,
arm_ldc__imm, arm_ldc__lit,
arm_ldc2__imm, arm_ldc2__lit,
arm_ldm, arm_ldm__exc_ret, arm_ldm__user_reg,
arm_ldmda,
arm_ldmdb,
arm_ldmib,
arm_ldr__imm, arm_ldr__lit, arm_ldr__reg,
arm_ldrb__imm, arm_ldrb__lit, arm_ldrb__reg,
arm_ldrbt__imm, arm_ldrbt__reg,
arm_ldrd__imm, arm_ldrd__lit, arm_ldrd__reg,
arm_ldrex,
arm_ldrexb,
arm_ldrexd,
arm_ldrexh,
arm_ldrh__imm, arm_ldrh__lit, arm_ldrh__reg,
arm_ldrht__imm, arm_ldrht__reg,
arm_ldrsb__imm, arm_ldrsb__lit, arm_ldrsb__reg,
arm_ldrsbt__imm, arm_ldrsbt__reg,
arm_ldrsh__imm, arm_ldrsh__lit, arm_ldrsh__reg,
arm_ldrsht__imm, arm_ldrsht__reg,
arm_ldrt__imm, arm_ldrt__reg,
arm_lsl__imm, arm_lsl__reg,
arm_lsr__imm, arm_lsr__reg,
arm_mcr,
arm_mcr2,
arm_mcrr,
arm_mcrr2,
arm_mla,
arm_mls,
arm_mov__imm, arm_mov__reg,
arm_movw,
arm_movt,
arm_mrc,
arm_mrc2,
arm_mrrc,
arm_mrrc2,
arm_mrs,
arm_msr__imm, arm_msr__reg, arm_msr__sys_imm, arm_msr__sys_reg,
arm_mul,
arm_mvn__imm, arm_mvn__reg, arm_mvn__rsr,
arm_nop,
arm_orr__imm, arm_orr__reg, arm_orr__rsr,
arm_pkh,
arm_pld__imm, arm_pld__lit, arm_pld__reg,
arm_pli__imm_lit, arm_pli__reg,
arm_pop__regs, arm_pop__reg,
arm_push__regs, arm_push__reg,
arm_qadd,
arm_qdadd,
arm_qdsub,
arm_qsub,
arm__r_dnm_math,
arm_rbit,
arm_rev,
arm_rev16,
arm_revsh,
arm_rfe,
arm_ror__imm, arm_ror__reg,
arm_rrx,
arm_rsb__imm, arm_rsb__reg, arm_rsb__rsr,
arm_rsc__imm, arm_rsc__reg, arm_rsc__rsr,
arm_sbc__imm, arm_sbc__reg, arm_sbc__rsr,
arm_sbfx,
arm_sel,
arm_setend,
arm_sev,
arm_smc,
arm_smla,
arm_smlad,
arm_smlal,
arm_smlalxy,
arm_smlald,
arm_smlaw,
arm_smlsd,
arm_smlsld,
arm_smmla,
arm_smmls,
arm_smmul,
arm_smuad,
arm_smul,
arm_smull,
arm_smulw,
arm_smusd,
arm_srs,
arm_ssat,
arm_ssat16,
arm_stc,
arm_stc2,
arm_stm__regs, arm_stm__usr_regs,
arm_stmda,
arm_stmdb,
arm_stmib,
arm_str__imm, arm_str__reg,
arm_strb__imm, arm_strb__reg,
arm_strbt__imm, arm_strbt__reg,
arm_strd__imm, arm_strd__reg,
arm_strex,
arm_strexb,
arm_strexd,
arm_strexh,
arm_strh__imm, arm_strh__reg,
arm_strht__imm, arm_strht__reg,
arm_strt__imm, arm_strt__reg,
arm_sub__imm, arm_sub__reg, arm_sub__rsr,
arm_svc,
arm_swp,
arm_sxtab,
arm_sxtab16,
arm_sxtah,
arm_sxtb,
arm_sxtb16,
arm_sxth,
arm_teq__imm, arm_teq__reg, arm_teq__rsr,
arm_tst__imm, arm_tst__reg, arm_tst__rsr,
arm_ubfx,
arm_umaal,
arm_umlal,
arm_umull,
arm_usad8,
arm_usada8,
arm_usat,
arm_usat16,
arm_uxtab,
arm_uxtab16,
arm_uxtah,
arm_uxtb,
arm_uxtb16,
arm_uxth,
arm_vaba,
arm_vabal,
arm_vabd__int, arm_vabd__f32,
arm_vabdl,
arm_vabs, arm_vabs__f,
arm_vacge_vacgt,
arm_vadd__int, arm_vadd__f32, arm_vadd__fp_f, arm_vaddl_vaddw,
arm_vaddhn,
arm_vand,
arm_vbic,
arm_vbif_vbit_vbsl_veor,
arm_vceq__reg_int, arm_vceq__reg_f32, arm_vceq__imm0,
arm_vcge__reg_int, arm_vcge__reg_f32, arm_vcge__imm0,
arm_vcgt__reg_int, arm_vcgt__reg_f32, arm_vcgt__imm0,
arm_vcle,
arm_vcls,
arm_vclt,
arm_vclz,
arm_vcmp__reg, arm_vcmp__to_0,
arm_vcnt,
arm_vcvt__fp_i_vec, arm_vcvt__fp_i_reg, arm_vcvt__fp_fix_vec,
arm_vcvt__fp_fix_reg, arm_vcvt__dp_sp, arm_vcvt__hp_sp_vec, arm_vcvt__hp_sp_reg,
arm_vdiv,
arm_vdup__scalar, arm_vdup__reg,
arm_vext,
arm_vhadd_vhsub,
arm_vld__multi,
arm_vld__xlane,
arm_vldm__64, arm_vldm__32,
arm_vldr__64, arm_vldr__32,
arm_vmax_vmin__int, arm_vmax_vmin__fp,
arm_vml__int, arm_vml__int_long, arm_vml__f32, arm_vml__fp, arm_vml__scalar,
arm_vmov_vbitwise, arm_vmov__imm, arm_vmov_vorr, arm_vmov__reg_f,
arm_vmov_5, arm_vmov_6, arm_vmov_7, arm_vmov_8, arm_vmov_9,
arm_vmovl,
arm_vmovn,
arm_vmrs,
arm_vmsr,
arm_vmul_1, arm_vmul_f32, arm_vmul__fp_2, arm_vmul__scalar,
arm_vmull,
arm_vmvn,
arm_vneg, arm_vneg__f,
arm_vnml,
arm_vnmul,
arm_vorn,
arm_vpadal,
arm_vpadd__int, arm_vpadd__f32,
arm_vpaddl,
arm_vpmax_vpmin__int, arm_vpmax_vpmin__fp,
arm_vpop,
arm_vpush,
arm_vqabs,
arm_vqadd,
arm_vqdml__vec, arm_vqdml__scalar,
arm_vqdmulh__vec, arm_vqdmulh__scalar,
arm_vqdmull__vec, arm_vqdmull__scalar,
arm_vqmov,
arm_vqneg,
arm_vqrdmulh__vec, arm_vqrdmulh__scalar,
arm_vqrshl,
arm_vqrshr,
arm_vqshl__reg, arm_vqshl__imm,
arm_vqshr,
arm_vqsub,
arm_vraddhn,
arm_vrecpe,
arm_vrecps,
arm_vrev,
arm_vrhadd,
arm_vrshl,
arm_vrshr,
arm_vrshrn,
arm_vrsqrte,
arm_vrsqrts,
arm_vrsra,
arm_vrsubhn,
arm_vshl__imm, arm_vshl__reg,
arm_vshll__various, arm_vshll__max,
arm_vshr,
arm_vshrn,
arm_vsli,
arm_vsqrt,
arm_vsra,
arm_vsri,
arm_vst__multi,
arm_vst__xlane,
arm_vstm__64, arm_vstm__32,
arm_vstr__64, arm_vstr__32,
arm_vsub__int, arm_vsub__f32, arm_vsub__fp_f, arm_vsubl_vsubw,
arm_vsubhn,
arm_vswp,
arm_vtb,
arm_vtrn,
arm_vtst,
arm_vuzp,
arm_vzip,
arm_wfe,
arm_wfi,
arm_yield,
arm_undefined,
// 16-bit Thumb instructions
thumb_adc,
thumb_add__imm, thumb_add__imm_to_sp, thumb_add__reg,
thumb_add__reg_imm, thumb_add__reg_reg,
thumb_add__sp_imm,
thumb_adr,
thumb_and,
thumb_asr__imm, thumb_asr__reg,
thumb_b_1, thumb_b_2,
thumb_bic,
thumb_bkpt,
thumb_blx,
thumb_bx,
thumb_cbnz_cbz,
thumb_cmn,
thumb_cmp__imm, thumb_cmp__reg, thumb_cmp__reg_hi,
thumb_cps,
thumb_eor,
thumb_it,
thumb_ldm,
thumb_ldr__imm, thumb_ldr__imm_sp, thumb_ldr__lit, thumb_ldr__reg,
thumb_ldrb__imm, thumb_ldrb__reg,
thumb_ldrh__imm, thumb_ldrh__reg,
thumb_ldrsb,
thumb_ldrsh,
thumb_lsl__imm, thumb_lsl__reg,
thumb_lsr__imm, thumb_lsr__reg,
thumb_mov__imm, thumb_mov__reg,
thumb_movs,
thumb_mul,
thumb_mvn,
thumb_nop,
thumb_orr,
thumb_pop,
thumb_push,
thumb_rev,
thumb_rev16,
thumb_revsh,
thumb_ror,
thumb_rsb,
thumb_sbc,
thumb_setend,
thumb_sev,
thumb_stm,
thumb_str__imm, thumb_str__imm_sp, thumb_str__reg,
thumb_strb__imm, thumb_strb__reg,
thumb_strh__imm, thumb_strh__reg,
thumb_sub__imm, thumb_sub__imm_from_sp, thumb_sub__reg_imm, thumb_sub__reg_reg,
thumb_svc,
thumb_sxtb,
thumb_sxth,
thumb_tst,
thumb_uxtb,
thumb_uxth,
thumb_wfe,
thumb_wfi,
thumb_yield,
thumb_undefined,
// 32-bit Thumb instructions
thumb2_adc__imm, thumb2_adc__reg,
thumb2_add__imm, thumb2_add__reg, /* thumb2_add__sp_imm, thumb2_add__sp_reg, */
thumb2_addw, /* thumb2_addw__sp_imm, */
thumb2_adr__sub, thumb2_adr__add,
thumb2_and__imm, thumb2_and__reg,
thumb2_asr__imm, thumb2_asr__reg,
thumb2_b__cond, thumb2_b__uncond,
thumb2_bfc,
thumb2_bfi,
thumb2_bfx,
thumb2_bic__imm, thumb2_bic__reg,
thumb2_bl,
thumb2_blx,
thumb2_bxj,
thumb2_cdp,
thumb2_cdp2,
thumb2_clrex,
thumb2_clz,
thumb2_cmn__imm, thumb2_cmn__reg,
thumb2_cmp__imm, thumb2_cmp__reg,
thumb2_cps,
thumb2_dbg,
thumb2_dmb,
thumb2_dsb,
thumb2_eor__imm, thumb2_eor__reg,
thumb2_enterx_leavex,
thumb2_isb,
thumb2_ldc,
thumb2_ldm,
thumb2_ldmdb,
thumb2_ldr,
thumb2_ldrd__imm, thumb2_ldrd__lit,
thumb2_ldrex,
thumb2_ldrexx,
thumb2_lsl__imm, thumb2_lsl__reg,
thumb2_lsr__imm, thumb2_lsr__reg,
thumb2_mcr,
thumb2_mcrr,
thumb2_ml,
thumb2_mov__imm, thumb2_mov__reg,
thumb2_movx,
thumb2_mrc,
thumb2_mrrc,
thumb2_mrs,
thumb2_msr,
thumb2_mul,
thumb2_mvn__imm, thumb2_mvn__reg,
thumb2_nop,
thumb2_orn__imm, thumb2_orn__reg,
thumb2_orr__imm, thumb2_orr__reg,
thumb2_pkh,
thumb2_pld,
thumb2_pli,
thumb2_pop__regs, thumb2_pop__reg,
thumb2_push__regs, thumb2_push__reg,
thumb2_qadd,
thumb2_qsub,
thumb2__r_dnm_math,
thumb2_reverse,
thumb2_rfe,
thumb2_ror__imm, thumb2_ror__reg,
thumb2_rrx,
thumb2_rsb__imm, thumb2_rsb__reg,
thumb2_sbc__imm, thumb2_sbc__reg,
thumb2_sdiv,
thumb2_sel,
thumb2_sev,
thumb2_smc,
thumb2_smla,
thumb2_smlad,
thumb2_smlal,
thumb2_smlald,
thumb2_smlaw,
thumb2_smlsd,
thumb2_smlsld,
thumb2_smmla,
thumb2_smmls,
thumb2_smmul,
thumb2_smuad,
thumb2_smul,
thumb2_smull,
thumb2_smulw,
thumb2_smusd,
thumb2_srs,
thumb2_ssat,
thumb2_ssat16,
thumb2_stc,
thumb2_stm,
thumb2_stmdb,
thumb2_str,
thumb2_strd,
thumb2_strex,
thumb2_strexx,
thumb2_sub__imm, thumb2_sub__reg,
thumb2_subs,
thumb2_subw,
thumb2_sxtab,
thumb2_sxtab16,
thumb2_sxtah,
thumb2_sxtb,
thumb2_sxtb16,
thumb2_sxth,
thumb2_tb,
thumb2_teq__imm, thumb2_teq__reg,
thumb2_tst__imm, thumb2_tst__reg,
thumb2_udiv,
thumb2_umaal,
thumb2_umlal,
thumb2_umull,
thumb2_usad8,
thumb2_usada8,
thumb2_usat,
thumb2_usat16,
thumb2_uxtab,
thumb2_uxtab16,
thumb2_uxtah,
thumb2_uxtb,
thumb2_uxtb16,
thumb2_uxth,
thumb2_vaba,
thumb2_vabal,
thumb2_vabd__int, thumb2_vabd__f32,
thumb2_vabdl,
thumb2_vabs, thumb2_vabs__f,
thumb2_vacge_vacgt,
thumb2_vadd__int, thumb2_vadd__f32, thumb2_vadd__fp_f, thumb2_vaddl_vaddw,
thumb2_vaddhn,
thumb2_vand,
thumb2_vbic__reg,
thumb2_vbif_vbit_vbsl_veor,
thumb2_vceq__reg_int, thumb2_vceq__reg_f32, thumb2_vceq__imm0,
thumb2_vcge__reg_int, thumb2_vcge__reg_f32, thumb2_vcge__imm0,
thumb2_vcgt__reg_int, thumb2_vcgt__reg_f32, thumb2_vcgt__imm0,
thumb2_vcle,
thumb2_vcls,
thumb2_vclt,
thumb2_vclz,
thumb2_vcmp__reg, thumb2_vcmp__to_0,
thumb2_vcnt,
thumb2_vcvt__fp_i_vec, thumb2_vcvt__fp_i_reg,
thumb2_vcvt__fp_fix_vec, thumb2_vcvt__fp_fix_reg,
thumb2_vcvt__dp_sp, thumb2_vcvt__hp_sp_vec, thumb2_vcvt__hp_sp_reg,
thumb2_vdiv,
thumb2_vdup__scalar, thumb2_vdup__reg,
thumb2_vext,
thumb2_vhadd_vhsub,
thumb2_vld__multi,
thumb2_vld__xlane,
thumb2_vldm__64, thumb2_vldm__32,
thumb2_vldr__64, thumb2_vldr__32,
thumb2_vmax_vmin__int, thumb2_vmax_vmin__fp,
thumb2_vml__int, thumb2_vml__int_long, thumb2_vml__f32,
thumb2_vml__fp, thumb2_vml__scalar,
thumb2_vmov_vbitwise, thumb2_vmov__imm, thumb2_vmov_vorr, thumb2_vmov__reg_f,
thumb2_vmov_5, thumb2_vmov_6, thumb2_vmov_7, thumb2_vmov_8, thumb2_vmov_9,
thumb2_vmovl,
thumb2_vmovn,
thumb2_vmrs,
thumb2_vmsr,
thumb2_vmul_1, thumb2_vmul__f32, thumb2_vmul__fp_2, thumb2_vmul__scalar,
thumb2_vmull,
thumb2_vmvn,
thumb2_vneg, thumb2_vneg__f,
thumb2_vnml,
thumb2_vnmul,
thumb2_vorn,
thumb2_vpadal,
thumb2_vpadd__int, thumb2_vpadd__f32,
thumb2_vpaddl,
thumb2_vpmax_vpmin__int, thumb2_vpmax_vpmin__fp,
thumb2_vpop,
thumb2_vpush,
thumb2_vqabs,
thumb2_vqadd,
thumb2_vqdml__vec, thumb2_vqdml__scalar,
thumb2_vqdmulh__vec, thumb2_vqdmulh__scalar,
thumb2_vqdmull__vec, thumb2_vqdmull__scalar,
thumb2_vqmov,
thumb2_vqneg,
thumb2_vqrdmulh__vec, thumb2_vqrdmulh__scalar,
thumb2_vqrshl,
thumb2_vqrshr,
thumb2_vqshl__reg, thumb2_vqshl__imm,
thumb2_vqshr,
thumb2_vqsub,
thumb2_vraddhn,
thumb2_vrecpe,
thumb2_vrecps,
thumb2_vrev,
thumb2_vrhadd,
thumb2_vrshl,
thumb2_vrshr,
thumb2_vrshrn,
thumb2_vrsqrte,
thumb2_vrsqrts,
thumb2_vrsra,
thumb2_vrsubhn,
thumb2_vshl__imm, thumb2_vshl__reg,
thumb2_vshll__various, thumb2_vshll__max,
thumb2_vshr,
thumb2_vshrn,
thumb2_vsli,
thumb2_vsqrt,
thumb2_vsra,
thumb2_vsri,
thumb2_vst__multi,
thumb2_vst__xlane,
thumb2_vstm__64, thumb2_vstm__32,
thumb2_vstr__64, thumb2_vstr__32,
thumb2_vsub__int, thumb2_vsub__f32, thumb2_vsub__fp_f, thumb2_vsubl_vsubw,
thumb2_vsubhn,
thumb2_vswp,
thumb2_vtb,
thumb2_vtrn,
thumb2_vtst,
thumb2_vuzp,
thumb2_vzip,
thumb2_wfe,
thumb2_wfi,
thumb2_yield,
thumb2_undefined,
// 16-bit ThumbEE instructions
thumbEE_chka,
thumbEE_hb,
thumbEE_hblp,
thumbEE_hbp,
thumbEE_ldr_1,
thumbEE_ldr_2,
thumbEE_ldr_3,
thumbEE_ldr_4,
thumbEE_ldrh,
thumbEE_ldrsh,
thumbEE_str_1, thumbEE_str_2,
thumbEE_strh,
thumbEE_undefined,
invalid
};
// Reference manual citations (e.g., "A8.6.67") refer to sections in the ARM Architecture
// Reference Manual ARMv7-A and ARMv7-R Edition, Errata markup
public static final OpcodeARM arm_opcode_table[] = {
// A8.6.67 LDRD (literal)
// Encoding A1 ARMv5TE*, ARMv6*, ARMv7
// ldrd<c> <Rt>,<Rt2>,<label> ldrd<c> <Rt>,<Rt2>,[pc,#-0] Special case
// Unpredictable if (1) is 0 or (0) is 1: xxxx000(1)x1(0)01111xxxxxxxx1101xxxx
// must precede arm_ldrd__imm in table
new OpcodeARM(Index.arm_ldrd__lit, "ldrd", "xxxx000xx1x01111xxxxxxxx1101xxxx"),
// A8.6.66 LDRD (immediate)
// Encoding A1 ARMv5TE*, ARMv6*, ARMv7
// ldrd<c> <Rt>,<Rt2>,[<Rn>{,#+/-<imm8>}] ldrd<c> <Rt>,<Rt2>,[<Rn>],#+/-<imm8> ldrd<c> <Rt>,<Rt2>,[<Rn>,#+/-<imm8>]!
// must follow arm_ldrd__lit in table
new OpcodeARM(Index.arm_ldrd__imm, "ldrd", "xxxx000xx1x0xxxxxxxxxxxx1101xxxx"),
// A8.6.77 LDRHT
// Encoding A1 ARMv6T2, ARMv7
// ldrht<c> <Rt>, [<Rn>] {, #+/-<imm8>}
// must precede arm_ldrh__imm in table
new OpcodeARM(Index.arm_ldrht__imm, "ldrht", "xxxx0000x111xxxxxxxxxxxx1011xxxx"),
// A8.6.75 LDRH (literal)
// Encoding A1 ARMv4*, ARMv5T*, ARMv6*, ARMv7
// ldrh<c> <Rt>,<label> ldrh<c> <Rt>,[pc,#-0] Special case
// Unpredictable if (1) is 0 or (0) is 1: xxxx000(1)x1(0)11111xxxxxxxx1011xxxx
// must precede arm_ldrh__imm in table
new OpcodeARM(Index.arm_ldrh__lit, "ldrh", "xxxx000xx1x11111xxxxxxxx1011xxxx"),
// A8.6.74 LDRH (immediate, ARM)
// Encoding A1 ARMv4*, ARMv5T*, ARMv6*, ARMv7
// ldrh<c> <Rt>,[<Rn>{,#+/-<imm8>}] ldrh<c> <Rt>,[<Rn>],#+/-<imm8> ldrh<c> <Rt>,[<Rn>,#+/-<imm8>]!
// must follow arm_ldrh__lit in table
// must follow arm_ldrht__imm in table
new OpcodeARM(Index.arm_ldrh__imm, "ldrh", "xxxx000xx1x1xxxxxxxxxxxx1011xxxx"),
// A8.6.81 LDRSBT
// Encoding A1 ARMv6T2, ARMv7
// ldrsbt<c> <Rt>, [<Rn>] {, #+/-<imm8>}
// must precede arm_ldrsb__imm in table
new OpcodeARM(Index.arm_ldrsbt__imm, "ldrsbt", "xxxx0000x111xxxxxxxxxxxx1101xxxx"),
// A8.6.79 LDRSB (literal)
// Encoding A1 ARMv4*, ARMv5T*, ARMv6*, ARMv7
// ldrsb<c> <Rt>,<label> ldrsb<c> <Rt>,[pc,#-0] Special case
// Unpredictable if (1) is 0 or (0) is 1: xxxx000(1)x1(0)11111xxxxxxxx1101xxxx
// must precede arm_ldrsb__imm in table
new OpcodeARM(Index.arm_ldrsb__lit, "ldrsb", "xxxx000xx1x11111xxxxxxxx1101xxxx"),
// A8.6.78 LDRSB (immediate)
// Encoding A1 ARMv4*, ARMv5T*, ARMv6*, ARMv7
// ldrsb<c> <Rt>,[<Rn>{,#+/-<imm8>}] ldrsb<c> <Rt>,[<Rn>],#+/-<imm8> ldrsb<c> <Rt>,[<Rn>,#+/-<imm8>]!
// must follow arm_ldrsb__lit in table
// must follow arm_ldrsbt__imm in table
new OpcodeARM(Index.arm_ldrsb__imm, "ldrsb", "xxxx000xx1x1xxxxxxxxxxxx1101xxxx"),
// A8.6.85 LDRSHT
// Encoding A1 ARMv6T2, ARMv7
// ldrsht<c> <Rt>, [<Rn>] {, #+/-<imm8>}
// must precede arm_ldrsh__imm in table
new OpcodeARM(Index.arm_ldrsht__imm, "ldrsht", "xxxx0000x111xxxxxxxxxxxx1111xxxx"),
// A8.6.83 LDRSH (literal)
// Encoding A1 ARMv4*, ARMv5T*, ARMv6*, ARMv7
// ldrsh<c> <Rt>,<label> ldrsh<c> <Rt>,[pc,#-0] Special case
// Unpredictable if (1) is 0 or (0) is 1: xxxx000(1)x1(0)11111xxxxxxxx1111xxxx
// must precede arm_ldrsh__imm in table
new OpcodeARM(Index.arm_ldrsh__lit, "ldrsh", "xxxx000xx1x11111xxxxxxxx1111xxxx"),
// A8.6.82 LDRSH (immediate)
// Encoding A1 ARMv4*, ARMv5T*, ARMv6*, ARMv7
// ldrsh<c> <Rt>,[<Rn>{,#+/-<imm8>}] ldrsh<c> <Rt>,[<Rn>],#+/-<imm8> ldrsh<c> <Rt>,[<Rn>,#+/-<imm8>]!
// must follow arm_ldrsh__lit in table
// must follow arm_ldrsht__imm in table
new OpcodeARM(Index.arm_ldrsh__imm, "ldrsh", "xxxx000xx1x1xxxxxxxxxxxx1111xxxx"),
// A8.6.200 STRD (immediate)
// Encoding A1 ARMv5TE*, ARMv6*, ARMv7
// strd<c> <Rt>,<Rt2>,[<Rn>{,#+/-<imm8>}] strd<c> <Rt>,<Rt2>,[<Rn>],#+/-<imm8> strd<c> <Rt>,<Rt2>,[<Rn>,#+/-<imm8>]!
new OpcodeARM(Index.arm_strd__imm, "strd", "xxxx000xx1x0xxxxxxxxxxxx1111xxxx"),
// A8.6.209 STRHT
// Encoding A1 ARMv6T2, ARMv7
// strht<c> <Rt>, [<Rn>] {, #+/-<imm8>}
// must precede arm_strh__imm in table
new OpcodeARM(Index.arm_strht__imm, "strht", "xxxx0000x110xxxxxxxxxxxx1011xxxx"),
// A8.6.207 STRH (immediate, ARM)
// Encoding A1 ARMv4*, ARMv5T*, ARMv6*, ARMv7
// strh<c> <Rt>,[<Rn>{,#+/-<imm8>}] strh<c> <Rt>,[<Rn>],#+/-<imm8> strh<c> <Rt>,[<Rn>,#+/-<imm8>]!
// must follow arm_strht__imm in table
new OpcodeARM(Index.arm_strh__imm, "strh", "xxxx000xx1x0xxxxxxxxxxxx1011xxxx"),
// A8.6.1 ADC (immediate)
// Encoding A1 ARMv4*, ARMv5T*, ARMv6*, ARMv7
// adc{s}<c> <Rd>,<Rn>,#<const>
new OpcodeARM(Index.arm_adc__imm, "adc", "xxxx0010101xxxxxxxxxxxxxxxxxxxxx"),
// A8.6.2 ADC (register)
// Encoding A1 ARMv4*, ARMv5T*, ARMv6*, ARMv7
// adc{s}<c> <Rd>,<Rn>,<Rm>{,<shift>}
new OpcodeARM(Index.arm_adc__reg, "adc", "xxxx0000101xxxxxxxxxxxxxxxx0xxxx"),
// A8.6.3 ADC (register-shifted register)
// Encoding A1 ARMv4*, ARMv5T*, ARMv6*, ARMv7
// adc{s}<c> <Rd>,<Rn>,<Rm>,<type> <Rs>
new OpcodeARM(Index.arm_adc__rsr, "adc", "xxxx0000101xxxxxxxxxxxxx0xx1xxxx"),
// A8.6.10 ADR
// Encoding A1 ARMv4*, ARMv5T*, ARMv6*, ARMv7
// adr<c> <Rd>,<label> add<c> <Rd>,pc,#<const> Alternative form
// must precede arm_add__imm in table
new OpcodeARM(Index.arm_adr__higher, "add", "xxxx001010001111xxxxxxxxxxxxxxxx"),
// A8.6.5 ADD (immediate, ARM)
// Encoding A1 ARMv4*, ARMv5T*, ARMv6*, ARMv7
// add{s}<c> <Rd>,<Rn>,#<const>
// A8.6.8 ADD (SP plus immediate)
// Encoding A1 ARMv4*, ARMv5T*, ARMv6*, ARMv7
// add{s}<c> <Rd>,sp,#<const>
//
// must follow arm_adr__higher in table
new OpcodeARM(Index.arm_add__imm, "add", "xxxx0010100xxxxxxxxxxxxxxxxxxxxx"),
// A8.6.6 ADD (register)
// Encoding A1 ARMv4*, ARMv5T*, ARMv6*, ARMv7
// add{s}<c> <Rd>,<Rn>,<Rm>{,<shift>}
// A8.6.9 ADD (SP plus register)
// Encoding A1 ARMv4*, ARMv5T*, ARMv6*, ARMv7
// add{s}<c> <Rd>,sp,<Rm>{,<shift>}
//
new OpcodeARM(Index.arm_add__reg, "add", "xxxx0000100xxxxxxxxxxxxxxxx0xxxx"),
// A8.6.7 ADD (register-shifted register)
// Encoding A1 ARMv4*, ARMv5T*, ARMv6*, ARMv7
// add{s}<c> <Rd>,<Rn>,<Rm>,<type> <Rs>
new OpcodeARM(Index.arm_add__rsr, "add", "xxxx0000100xxxxxxxxxxxxx0xx1xxxx"),
// A8.6.11 AND (immediate)
// Encoding A1 ARMv4*, ARMv5T*, ARMv6*, ARMv7
// and{s}<c> <Rd>,<Rn>,#<const>
new OpcodeARM(Index.arm_and__imm, "and", "xxxx0010000xxxxxxxxxxxxxxxxxxxxx"),
// A8.6.12 AND (register)
// Encoding A1 ARMv4*, ARMv5T*, ARMv6*, ARMv7
// and{s}<c> <Rd>,<Rn>,<Rm>{,<shift>}
new OpcodeARM(Index.arm_and__reg, "and", "xxxx0000000xxxxxxxxxxxxxxxx0xxxx"),
// A8.6.13 AND (register-shifted register)
// Encoding A1 ARMv4*, ARMv5T*, ARMv6*, ARMv7
// and{s}<c> <Rd>,<Rn>,<Rm>,<type> <Rs>
new OpcodeARM(Index.arm_and__rsr, "and", "xxxx0000000xxxxxxxxxxxxx0xx1xxxx"),
// A8.6.14 ASR (immediate)
// Encoding A1 ARMv4*, ARMv5T*, ARMv6*, ARMv7
// asr{s}<c> <Rd>,<Rm>,#<imm>
// Unpredictable if (0) is 1: xxxx0001101x(0)(0)(0)(0)xxxxxxxxx100xxxx
new OpcodeARM(Index.arm_asr__imm, "asr", "xxxx0001101xxxxxxxxxxxxxx100xxxx"),
// A8.6.15 ASR (register)
// Encoding A1 ARMv4*, ARMv5T*, ARMv6*, ARMv7
// asr{s}<c> <Rd>,<Rn>,<Rm>
// Unpredictable if (0) is 1: xxxx0001101x(0)(0)(0)(0)xxxxxxxx0101xxxx
new OpcodeARM(Index.arm_asr__reg, "asr", "xxxx0001101xxxxxxxxxxxxx0101xxxx"),
// A8.6.23 BL, BLX (immediate)
// Encoding A2 ARMv5T*, ARMv6*, ARMv7
// blx <label>
// must precede arm_b in table
new OpcodeARM(Index.arm_blx__imm, "blx", "1111101xxxxxxxxxxxxxxxxxxxxxxxxx"),
// A8.6.16 B
// Encoding A1 ARMv4*, ARMv5T*, ARMv6*, ARMv7
// b<c> <label>
// must follow arm_blx__imm in table
new OpcodeARM(Index.arm_b, "b", "xxxx1010xxxxxxxxxxxxxxxxxxxxxxxx"),
// A8.6.17 BFC
// Encoding A1 ARMv6T2, ARMv7
// bfc<c> <Rd>,#<lsb>,#<width>
// must precede arm_bfi in table
new OpcodeARM(Index.arm_bfc, "bfc", "xxxx0111110xxxxxxxxxxxxxx0011111"),
// A8.6.18 BFI
// Encoding A1 ARMv6T2, ARMv7
// bfi<c> <Rd>,<Rn>,#<lsb>,#<width>
// must follow arm_bfc in table
new OpcodeARM(Index.arm_bfi, "bfi", "xxxx0111110xxxxxxxxxxxxxx001xxxx"),
// A8.6.20 BIC (register)
// Encoding A1 ARMv4*, ARMv5T*, ARMv6*, ARMv7
// bic{s}<c> <Rd>,<Rn>,<Rm>{,<shift>}
new OpcodeARM(Index.arm_bic__reg, "bic", "xxxx0001110xxxxxxxxxxxxxxxx0xxxx"),
// A8.6.21 BIC (register-shifted register)
// Encoding A1 ARMv4*, ARMv5T*, ARMv6*, ARMv7
// bic{s}<c> <Rd>,<Rn>,<Rm>,<type> <Rs>
new OpcodeARM(Index.arm_bic__rsr, "bic", "xxxx0001110xxxxxxxxxxxxx0xx1xxxx"),
// A8.6.22 BKPT
// Encoding A1 ARMv5T*, ARMv6*, ARMv7
// bkpt #<imm16>
new OpcodeARM(Index.arm_bkpt, "bkpt", "xxxx00010010xxxxxxxxxxxx0111xxxx"),
// A8.6.23 BL, BLX (immediate)
// Encoding A1 ARMv4*, ARMv5T*, ARMv6*, ARMv7
// bl<c> <label>
new OpcodeARM(Index.arm_bl, "bl", "xxxx1011xxxxxxxxxxxxxxxxxxxxxxxx"),
// A8.6.24 BLX (register)
// Encoding A1 ARMv5T*, ARMv6*, ARMv7
// blx<c> <Rm>
// Unpredictable if (1) is 0: xxxx00010010(1)(1)(1)(1)(1)(1)(1)(1)(1)(1)(1)(1)0011xxxx
new OpcodeARM(Index.arm_blx__reg, "blx", "xxxx00010010xxxxxxxxxxxx0011xxxx"),
// A8.6.25 BX
// Encoding A1 ARMv4T, ARMv5T*, ARMv6*, ARMv7
// bx<c> Rm
// Unpredictable if (1) is 0: xxxx00010010(1)(1)(1)(1)(1)(1)(1)(1)(1)(1)(1)(1)0001xxxx
new OpcodeARM(Index.arm_bx, "bx", "xxxx00010010xxxxxxxxxxxx0001xxxx"),
// A8.6.26 BXJ
// Encoding A1 ARMv5TEJ, ARMv6*, ARMv7
// bxj<c> <Rm>
// Unpredictable if (1) is 0: xxxx00010010(1)(1)(1)(1)(1)(1)(1)(1)(1)(1)(1)(1)0010xxxx
new OpcodeARM(Index.arm_bxj, "bxj", "xxxx00010010xxxxxxxxxxxx0010xxxx"),
// A8.6.30 CLREX
// Encoding A1 ARMv6K, ARMv7
// clrex
// Unpredictable if (1) is 0 or (0) is 1: 111101010111(1)(1)(1)(1)(1)(1)(1)(1)(0)(0)(0)(0)0001(1)(1)(1)(1)
new OpcodeARM(Index.arm_clrex, "clrex", "111101010111xxxxxxxxxxxx0001xxxx"),
// A8.6.31 CLZ
// Encoding A1 ARMv5T*, ARMv6*, ARMv7
// clz<c> <Rd>,<Rm>
// Unpredictable if (1) is 0: xxxx00010110(1)(1)(1)(1)xxxx(1)(1)(1)(1)0001xxxx
new OpcodeARM(Index.arm_clz, "clz", "xxxx00010110xxxxxxxxxxxx0001xxxx"),
// A8.6.33 CMN (register)
// Encoding A1 ARMv4*, ARMv5T*, ARMv6*, ARMv7
// cmn<c> <Rn>,<Rm>{,<shift>}
// Unpredictable if (0) is 1: xxxx00010111xxxx(0)(0)(0)(0)xxxxxxx0xxxx
new OpcodeARM(Index.arm_cmn__reg, "cmn", "xxxx00010111xxxxxxxxxxxxxxx0xxxx"),
// A8.6.34 CMN (register-shifted register)
// Encoding A1 ARMv4*, ARMv5T*, ARMv6*, ARMv7
// cmn<c> <Rn>,<Rm>,<type> <Rs>
// Unpredictable if (0) is 1: xxxx00010111xxxx(0)(0)(0)(0)xxxx0xx1xxxx
new OpcodeARM(Index.arm_cmn__rsr, "cmn", "xxxx00010111xxxxxxxxxxxx0xx1xxxx"),
// A8.6.36 CMP (register)
// Encoding A1 ARMv4*, ARMv5T*, ARMv6*, ARMv7
// cmp<c> <Rn>,<Rm>{,<shift>}
// Unpredictable if (0) is 1: xxxx00010101xxxx(0)(0)(0)(0)xxxxxxx0xxxx
new OpcodeARM(Index.arm_cmp__reg, "cmp", "xxxx00010101xxxxxxxxxxxxxxx0xxxx"),
// A8.6.37 CMP (register-shifted register)
// Encoding A1 ARMv4*, ARMv5T*, ARMv6*, ARMv7
// cmp<c> <Rn>,<Rm>,<type> <Rs>
// Unpredictable if (0) is 1: xxxx00010101xxxx(0)(0)(0)(0)xxxx0xx1xxxx
new OpcodeARM(Index.arm_cmp__rsr, "cmp", "xxxx00010101xxxxxxxxxxxx0xx1xxxx"),
// A8.6.40 DBG
// Encoding A1 ARMv7 (executes as NOP in ARMv6Kand ARMv6T2)
// dbg<c> #<option>
// Unpredictable if (1) is 0 or (0) is 1: xxxx001100100000(1)(1)(1)(1)(0)(0)(0)(0)1111xxxx
new OpcodeARM(Index.arm_dbg, "dbg", "xxxx001100100000xxxxxxxx1111xxxx"),
// A8.6.41 DMB
// Encoding A1 ARMv7
// dmb #<option>
// Unpredictable if (1) is 0 or (0) is 1: 111101010111(1)(1)(1)(1)(1)(1)(1)(1)(0)(0)(0)(0)0101xxxx
new OpcodeARM(Index.arm_dmb, "dmb", "111101010111xxxxxxxxxxxx0101xxxx"),
// A8.6.42 DSB
// Encoding A1 ARMv7
// dsb #<option>
// Unpredictable if (1) is 0 or (0) is 1: 111101010111(1)(1)(1)(1)(1)(1)(1)(1)(0)(0)(0)(0)0100xxxx
new OpcodeARM(Index.arm_dsb, "dsb", "111101010111xxxxxxxxxxxx0100xxxx"),
// A8.6.44 EOR (immediate)
// Encoding A1 ARMv4*, ARMv5T*, ARMv6*, ARMv7
// eor{s}<c> <Rd>,<Rn>,#<const>
new OpcodeARM(Index.arm_eor__imm, "eor", "xxxx0010001xxxxxxxxxxxxxxxxxxxxx"),
// A8.6.45 EOR (register)
// Encoding A1 ARMv4*, ARMv5T*, ARMv6*, ARMv7
// eor{s}<c> <Rd>,<Rn>,<Rm>{,<shift>}
new OpcodeARM(Index.arm_eor__reg, "eor", "xxxx0000001xxxxxxxxxxxxxxxx0xxxx"),
// A8.6.46 EOR (register-shifted register)
// Encoding A1 ARMv4*, ARMv5T*, ARMv6*, ARMv7
// eor{s}<c> <Rd>,<Rn>,<Rm>,<type> <Rs>
new OpcodeARM(Index.arm_eor__rsr, "eor", "xxxx0000001xxxxxxxxxxxxx0xx1xxxx"),
// A8.6.49 ISB
// Encoding A1 ARMv7
// isb #<option>
// Unpredictable if (1) is 0 or (0) is 1: 111101010111(1)(1)(1)(1)(1)(1)(1)(1)(0)(0)(0)(0)0110xxxx
new OpcodeARM(Index.arm_isb, "isb", "111101010111xxxxxxxxxxxx0110xxxx"),
// B6.1.8 RFE
// Encoding A1 ARMv6*, ARMv7
// rfe{<amode>} <Rn>{!}
// Unpredictable if (1) is 0 or (0) is 1: 1111100xx0x1xxxx(0)(0)(0)(0)(1)(0)(1)(0)(0)(0)(0)(0)(0)(0)(0)(0)
// must precede arm_ldm__exc_ret in table
new OpcodeARM(Index.arm_rfe, "rfe", "1111100xx0x1xxxxxxxxxxxxxxxxxxxx"),
// B6.1.2 LDM (exception return)
// Encoding A1 ARMv4*, ARMv5T*, ARMv6*, ARMv7
// ldm{<amode>}<c> <Rn>{!},<registers_with_pc>^
// must follow arm_rfe in table
new OpcodeARM(Index.arm_ldm__exc_ret, "ldm", "xxxx100xx1x1xxxx1xxxxxxxxxxxxxxx"),
// B6.1.3 LDM (user registers)
// Encoding A1 ARMv4*, ARMv5T*, ARMv6*, ARMv7
// ldm{<amode>}<c> <Rn>,<registers_without_pc>^
// Unpredictable if (0) is 1: xxxx100xx1(0)1xxxx0xxxxxxxxxxxxxxx
new OpcodeARM(Index.arm_ldm__user_reg, "ldm", "xxxx100xx1x1xxxx0xxxxxxxxxxxxxxx"),
// A8.6.122 POP
// Encoding A1 ARMv4*, ARMv5T*, ARMv6*, ARMv7
// pop<c> <registers> <registers> contains more than one register
// must precede arm_ldm in table
new OpcodeARM(Index.arm_pop__regs, "pop", "xxxx100010111101xxxxxxxxxxxxxxxx"),
// A8.6.53 LDM / LDMIA / LDMFD
// Encoding A1 ARMv4*, ARMv5T*, ARMv6*, ARMv7
// ldm<c> <Rn>{!},<registers>
// must follow arm_pop__regs in table
new OpcodeARM(Index.arm_ldm, "ldm", "xxxx100010x1xxxxxxxxxxxxxxxxxxxx"),
// A8.6.54 LDMDA / LDMFA
// Encoding A1 ARMv4*, ARMv5T*, ARMv6*, ARMv7
// ldmda<c> <Rn>{!},<registers>
new OpcodeARM(Index.arm_ldmda, "ldmda", "xxxx100000x1xxxxxxxxxxxxxxxxxxxx"),
// A8.6.55 LDMDB / LDMEA
// Encoding A1 ARMv4*, ARMv5T*, ARMv6*, ARMv7
// ldmdb<c> <Rn>{!},<registers>
new OpcodeARM(Index.arm_ldmdb, "ldmdb", "xxxx100100x1xxxxxxxxxxxxxxxxxxxx"),
// A8.6.56 LDMIB / LDMED
// Encoding A1 ARMv4*, ARMv5T*, ARMv6*, ARMv7
// ldmib<c> <Rn>{!},<registers>
new OpcodeARM(Index.arm_ldmib, "ldmib", "xxxx100110x1xxxxxxxxxxxxxxxxxxxx"),
// A8.6.122 POP
// Encoding A2 ARMv4*, ARMv5T*, ARMv6*, ARMv7
// pop<c> <registers> <registers> contains one register, <Rt>
// must precede arm_ldr__imm in table
new OpcodeARM(Index.arm_pop__reg, "pop", "xxxx010010011101xxxx000000000100"),
// A8.6.118 PLD (literal)
// Encoding A1 ARMv5TE*, ARMv6*, ARMv7
// pld <label> pld [pc,#-0] Special case
// Unpredictable if (1) is 0: 11110101x(1)011111(1)(1)(1)(1)xxxxxxxxxxxx
// must precede arm_ldr__imm in table
// must precede arm_pld__imm in table
new OpcodeARM(Index.arm_pld__lit, "pld", "11110101xx011111xxxxxxxxxxxxxxxx"),
// A8.6.117 PLD, PLDW (immediate)
// Encoding A1 ARMv5TE*, ARMv6*, ARMv7 for PLD; ARMv7 with MP Extensions for PLDW
// pld{w} [<Rn>,#+/-<imm12>]
// Unpredictable if (1) is 0: 11110101xx01xxxx(1)(1)(1)(1)xxxxxxxxxxxx
// must follow arm_pld__lit in table
// must precede arm_ldr__imm in table
// must precede arm_ldrbt__imm in table
// must precede arm_ldrb__lit in table
// must precede arm_ldrb__imm in table
new OpcodeARM(Index.arm_pld__imm, "pld", "11110101xx01xxxxxxxxxxxxxxxxxxxx"),
// A8.6.120 PLI (immediate, literal)
// Encoding A1 ARMv7
// pli [<Rn>,#+/-<imm12>] pli <label> pli [pc,#-0] Special case
// Unpredictable if (1) is 0: 11110100x101xxxx(1)(1)(1)(1)xxxxxxxxxxxx
// must precede arm_ldr__imm in table
// must precede arm_ldrbt__imm in table
// must precede arm_ldrb__lit in table
// must precede arm_ldrb__imm in table
new OpcodeARM(Index.arm_pli__imm_lit, "pli", "11110100x101xxxxxxxxxxxxxxxxxxxx"),
// A8.6.86 LDRT
// Encoding A1 ARMv4*, ARMv5T*, ARMv6*, ARMv7
// ldrt<c> <Rt>, [<Rn>] {, #+/-<imm12>}
// must precede arm_ldr__lit in table
// must follow arm_pld__lit in table
// must follow arm_pld__imm in table
// must follow arm_pli__imm_lit in table
new OpcodeARM(Index.arm_ldrt__imm, "ldrt", "xxxx0100x011xxxxxxxxxxxxxxxxxxxx"),
// A8.6.59 LDR (literal)
// Encoding A1 ARMv4*, ARMv5T*, ARMv6*, ARMv7
// ldr<c> <Rt>,<label> ldr<c> <Rt>,[pc,#-0] Special case
// Unpredictable if (1) is 0 or (0) is 1: xxxx010(1)x0(0)11111xxxxxxxxxxxxxxxx
// must precede arm_ldr__imm in table
// must follow arm_ldrt__imm in table
// must follow arm_pld__lit in table
// must follow arm_pld__imm in table
// must follow arm_pli__imm_lit in table
new OpcodeARM(Index.arm_ldr__lit, "ldr", "xxxx010xx0x11111xxxxxxxxxxxxxxxx"),
// A8.6.58 LDR (immediate, ARM)
// Encoding A1 ARMv4*, ARMv5T*, ARMv6*, ARMv7
// ldr<c> <Rt>,[<Rn>{,#+/-<imm12>}] ldr<c> <Rt>,[<Rn>],#+/-<imm12> ldr<c> <Rt>,[<Rn>,#+/-<imm12>]!
// must follow arm_ldr__lit in table
// must follow arm_pop__reg in table
// must follow arm_pld__lit in table
// must follow arm_pld__imm in table
// must follow arm_pli__imm_lit in table
new OpcodeARM(Index.arm_ldr__imm, "ldr", "xxxx010xx0x1xxxxxxxxxxxxxxxxxxxx"),
// A8.6.86 LDRT
// Encoding A2 ARMv4*, ARMv5T*, ARMv6*, ARMv7
// ldrt<c> <Rt>,[<Rn>],+/-<Rm>{, <shift>}
// must precede arm_ldr__reg in table
new OpcodeARM(Index.arm_ldrt__reg, "ldrt", "xxxx0110x011xxxxxxxxxxxxxxx0xxxx"),
// A8.6.119 PLD, PLDW (register)
// Encoding A1 ARMv5TE*, ARMv6*, ARMv7 for PLD; ARMv7 with MP Extensions for PLDW
// pld{w}<c> [<Rn>,+/-<Rm>{, <shift>}]
// Unpredictable if (1) is 0: 11110111xx01xxxx(1)(1)(1)(1)xxxxxxx0xxxx
// must precede arm_ldrb__reg in table
// must precede arm_ldrt__reg in table
new OpcodeARM(Index.arm_pld__reg, "pld", "11110111xx01xxxxxxxxxxxxxxx0xxxx"),
// A8.6.121 PLI (register)
// Encoding A1 ARMv7
// pli [<Rn>,+/-<Rm>{, <shift>}]
// Unpredictable if (1) is 0: 11110110x101xxxx(1)(1)(1)(1)xxxxxxx0xxxx
// must precede arm_ldrb__reg in table
// must precede arm_ldrt__reg in table
new OpcodeARM(Index.arm_pli__reg, "pli", "11110110x101xxxxxxxxxxxxxxx0xxxx"),
// A8.6.60 LDR (register)
// Encoding A1 ARMv4*, ARMv5T*, ARMv6*, ARMv7
// ldr<c> <Rt>,[<Rn>,+/-<Rm>{, <shift>}]{!} ldr<c> <Rt>,[<Rn>],+/-<Rm>{, <shift>}
// must follow arm_ldrt__reg in table
// must follow arm_pld__reg in table
// must follow arm_pli__reg in table
new OpcodeARM(Index.arm_ldr__reg, "ldr", "xxxx011xx0x1xxxxxxxxxxxxxxx0xxxx"),
// A8.6.65 LDRBT
// Encoding A1 ARMv4*, ARMv5T*, ARMv6*, ARMv7
// ldrbt<c> <Rt>,[<Rn>],#+/-<imm12>
// must precede arm_ldrb__imm in table
// must follow arm_pld__imm in table
new OpcodeARM(Index.arm_ldrbt__imm, "ldrbt", "xxxx0100x111xxxxxxxxxxxxxxxxxxxx"),
// A8.6.63 LDRB (literal)
// Encoding A1 ARMv4*, ARMv5T*, ARMv6*, ARMv7
// ldrb<c> <Rt>,<label> ldrb<c> <Rt>,[pc,#-0] Special case
// Unpredictable if (1) is 0 or (0) is 1: xxxx010(1)x1(0)11111xxxxxxxxxxxxxxxx
// must precede arm_ldrb__imm in table
// must follow arm_pld__imm in table
new OpcodeARM(Index.arm_ldrb__lit, "ldrb", "xxxx010xx1x11111xxxxxxxxxxxxxxxx"),
// A8.6.62 LDRB (immediate, ARM)
// Encoding A1 ARMv4*, ARMv5T*, ARMv6*, ARMv7
// ldrb<c> <Rt>,[<Rn>{,#+/-<imm12>}] ldrb<c> <Rt>,[<Rn>],#+/-<imm12> ldrb<c> <Rt>,[<Rn>,#+/-<imm12>]!
// must follow arm_ldrb__lit in table
// must follow arm_ldrbt__imm in table
// must follow arm_pld__imm in table
new OpcodeARM(Index.arm_ldrb__imm, "ldrb", "xxxx010xx1x1xxxxxxxxxxxxxxxxxxxx"),
// A8.6.65 LDRBT
// Encoding A2 ARMv4*, ARMv5T*, ARMv6*, ARMv7
// ldrbt<c> <Rt>,[<Rn>],+/-<Rm>{, <shift>}
// must precede arm_ldrb__reg in table
new OpcodeARM(Index.arm_ldrbt__reg, "ldrbt", "xxxx0110x111xxxxxxxxxxxxxxx0xxxx"),
// A8.6.64 LDRB (register)
// Encoding A1 ARMv4*, ARMv5T*, ARMv6*, ARMv7
// ldrb<c> <Rt>,[<Rn>,+/-<Rm>{, <shift>}]{!} ldrb<c> <Rt>,[<Rn>],+/-<Rm>{, <shift>}
// must follow arm_ldrbt__reg in table
// must follow arm_pld__reg in table
new OpcodeARM(Index.arm_ldrb__reg, "ldrb", "xxxx011xx1x1xxxxxxxxxxxxxxx0xxxx"),
// B6.1.1 CPS
// Encoding A1 ARMv6*, ARMv7
// cps<effect> <iflags>{,#<mode>} cps #<mode>
// Unpredictable if (0) is 1: 111100010000xxx0(0)(0)(0)(0)(0)(0)(0)xxx0xxxxx
// must precede arm_mrs in table
// must precede arm_ldrd__reg in table
new OpcodeARM(Index.arm_cps, "cps", "111100010000xxx0xxxxxxxxxx0xxxxx"),
// A8.6.68 LDRD (register)
// Encoding A1 ARMv5TE*, ARMv6*, ARMv7
// ldrd<c> <Rt>,<Rt2>,[<Rn>,+/-<Rm>]{!} ldrd<c> <Rt>,<Rt2>,[<Rn>],+/-<Rm>
// Unpredictable if (0) is 1: xxxx000xx0x0xxxxxxxx(0)(0)(0)(0)1101xxxx
// must follow arm_cps in table
new OpcodeARM(Index.arm_ldrd__reg, "ldrd", "xxxx000xx0x0xxxxxxxxxxxx1101xxxx"),
// A8.6.69 LDREX
// Encoding A1 ARMv6*, ARMv7
// ldrex<c> <Rt>,[<Rn>]
// Unpredictable if (1) is 0: xxxx00011001xxxxxxxx(1)(1)(1)(1)1001(1)(1)(1)(1)
new OpcodeARM(Index.arm_ldrex, "ldrex", "xxxx00011001xxxxxxxxxxxx1001xxxx"),
// A8.6.70 LDREXB
// Encoding A1 ARMv6K, ARMv7
// ldrexb<c> <Rt>, [<Rn>]
// Unpredictable if (1) is 0: xxxx00011101xxxxxxxx(1)(1)(1)(1)1001(1)(1)(1)(1)
new OpcodeARM(Index.arm_ldrexb, "ldrexb", "xxxx00011101xxxxxxxxxxxx1001xxxx"),
// A8.6.71 LDREXD
// Encoding A1 ARMv6K, ARMv7
// ldrexd<c> <Rt>,<Rt2>,[<Rn>]
// Unpredictable if (1) is 0: xxxx00011011xxxxxxxx(1)(1)(1)(1)1001(1)(1)(1)(1)
new OpcodeARM(Index.arm_ldrexd, "ldrexd", "xxxx00011011xxxxxxxxxxxx1001xxxx"),
// A8.6.72 LDREXH
// Encoding A1 ARMv6K, ARMv7
// ldrexh<c> <Rt>, [<Rn>]
// Unpredictable if (1) is 0: xxxx00011111xxxxxxxx(1)(1)(1)(1)1001(1)(1)(1)(1)
new OpcodeARM(Index.arm_ldrexh, "ldrexh", "xxxx00011111xxxxxxxxxxxx1001xxxx"),
// A8.6.77 LDRHT
// Encoding A2 ARMv6T2, ARMv7
// ldrht<c> <Rt>, [<Rn>], +/-<Rm>
// Unpredictable if (0) is 1: xxxx0000x011xxxxxxxx(0)(0)(0)(0)1011xxxx
// must precede arm_ldrh__reg in table
new OpcodeARM(Index.arm_ldrht__reg, "ldrht", "xxxx0000x011xxxxxxxxxxxx1011xxxx"),
// A8.6.76 LDRH (register)
// Encoding A1 ARMv4*, ARMv5T*, ARMv6*, ARMv7
// ldrh<c> <Rt>,[<Rn>,+/-<Rm>]{!} ldrh<c> <Rt>,[<Rn>],+/-<Rm>
// Unpredictable if (0) is 1: xxxx000xx0x1xxxxxxxx(0)(0)(0)(0)1011xxxx
// must follow arm_ldrht__reg in table
new OpcodeARM(Index.arm_ldrh__reg, "ldrh", "xxxx000xx0x1xxxxxxxxxxxx1011xxxx"),
// A8.6.81 LDRSBT
// Encoding A2 ARMv6T2, ARMv7
// ldrsbt<c> <Rt>, [<Rn>], +/-<Rm>
// Unpredictable if (0) is 1: xxxx0000x011xxxxxxxx(0)(0)(0)(0)1101xxxx
// must precede arm_ldrsb__reg in table
new OpcodeARM(Index.arm_ldrsbt__reg, "ldrsbt", "xxxx0000x011xxxxxxxxxxxx1101xxxx"),
// A8.6.80 LDRSB (register)
// Encoding A1 ARMv4*, ARMv5T*, ARMv6*, ARMv7
// ldrsb<c> <Rt>,[<Rn>,+/-<Rm>]{!} ldrsb<c> <Rt>,[<Rn>],+/-<Rm>
// Unpredictable if (0) is 1: xxxx000xx0x1xxxxxxxx(0)(0)(0)(0)1101xxxx
// must follow arm_ldrsbt__reg in table
new OpcodeARM(Index.arm_ldrsb__reg, "ldrsb", "xxxx000xx0x1xxxxxxxxxxxx1101xxxx"),
// A8.6.85 LDRSHT
// Encoding A2 ARMv6T2, ARMv7
// ldrsht<c> <Rt>, [<Rn>], +/-<Rm>
// Unpredictable if (0) is 1: xxxx0000x011xxxxxxxx(0)(0)(0)(0)1111xxxx
// must precede arm_ldrsh__reg in table
new OpcodeARM(Index.arm_ldrsht__reg, "ldrsht", "xxxx0000x011xxxxxxxxxxxx1111xxxx"),
// A8.6.84 LDRSH (register)
// Encoding A1 ARMv4*, ARMv5T*, ARMv6*, ARMv7
// ldrsh<c> <Rt>,[<Rn>,+/-<Rm>]{!} ldrsh<c> <Rt>,[<Rn>],+/-<Rm>
// Unpredictable if (0) is 1: xxxx000xx0x1xxxxxxxx(0)(0)(0)(0)1111xxxx
// must follow arm_ldrsht__reg in table
new OpcodeARM(Index.arm_ldrsh__reg, "ldrsh", "xxxx000xx0x1xxxxxxxxxxxx1111xxxx"),
// A8.6.89 LSL (register)
// Encoding A1 ARMv4*, ARMv5T*, ARMv6*, ARMv7
// lsl{s}<c> <Rd>,<Rn>,<Rm>
// Unpredictable if (0) is 1: xxxx0001101x(0)(0)(0)(0)xxxxxxxx0001xxxx
new OpcodeARM(Index.arm_lsl__reg, "lsl", "xxxx0001101xxxxxxxxxxxxx0001xxxx"),
// A8.6.90 LSR (immediate)
// Encoding A1 ARMv4*, ARMv5T*, ARMv6*, ARMv7
// lsr{s}<c> <Rd>,<Rm>,#<imm>
// Unpredictable if (0) is 1: xxxx0001101x(0)(0)(0)(0)xxxxxxxxx010xxxx
new OpcodeARM(Index.arm_lsr__imm, "lsr", "xxxx0001101xxxxxxxxxxxxxx010xxxx"),
// A8.6.91 LSR (register)
// Encoding A1 ARMv4*, ARMv5T*, ARMv6*, ARMv7
// lsr{s}<c> <Rd>,<Rn>,<Rm>
// Unpredictable if (0) is 1: xxxx0001101x(0)(0)(0)(0)xxxxxxxx0011xxxx
new OpcodeARM(Index.arm_lsr__reg, "lsr", "xxxx0001101xxxxxxxxxxxxx0011xxxx"),
// A8.6.94 MLA
// Encoding A1 ARMv4*, ARMv5T*, ARMv6*, ARMv7
// mla{s}<c> <Rd>,<Rn>,<Rm>,<Ra>
new OpcodeARM(Index.arm_mla, "mla", "xxxx0000001xxxxxxxxxxxxx1001xxxx"),
// A8.6.95 MLS
// Encoding A1 ARMv6T2, ARMv7
// mls<c> <Rd>,<Rn>,<Rm>,<Ra>
new OpcodeARM(Index.arm_mls, "mls", "xxxx00000110xxxxxxxxxxxx1001xxxx"),
// A8.6.96 MOV (immediate)
// Encoding A1 ARMv4*, ARMv5T*, ARMv6*, ARMv7
// mov{s}<c> <Rd>,#<const>
// Unpredictable if (0) is 1: xxxx0011101x(0)(0)(0)(0)xxxxxxxxxxxxxxxx
new OpcodeARM(Index.arm_mov__imm, "mov", "xxxx0011101xxxxxxxxxxxxxxxxxxxxx"),
// A8.6.97 MOV (register)
// Encoding A1 ARMv4*, ARMv5T*, ARMv6*, ARMv7
// mov{s}<c> <Rd>,<Rm>
// Unpredictable if (0) is 1: xxxx0001101x(0)(0)(0)(0)xxxx00000000xxxx
// must precede arm_lsl__imm in table
new OpcodeARM(Index.arm_mov__reg, "mov", "xxxx0001101xxxxxxxxx00000000xxxx"),
// A8.6.88 LSL (immediate)
// Encoding A1 ARMv4*, ARMv5T*, ARMv6*, ARMv7
// lsl{s}<c> <Rd>,<Rm>,#<imm>
// Unpredictable if (0) is 1: xxxx0001101x(0)(0)(0)(0)xxxxxxxxx000xxxx
// must follow arm_mov__reg in table
new OpcodeARM(Index.arm_lsl__imm, "lsl", "xxxx0001101xxxxxxxxxxxxxx000xxxx"),
// A8.6.96 MOV (immediate)
// Encoding A2 ARMv6T2, ARMv7
// movw<c> <Rd>,#<imm16>
new OpcodeARM(Index.arm_movw, "movw", "xxxx00110000xxxxxxxxxxxxxxxxxxxx"),
// A8.6.157 SETEND
// Encoding A1 ARMv6*, ARMv7
// setend <endian_specifier> Cannot be conditional
// Unpredictable if (0) is 1: 111100010000(0)(0)(0)1(0)(0)(0)(0)(0)(0)x(0)0000(0)(0)(0)(0)
// must precede arm_mrs in table
new OpcodeARM(Index.arm_setend, "setend", "111100010000xxx1xxxxxxxx0000xxxx"),
// A8.6.102 MRS
// Encoding A1 ARMv4*, ARMv5T*, ARMv6*, ARMv7
// mrs<c> <Rd>,<spec_reg>
// Unpredictable if (1) is 0 or (0) is 1: xxxx00010000(1)(1)(1)(1)xxxx(0)(0)(0)(0)0000(0)(0)(0)(0)
// B6.1.5 MRS
// Encoding A1 ARMv4*, ARMv5T*, ARMv6*, ARMv7
// mrs<c> <Rd>,<spec_reg>
// Unpredictable if (1) is 0 or (0) is 1: xxxx00010x00(1)(1)(1)(1)xxxx(0)(0)(0)(0)0000(0)(0)(0)(0)
//
// combined A8.6.102 MRS and B6.1.5 MRS, using the bit pattern of B6.1.5 MRS
// must follow arm_cps in table
// must follow arm_setend in table
new OpcodeARM(Index.arm_mrs, "mrs", "xxxx00010x00xxxxxxxxxxxx0000xxxx"),
// A8.6.158 SEV
// Encoding A1 ARMv6K, ARMv7 (executes as NOP in ARMv6T2)
// sev<c>
// Unpredictable if (1) is 0 or (0) is 1: xxxx001100100000(1)(1)(1)(1)(0)(0)(0)(0)00000100
// must precede arm_msr__imm in table
new OpcodeARM(Index.arm_sev, "sev", "xxxx001100100000xxxxxxxx00000100"),
// A8.6.110 NOP
// Encoding A1 ARMv6K, ARMv6T2, ARMv7
// nop<c>
// Unpredictable if (1) is 0 or (0) is 1: xxxx001100100000(1)(1)(1)(1)(0)(0)(0)(0)00000000
// must precede arm_msr__imm in table
new OpcodeARM(Index.arm_nop, "nop", "xxxx001100100000xxxxxxxx00000000"),
// A8.6.411 WFE
// Encoding A1 ARMv6K, ARMv7 (executes as NOP in ARMv6T2)
// wfe<c>
// Unpredictable if (1) is 0 or (0) is 1: xxxx001100100000(1)(1)(1)(1)(0)(0)(0)(0)00000010
// must precede arm_msr__imm in table
new OpcodeARM(Index.arm_wfe, "wfe", "xxxx001100100000xxxxxxxx00000010"),
// A8.6.412 WFI
// Encoding A1 ARMv6K, ARMv7 (executes as NOP in ARMv6T2)
// wfi<c>
// Unpredictable if (1) is 0 or (0) is 1: xxxx001100100000(1)(1)(1)(1)(0)(0)(0)(0)00000011
// must precede arm_msr__imm in table
new OpcodeARM(Index.arm_wfi, "wfi", "xxxx001100100000xxxxxxxx00000011"),
// A8.6.413 YIELD
// Encoding A1 ARMv6K, ARMv7 (executes as NOP in ARMv6T2)
// yield<c>
// Unpredictable if (1) is 0 or (0) is 1: xxxx001100100000(1)(1)(1)(1)(0)(0)(0)(0)00000001
// must precede arm_msr__imm in table
new OpcodeARM(Index.arm_yield, "yield", "xxxx001100100000xxxxxxxx00000001"),
// A8.6.104 MSR (register)
// Encoding A1 ARMv4*, ARMv5T*, ARMv6*, ARMv7
// msr<c> <spec_reg>,<Rn>
// Unpredictable if (1) is 0 or (0) is 1: xxxx00010010xx00(1)(1)(1)(1)(0)(0)(0)(0)0000xxxx
// must precede arm_msr__sys_reg in table
new OpcodeARM(Index.arm_msr__reg, "msr", "xxxx00010010xx00xxxxxxxx0000xxxx"),
// B6.1.7 MSR (register)
// Encoding A1 ARMv4*, ARMv5T*, ARMv6*, ARMv7
// msr<c> <spec_reg>,<Rn>
// Unpredictable if (1) is 0 or (0) is 1: xxxx00010x10xxxx(1)(1)(1)(1)(0)(0)(0)(0)0000xxxx
// must follow arm_msr__reg in table in table
new OpcodeARM(Index.arm_msr__sys_reg, "msr", "xxxx00010x10xxxxxxxxxxxx0000xxxx"),
// A8.6.105 MUL
// Encoding A1 ARMv4*, ARMv5T*, ARMv6*, ARMv7
// mul{s}<c> <Rd>,<Rn>,<Rm>
// Unpredictable if (0) is 1: xxxx0000000xxxxx(0)(0)(0)(0)xxxx1001xxxx
new OpcodeARM(Index.arm_mul, "mul", "xxxx0000000xxxxxxxxxxxxx1001xxxx"),
// A8.6.107 MVN (register)
// Encoding A1 ARMv4*, ARMv5T*, ARMv6*, ARMv7
// mvn{s}<c> <Rd>,<Rm>{,<shift>}
// Unpredictable if (0) is 1: xxxx0001111x(0)(0)(0)(0)xxxxxxxxxxx0xxxx
new OpcodeARM(Index.arm_mvn__reg, "mvn", "xxxx0001111xxxxxxxxxxxxxxxx0xxxx"),
// A8.6.108 MVN (register-shifted register)
// Encoding A1 ARMv4*, ARMv5T*, ARMv6*, ARMv7
// mvn{s}<c> <Rd>,<Rm>,<type> <Rs>
// Unpredictable if (0) is 1: xxxx0001111x(0)(0)(0)(0)xxxxxxxx0xx1xxxx
new OpcodeARM(Index.arm_mvn__rsr, "mvn", "xxxx0001111xxxxxxxxxxxxx0xx1xxxx"),
// A8.6.113 ORR (immediate)
// Encoding A1 ARMv4*, ARMv5T*, ARMv6*, ARMv7
// orr{s}<c> <Rd>,<Rn>,#<const>
new OpcodeARM(Index.arm_orr__imm, "orr", "xxxx0011100xxxxxxxxxxxxxxxxxxxxx"),
// A8.6.114 ORR (register)
// Encoding A1 ARMv4*, ARMv5T*, ARMv6*, ARMv7
// orr{s}<c> <Rd>,<Rn>,<Rm>{,<shift>}
new OpcodeARM(Index.arm_orr__reg, "orr", "xxxx0001100xxxxxxxxxxxxxxxx0xxxx"),
// A8.6.115 ORR (register-shifted register)
// Encoding A1 ARMv4*, ARMv5T*, ARMv6*, ARMv7
// orr{s}<c> <Rd>,<Rn>,<Rm>,<type> <Rs>
new OpcodeARM(Index.arm_orr__rsr, "orr", "xxxx0001100xxxxxxxxxxxxx0xx1xxxx"),
// A8.6.116 PKH
// Encoding A1 ARMv6*, ARMv7
// pkhbt<c> <Rd>,<Rn>,<Rm>{,lsl #<imm>} pkhtb<c> <Rd>,<Rn>,<Rm>{,asr #<imm>}
new OpcodeARM(Index.arm_pkh, "pkh", "xxxx01101000xxxxxxxxxxxxxx01xxxx"),
// A8.6.124 QADD
// Encoding A1 ARMv5TE*, ARMv6*, ARMv7
// qadd<c> <Rd>,<Rm>,<Rn>
// Unpredictable if (0) is 1: xxxx00010000xxxxxxxx(0)(0)(0)(0)0101xxxx
new OpcodeARM(Index.arm_qadd, "qadd", "xxxx00010000xxxxxxxxxxxx0101xxxx"),
// A8.6.128 QDADD
// Encoding A1 ARMv5TE*, ARMv6*, ARMv7
// qdadd<c> <Rd>,<Rm>,<Rn>
// Unpredictable if (0) is 1: xxxx00010100xxxxxxxx(0)(0)(0)(0)0101xxxx
new OpcodeARM(Index.arm_qdadd, "qdadd", "xxxx00010100xxxxxxxxxxxx0101xxxx"),
// A8.6.129 QDSUB
// Encoding A1 ARMv5TE*, ARMv6*, ARMv7
// qdsub<c> <Rd>,<Rm>,<Rn>
// Unpredictable if (0) is 1: xxxx00010110xxxxxxxx(0)(0)(0)(0)0101xxxx
new OpcodeARM(Index.arm_qdsub, "qdsub", "xxxx00010110xxxxxxxxxxxx0101xxxx"),
// A8.6.131 QSUB
// Encoding A1 ARMv5TE*, ARMv6*, ARMv7
// qsub<c> <Rd>,<Rm>,<Rn>
// Unpredictable if (0) is 1: xxxx00010010xxxxxxxx(0)(0)(0)(0)0101xxxx
new OpcodeARM(Index.arm_qsub, "qsub", "xxxx00010010xxxxxxxxxxxx0101xxxx"),
// A8.6.125 QADD16
// Encoding A1 ARMv6*, ARMv7
// qadd16<c> <Rd>,<Rn>,<Rm>
// Unpredictable if (1) is 0: xxxx01100010xxxxxxxx(1)(1)(1)(1)0001xxxx
// A8.6.126 QADD8
// Encoding A1 ARMv6*, ARMv7
// qadd8<c> <Rd>,<Rn>,<Rm>
// Unpredictable if (1) is 0: xxxx01100010xxxxxxxx(1)(1)(1)(1)1001xxxx
// A8.6.127 QASX
// Encoding A1 ARMv6*, ARMv7
// qasx<c> <Rd>,<Rn>,<Rm>
// Unpredictable if (1) is 0: xxxx01100010xxxxxxxx(1)(1)(1)(1)0011xxxx
// A8.6.130 QSAX
// Encoding A1 ARMv6*, ARMv7
// qsax<c> <Rd>,<Rn>,<Rm>
// Unpredictable if (1) is 0: xxxx01100010xxxxxxxx(1)(1)(1)(1)0101xxxx
// A8.6.132 QSUB16
// Encoding A1 ARMv6*, ARMv7
// qsub16<c> <Rd>,<Rn>,<Rm>
// Unpredictable if (1) is 0: xxxx01100010xxxxxxxx(1)(1)(1)(1)0111xxxx
// A8.6.133 QSUB8
// Encoding A1 ARMv6*, ARMv7
// qsub8<c> <Rd>,<Rn>,<Rm>
// Unpredictable if (1) is 0: xxxx01100010xxxxxxxx(1)(1)(1)(1)1111xxxx
// A8.6.148 SADD16
// Encoding A1 ARMv6*, ARMv7
// sadd16<c> <Rd>,<Rn>,<Rm>
// Unpredictable if (1) is 0: xxxx01100001xxxxxxxx(1)(1)(1)(1)0001xxxx
// A8.6.149 SADD8
// Encoding A1 ARMv6*, ARMv7
// sadd8<c> <Rd>,<Rn>,<Rm>
// Unpredictable if (1) is 0: xxxx01100001xxxxxxxx(1)(1)(1)(1)1001xxxx
// A8.6.150 SASX
// Encoding A1 ARMv6*, ARMv7
// sasx<c> <Rd>,<Rn>,<Rm>
// Unpredictable if (1) is 0: xxxx01100001xxxxxxxx(1)(1)(1)(1)0011xxxx
// A8.6.159 SHADD16
// Encoding A1 ARMv6*, ARMv7
// shadd16<c> <Rd>,<Rn>,<Rm>
// Unpredictable if (1) is 0: xxxx01100011xxxxxxxx(1)(1)(1)(1)0001xxxx
// A8.6.160 SHADD8
// Encoding A1 ARMv6*, ARMv7
// shadd8<c> <Rd>,<Rn>,<Rm>
// Unpredictable if (1) is 0: xxxx01100011xxxxxxxx(1)(1)(1)(1)1001xxxx
// A8.6.161 SHASX
// Encoding A1 ARMv6*, ARMv7
// shasx<c> <Rd>,<Rn>,<Rm>
// Unpredictable if (1) is 0: xxxx01100011xxxxxxxx(1)(1)(1)(1)0011xxxx
// A8.6.162 SHSAX
// Encoding A1 ARMv6*, ARMv7
// shsax<c> <Rd>,<Rn>,<Rm>
// Unpredictable if (1) is 0: xxxx01100011xxxxxxxx(1)(1)(1)(1)0101xxxx
// A8.6.163 SHSUB16
// Encoding A1 ARMv6*, ARMv7
// shsub16<c> <Rd>,<Rn>,<Rm>
// Unpredictable if (1) is 0: xxxx01100011xxxxxxxx(1)(1)(1)(1)0111xxxx
// A8.6.164 SHSUB8
// Encoding A1 ARMv6*, ARMv7
// shsub8<c> <Rd>,<Rn>,<Rm>
// Unpredictable if (1) is 0: xxxx01100011xxxxxxxx(1)(1)(1)(1)1111xxxx
// A8.6.185 SSAX
// Encoding A1 ARMv6*, ARMv7
// ssax<c> <Rd>,<Rn>,<Rm>
// Unpredictable if (1) is 0: xxxx01100001xxxxxxxx(1)(1)(1)(1)0101xxxx
// A8.6.186 SSUB16
// Encoding A1 ARMv6*, ARMv7
// ssub16<c> <Rd>,<Rn>,<Rm>
// Unpredictable if (1) is 0: xxxx01100001xxxxxxxx(1)(1)(1)(1)0111xxxx
// A8.6.187 SSUB8
// Encoding A1 ARMv6*, ARMv7
// ssub8<c> <Rd>,<Rn>,<Rm>
// Unpredictable if (1) is 0: xxxx01100001xxxxxxxx(1)(1)(1)(1)1111xxxx
// A8.6.233 UADD16
// Encoding A1 ARMv6*, ARMv7
// uadd16<c> <Rd>,<Rn>,<Rm>
// Unpredictable if (1) is 0: xxxx01100101xxxxxxxx(1)(1)(1)(1)0001xxxx
// A8.6.234 UADD8
// Encoding A1 ARMv6*, ARMv7
// uadd8<c> <Rd>,<Rn>,<Rm>
// Unpredictable if (1) is 0: xxxx01100101xxxxxxxx(1)(1)(1)(1)1001xxxx
// A8.6.235 UASX
// Encoding A1 ARMv6*, ARMv7
// uasx<c> <Rd>,<Rn>,<Rm>
// Unpredictable if (1) is 0: xxxx01100101xxxxxxxx(1)(1)(1)(1)0011xxxx
// A8.6.238 UHADD16
// Encoding A1 ARMv6*, ARMv7
// uhadd16<c> <Rd>,<Rn>,<Rm>
// Unpredictable if (1) is 0: xxxx01100111xxxxxxxx(1)(1)(1)(1)0001xxxx
// A8.6.239 UHADD8
// Encoding A1 ARMv6*, ARMv7
// uhadd8<c> <Rd>,<Rn>,<Rm>
// Unpredictable if (1) is 0: xxxx01100111xxxxxxxx(1)(1)(1)(1)1001xxxx
// A8.6.240 UHASX
// Encoding A1 ARMv6*, ARMv7
// uhasx<c> <Rd>,<Rn>,<Rm>
// Unpredictable if (1) is 0: xxxx01100111xxxxxxxx(1)(1)(1)(1)0011xxxx
// A8.6.241 UHSAX
// Encoding A1 ARMv6*, ARMv7
// uhsax<c> <Rd>,<Rn>,<Rm>
// Unpredictable if (1) is 0: xxxx01100111xxxxxxxx(1)(1)(1)(1)0101xxxx
// A8.6.242 UHSUB16
// Encoding A1 ARMv6*, ARMv7
// uhsub16<c> <Rd>,<Rn>,<Rm>
// Unpredictable if (1) is 0: xxxx01100111xxxxxxxx(1)(1)(1)(1)0111xxxx
// A8.6.243 UHSUB8
// Encoding A1 ARMv6*, ARMv7
// uhsub8<c> <Rd>,<Rn>,<Rm>
// Unpredictable if (1) is 0: xxxx01100111xxxxxxxx(1)(1)(1)(1)1111xxxx
// A8.6.247 UQADD16
// Encoding A1 ARMv6*, ARMv7
// uqadd16<c> <Rd>,<Rn>,<Rm>
// Unpredictable if (1) is 0: xxxx01100110xxxxxxxx(1)(1)(1)(1)0001xxxx
// A8.6.248 UQADD8
// Encoding A1 ARMv6*, ARMv7
// uqadd8<c> <Rd>,<Rn>,<Rm>
// Unpredictable if (1) is 0: xxxx01100110xxxxxxxx(1)(1)(1)(1)1001xxxx
// A8.6.249 UQASX
// Encoding A1 ARMv6*, ARMv7
// uqasx<c> <Rd>,<Rn>,<Rm>
// Unpredictable if (1) is 0: xxxx01100110xxxxxxxx(1)(1)(1)(1)0011xxxx
// A8.6.250 UQSAX
// Encoding A1 ARMv6*, ARMv7
// uqsax<c> <Rd>,<Rn>,<Rm>
// Unpredictable if (1) is 0: xxxx01100110xxxxxxxx(1)(1)(1)(1)0101xxxx
// A8.6.251 UQSUB16
// Encoding A1 ARMv6*, ARMv7
// uqsub16<c> <Rd>,<Rn>,<Rm>
// Unpredictable if (1) is 0: xxxx01100110xxxxxxxx(1)(1)(1)(1)0111xxxx
// A8.6.252 UQSUB8
// Encoding A1 ARMv6*, ARMv7
// uqsub8<c> <Rd>,<Rn>,<Rm>
// Unpredictable if (1) is 0: xxxx01100110xxxxxxxx(1)(1)(1)(1)1111xxxx
// A8.6.257 USAX
// Encoding A1 ARMv6*, ARMv7
// usax<c> <Rd>,<Rn>,<Rm>
// Unpredictable if (1) is 0: xxxx01100101xxxxxxxx(1)(1)(1)(1)0101xxxx
// A8.6.258 USUB16
// Encoding A1 ARMv6*, ARMv7
// usub16<c> <Rd>,<Rn>,<Rm>
// Unpredictable if (1) is 0: xxxx01100101xxxxxxxx(1)(1)(1)(1)0111xxxx
// A8.6.259 USUB8
// Encoding A1 ARMv6*, ARMv7
// usub8<c> <Rd>,<Rn>,<Rm>
// Unpredictable if (1) is 0: xxxx01100101xxxxxxxx(1)(1)(1)(1)1111xxxx
//
// {s|u|}{h|q|}{{add|sub}{8|16}|asx|sax}<c> <Rd>,<Rn>,<Rm>
// cond_31_28 0 1 1 0 0 hqsu_22_20 Rn_19_16 Rd_15_12 (1)(1)(1)(1) op_7_5 1 Rm_3_0
// Unpredictable if (1) is 0: xxxx01100010xxxxxxxx(1)(1)(1)(1)0001xxxx
new OpcodeARM(Index.arm__r_dnm_math, null, "xxxx01100xxxxxxxxxxxxxxxxxx1xxxx"),
// A8.6.134 RBIT
// Encoding A1 ARMv6T2, ARMv7
// rbit<c> <Rd>,<Rm>
// Unpredictable if (1) is 0: xxxx01101111(1)(1)(1)(1)xxxx(1)(1)(1)(1)0011xxxx
new OpcodeARM(Index.arm_rbit, "rbit", "xxxx01101111xxxxxxxxxxxx0011xxxx"),
// A8.6.135 REV
// Encoding A1 ARMv6*, ARMv7
// rev<c> <Rd>,<Rm>
// Unpredictable if (1) is 0: xxxx01101011(1)(1)(1)(1)xxxx(1)(1)(1)(1)0011xxxx
new OpcodeARM(Index.arm_rev, "rev", "xxxx01101011xxxxxxxxxxxx0011xxxx"),
// A8.6.136 REV16
// Encoding A1 ARMv6*, ARMv7
// rev16<c> <Rd>,<Rm>
// Unpredictable if (1) is 0: xxxx01101011(1)(1)(1)(1)xxxx(1)(1)(1)(1)1011xxxx
new OpcodeARM(Index.arm_rev16, "rev16", "xxxx01101011xxxxxxxxxxxx1011xxxx"),
// A8.6.137 REVSH
// Encoding A1 ARMv6*, ARMv7
// revsh<c> <Rd>,<Rm>
// Unpredictable if (1) is 0: xxxx01101111(1)(1)(1)(1)xxxx(1)(1)(1)(1)1011xxxx
new OpcodeARM(Index.arm_revsh, "revsh", "xxxx01101111xxxxxxxxxxxx1011xxxx"),
// A8.6.141 RRX
// Encoding A1 ARMv4*, ARMv5T*, ARMv6*, ARMv7
// rrx{s}<c> <Rd>,<Rm>
// Unpredictable if (0) is 1: xxxx0001101x(0)(0)(0)(0)xxxx00000110xxxx
// must precede arm_ror__imm in table
new OpcodeARM(Index.arm_rrx, "rrx", "xxxx0001101xxxxxxxxx00000110xxxx"),
// A8.6.139 ROR (immediate)
// Encoding A1 ARMv4*, ARMv5T*, ARMv6*, ARMv7
// ror{s}<c> <Rd>,<Rm>,#<imm>
// Unpredictable if (0) is 1: xxxx0001101x(0)(0)(0)(0)xxxxxxxxx110xxxx
// must follow arm_rrx in table
new OpcodeARM(Index.arm_ror__imm, "ror", "xxxx0001101xxxxxxxxxxxxxx110xxxx"),
// A8.6.140 ROR (register)
// Encoding A1 ARMv4*, ARMv5T*, ARMv6*, ARMv7
// ror{s}<c> <Rd>,<Rn>,<Rm>
// Unpredictable if (0) is 1: xxxx0001101x(0)(0)(0)(0)xxxxxxxx0111xxxx
new OpcodeARM(Index.arm_ror__reg, "ror", "xxxx0001101xxxxxxxxxxxxx0111xxxx"),
// A8.6.143 RSB (register)
// Encoding A1 ARMv4*, ARMv5T*, ARMv6*, ARMv7
// rsb{s}<c> <Rd>,<Rn>,<Rm>{,<shift>}
new OpcodeARM(Index.arm_rsb__reg, "rsb", "xxxx0000011xxxxxxxxxxxxxxxx0xxxx"),
// A8.6.144 RSB (register-shifted register)
// Encoding A1 ARMv4*, ARMv5T*, ARMv6*, ARMv7
// rsb{s}<c> <Rd>,<Rn>,<Rm>,<type> <Rs>
new OpcodeARM(Index.arm_rsb__rsr, "rsb", "xxxx0000011xxxxxxxxxxxxx0xx1xxxx"),
// A8.6.146 RSC (register)
// Encoding A1 ARMv4*, ARMv5T*, ARMv6*, ARMv7
// rsc{s}<c> <Rd>,<Rn>,<Rm>{,<shift>}
new OpcodeARM(Index.arm_rsc__reg, "rsc", "xxxx0000111xxxxxxxxxxxxxxxx0xxxx"),
// A8.6.147 RSC (register-shifted register)
// Encoding A1 ARMv4*, ARMv5T*, ARMv6*, ARMv7
// rsc{s}<c> <Rd>,<Rn>,<Rm>,<type> <Rs>
new OpcodeARM(Index.arm_rsc__rsr, "rsc", "xxxx0000111xxxxxxxxxxxxx0xx1xxxx"),
// A8.6.152 SBC (register)
// Encoding A1 ARMv4*, ARMv5T*, ARMv6*, ARMv7
// sbc{s}<c> <Rd>,<Rn>,<Rm>{,<shift>}
new OpcodeARM(Index.arm_sbc__reg, "sbc", "xxxx0000110xxxxxxxxxxxxxxxx0xxxx"),
// A8.6.153 SBC (register-shifted register)
// Encoding A1 ARMv4*, ARMv5T*, ARMv6*, ARMv7
// sbc{s}<c> <Rd>,<Rn>,<Rm>,<type> <Rs>
new OpcodeARM(Index.arm_sbc__rsr, "sbc", "xxxx0000110xxxxxxxxxxxxx0xx1xxxx"),
// A8.6.154 SBFX
// Encoding A1 ARMv6T2, ARMv7
// sbfx<c> <Rd>,<Rn>,#<lsb>,#<width>
new OpcodeARM(Index.arm_sbfx, "sbfx", "xxxx0111101xxxxxxxxxxxxxx101xxxx"),
// A8.6.156 SEL
// Encoding A1 ARMv6*, ARMv7
// sel<c> <Rd>,<Rn>,<Rm>
// Unpredictable if (1) is 0: xxxx01101000xxxxxxxx(1)(1)(1)(1)1011xxxx
new OpcodeARM(Index.arm_sel, "sel", "xxxx01101000xxxxxxxxxxxx1011xxxx"),
// A8.6.166 SMLABB, SMLABT, SMLATB, SMLATT
// Encoding A1 ARMv5TE*, ARMv6*, ARMv7
// smla<x><y><c> <Rd>,<Rn>,<Rm>,<Ra>
new OpcodeARM(Index.arm_smla, "smla", "xxxx00010000xxxxxxxxxxxx1xx0xxxx"),
// A8.6.177 SMUAD
// Encoding A1 ARMv6*, ARMv7
// smuad{x}<c> <Rd>,<Rn>,<Rm>
new OpcodeARM(Index.arm_smuad, "smuad", "xxxx01110000xxxx1111xxxx00x1xxxx"),
// A8.6.167 SMLAD
// Encoding A1 ARMv6*, ARMv7
// smlad{x}<c> <Rd>,<Rn>,<Rm>,<Ra>
// must follow arm_smuad in table
new OpcodeARM(Index.arm_smlad, "smlad", "xxxx01110000xxxxxxxxxxxx00x1xxxx"),
// A8.6.168 SMLAL
// Encoding A1 ARMv4*, ARMv5T*, ARMv6*, ARMv7
// smlal{s}<c> <RdLo>,<RdHi>,<Rn>,<Rm>
new OpcodeARM(Index.arm_smlal, "smlal", "xxxx0000111xxxxxxxxxxxxx1001xxxx"),
// A8.6.169 SMLALBB, SMLALBT, SMLALTB, SMLALTT
// Encoding A1 ARMv5TE*, ARMv6*, ARMv7
// smlal<x><y><c> <RdLo>,<RdHi>,<Rn>,<Rm>
new OpcodeARM(Index.arm_smlalxy, "smlal", "xxxx00010100xxxxxxxxxxxx1xx0xxxx"),
// A8.6.170 SMLALD
// Encoding A1 ARMv6*, ARMv7
// smlald{x}<c> <RdLo>,<RdHi>,<Rn>,<Rm>
new OpcodeARM(Index.arm_smlald, "smlald", "xxxx01110100xxxxxxxxxxxx00x1xxxx"),
// A8.6.171 SMLAWB, SMLAWT
// Encoding A1 ARMv5TE*, ARMv6*, ARMv7
// smlaw<y><c> <Rd>,<Rn>,<Rm>,<Ra>
new OpcodeARM(Index.arm_smlaw, "smlaw", "xxxx00010010xxxxxxxxxxxx1x00xxxx"),
// A8.6.181 SMUSD
// Encoding A1 ARMv6*, ARMv7
// smusd{x}<c> <Rd>,<Rn>,<Rm>
// must precede arm_smlsd in table
new OpcodeARM(Index.arm_smusd, "smusd", "xxxx01110000xxxx1111xxxx01x1xxxx"),
// A8.6.172 SMLSD
// Encoding A1 ARMv6*, ARMv7
// smlsd{x}<c> <Rd>,<Rn>,<Rm>,<Ra>
// must follow arm_smusd in table
new OpcodeARM(Index.arm_smlsd, "smlsd", "xxxx01110000xxxxxxxxxxxx01x1xxxx"),
// A8.6.173 SMLSLD
// Encoding A1 ARMv6*, ARMv7
// smlsld{x}<c> <RdLo>,<RdHi>,<Rn>,<Rm>
new OpcodeARM(Index.arm_smlsld, "smlsld", "xxxx01110100xxxxxxxxxxxx01x1xxxx"),
// A8.6.176 SMMUL
// Encoding A1 ARMv6*, ARMv7
// smmul{r}<c> <Rd>,<Rn>,<Rm>
// must precede arm_smmla in table
new OpcodeARM(Index.arm_smmul, "smmul", "xxxx01110101xxxx1111xxxx00x1xxxx"),
// A8.6.174 SMMLA
// Encoding A1 ARMv6*, ARMv7
// smmla{r}<c> <Rd>,<Rn>,<Rm>,<Ra>
// must follow arm_smmul in table
new OpcodeARM(Index.arm_smmla, "smmla", "xxxx01110101xxxxxxxxxxxx00x1xxxx"),
// A8.6.175 SMMLS
// Encoding A1 ARMv6*, ARMv7
// smmls{r}<c> <Rd>,<Rn>,<Rm>,<Ra>
new OpcodeARM(Index.arm_smmls, "smmls", "xxxx01110101xxxxxxxxxxxx11x1xxxx"),
// A8.6.178 SMULBB, SMULBT, SMULTB, SMULTT
// Encoding A1 ARMv5TE*, ARMv6*, ARMv7
// smul<x><y><c> <Rd>,<Rn>,<Rm>
new OpcodeARM(Index.arm_smul, "smul", "xxxx00010110xxxxxxxxxxxx1xx0xxxx"),
// A8.6.179 SMULL
// Encoding A1 ARMv4*, ARMv5T*, ARMv6*, ARMv7
// smull{s}<c> <RdLo>,<RdHi>,<Rn>,<Rm>
new OpcodeARM(Index.arm_smull, "smull", "xxxx0000110xxxxxxxxxxxxx1001xxxx"),
// A8.6.180 SMULWB, SMULWT
// Encoding A1 ARMv5TE*, ARMv6*, ARMv7
// smulw<y><c> <Rd>,<Rn>,<Rm>
new OpcodeARM(Index.arm_smulw, "smulw", "xxxx00010010xxxxxxxxxxxx1x10xxxx"),
// A8.6.183 SSAT
// Encoding A1 ARMv6*, ARMv7
// ssat<c> <Rd>,#<imm>,<Rn>{,<shift>}
new OpcodeARM(Index.arm_ssat, "ssat", "xxxx0110101xxxxxxxxxxxxxxx01xxxx"),
// A8.6.184 SSAT16
// Encoding A1 ARMv6*, ARMv7
// ssat16<c> <Rd>,#<imm>,<Rn>
// Unpredictable if (1) is 0: xxxx01101010xxxxxxxx(1)(1)(1)(1)0011xxxx
new OpcodeARM(Index.arm_ssat16, "ssat16", "xxxx01101010xxxxxxxxxxxx0011xxxx"),
// A8.6.189 STM / STMIA / STMEA
// Encoding A1 ARMv4*, ARMv5T*, ARMv6*, ARMv7
// stm<c> <Rn>{!},<registers>
// must precede arm_stm__usr_regs in table
new OpcodeARM(Index.arm_stm__regs, "stm", "xxxx100010x0xxxxxxxxxxxxxxxxxxxx"),
// A8.6.190 STMDA / STMED
// Encoding A1 ARMv4*, ARMv5T*, ARMv6*, ARMv7
// stmda<c> <Rn>{!},<registers>
new OpcodeARM(Index.arm_stmda, "stmda", "xxxx100000x0xxxxxxxxxxxxxxxxxxxx"),
// A8.6.123 PUSH
// Encoding A1 ARMv4*, ARMv5T*, ARMv6*, ARMv7
// push<c> <registers> <registers> contains more than one register
// must precede arm_stmdb in table
new OpcodeARM(Index.arm_push__regs, "push", "xxxx100100101101xxxxxxxxxxxxxxxx"),
// A8.6.191 STMDB / STMFD
// Encoding A1 ARMv4*, ARMv5T*, ARMv6*, ARMv7
// stmdb<c> <Rn>{!},<registers>
// must follow arm_push__regs in table
new OpcodeARM(Index.arm_stmdb, "stmdb", "xxxx100100x0xxxxxxxxxxxxxxxxxxxx"),
// A8.6.192 STMIB / STMFA
// Encoding A1 ARMv4*, ARMv5T*, ARMv6*, ARMv7
// stmib<c> <Rn>{!},<registers>
new OpcodeARM(Index.arm_stmib, "stmib", "xxxx100110x0xxxxxxxxxxxxxxxxxxxx"),
// A8.6.210 STRT
// Encoding A1 ARMv4*, ARMv5T*, ARMv6*, ARMv7
// strt<c> <Rt>, [<Rn>] {, +/-<imm12>}
// must precede arm_str__imm in table
new OpcodeARM(Index.arm_strt__imm, "strt", "xxxx0100x010xxxxxxxxxxxxxxxxxxxx"),
// A8.6.123 PUSH
// Encoding A2 ARMv4*, ARMv5T*, ARMv6*, ARMv7
// push<c> <registers> <registers> contains one register, <Rt>
// must precede arm_str__imm in table
new OpcodeARM(Index.arm_push__reg, "push", "xxxx010100101101xxxx000000000100"),
// A8.6.194 STR (immediate, ARM)
// Encoding A1 ARMv4*, ARMv5T*, ARMv6*, ARMv7
// str<c> <Rt>,[<Rn>{,#+/-<imm12>}] str<c> <Rt>,[<Rn>],#+/-<imm12> str<c> <Rt>,[<Rn>,#+/-<imm12>]!
// must follow arm_strt__imm in table
// must follow arm_push__reg in table
new OpcodeARM(Index.arm_str__imm, "str", "xxxx010xx0x0xxxxxxxxxxxxxxxxxxxx"),
// A8.6.210 STRT
// Encoding A2 ARMv4*, ARMv5T*, ARMv6*, ARMv7
// strt<c> <Rt>,[<Rn>],+/-<Rm>{, <shift>}
// must precede arm_str__reg in table
new OpcodeARM(Index.arm_strt__reg, "strt", "xxxx0110x010xxxxxxxxxxxxxxx0xxxx"),
// A8.6.195 STR (register)
// Encoding A1 ARMv4*, ARMv5T*, ARMv6*, ARMv7
// str<c> <Rt>,[<Rn>,+/-<Rm>{, <shift>}]{!} str<c> <Rt>,[<Rn>],+/-<Rm>{, <shift>}
// must follow arm_strt__reg in table
new OpcodeARM(Index.arm_str__reg, "str", "xxxx011xx0x0xxxxxxxxxxxxxxx0xxxx"),
// A8.6.199 STRBT
// Encoding A2 ARMv4*, ARMv5T*, ARMv6*, ARMv7
// strbt<c> <Rt>,[<Rn>],+/-<Rm>{, <shift>}
// must precede arm_strb__reg in table
new OpcodeARM(Index.arm_strbt__reg, "strbt", "xxxx0110x110xxxxxxxxxxxxxxx0xxxx"),
// A8.6.198 STRB (register)
// Encoding A1 ARMv4*, ARMv5T*, ARMv6*, ARMv7
// strb<c> <Rt>,[<Rn>,+/-<Rm>{, <shift>}]{!} strb<c> <Rt>,[<Rn>],+/-<Rm>{, <shift>}
// must follow arm_strbt__reg in table
new OpcodeARM(Index.arm_strb__reg, "strb", "xxxx011xx1x0xxxxxxxxxxxxxxx0xxxx"),
// A8.6.201 STRD (register)
// Encoding A1 ARMv5TE*, ARMv6*, ARMv7
// strd<c> <Rt>,<Rt2>,[<Rn>,+/-<Rm>]{!} strd<c> <Rt>,<Rt2>,[<Rn>],+/-<Rm>
// Unpredictable if (0) is 1: xxxx000xx0x0xxxxxxxx(0)(0)(0)(0)1111xxxx
new OpcodeARM(Index.arm_strd__reg, "strd", "xxxx000xx0x0xxxxxxxxxxxx1111xxxx"),
// A8.6.202 STREX
// Encoding A1 ARMv6*, ARMv7
// strex<c> <Rd>,<Rt>,[<Rn>]
// Unpredictable if (1) is 0: xxxx00011000xxxxxxxx(1)(1)(1)(1)1001xxxx
new OpcodeARM(Index.arm_strex, "strex", "xxxx00011000xxxxxxxxxxxx1001xxxx"),
// A8.6.203 STREXB
// Encoding A1 ARMv6K, ARMv7
// strexb<c> <Rd>,<Rt>,[<Rn>]
// Unpredictable if (1) is 0: xxxx00011100xxxxxxxx(1)(1)(1)(1)1001xxxx
new OpcodeARM(Index.arm_strexb, "strexb", "xxxx00011100xxxxxxxxxxxx1001xxxx"),
// A8.6.204 STREXD
// Encoding A1 ARMv6K, ARMv7
// strexd<c> <Rd>,<Rt>,<Rt2>,[<Rn>]
// Unpredictable if (1) is 0: xxxx00011010xxxxxxxx(1)(1)(1)(1)1001xxxx
new OpcodeARM(Index.arm_strexd, "strexd", "xxxx00011010xxxxxxxxxxxx1001xxxx"),
// A8.6.205 STREXH
// Encoding A1 ARMv6K, ARMv7
// strexh<c> <Rd>,<Rt>,[<Rn>]
// Unpredictable if (1) is 0: xxxx00011110xxxxxxxx(1)(1)(1)(1)1001xxxx
new OpcodeARM(Index.arm_strexh, "strexh", "xxxx00011110xxxxxxxxxxxx1001xxxx"),
// A8.6.209 STRHT
// Encoding A2 ARMv6T2, ARMv7
// strht<c> <Rt>, [<Rn>], +/-<Rm>
// Unpredictable if (0) is 1: xxxx0000x010xxxxxxxx(0)(0)(0)(0)1011xxxx
// must precede arm_strh__reg in table
new OpcodeARM(Index.arm_strht__reg, "strht", "xxxx0000x010xxxxxxxxxxxx1011xxxx"),
// A8.6.208 STRH (register)
// Encoding A1 ARMv4*, ARMv5T*, ARMv6*, ARMv7
// strh<c> <Rt>,[<Rn>,+/-<Rm>]{!} strh<c> <Rt>,[<Rn>],+/-<Rm>
// Unpredictable if (0) is 1: xxxx000xx0x0xxxxxxxx(0)(0)(0)(0)1011xxxx
// must follow arm_strht__reg in table
new OpcodeARM(Index.arm_strh__reg, "strh", "xxxx000xx0x0xxxxxxxxxxxx1011xxxx"),
// A8.6.10 ADR
// Encoding A2 ARMv4*, ARMv5T*, ARMv6*, ARMv7
// adr<c> <Rd>,<label> sub<c> <Rd>,pc,#<const> Alternative form
// must precede arm_sub__imm in table
new OpcodeARM(Index.arm_adr__lower, "sub", "xxxx001001001111xxxxxxxxxxxxxxxx"),
// A8.6.213 SUB (register)
// Encoding A1 ARMv4*, ARMv5T*, ARMv6*, ARMv7
// sub{s}<c> <Rd>,<Rn>,<Rm>{,<shift>}
// A8.6.216 SUB (SP minus register)
// Encoding A1 ARMv4*, ARMv5T*, ARMv6*, ARMv7
// sub{s}<c> <Rd>,sp,<Rm>{,<shift>}
//
new OpcodeARM(Index.arm_sub__reg, "sub", "xxxx0000010xxxxxxxxxxxxxxxx0xxxx"),
// A8.6.214 SUB (register-shifted register)
// Encoding A1 ARMv4*, ARMv5T*, ARMv6*, ARMv7
// sub{s}<c> <Rd>,<Rn>,<Rm>,<type> <Rs>
new OpcodeARM(Index.arm_sub__rsr, "sub", "xxxx0000010xxxxxxxxxxxxx0xx1xxxx"),
// A8.6.218 SVC (previously SWI)
// Encoding A1 ARMv4*, ARMv5T*, ARMv6*, ARMv7
// svc<c> #<imm24>
new OpcodeARM(Index.arm_svc, "svc", "xxxx1111xxxxxxxxxxxxxxxxxxxxxxxx"),
// A8.6.219 SWP, SWPB
// Encoding A1 ARMv4*, ARMv5T*, ARMv6* (deprecated), ARMv7 (deprecated)
// swp{b}<c> <Rt>,<Rt2>,[<Rn>]
// Unpredictable if (0) is 1: xxxx00010x00xxxxxxxx(0)(0)(0)(0)1001xxxx
new OpcodeARM(Index.arm_swp, "swp", "xxxx00010x00xxxxxxxxxxxx1001xxxx"),
// A8.6.223 SXTB
// Encoding A1 ARMv6*, ARMv7
// sxtb<c> <Rd>,<Rm>{,<rotation>}
// Unpredictable if (0) is 1: xxxx011010101111xxxxxx(0)(0)0111xxxx
// must precede arm_sxtab in table
new OpcodeARM(Index.arm_sxtb, "sxtb", "xxxx011010101111xxxxxxxx0111xxxx"),
// A8.6.220 SXTAB
// Encoding A1 ARMv6*, ARMv7
// sxtab<c> <Rd>,<Rn>,<Rm>{,<rotation>}
// Unpredictable if (0) is 1: xxxx01101010xxxxxxxxxx(0)(0)0111xxxx
// must follow arm_sxtb in table
new OpcodeARM(Index.arm_sxtab, "sxtab", "xxxx01101010xxxxxxxxxxxx0111xxxx"),
// A8.6.224 SXTB16
// Encoding A1 ARMv6*, ARMv7
// sxtb16<c> <Rd>,<Rm>{,<rotation>}
// Unpredictable if (0) is 1: xxxx011010001111xxxxxx(0)(0)0111xxxx
// must precede arm_sxtab16 in table
new OpcodeARM(Index.arm_sxtb16, "sxtb16", "xxxx011010001111xxxxxxxx0111xxxx"),
// A8.6.221 SXTAB16
// Encoding A1 ARMv6*, ARMv7
// sxtab16<c> <Rd>,<Rn>,<Rm>{,<rotation>}
// Unpredictable if (0) is 1: xxxx01101000xxxxxxxxxx(0)(0)0111xxxx
// must follow arm_sxtb16 in table
new OpcodeARM(Index.arm_sxtab16, "sxtab16", "xxxx01101000xxxxxxxxxxxx0111xxxx"),
// A8.6.225 SXTH
// Encoding A1 ARMv6*, ARMv7
// sxth<c> <Rd>,<Rm>{,<rotation>}
// Unpredictable if (0) is 1: xxxx011010111111xxxxxx(0)(0)0111xxxx
// must precede arm_sxtah in table
new OpcodeARM(Index.arm_sxth, "sxth", "xxxx011010111111xxxxxxxx0111xxxx"),
// A8.6.222 SXTAH
// Encoding A1 ARMv6*, ARMv7
// sxtah<c> <Rd>,<Rn>,<Rm>{,<rotation>}
// Unpredictable if (0) is 1: xxxx01101011xxxxxxxxxx(0)(0)0111xxxx
// must follow arm_sxth in table
new OpcodeARM(Index.arm_sxtah, "sxtah", "xxxx01101011xxxxxxxxxxxx0111xxxx"),
// A8.6.227 TEQ (immediate)
// Encoding A1 ARMv4*, ARMv5T*, ARMv6*, ARMv7
// teq<c> <Rn>,#<const>
// Unpredictable if (0) is 1: xxxx00110011xxxx(0)(0)(0)(0)xxxxxxxxxxxx
new OpcodeARM(Index.arm_teq__imm, "teq", "xxxx00110011xxxxxxxxxxxxxxxxxxxx"),
// A8.6.228 TEQ (register)
// Encoding A1 ARMv4*, ARMv5T*, ARMv6*, ARMv7
// teq<c> <Rn>,<Rm>{,<shift>}
// Unpredictable if (0) is 1: xxxx00010011xxxx(0)(0)(0)(0)xxxxxxx0xxxx
new OpcodeARM(Index.arm_teq__reg, "teq", "xxxx00010011xxxxxxxxxxxxxxx0xxxx"),
// A8.6.229 TEQ (register-shifted register)
// Encoding A1 ARMv4*, ARMv5T*, ARMv6*, ARMv7
// teq<c> <Rn>,<Rm>,<type> <Rs>
// Unpredictable if (0) is 1: xxxx00010011xxxx(0)(0)(0)(0)xxxx0xx1xxxx
new OpcodeARM(Index.arm_teq__rsr, "teq", "xxxx00010011xxxxxxxxxxxx0xx1xxxx"),
// A8.6.230 TST (immediate)
// Encoding A1 ARMv4*, ARMv5T*, ARMv6*, ARMv7
// tst<c> <Rn>,#<const>
// Unpredictable if (0) is 1: xxxx00110001xxxx(0)(0)(0)(0)xxxxxxxxxxxx
new OpcodeARM(Index.arm_tst__imm, "tst", "xxxx00110001xxxxxxxxxxxxxxxxxxxx"),
// A8.6.231 TST (register)
// Encoding A1 ARMv4*, ARMv5T*, ARMv6*, ARMv7
// tst<c> <Rn>,<Rm>{,<shift>}
// Unpredictable if (0) is 1: xxxx00010001xxxx(0)(0)(0)(0)xxxxxxx0xxxx
new OpcodeARM(Index.arm_tst__reg, "tst", "xxxx00010001xxxxxxxxxxxxxxx0xxxx"),
// A8.6.232 TST (register-shifted register)
// Encoding A1 ARMv4*, ARMv5T*, ARMv6*, ARMv7
// tst<c> <Rn>,<Rm>,<type> <Rs>
// Unpredictable if (0) is 1: xxxx00010001xxxx(0)(0)(0)(0)xxxx0xx1xxxx
new OpcodeARM(Index.arm_tst__rsr, "tst", "xxxx00010001xxxxxxxxxxxx0xx1xxxx"),
// A8.6.236 UBFX
// Encoding A1 ARMv6T2, ARMv7
// ubfx<c> <Rd>,<Rn>,#<lsb>,#<width>
new OpcodeARM(Index.arm_ubfx, "ubfx", "xxxx0111111xxxxxxxxxxxxxx101xxxx"),
// A8.6.244 UMAAL
// Encoding A1 ARMv6*, ARMv7
// umaal<c> <RdLo>,<RdHi>,<Rn>,<Rm>
new OpcodeARM(Index.arm_umaal, "umaal", "xxxx00000100xxxxxxxxxxxx1001xxxx"),
// A8.6.245 UMLAL
// Encoding A1 ARMv4*, ARMv5T*, ARMv6*, ARMv7
// umlal{s}<c> <RdLo>,<RdHi>,<Rn>,<Rm>
new OpcodeARM(Index.arm_umlal, "umlal", "xxxx0000101xxxxxxxxxxxxx1001xxxx"),
// A8.6.246 UMULL
// Encoding A1 ARMv4*, ARMv5T*, ARMv6*, ARMv7
// umull{s}<c> <RdLo>,<RdHi>,<Rn>,<Rm>
new OpcodeARM(Index.arm_umull, "umull", "xxxx0000100xxxxxxxxxxxxx1001xxxx"),
// A8.6.253 USAD8
// Encoding A1 ARMv6*, ARMv7
// usad8<c> <Rd>,<Rn>,<Rm>
// must precede arm_usada8 in table
new OpcodeARM(Index.arm_usad8, "usad8", "xxxx01111000xxxx1111xxxx0001xxxx"),
// A8.6.254 USADA8
// Encoding A1 ARMv6*, ARMv7
// usada8<c> <Rd>,<Rn>,<Rm>,<Ra>
// must follow arm_usad8 in table
new OpcodeARM(Index.arm_usada8, "usada8", "xxxx01111000xxxxxxxxxxxx0001xxxx"),
// A8.6.255 USAT
// Encoding A1 ARMv6*, ARMv7
// usat<c> <Rd>,#<imm5>,<Rn>{,<shift>}
new OpcodeARM(Index.arm_usat, "usat", "xxxx0110111xxxxxxxxxxxxxxx01xxxx"),
// A8.6.256 USAT16
// Encoding A1 ARMv6*, ARMv7
// usat16<c> <Rd>,#<imm4>,<Rn>
// Unpredictable if (1) is 0: xxxx01101110xxxxxxxx(1)(1)(1)(1)0011xxxx
new OpcodeARM(Index.arm_usat16, "usat16", "xxxx01101110xxxxxxxxxxxx0011xxxx"),
// A8.6.263 UXTB
// Encoding A1 ARMv6*, ARMv7
// uxtb<c> <Rd>,<Rm>{,<rotation>}
// Unpredictable if (0) is 1: xxxx011011101111xxxxxx(0)(0)0111xxxx
// must precede arm_uxtab in table
new OpcodeARM(Index.arm_uxtb, "uxtb", "xxxx011011101111xxxxxxxx0111xxxx"),
// A8.6.260 UXTAB
// Encoding A1 ARMv6*, ARMv7
// uxtab<c> <Rd>,<Rn>,<Rm>{,<rotation>}
// Unpredictable if (0) is 1: xxxx01101110xxxxxxxxxx(0)(0)0111xxxx
// must follow arm_uxtb in table
new OpcodeARM(Index.arm_uxtab, "uxtab", "xxxx01101110xxxxxxxxxxxx0111xxxx"),
// A8.6.264 UXTB16
// Encoding A1 ARMv6*, ARMv7
// uxtb16<c> <Rd>,<Rm>{,<rotation>}
// Unpredictable if (0) is 1: xxxx011011001111xxxxxx(0)(0)0111xxxx
// must precede arm_uxtab16 in table
new OpcodeARM(Index.arm_uxtb16, "uxtb16", "xxxx011011001111xxxxxxxx0111xxxx"),
// A8.6.261 UXTAB16
// Encoding A1 ARMv6*, ARMv7
// uxtab16<c> <Rd>,<Rn>,<Rm>{,<rotation>}
// Unpredictable if (0) is 1: xxxx01101100xxxxxxxxxx(0)(0)0111xxxx
// must follow arm_uxtb16 in table
new OpcodeARM(Index.arm_uxtab16, "uxtab16", "xxxx01101100xxxxxxxxxxxx0111xxxx"),
// A8.6.265 UXTH
// Encoding A1 ARMv6*, ARMv7
// uxth<c> <Rd>,<Rm>{,<rotation>}
// Unpredictable if (0) is 1: xxxx011011111111xxxxxx(0)(0)0111xxxx
// must precede arm_uxtah in table
new OpcodeARM(Index.arm_uxth, "uxth", "xxxx011011111111xxxxxxxx0111xxxx"),
// A8.6.262 UXTAH
// Encoding A1 ARMv6*, ARMv7
// uxtah<c> <Rd>,<Rn>,<Rm>{,<rotation>}
// Unpredictable if (0) is 1: xxxx01101111xxxxxxxxxx(0)(0)0111xxxx
// must follow arm_uxth in table
new OpcodeARM(Index.arm_uxtah, "uxtah", "xxxx01101111xxxxxxxxxxxx0111xxxx"),
// B6.1.9 SMC (previously SMI)
// Encoding A1 Security Extensions
// smc<c> #<imm4>
// Unpredictable if (0) is 1: xxxx00010110(0)(0)(0)(0)(0)(0)(0)(0)(0)(0)(0)(0)0111xxxx
new OpcodeARM(Index.arm_smc, "smc", "xxxx00010110xxxxxxxxxxxx0111xxxx"),
// B6.1.10 SRS
// Encoding A1 ARMv6*, ARMv7
// srs{<amode>} sp{!},#<mode>
// Unpredictable if (1) is 0 or (0) is 1: 1111100xx1x0(1)(1)(0)(1)(0)(0)(0)(0)(0)(1)(0)(1)(0)(0)(0)xxxxx
new OpcodeARM(Index.arm_srs, "srs", "1111100xx1x0xxxxxxxxxxxxxxxxxxxx"),
// B6.1.11 STM (user registers)
// Encoding A1 ARMv4*, ARMv5T*, ARMv6*, ARMv7
// stm{amode}<c> <Rn>,<registers>^
// Unpredictable if (0) is 1: xxxx100xx1(0)0xxxxxxxxxxxxxxxxxxxx
// must follow arm_stm__regs in table
new OpcodeARM(Index.arm_stm__usr_regs, "stm", "xxxx100xx1x0xxxxxxxxxxxxxxxxxxxx"),
// VFP and Advanced SIMD instructions
// A8.6.266 VABA, VABAL
// Encoding A1 / T1 Advanced SIMD
// vaba<c>.<dt> <Qd>, <Qn>, <Qm> vaba<c>.<dt> <Dd>, <Dn>, <Dm>
new OpcodeARM(Index.arm_vaba, "vaba", "1111001x0xxxxxxxxxxx0111xxx1xxxx"),
// A8.6.281 VCEQ (immediate #0)
// Encoding A1 / T1 Advanced SIMD (F = 1 UNDEFINED in integer-only variants)
// vceq<c>.<dt> <Qd>, <Qm>, #0 vceq<c>.<dt> <Dd>, <Dm>, #0
// must precede arm_vabal in table
// must precede arm_vaddl_vaddw in table
new OpcodeARM(Index.arm_vceq__imm0, "vceq", "111100111x11xx01xxxx0x010xx0xxxx"),
// A8.6.287 VCLE (immediate #0)
// Encoding A1 / T1 Advanced SIMD (F = 1 UNDEFINED in integer-only variants)
// vcle<c>.<dt> <Qd>, <Qm>, #0 vcle<c>.<dt> <Dd>, <Dm>, #0
// must precede arm_vabal in table
// must precede arm_vaddl_vaddw in table
new OpcodeARM(Index.arm_vcle, "vcle", "111100111x11xx01xxxx0x011xx0xxxx"),
// A8.6.293 VCNT
// Encoding A1 / T1 Advanced SIMD
// vcnt<c>.8 <Qd>, <Qm> vcnt<c>.8 <Dd>, <Dm>
// must precede arm_vabal in table
new OpcodeARM(Index.arm_vcnt, "vcnt", "111100111x11xx00xxxx01010xx0xxxx"),
// A8.6.267 VABD, VABDL (integer)
// Encoding A1 / T1 Advanced SIMD
// vabd<c>.<dt> <Qd>, <Qn>, <Qm> vabd<c>.<dt> <Dd>, <Dn>, <Dm>
new OpcodeARM(Index.arm_vabd__int, "vabd", "1111001x0xxxxxxxxxxx0111xxx0xxxx"),
// A8.6.269 VABS
// Encoding A1 / T1 Advanced SIMD (F = 1 UNDEFINED in integer-only variant)
// vabs<c>.<dt> <Qd>, <Qm> vabs<c>.<dt> <Dd>, <Dm>
// must precede arm_vabdl in table
new OpcodeARM(Index.arm_vabs, "vabs", "111100111x11xx01xxxx0x110xx0xxxx"),
// A8.6.294 VCVT (between floating-point and integer, Advanced SIMD)
// Encoding A1 / T1 Advanced SIMD (UNDEFINED in integer-only variant)
// vcvt<c>.<Td>.<Tm> <Qd>, <Qm> vcvt<c>.<Td>.<Tm> <Dd>, <Dm>
// must precede arm_vabdl in table
new OpcodeARM(Index.arm_vcvt__fp_i_vec, "vcvt", "111100111x11xx11xxxx011xxxx0xxxx"),
// A8.6.299 VCVT (between half-precision and single-precision, Advanced SIMD)
// Encoding A1 / T1 Advanced SIMD with half-precision extensions (UNDEFINED in integer-only variant)
// vcvt<c>.f32.f16 <Qd>, <Dm> vcvt<c>.f16.f32 <Dd>, <Qm>
// must precede arm_vabdl in table
new OpcodeARM(Index.arm_vcvt__hp_sp_vec, "vcvt", "111100111x11xx10xxxx011x00x0xxxx"),
// A8.6.342 VNEG
// Encoding A1 / T1 Advanced SIMD (F = 1 UNDEFINED in integer-only variants)
// vneg<c>.<dt> <Qd>, <Qm> vneg<c>.<dt> <Dd>, <Dm>
// must precede arm_vabdl in table
// must precede arm_vmlal in table
// must precede arm_vmlsl in table
new OpcodeARM(Index.arm_vneg, "vneg", "111100111x11xx01xxxx0x111xx0xxxx"),
// A8.6.356 VQABS
// Encoding A1 / T1 Advanced SIMD
// vqabs<c>.<dt> <Qd>,<Qm> vqabs<c>.<dt> <Dd>,<Dm>
// must precede arm_vabdl in table
// must precede arm_vmlal in table
new OpcodeARM(Index.arm_vqabs, "vqabs", "111100111x11xx00xxxx01110xx0xxxx"),
// A8.6.362 VQNEG
// Encoding A1 / T1 Advanced SIMD
// vqneg<c>.<dt> <Qd>,<Qm> vqneg<c>.<dt> <Dd>,<Dm>
// must precede arm_vabdl in table
// must precede arm_vmlsl in table
new OpcodeARM(Index.arm_vqneg, "vqneg", "111100111x11xx00xxxx01111xx0xxxx"),
// A8.6.267 VABD, VABDL (integer)
// Encoding A2 Advanced SIMD
// vabdl<c>.<dt> <Qd>, <Dn>, <Dm>
// must follow arm_vabs in table
// must follow arm_vcvt__fp_i_vec in table
// must follow arm_vcvt__hp_sp_vec in table
// must follow arm_vneg in table
// must follow arm_vqabs in table
// must follow arm_vqneg in table
new OpcodeARM(Index.arm_vabdl, "vabdl", "1111001x1xxxxxxxxxxx0111x0x0xxxx"),
// A8.6.268 VABD (floating-point)
// Encoding A1 / T1 Advanced SIMD (UNDEFINED in integer-only variant)
// vabd<c>.f32 <Qd>, <Qn>, <Qm> vabd<c>.f32 <Dd>, <Dn>, <Dm>
new OpcodeARM(Index.arm_vabd__f32, "vabd", "111100110x1xxxxxxxxx1101xxx0xxxx"),
// A8.6.269 VABS
// Encoding A2 / T2 VFPv2, VFPv3 (sz = 1 UNDEFINED in single-precision only variants)
// vabs<c>.f64 <Dd>, <Dm> vabs<c>.f32 <Sd>, <Sm>
new OpcodeARM(Index.arm_vabs__f, "vabs", "xxxx11101x110000xxxx101x11x0xxxx"),
// A8.6.270 VACGE, VACGT, VACLE, VACLT
// Encoding A1 / T1 Advanced SIMD (UNDEFINED in integer-only variant)
// vacge<c>.f32 <Qd>, <Qn>, <Qm> vacge<c>.f32 <Dd>, <Dn>, <Dm>
// vacgt<c>.f32 <Qd>, <Qn>, <Qm> vacgt<c>.f32 <Dd>, <Dn>, <Dm>
new OpcodeARM(Index.arm_vacge_vacgt, "vac", "111100110xxxxxxxxxxx1110xxx1xxxx"),
// A8.6.271 VADD (integer)
// Encoding A1 / T1 Advanced SIMD
// vadd<c>.<dt> <Qd>, <Qn>, <Qm> vadd<c>.<dt> <Dd>, <Dn>, <Dm>
new OpcodeARM(Index.arm_vadd__int, "vadd", "111100100xxxxxxxxxxx1000xxx0xxxx"),
// A8.6.272 VADD (floating-point)
// Encoding A1 / T1 Advanced SIMD (UNDEFINED in integer-only variants)
// vadd<c>.f32 <Qd>, <Qn>, <Qm> vadd<c>.f32 <Dd>, <Dn>, <Dm>
new OpcodeARM(Index.arm_vadd__f32, "vadd", "111100100x0xxxxxxxxx1101xxx0xxxx"),
// A8.6.272 VADD (floating-point)
// Encoding A2 / T2 VFPv2, VFPv3 (sz = 1 UNDEFINED in single-precision only variants)
// vadd<c>.f64 <Dd>, <Dn>, <Dm> vadd<c>.f32 <Sd>, <Sn>, <Sm>
new OpcodeARM(Index.arm_vadd__fp_f, "vadd", "xxxx11100x11xxxxxxxx101xx0x0xxxx"),
// A8.6.305 VEXT
// Encoding A1 / T1 Advanced SIMD
// vext<c>.8 <Qd>, <Qn>, <Qm>, #<imm> vext<c>.8 <Dd>, <Dn>, <Dm>, #<imm>
// must precede arm_vabal in table
// must precede arm_vaddhn in table
new OpcodeARM(Index.arm_vext, "vext", "111100101x11xxxxxxxxxxxxxxx0xxxx"),
// A8.6.273 VADDHN
// Encoding A1 / T1 Advanced SIMD
// vaddhn<c>.<dt> <Dd>, <Qn>, <Qm>
// must follow arm_vext in table
new OpcodeARM(Index.arm_vaddhn, "vaddhn", "111100101xxxxxxxxxxx0100x0x0xxxx"),
// A8.6.283 VCGE (immediate #0)
// Encoding A1 / T1 Advanced SIMD (F = 1 UNDEFINED in integer-only variants)
// vcge<c>.<dt> <Qd>, <Qm>, #0 vcge<c>.<dt> <Dd>, <Dm>, #0
// must precede arm_vaddl_vaddw in table
new OpcodeARM(Index.arm_vcge__imm0, "vcge", "111100111x11xx01xxxx0x001xx0xxxx"),
// A8.6.285 VCGT (immediate #0)
// Encoding A1 / T1 Advanced SIMD (F = 1 UNDEFINED in integer-only variants)
// vcgt<c>.<dt> <Qd>, <Qm>, #0 vcgt<c>.<dt> <Dd>, <Dm>, #0
// must precede arm_vaddl_vaddw in table
new OpcodeARM(Index.arm_vcgt__imm0, "vcgt", "111100111x11xx01xxxx0x000xx0xxxx"),
// A8.6.373 VREV16, VREV32, VREV64
// Encoding A1 / T1 Advanced SIMD
// vrev<n><c>.<size> <Qd>, <Qm> vrev<n><c>.<size> <Dd>, <Dm>
// must precede arm_vaddl_vaddw in table
new OpcodeARM(Index.arm_vrev, "vrev", "111100111x11xx00xxxx000xxxx0xxxx"),
// A8.6.405 VSWP
// Encoding A1 / T1 Advanced SIMD
// vswp<c> <Qd>, <Qm> vswp<c> <Dd>, <Dm>
// must precede arm_vaddl_vaddw in table
new OpcodeARM(Index.arm_vswp, "vswp", "111100111x11xx10xxxx00000xx0xxxx"),
// A8.6.409 VUZP
// Encoding A1 / T1 Advanced SIMD
// vuzp<c>.<size> <Qd>, <Qm> vuzp<c>.<size> <Dd>, <Dm>
// must precede arm_vaddl_vaddw in table
// must precede arm_vtrn in table
new OpcodeARM(Index.arm_vuzp, "vuzp", "111100111x11xx10xxxx00010xx0xxxx"),
// A8.6.410 VZIP
// Encoding A1 / T1 Advanced SIMD
// vzip<c>.<size> <Qd>, <Qm> vzip<c>.<size> <Dd>, <Dm>
// must precede arm_vaddl_vaddw in table
// must precede arm_vtrn in table
new OpcodeARM(Index.arm_vzip, "vzip", "111100111x11xx10xxxx00011xx0xxxx"),
// A8.6.407 VTRN
// Encoding A1 / T1 Advanced SIMD
// vtrn<c>.<size> <Qd>, <Qm> vtrn<c>.<size> <Dd>, <Dm>
// must precede arm_vaddl_vaddw in table
// must follow arm_vuzp in table
// must follow arm_vzip in table
new OpcodeARM(Index.arm_vtrn, "vtrn", "111100111x11xx10xxxx00001xx0xxxx"),
// A8.6.274 VADDL, VADDW
// Encoding A1 / T1 Advanced SIMD
// vaddl<c>.<dt> <Qd>, <Dn>, <Dm> vaddw<c>.<dt> <Qd>, <Qn>, <Dm>
// must follow arm_vceq__imm0 in table
// must follow arm_vcge__imm0 in table
// must follow arm_vcgt__imm0 in table
// must follow arm_vcle in table
// must follow arm_vrev in table
// must follow arm_vswp in table
// must follow arm_vtrn in table
// must follow arm_vuzp in table
// must follow arm_vzip in table
new OpcodeARM(Index.arm_vaddl_vaddw, "vadd", "1111001x1xxxxxxxxxxx000xx0x0xxxx"),
// A8.6.276 VAND (register)
// Encoding A1 / T1 Advanced SIMD
// vand<c> <Qd>, <Qn>, <Qm> vand<c> <Dd>, <Dn>, <Dm>
new OpcodeARM(Index.arm_vand, "vand", "111100100x00xxxxxxxx0001xxx1xxxx"),
// A8.6.278 VBIC (register)
// Encoding A1 / T1 Advanced SIMD
// vbic<c> <Qd>, <Qn>, <Qm> vbic<c> <Dd>, <Dn>, <Dm>
new OpcodeARM(Index.arm_vbic, "vbic", "111100100x01xxxxxxxx0001xxx1xxxx"),
// A8.6.304 VEOR
// Encoding A1 / T1 Advanced SIMD
// veor<c> <Qd>, <Qn>, <Qm> veor<c> <Dd>, <Dn>, <Dm>
// A8.6.279 VBIF, VBIT, VBSL
// Encoding A1 / T1 Advanced SIMD
// vbif<c> <Qd>, <Qn>, <Qm> vbif<c> <Dd>, <Dn>, <Dm>
// vbit<c> <Qd>, <Qn>, <Qm> vbit<c> <Dd>, <Dn>, <Dm>
// vbsl<c> <Qd>, <Qn>, <Qm> vbsl<c> <Dd>, <Dn>, <Dm>
//
new OpcodeARM(Index.arm_vbif_vbit_vbsl_veor, "v", "111100110xxxxxxxxxxx0001xxx1xxxx"),
// A8.6.280 VCEQ (register)
// Encoding A1 / T1 Advanced SIMD
// vceq<c>.<dt> <Qd>, <Qn>, <Qm> vceq<c>.<dt> <Dd>, <Dn>, <Dm>
new OpcodeARM(Index.arm_vceq__reg_int, "vceq", "111100110xxxxxxxxxxx1000xxx1xxxx"),
// A8.6.280 VCEQ (register)
// Encoding A2 / T2 Advanced SIMD (UNDEFINED in integer-only variant)
// vceq<c>.f32 <Qd>, <Qn>, <Qm> vceq<c>.f32 <Dd>, <Dn>, <Dm>
new OpcodeARM(Index.arm_vceq__reg_f32, "vceq", "111100100x0xxxxxxxxx1110xxx0xxxx"),
// A8.6.282 VCGE (register)
// Encoding A1 / T1 Advanced SIMD
// vcge<c>.<dt> <Qd>, <Qn>, <Qm> vcge<c>.<dt> <Dd>, <Dn>, <Dm>
new OpcodeARM(Index.arm_vcge__reg_int, "vcge", "1111001x0xxxxxxxxxxx0011xxx1xxxx"),
// A8.6.282 VCGE (register)
// Encoding A2 / T2 Advanced SIMD (UNDEFINED in integer-only variant)
// vcge<c>.f32 <Qd>, <Qn>, <Qm> vcge<c>.f32 <Dd>, <Dn>, <Dm>
new OpcodeARM(Index.arm_vcge__reg_f32, "vcge", "111100110x0xxxxxxxxx1110xxx0xxxx"),
// A8.6.284 VCGT (register)
// Encoding A1 / T1 Advanced SIMD
// vcgt<c>.<dt> <Qd>, <Qn>, <Qm> vcgt<c>.<dt> <Dd>, <Dn>, <Dm>
new OpcodeARM(Index.arm_vcgt__reg_int, "vcgt", "1111001x0xxxxxxxxxxx0011xxx0xxxx"),
// A8.6.284 VCGT (register)
// Encoding A2 / T2 Advanced SIMD (UNDEFINED in integer-only variant)
// vcgt<c>.f32 <Qd>, <Qn>, <Qm> vcgt<c>.f32 <Dd>, <Dn>, <Dm>
new OpcodeARM(Index.arm_vcgt__reg_f32, "vcgt", "111100110x1xxxxxxxxx1110xxx0xxxx"),
// A8.6.288 VCLS
// Encoding A1 / T1 Advanced SIMD
// vcls<c>.<dt> <Qd>, <Qm> vcls<c>.<dt> <Dd>, <Dm>
new OpcodeARM(Index.arm_vcls, "vcls", "111100111x11xx00xxxx01000xx0xxxx"),
// A8.6.290 VCLT (immediate #0)
// Encoding A1 / T1 Advanced SIMD (F = 1 UNDEFINED in integer-only variants)
// vclt<c>.<dt> <Qd>, <Qm>, #0 vclt<c>.<dt> <Dd>, <Dm>, #0
new OpcodeARM(Index.arm_vclt, "vclt", "111100111x11xx01xxxx0x100xx0xxxx"),
// A8.6.291 VCLZ
// Encoding A1 / T1 Advanced SIMD
// vclz<c>.<dt> <Qd>, <Qm> vclz<c>.<dt> <Dd>, <Dm>
new OpcodeARM(Index.arm_vclz, "vclz", "111100111x11xx00xxxx01001xx0xxxx"),
// A8.6.292 VCMP, VCMPE
// Encoding A1 / T1 VFPv2, VFPv3 (sz = 1 UNDEFINED in single-precision only variants)
// vcmp{e}<c>.f64 <Dd>, <Dm> vcmp{e}<c>.f32 <Sd>, <Sm>
new OpcodeARM(Index.arm_vcmp__reg, "vcmp", "xxxx11101x110100xxxx101xx1x0xxxx"),
// A8.6.292 VCMP, VCMPE
// Encoding A2 / T2 VFPv2, VFPv3 (sz = 1 UNDEFINED in single-precision only variants)
// vcmp{e}<c>.f64 <Dd>, #0.0 vcmp{e}<c>.f32 <Sd>, #0.0
// Unpredictable if (0) is 1: xxxx11101x110101xxxx101xx1(0)0(0)(0)(0)(0)
new OpcodeARM(Index.arm_vcmp__to_0, "vcmp", "xxxx11101x110101xxxx101xx1x0xxxx"),
// A8.6.297 VCVT (between floating-point and fixed-point, VFP)
// Encoding A1 / T1 VFPv3 (sf = 1 UNDEFINED in single-precision only variants)
// vcvt<c>.<Td>.f64 <Dd>, <Dd>, #<fbits> vcvt<c>.<Td>.f32 <Sd>, <Sd>, #<fbits>
// vcvt<c>.f64.<Td> <Dd>, <Dd>, #<fbits> vcvt<c>.f32.<Td> <Sd>, <Sd>, #<fbits>
// must precede arm_vcvt__fp_i_reg in table
new OpcodeARM(Index.arm_vcvt__fp_fix_reg, "vcvt", "xxxx11101x111x1xxxxx101xx1x0xxxx"),
// A8.6.295 VCVT, VCVTR (between floating-point and integer, VFP)
// Encoding A1 / T1 VFPv2, VFPv3 (sz = 1 UNDEFINED in single-precision only variants)
// vcvt{r}<c>.s32.f64 <Sd>, <Dm> vcvt{r}<c>.s32.f32 <Sd>, <Sm> vcvt{r}<c>.u32.f64 <Sd>, <Dm>
// vcvt{r}<c>.u32.f32 <Sd>, <Sm> vcvt<c>.f64.<Tm> <Dd>, <Sm> vcvt<c>.f32.<Tm> <Sd>, <Sm>
// must follow arm_vcvt__fp_fix_reg in table
new OpcodeARM(Index.arm_vcvt__fp_i_reg, "vcvt", "xxxx11101x111xxxxxxx101xx1x0xxxx"),
// A8.6.277 VBIC (immediate)
// Encoding A1 / T1 Advanced SIMD
// vbic<c>.<dt> <Qd>, #<imm> vbic<c>.<dt> <Dd>, #<imm>
// A8.6.346 VORR (immediate)
// Encoding A1 / T1 Advanced SIMD
// vorr<c>.<dt> <Qd>, #<imm> vorr<c>.<dt> <Dd>, #<imm>
// A8.6.340 VMVN (immediate)
// Encoding A1 / T1 Advanced SIMD
// vmvn<c>.<dt> <Qd>, #<imm> vmvn<c>.<dt> <Dd>, #<imm>
// A8.6.326 VMOV (immediate)
// Encoding A1 / T1 Advanced SIMD
// vmov<c>.<dt> <Qd>, #<imm> vmov<c>.<dt> <Dd>, #<imm>
//
// must precede arm_vcvt__fp_fix_vec in table
new OpcodeARM(Index.arm_vmov_vbitwise, "_", "1111001x1x000xxxxxxxxxxx0xx1xxxx"),
// A8.6.296 VCVT (between floating-point and fixed-point, Advanced SIMD)
// Encoding A1 / T1 Advanced SIMD (UNDEFINED in integer-only variant)
// vcvt<c>.<Td>.<Tm> <Qd>, <Qm>, #<fbits> vcvt<c>.<Td>.<Tm> <Dd>, <Dm>, #<fbits>
// must follow arm_vmov_vbitwise in table
new OpcodeARM(Index.arm_vcvt__fp_fix_vec, "vcvt", "1111001x1xxxxxxxxxxx111x0xx1xxxx"),
// A8.6.298 VCVT (between double-precision and single-precision)
// Encoding A1 / T1 VFPv2, VFPv3 (UNDEFINED in single-precision only variants)
// vcvt<c>.f64.f32 <Dd>, <Sm> vcvt<c>.f32.f64 <Sd>, <Dm>
new OpcodeARM(Index.arm_vcvt__dp_sp, "vcvt", "xxxx11101x110111xxxx101x11x0xxxx"),
// A8.6.300 VCVTB, VCVTT (between half-precision and single-precision, VFP)
// Encoding A1 / T1 VFPv3 half-precision extensions
// vcvt<y><c>.f32.f16 <Sd>, <Sm> vcvt<y><c>.f16.f32 <Sd>, <Sm>
new OpcodeARM(Index.arm_vcvt__hp_sp_reg, "vcvt", "xxxx11101x11001xxxxx1010x1x0xxxx"),
// A8.6.301 VDIV
// Encoding A1 / T1 VFPv2, VFPv3 (sz = 1 UNDEFINED in single-precision only variants)
// vdiv<c>.f64 <Dd>, <Dn>, <Dm> vdiv<c>.f32 <Sd>, <Sn>, <Sm>
new OpcodeARM(Index.arm_vdiv, "vdiv", "xxxx11101x00xxxxxxxx101xx0x0xxxx"),
// A8.6.302 VDUP (scalar)
// Encoding A1 / T1 Advanced SIMD
// vdup<c>.<size> <Qd>, <Dm[x]> vdup<c>.<size> <Dd>, <Dm[x]>
new OpcodeARM(Index.arm_vdup__scalar, "vdup", "111100111x11xxxxxxxx11000xx0xxxx"),
// A8.6.303 VDUP (ARM core register)
// Encoding A1 / T1 Advanced SIMD
// vdup<c>.<size> <Qd>, <Rt> vdup<c>.<size> <Dd>, <Rt>
// Unpredictable if (0) is 1: xxxx11101xx0xxxxxxxx1011x0x1(0)(0)(0)(0)
new OpcodeARM(Index.arm_vdup__reg, "vdup", "xxxx11101xx0xxxxxxxx1011x0x1xxxx"),
// A8.6.306 VHADD, VHSUB
// Encoding A1 / T1 Advanced SIMD
// vh<op><c> <Qd>, <Qn>, <Qm> vh<op><c> <Dd>, <Dn>, <Dm>
new OpcodeARM(Index.arm_vhadd_vhsub, "vh", "1111001x0xxxxxxxxxxx00x0xxx0xxxx"),
// A8.6.307 VLD1 (multiple single elements)
// Encoding A1 / T1 Advanced SIMD
// vld1<c>.<size> <list>, [<Rn>{@<align>}]{!} vld1<c>.<size> <list>, [<Rn>{@<align>}], <Rm>
// A8.6.310 VLD2 (multiple 2-element structures)
// Encoding A1 / T1 Advanced SIMD
// vld2<c>.<size> <list>, [<Rn>{@<align>}]{!} vld2<c>.<size> <list>, [<Rn>{@<align>}], <Rm>
// A8.6.313 VLD3 (multiple 3-element structures)
// Encoding A1 / T1 Advanced SIMD
// vld3<c>.<size> <list>, [<Rn>{@<align>}]{!} vld3<c>.<size> <list>, [<Rn>{@<align>}], <Rm>
// A8.6.316 VLD4 (multiple 4-element structures)
// Encoding A1 / T1 Advanced SIMD
// vld4<c>.<size> <list>, [<Rn>{@<align>}]{!} vld4<c>.<size> <list>, [<Rn>{@<align>}], <Rm>
//
new OpcodeARM(Index.arm_vld__multi, "vld", "111101000x10xxxxxxxxxxxxxxxxxxxx"),
// A8.6.308 VLD1 (single element to one lane)
// Encoding A1 / T1 Advanced SIMD
// vld1<c>.<size> <list>, [<Rn>{@<align>}]{!} vld1<c>.<size> <list>, [<Rn>{@<align>}], <Rm>
// A8.6.309 VLD1 (single element to all lanes)
// Encoding A1 / T1 Advanced SIMD
// vld1<c>.<size> <list>, [<Rn>{@<align>}]{!} vld1<c>.<size> <list>, [<Rn>{@<align>}], <Rm>
// A8.6.311 VLD2 (single 2-element structure to one lane)
// Encoding A1 / T1 Advanced SIMD
// vld2<c>.<size> <list>, [<Rn>{@<align>}]{!} vld2<c>.<size> <list>, [<Rn>{@<align>}], <Rm>
// A8.6.312 VLD2 (single 2-element structure to all lanes)
// Encoding A1 / T1 Advanced SIMD
// vld2<c>.<size> <list>, [<Rn>{@<align>}]{!} vld2<c>.<size> <list>, [<Rn>{@<align>}], <Rm>
// A8.6.314 VLD3 (single 3-element structure to one lane)
// Encoding A1 / T1 Advanced SIMD
// vld3<c>.<size> <list>, [<Rn>]{!} vld3<c>.<size> <list>, [<Rn>], <Rm>
// A8.6.315 VLD3 (single 3-element structure to all lanes)
// Encoding A1 / T1 Advanced SIMD
// vld3<c>.<size> <list>, [<Rn>]{!} vld3<c>.<size> <list>, [<Rn>], <Rm>
// A8.6.317 VLD4 (single 4-element structure to one lane)
// Encoding A1 / T1 Advanced SIMD
// vld4<c>.<size> <list>, [<Rn>{@<align>}]{!} vld4<c>.<size> <list>, [<Rn>{@<align>}], <Rm>
// A8.6.318 VLD4 (single 4-element structure to all lanes)
// Encoding A1 / T1 Advanced SIMD
// vld4<c>.<size> <list>, [<Rn>{ @<align>}]{!} vld4<c>.<size> <list>, [<Rn>{ @<align>}], <Rm>
//
new OpcodeARM(Index.arm_vld__xlane, "vld", "111101001x10xxxxxxxxxxxxxxxxxxxx"),
// A8.6.320 VLDR
// Encoding A1 / T1 VFPv2, VFPv3, Advanced SIMD
// vldr<c> <Dd>, [<Rn>{, #+/-<imm>}] vldr<c> <Dd>, <label> vldr<c> <Dd>, [pc,#-0] Special case
// must precede arm_vldm_1 in table
new OpcodeARM(Index.arm_vldr__64, "vldr", "xxxx1101xx01xxxxxxxx1011xxxxxxxx"),
// A8.6.332 VMOV (between two ARM core registers and a doubleword extension register)
// Encoding A1 / T1 VFPv2, VFPv3, Advanced SIMD
// vmov<c> <Dm>, <Rt>, <Rt2> vmov<c> <Rt>, <Rt2>, <Dm>
// must precede arm_vldm__64 in table
new OpcodeARM(Index.arm_vmov_9, "vmov", "xxxx1100010xxxxxxxxx101100x1xxxx"),
// A8.6.354 VPOP
// Encoding A1 / T1 VFPv2, VFPv3, Advanced SIMD
// vpop <list> <list> is consecutive 64-bit registers
// A8.6.354 VPOP
// Encoding A2 / T2 VFPv2, VFPv3
// vpop <list> <list> is consecutive 32-bit registers
// must precede arm_vldm_1 in table
// must precede arm_vldm_2 in table
// must precede arm_vldm__64 in table
new OpcodeARM(Index.arm_vpop, "vpop", "xxxx11001x111101xxxx101xxxxxxxxx"),
// A8.6.319 VLDM
// Encoding A1 / T1 VFPv2, VFPv3, Advanced SIMD
// vldm{mode}<c> <Rn>{!}, <list> <list> is consecutive 64-bit registers
// must follow arm_vldr_1 in table
// must follow arm_vmov_9 in table
// must follow arm_vpop in table
new OpcodeARM(Index.arm_vldm__64, "vldm", "xxxx110xxxx1xxxxxxxx1011xxxxxxxx"),
// A8.6.331 VMOV (between two ARM core registers and two single-precision registers)
// Encoding A1 / T1 VFPv2, VFPv3
// vmov<c> <Sm>, <Sm1>, <Rt>, <Rt2> vmov<c> <Rt>, <Rt2>, <Sm>, <Sm1>
// must precede arm_vldr__32 in table
new OpcodeARM(Index.arm_vmov_8, "vmov", "xxxx1100010xxxxxxxxx101000x1xxxx"),
// A8.6.320 VLDR
// Encoding A2 / T2 VFPv2, VFPv3
// vldr<c> <Sd>, [<Rn>{, #+/-<imm>}] vldr<c> <Sd>, <label> vldr<c> <Sd>, [pc,#-0] Special case
// must precede arm_vldm_2 in table
// must follow arm_vmov_8 in table
new OpcodeARM(Index.arm_vldr__32, "vldr", "xxxx1101xx01xxxxxxxx1010xxxxxxxx"),
// A8.6.319 VLDM
// Encoding A2 / T2 VFPv2, VFPv3
// vldm{mode}<c> <Rn>{!}, <list> <list> is consecutive 32-bit registers
// must follow arm_vldr_2 in table
// must follow arm_vpop in table
new OpcodeARM(Index.arm_vldm__32, "vldm", "xxxx110xxxx1xxxxxxxx1010xxxxxxxx"),
// A8.6.321 VMAX, VMIN (integer)
// Encoding A1 / T1 Advanced SIMD
// vmax<c>.<dt> <Qd>, <Qn>, <Qm> vmax<c>.<dt> <Dd>, <Dn>, <Dm>
// vmin<c>.<dt> <Qd>, <Qn>, <Qm> vmin<c>.<dt> <Dd>, <Dn>, <Dm>
new OpcodeARM(Index.arm_vmax_vmin__int, "v", "1111001x0xxxxxxxxxxx0110xxxxxxxx"),
// A8.6.322 VMAX, VMIN (floating-point)
// Encoding A1 / T1 Advanced SIMD (UNDEFINED in integer-only variant)
// vmax<c>.f32 <Qd>, <Qn>, <Qm> vmax<c>.f32 <Dd>, <Dn>, <Dm>
// vmin<c>.f32 <Qd>, <Qn>, <Qm> vmin<c>.f32 <Dd>, <Dn>, <Dm>
new OpcodeARM(Index.arm_vmax_vmin__fp, "v", "111100100xxxxxxxxxxx1111xxx0xxxx"),
// A8.6.323 VMLA, VMLAL, VMLS, VMLSL (integer)
// Encoding A1 / T1 Advanced SIMD
// v<op><c>.<dt> <Qd>, <Qn>, <Qm> v<op><c>.<dt> <Dd>, <Dn>, <Dm>
new OpcodeARM(Index.arm_vml__int, "vml", "1111001x0xxxxxxxxxxx1001xxx0xxxx"),
// A8.6.406 VTBL, VTBX
// Encoding A1 / T1 Advanced SIMD
// v<op><c>.8 <Dd>, <list>, <Dm>
// must precede arm_vml__int_long in table
new OpcodeARM(Index.arm_vtb, "vtb", "111100111x11xxxxxxxx10xxxxx0xxxx"),
// A8.6.323 VMLA, VMLAL, VMLS, VMLSL (integer)
// Encoding A2 / T2 Advanced SIMD
// v<op>l<c>.<dt> <Qd>, <Dn>, <Dm>
// must follow arm_vtb in table
new OpcodeARM(Index.arm_vml__int_long, "vml", "1111001x1xxxxxxxxxxx10x0x0x0xxxx"),
// A8.6.324 VMLA, VMLS (floating-point)
// Encoding A1 / T1 Advanced SIMD (UNDEFINED in integer-only variant)
// v<op><c>.f32 <Qd>, <Qn>, <Qm> v<op><c>.f32 <Dd>, <Dn>, <Dm>
new OpcodeARM(Index.arm_vml__f32, "vml", "111100100xxxxxxxxxxx1101xxx1xxxx"),
// A8.6.324 VMLA, VMLS (floating-point)
// Encoding A2 / T2 VFPv2, VFPv3 (sz = 1 UNDEFINED in single-precision only variants)
// v<op><c>.f64 <Dd>, <Dn>, <Dm> v<op><c>.f32 <Sd>, <Sn>, <Sm>
new OpcodeARM(Index.arm_vml__fp, "vml", "xxxx11100x00xxxxxxxx101xxxx0xxxx"),
// A8.6.341 VMVN (register)
// Encoding A1 / T1 Advanced SIMD
// vmvn<c> <Qd>, <Qm> vmvn<c> <Dd>, <Dm>
// must precede arm_vml__scalar in table
new OpcodeARM(Index.arm_vmvn, "vmvn", "111100111x11xx00xxxx01011xx0xxxx"),
// A8.6.348 VPADAL
// Encoding A1 / T1 Advanced SIMD
// vpadal<c>.<dt> <Qd>, <Qm> vpadal<c>.<dt> <Dd>, <Dm>
// must precede arm_vml__scalar in table
new OpcodeARM(Index.arm_vpadal, "vpadal", "111100111x11xx00xxxx0110xxx0xxxx"),
// A8.6.358 VQDMLAL, VQDMLSL
// Encoding A2 / T2 Advanced SIMD
// vqd<op><c>.<dt> <Qd>,<Dn>,<Dm[x]>
// must precede arm_vml__scalar in table
new OpcodeARM(Index.arm_vqdml__scalar, "vqdml", "111100101xxxxxxxxxxx0x11x1x0xxxx"),
// A8.6.334 VMOVN
// Encoding A1 / T1 Advanced SIMD
// vmovn<c>.<dt> <Dd>, <Qm>
// must precede arm_vqmov in table
new OpcodeARM(Index.arm_vmovn, "vmovn", "111100111x11xx10xxxx001000x0xxxx"),
// A8.6.351 VPADDL
// Encoding A1 / T1 Advanced SIMD
// vpaddl<c>.<dt> <Qd>, <Qm> vpaddl<c>.<dt> <Dd>, <Dm>
// must precede arm_vml__scalar in table
new OpcodeARM(Index.arm_vpaddl, "vpaddl", "111100111x11xx00xxxx0010xxx0xxxx"),
// A8.6.361 VQMOVN, VQMOVUN
// Encoding A1 / T1 Advanced SIMD
// vqmov{u}n<c>.<type><size> <Dd>, <Qm>
// must follow arm_vmovn in table
// must precede arm_vml__scalar in table
new OpcodeARM(Index.arm_vqmov, "vqmov", "111100111x11xx10xxxx0010xxx0xxxx"),
// A8.6.371 VRECPE
// Encoding A1 / T1 Advanced SIMD (F = 1 UNDEFINED in integer-only variants)
// vrecpe<c>.<dt> <Qd>, <Qm> vrecpe<c>.<dt> <Dd>, <Dm>
// must precede arm_vml__scalar in table
new OpcodeARM(Index.arm_vrecpe, "vrecpe", "111100111x11xx11xxxx010x0xx0xxxx"),
// A8.6.378 VRSQRTE
// Encoding A1 / T1 Advanced SIMD (F = 1 UNDEFINED in integer-only variants)
// vrsqrte<c>.<dt> <Qd>, <Qm> vrsqrte<c>.<dt> <Dd>, <Dm>
// must precede arm_vabal in table
// must precede arm_vml__scalar in table
new OpcodeARM(Index.arm_vrsqrte, "vrsqrte", "111100111x11xx11xxxx010x1xx0xxxx"),
// A8.6.325 VMLA, VMLAL, VMLS, VMLSL (by scalar)
// Encoding A1 / T1 Advanced SIMD (F = 1 UNDEFINED in integer-only variants)
// v<op><c>.<dt> <Qd>, <Qn>, <Dm[x]> v<op><c>.<dt> <Dd>, <Dn>, <Dm[x]>
// A8.6.325 VMLA, VMLAL, VMLS, VMLSL (by scalar)
// Encoding A2 / T2 Advanced SIMD
// v<op>l<c>.<dt> <Qd>, <Dn>, <Dm[x]>
// must follow arm_vmvn in table
// must follow arm_vpadal in table
// must follow arm_vpaddl in table
// must follow arm_vqdml__scalar in table
// must follow arm_vqmov in table
// must follow arm_vrecpe in table
// must follow arm_vrsqrte in table
new OpcodeARM(Index.arm_vml__scalar, "vml", "1111001x1xxxxxxxxxxx0xxxx1x0xxxx"),
// A8.6.326 VMOV (immediate)
// Encoding A2 / T2 VFPv3 (sz = 1 UNDEFINED in single-precision only variants)
// vmov<c>.f64 <Dd>, #<imm> vmov<c>.f32 <Sd>, #<imm>
// Unpredictable if (0) is 1: xxxx11101x11xxxxxxxx101x(0)0(0)0xxxx
new OpcodeARM(Index.arm_vmov__imm, "vmov", "xxxx11101x11xxxxxxxx101xx0x0xxxx"),
// A8.6.327 VMOV (register)
// Encoding A1 / T1 Advanced SIMD
// vmov<c> <Qd>, <Qm> vmov<c> <Dd>, <Dm>
// A8.6.347 VORR (register)
// Encoding A1 / T1 Advanced SIMD
// vorr<c> <Qd>, <Qn>, <Qm> vorr<c> <Dd>, <Dn>, <Dm>
//
new OpcodeARM(Index.arm_vmov_vorr, "vmov", "111100100x10xxxxxxxx0001xxx1xxxx"),
// A8.6.327 VMOV (register)
// Encoding A2 / T2 VFPv2, VFPv3 (sz = 1 UNDEFINED in single-precision only variants)
// vmov<c>.f64 <Dd>, <Dm> vmov<c>.f32 <Sd>, <Sm>
new OpcodeARM(Index.arm_vmov__reg_f, "vmov", "xxxx11101x110000xxxx101x01x0xxxx"),
// A8.6.328 VMOV (ARM core register to scalar)
// Encoding A1 / T1 VFPv2, VFPv3, Advanced SIMD for word version (opc1:opc2 == '00x00'); Advanced SIMD otherwise
// vmov<c>.<size> <Dd[x]>, <Rt>
// Unpredictable if (0) is 1: xxxx11100xx0xxxxxxxx1011xxx1(0)(0)(0)(0)
new OpcodeARM(Index.arm_vmov_5, "vmov", "xxxx11100xx0xxxxxxxx1011xxx1xxxx"),
// A8.6.329 VMOV (scalar to ARM core register)
// Encoding A1 / T1 VFPv2, VFPv3, Advanced SIMD for word version (U:opc1:opc2 == '00x00'); Advanced SIMD otherwise
// vmov<c>.<dt> <Rt>, <Dn[x]>
// Unpredictable if (0) is 1: xxxx1110xxx1xxxxxxxx1011xxx1(0)(0)(0)(0)
new OpcodeARM(Index.arm_vmov_6, "vmov", "xxxx1110xxx1xxxxxxxx1011xxx1xxxx"),
// A8.6.330 VMOV (between ARM core register and single-precision register)
// Encoding A1 / T1 VFPv2, VFPv3
// vmov<c> <Sn>, <Rt> vmov<c> <Sn>, <Rt> vmov<c> <Rt>, <Sn>
// Unpredictable if (0) is 1: xxxx1110000xxxxxxxxx1010x(0)(0)1(0)(0)(0)(0)
new OpcodeARM(Index.arm_vmov_7, "vmov", "xxxx1110000xxxxxxxxx1010xxx1xxxx"),
// A8.6.333 VMOVL
// Encoding A1 / T1 Advanced SIMD
// vmovl<c>.<dt> <Qd>, <Dm>
// must precede arm_vshll_1 in table
new OpcodeARM(Index.arm_vmovl, "vmovl", "1111001x1xxxx000xxxx101000x1xxxx"),
// A8.6.384 VSHLL
// Encoding A1 / T1 Advanced SIMD
// vshll<c>.<type><size> <Qd>, <Dm>, #<imm> (0 < <imm> < <size>)
// must follow arm_vmovl in table
new OpcodeARM(Index.arm_vshll__various, "vshll", "1111001x1xxxxxxxxxxx101000x1xxxx"),
// A8.6.335 VMRS
// Encoding A1 / T1 VFPv2, VFPv3, Advanced SIMD
// vmrs<c> <Rt>, fpscr
// Unpredictable if (0) is 1: xxxx111011110001xxxx10100(0)(0)1(0)(0)(0)(0)
// B6.1.14 VMRS
// Encoding A1 / T1 VFPv2, VFPv3, Advanced SIMD
// vmrs<c> <Rt>,<spec_reg>
// Unpredictable if (0) is 1: xxxx11101111xxxxxxxx1010(0)(0)(0)1(0)(0)(0)(0)
//
new OpcodeARM(Index.arm_vmrs, "vmrs", "xxxx11101111xxxxxxxx1010xxx1xxxx"),
// A8.6.336 VMSR
// Encoding A1 / T1 VFPv2, VFPv3, Advanced SIMD
// vmsr<c> fpscr, <Rt>
// Unpredictable if (0) is 1: xxxx111011100001xxxx10100(0)(0)1(0)(0)(0)(0)
// B6.1.15 VMSR
// Encoding A1 / T2 VFPv2, VFPv3, Advanced SIMD
// vmsr<c> <spec_reg>,<Rt>
// Unpredictable if (0) is 1: xxxx11101110xxxxxxxx1010(0)(0)(0)1(0)(0)(0)(0)
//
new OpcodeARM(Index.arm_vmsr, "vmsr", "xxxx11101110xxxxxxxx1010xxx1xxxx"),
// A8.6.337 VMUL, VMULL (integer and polynomial)
// Encoding A1 / T1 Advanced SIMD
// vmul<c>.<dt> <Qd>, <Qn>, <Qm> vmul<c>.<dt> <Dd>, <Dn>, <Dm>
new OpcodeARM(Index.arm_vmul_1, "vmul", "1111001x0xxxxxxxxxxx1001xxx1xxxx"),
// A8.6.337 VMUL, VMULL (integer and polynomial)
// Encoding A2 / T2 Advanced SIMD
// vmull<c>.<dt> <Qd>, <Dn>, <Dm>
new OpcodeARM(Index.arm_vmull, "vmull", "1111001x1xxxxxxxxxxx11x0x0x0xxxx"),
// A8.6.338 VMUL (floating-point)
// Encoding A1 / T1 Advanced SIMD (UNDEFINED in integer-only variant)
// vmul<c>.f32 <Qd>, <Qn>, <Qm> vmul<c>.f32 <Dd>, <Dn>, <Dm>
new OpcodeARM(Index.arm_vmul_f32, "vmul", "111100110x0xxxxxxxxx1101xxx1xxxx"),
// A8.6.338 VMUL (floating-point)
// Encoding A2 / T2 VFPv2, VFPv3 (sz = 1 UNDEFINED in single-precision only variants)
// vmul<c>.f64 <Dd>, <Dn>, <Dm> vmul<c>.f32 <Sd>, <Sn>, <Sm>
new OpcodeARM(Index.arm_vmul__fp_2, "vmul", "xxxx11100x10xxxxxxxx101xx0x0xxxx"),
// A8.6.360 VQDMULL
// Encoding A2 / T2 Advanced SIMD
// vqdmull<c>.<dt> <Qd>,<Dn>,<Dm[x]>
// must precede arm_vmul__scalar in table
new OpcodeARM(Index.arm_vqdmull__scalar, "vqdmul", "111100101xxxxxxxxxxx1011x1x0xxxx"),
// A8.6.339 VMUL, VMULL (by scalar)
// Encoding A1 / T1 Advanced SIMD (F = 1 UNDEFINED in integer-only variants)
// vmul<c>.<dt> <Qd>, <Qn>, <Dm[x]> vmul<c>.<dt> <Dd>, <Dn>, <Dm[x]>
// A8.6.339 VMUL, VMULL (by scalar)
// Encoding A2 / T2 Advanced SIMD
// vmull<c>.<dt> <Qd>, <Dn>, <Dm[x]>
// must follow arm_vqdmull__scalar in table
new OpcodeARM(Index.arm_vmul__scalar, "vmul", "1111001x1xxxxxxxxxxx10xxx1x0xxxx"),
// A8.6.342 VNEG
// Encoding A2 / T2 VFPv2, VFPv3 (sz = 1 UNDEFINED in single-precision only variants)
// vneg<c>.f64 <Dd>, <Dm> vneg<c>.f32 <Sd>, <Sm>
new OpcodeARM(Index.arm_vneg__f, "vneg", "xxxx11101x110001xxxx101x01x0xxxx"),
// A8.6.343 VNMLA, VNMLS, VNMUL
// Encoding A1 / T1 VFPv2, VFPv3 (sz = 1 UNDEFINED in single-precision only variants)
// vnmla<c>.f64 <Dd>, <Dn>, <Dm> vnmla<c>.f32 <Sd>, <Sn>, <Sm>
// vnmls<c>.f64 <Dd>, <Dn>, <Dm> vnmls<c>.f32 <Sd>, <Sn>, <Sm>
new OpcodeARM(Index.arm_vnml, "vnml", "xxxx11100x01xxxxxxxx101xxxx0xxxx"),
// A8.6.343 VNMLA, VNMLS, VNMUL
// Encoding A2 / T2 VFPv2, VFPv3 (sz = 1 UNDEFINED in single-precision only variants)
// vnmul<c>.f64 <Dd>, <Dn>, <Dm> vnmul<c>.f32 <Sd>, <Sn>, <Sm>
new OpcodeARM(Index.arm_vnmul, "vnmul", "xxxx11100x10xxxxxxxx101xx1x0xxxx"),
// A8.6.345 VORN (register)
// Encoding A1 / T1 Advanced SIMD
// vorn<c> <Qd>, <Qn>, <Qm> vorn<c> <Dd>, <Dn>, <Dm>
new OpcodeARM(Index.arm_vorn, "vorn", "111100100x11xxxxxxxx0001xxx1xxxx"),
// A8.6.349 VPADD (integer)
// Encoding A1 / T1 Advanced SIMD
// vpadd<c>.<dt> <Dd>, <Dn>, <Dm>
new OpcodeARM(Index.arm_vpadd__int, "vpadd", "111100100xxxxxxxxxxx1011xxx1xxxx"),
// A8.6.350 VPADD (floating-point)
// Encoding A1 / T1 Advanced SIMD (UNDEFINED in integer-only variant)
// vpadd<c>.f32 <Dd>, <Dn>, <Dm>
new OpcodeARM(Index.arm_vpadd__f32, "vpadd", "111100110x0xxxxxxxxx1101xxx0xxxx"),
// A8.6.352 VPMAX, VPMIN (integer)
// Encoding A1 / T1 Advanced SIMD
// vp<op><c>.<dt> <Dd>, <Dn>, <Dm>
new OpcodeARM(Index.arm_vpmax_vpmin__int, "vp", "1111001x0xxxxxxxxxxx1010xxxxxxxx"),
// A8.6.353 VPMAX, VPMIN (floating-point)
// Encoding A1 / T1 Advanced SIMD (UNDEFINED in integer-only variant)
// vp<op><c>.f32 <Dd>, <Dn>, <Dm>
new OpcodeARM(Index.arm_vpmax_vpmin__fp, "vp", "111100110xxxxxxxxxxx1111xxx0xxxx"),
// A8.6.357 VQADD
// Encoding A1 / T1 Advanced SIMD
// vqadd<c>.<dt> <Qd>,<Qn>,<Qm> vqadd<c>.<dt> <Dd>,<Dn>,<Dm>
new OpcodeARM(Index.arm_vqadd, "vqadd", "1111001x0xxxxxxxxxxx0000xxx1xxxx"),
// A8.6.358 VQDMLAL, VQDMLSL
// Encoding A1 / T1 Advanced SIMD
// vqd<op><c>.<dt> <Qd>,<Dn>,<Dm>
new OpcodeARM(Index.arm_vqdml__vec, "vqdml", "111100101xxxxxxxxxxx10x1x0x0xxxx"),
// A8.6.359 VQDMULH
// Encoding A1 / T1 Advanced SIMD
// vqdmulh<c>.<dt> <Qd>,<Qn>,<Qm> vqdmulh<c>.<dt> <Dd>,<Dn>,<Dm>
new OpcodeARM(Index.arm_vqdmulh__vec, "vqdmulh", "111100100xxxxxxxxxxx1011xxx0xxxx"),
// A8.6.359 VQDMULH
// Encoding A2 / T2 Advanced SIMD
// vqdmulh<c>.<dt> <Qd>,<Qn>,<Dm[x]> vqdmulh<c>.<dt> <Dd>,<Dn>,<Dm[x]>
new OpcodeARM(Index.arm_vqdmulh__scalar, "vqdmulh", "1111001x1xxxxxxxxxxx1100x1x0xxxx"),
// A8.6.360 VQDMULL
// Encoding A1 / T1 Advanced SIMD
// vqdmull<c>.<dt> <Qd>,<Dn>,<Dm> vqdmull<c>.<dt> <Qd>,<Dn>,<Dm>
new OpcodeARM(Index.arm_vqdmull__vec, "vqdmull", "111100101xxxxxxxxxxx1101x0x0xxxx"),
// A8.6.363 VQRDMULH
// Encoding A1 / T1 Advanced SIMD
// vqrdmulh<c>.<dt> <Qd>,<Qn>,<Qm> vqrdmulh<c>.<dt> <Dd>,<Dn>,<Dm>
new OpcodeARM(Index.arm_vqrdmulh__vec, "vqrdmulh", "111100110xxxxxxxxxxx1011xxx0xxxx"),
// A8.6.363 VQRDMULH
// Encoding A2 / T2 Advanced SIMD
// vqrdmulh<c>.<dt> <Qd>,<Qn>,<Dm[x]> vqrdmulh<c>.<dt> <Dd>,<Dn>,<Dm[x]>
new OpcodeARM(Index.arm_vqrdmulh__scalar, "vqrdmulh", "1111001x1xxxxxxxxxxx1101x1x0xxxx"),
// A8.6.364 VQRSHL
// Encoding A1 / T1 Advanced SIMD
// vqrshl<c>.<type><size> <Qd>,<Qm>,<Qn> vqrshl<c>.<type><size> <Dd>,<Dm>,<Dn>
new OpcodeARM(Index.arm_vqrshl, "vqrshl", "1111001x0xxxxxxxxxxx0101xxx1xxxx"),
// A8.6.377 VRSHRN
// Encoding A1 / T1 Advanced SIMD
// vrshrn<c>.i<size> <Dd>, <Qm>, #<imm>
// must precede arm_vqrshr in table
new OpcodeARM(Index.arm_vrshrn, "vrshrn", "111100101xxxxxxxxxxx100001x1xxxx"),
// A8.6.365 VQRSHRN, VQRSHRUN
// Encoding A1 / T1 Advanced SIMD
// vqrshr{u}n<c>.<type><size> <Dd>,<Qm>,#<imm>
// must follow arm_vrshrn in table
new OpcodeARM(Index.arm_vqrshr, "vqrshr", "1111001x1xxxxxxxxxxx100x01x1xxxx"),
// A8.6.366 VQSHL (register)
// Encoding A1 / T1 Advanced SIMD
// vqshl<c>.<type><size> <Qd>,<Qm>,<Qn> vqshl<c>.<type><size> <Dd>,<Dm>,<Dn>
new OpcodeARM(Index.arm_vqshl__reg, "vqshl", "1111001x0xxxxxxxxxxx0100xxx1xxxx"),
// A8.6.367 VQSHL, VQSHLU (immediate)
// Encoding A1 / T1 Advanced SIMD
// vqshl{u}<c>.<type><size> <Qd>,<Qm>,#<imm> vqshl{u}<c>.<type><size> <Dd>,<Dm>,#<imm>
new OpcodeARM(Index.arm_vqshl__imm, "vqshl", "1111001x1xxxxxxxxxxx011xxxx1xxxx"),
// A8.6.386 VSHRN
// Encoding A1 / T1 Advanced SIMD
// vshrn<c>.i<size> <Dd>, <Qm>, #<imm>
// must precede arm_vqshr in table
new OpcodeARM(Index.arm_vshrn, "vshrn", "111100101xxxxxxxxxxx100000x1xxxx"),
// A8.6.368 VQSHRN, VQSHRUN
// Encoding A1 / T1 Advanced SIMD
// vqshr{u}n<c>.<type><size> <Dd>,<Qm>,#<imm>
// must follow arm_vshrn in table
new OpcodeARM(Index.arm_vqshr, "vqshr", "1111001x1xxxxxxxxxxx100x00x1xxxx"),
// A8.6.369 VQSUB
// Encoding A1 / T1 Advanced SIMD
// vqsub<c>.<type><size> <Qd>, <Qn>, <Qm> vqsub<c>.<type><size> <Dd>, <Dn>, <Dm>
new OpcodeARM(Index.arm_vqsub, "vqsub", "1111001x0xxxxxxxxxxx0010xxx1xxxx"),
// A8.6.370 VRADDHN
// Encoding A1 / T1 Advanced SIMD
// vraddhn<c>.<dt> <Dd>, <Qn>, <Qm>
new OpcodeARM(Index.arm_vraddhn, "vraddhn", "111100111xxxxxxxxxxx0100x0x0xxxx"),
// A8.6.372 VRECPS
// Encoding A1 / T1 Advanced SIMD (UNDEFINED in integer-only variant)
// vrecps<c>.f32 <Qd>, <Qn>, <Qm> vrecps<c>.f32 <Dd>, <Dn>, <Dm>
new OpcodeARM(Index.arm_vrecps, "vrecps", "111100100x0xxxxxxxxx1111xxx1xxxx"),
// A8.6.374 VRHADD
// Encoding A1 / T1 Advanced SIMD
// vrhadd<c> <Qd>, <Qn>, <Qm> vrhadd<c> <Dd>, <Dn>, <Dm>
new OpcodeARM(Index.arm_vrhadd, "vrhadd", "1111001x0xxxxxxxxxxx0001xxx0xxxx"),
// A8.6.375 VRSHL
// Encoding A1 / T1 Advanced SIMD
// vrshl<c>.<type><size> <Qd>, <Qm>, <Qn> vrshl<c>.<type><size> <Dd>, <Dm>, <Dn>
new OpcodeARM(Index.arm_vrshl, "vrshl", "1111001x0xxxxxxxxxxx0101xxx0xxxx"),
// A8.6.376 VRSHR
// Encoding A1 / T1 Advanced SIMD
// vrshr<c>.<type><size> <Qd>, <Qm>, #<imm> vrshr<c>.<type><size> <Dd>, <Dm>, #<imm>
new OpcodeARM(Index.arm_vrshr, "vrshr", "1111001x1xxxxxxxxxxx0010xxx1xxxx"),
// A8.6.266 VABA, VABAL
// Encoding A2 / T2 Advanced SIMD
// vabal<c>.<dt> <Qd>, <Dn>, <Dm>
// must follow arm_vceq__imm0 in table
// must follow arm_vcle in table
// must follow arm_vcnt in table
// must follow arm_vext in table
// must follow arm_vrsqrte in table
new OpcodeARM(Index.arm_vabal, "vabal", "1111001x1xxxxxxxxxxx0101x0x0xxxx"),
// A8.6.379 VRSQRTS
// Encoding A1 / T1 Advanced SIMD (UNDEFINED in integer-only variant)
// vrsqrts<c>.f32 <Qd>, <Qn>, <Qm> vrsqrts<c>.f32 <Dd>, <Dn>, <Dm>
new OpcodeARM(Index.arm_vrsqrts, "vrsqrts", "111100100x1xxxxxxxxx1111xxx1xxxx"),
// A8.6.380 VRSRA
// Encoding A1 / T1 Advanced SIMD
// vrsra<c>.<type><size> <Qd>, <Qm>, #<imm> vrsra<c>.<type><size> <Dd>, <Dm>, #<imm>
new OpcodeARM(Index.arm_vrsra, "vrsra", "1111001x1xxxxxxxxxxx0011xxx1xxxx"),
// A8.6.381 VRSUBHN
// Encoding A1 / T1 Advanced SIMD
// vrsubhn<c>.<dt> <Dd>, <Qn>, <Qm>
new OpcodeARM(Index.arm_vrsubhn, "vrsubhn", "111100111xxxxxxxxxxx0110x0x0xxxx"),
// A8.6.382 VSHL (immediate)
// Encoding A1 / T1 Advanced SIMD
// vshl<c>.i<size> <Qd>, <Qm>, #<imm> vshl<c>.i<size> <Dd>, <Dm>, #<imm>
new OpcodeARM(Index.arm_vshl__imm, "vshl.i", "111100101xxxxxxxxxxx0101xxx1xxxx"),
// A8.6.383 VSHL (register)
// Encoding A1 / T1 Advanced SIMD
// vshl<c>.i<size> <Qd>, <Qm>, <Qn> vshl<c>.i<size> <Dd>, <Dm>, <Dn>
new OpcodeARM(Index.arm_vshl__reg, "vshl", "1111001x0xxxxxxxxxxx0100xxx0xxxx"),
// A8.6.384 VSHLL
// Encoding A2 / T2 Advanced SIMD
// vshll<c>.<type><size> <Qd>, <Dm>, #<imm> (<imm> == <size>)
new OpcodeARM(Index.arm_vshll__max, "vshll", "111100111x11xx10xxxx001100x0xxxx"),
// A8.6.385 VSHR
// Encoding A1 / T1 Advanced SIMD
// vshr<c>.<type><size> <Qd>, <Qm>, #<imm> vshr<c>.<type><size> <Dd>, <Dm>, #<imm>
new OpcodeARM(Index.arm_vshr, "vshr", "1111001x1xxxxxxxxxxx0000xxx1xxxx"),
// A8.6.387 VSLI
// Encoding A1 / T1 Advanced SIMD
// vsli<c>.<size> <Qd>, <Qm>, #<imm> vsli<c>.<size> <Dd>, <Dm>, #<imm>
new OpcodeARM(Index.arm_vsli, "vsli.", "111100111xxxxxxxxxxx0101xxx1xxxx"),
// A8.6.388 VSQRT
// Encoding A1 / T1 VFPv2, VFPv3 (sz = 1 UNDEFINED in single-precision only variants)
// vsqrt<c>.f64 <Dd>, <Dm> vsqrt<c>.f32 <Sd>, <Sm>
new OpcodeARM(Index.arm_vsqrt, "vsqrt", "xxxx11101x110001xxxx101x11x0xxxx"),
// A8.6.389 VSRA
// Encoding A1 / T1 Advanced SIMD
// vsra<c>.<type><size> <Qd>, <Qm>, #<imm> vsra<c>.<type><size> <Dd>, <Dm>, #<imm>
new OpcodeARM(Index.arm_vsra, "vsra", "1111001x1xxxxxxxxxxx0001xxx1xxxx"),
// A8.6.390 VSRI
// Encoding A1 / T1 Advanced SIMD
// vsri<c>.<size> <Qd>, <Qm>, #<imm> vsri<c>.<size> <Dd>, <Dm>, #<imm>
new OpcodeARM(Index.arm_vsri, "vsri.", "111100111xxxxxxxxxxx0100xxx1xxxx"),
// A8.6.391 VST1 (multiple single elements)
// Encoding A1 / T1 Advanced SIMD
// vst1<c>.<size> <list>, [<Rn>{@<align>}]{!} vst1<c>.<size> <list>, [<Rn>{@<align>}], <Rm>
// A8.6.393 VST2 (multiple 2-element structures)
// Encoding A1 / T1 Advanced SIMD
// vst2<c>.<size> <list>, [<Rn>{@<align>}]{!} vst2<c>.<size> <list>, [<Rn>{@<align>}], <Rm>
// A8.6.395 VST3 (multiple 3-element structures)
// Encoding A1 / T1 Advanced SIMD
// vst3<c>.<size> <list>, [<Rn>{@<align>}]{!} vst3<c>.<size> <list>, [<Rn>{@<align>}], <Rm>
// A8.6.397 VST4 (multiple 4-element structures)
// Encoding A1 / T1 Advanced SIMD
// vst4<c>.<size> <list>, [<Rn>{@<align>}]{!} vst4<c>.<size> <list>, [<Rn>{@<align>}], <Rm>
new OpcodeARM(Index.arm_vst__multi, "vst", "111101000x00xxxxxxxxxxxxxxxxxxxx"),
// A8.6.392 VST1 (single element from one lane)
// Encoding A1 / T1 Advanced SIMD
// vst1<c>.<size> <list>, [<Rn>{@<align>}]{!} vst1<c>.<size> <list>, [<Rn>{@<align>}], <Rm>
// A8.6.394 VST2 (single 2-element structure from one lane)
// Encoding A1 / T1 Advanced SIMD
// vst2<c>.<size> <list>, [<Rn>{@<align>}]{!} vst2<c>.<size> <list>, [<Rn>{@<align>}], <Rm>
// A8.6.396 VST3 (single 3-element structure from one lane)
// Encoding A1 / T1 Advanced SIMD
// vst3<c>.<size> <list>, [<Rn>]{!} vst3<c>.<size> <list>, [<Rn>], <Rm>
// A8.6.398 VST4 (single 4-element structure from one lane)
// Encoding A1 / T1 Advanced SIMD
// vst4<c>.<size> <list>, [<Rn>{@<align>}]{!} vst4<c>.<size> <list>, [<Rn>{@<align>}], <Rm>
//
new OpcodeARM(Index.arm_vst__xlane, "vst", "111101001x00xxxxxxxxxxxxxxxxxxxx"),
// A8.6.355 VPUSH
// Encoding A1 / T1 VFPv2, VFPv3, Advanced SIMD
// vpush<c> <list> <list> is consecutive 64-bit registers
// A8.6.355 VPUSH
// Encoding A2 / T2 VFPv2, VFPv3
// vpush<c> <list> <list> is consecutive 32-bit registers
// must precede arm_vstm_1 in table
// must precede arm_vstm_2 in table
new OpcodeARM(Index.arm_vpush, "vpush", "xxxx11010x101101xxxx101xxxxxxxxx"),
// A8.6.400 VSTR
// Encoding A1 / T1 VFPv2, VFPv3, Advanced SIMD
// vstr<c> <Dd>, [<Rn>{, #+/-<imm>}]
// must precede arm_vstm_1 in table
new OpcodeARM(Index.arm_vstr__64, "vstr", "xxxx1101xx00xxxxxxxx1011xxxxxxxx"),
// A8.6.399 VSTM
// Encoding A1 / T1 Advanced SIMD
// vstm{mode}<c> <Rn>{!}, <list> <list> is consecutive 64-bit registers
// must follow arm_vpush in table
// must follow arm_vstr_1 in table
new OpcodeARM(Index.arm_vstm__64, "vstm", "xxxx110xxxx0xxxxxxxx1011xxxxxxxx"),
// A8.6.400 VSTR
// Encoding A2 / T2 VFPv2, VFPv3
// vstr<c> <Sd>, [<Rn>{, #+/-<imm>}]
// must precede arm_vstm_2 in table
new OpcodeARM(Index.arm_vstr__32, "vstr", "xxxx1101xx00xxxxxxxx1010xxxxxxxx"),
// A8.6.399 VSTM
// Encoding A2 / T2 VFPv2, VFPv3
// vstm{mode}<c> <Rn>{!}, <list> <list> is consecutive 32-bit registers
// must follow arm_vpush in table
// must follow arm_vstr_2 in table
new OpcodeARM(Index.arm_vstm__32, "vstm", "xxxx110xxxx0xxxxxxxx1010xxxxxxxx"),
// A8.6.401 VSUB (integer)
// Encoding A1 / T1 Advanced SIMD
// vsub<c>.<dt> <Qd>, <Qn>, <Qm> vsub<c>.<dt> <Dd>, <Dn>, <Dm>
new OpcodeARM(Index.arm_vsub__int, "vsub", "111100110xxxxxxxxxxx1000xxx0xxxx"),
// A8.6.402 VSUB (floating-point)
// Encoding A1 / T1 Advanced SIMD (UNDEFINED in integer-only variant)
// vsub<c>.f32 <Qd>, <Qn>, <Qm> vsub<c>.f32 <Dd>, <Dn>, <Dm>
new OpcodeARM(Index.arm_vsub__f32, "vsub", "111100100x1xxxxxxxxx1101xxx0xxxx"),
// A8.6.402 VSUB (floating-point)
// Encoding A2 / T2 VFPv2, VFPv3 (sz = 1 UNDEFINED in single-precision only variants)
// vsub<c>.f64 <Dd>, <Dn>, <Dm> vsub<c>.f32 <Sd>, <Sn>, <Sm>
new OpcodeARM(Index.arm_vsub__fp_f, "vsub", "xxxx11100x11xxxxxxxx101xx1x0xxxx"),
// A8.6.403 VSUBHN
// Encoding A1 / T1 Advanced SIMD
// vsubhn<c>.<dt> <Dd>, <Qn>, <Qm>
new OpcodeARM(Index.arm_vsubhn, "vsubhn", "111100101xxxxxxxxxxx0110x0x0xxxx"),
// A8.6.404 VSUBL, VSUBW
// Encoding A1 / T1 Advanced SIMD
// vsubl<c>.<dt> <Qd>, <Dn>, <Dm> vsubw<c>.<dt> {<Qd>,} <Qn>, <Dm>
new OpcodeARM(Index.arm_vsubl_vsubw, "vsub", "1111001x1xxxxxxxxxxx001xx0x0xxxx"),
// A8.6.408 VTST
// Encoding A1 / T1 Advanced SIMD
// vtst<c>.<size> <Qd>, <Qn>, <Qm> vtst<c>.<size> <Dd>, <Dn>, <Dm>
new OpcodeARM(Index.arm_vtst, "vtst", "111100100xxxxxxxxxxx1000xxx1xxxx"),
// A8.6.19 BIC (immediate)
// Encoding A1 ARMv4*, ARMv5T*, ARMv6*, ARMv7
// bic{s}<c> <Rd>,<Rn>,#<const>
new OpcodeARM(Index.arm_bic__imm, "bic", "xxxx0011110xxxxxxxxxxxxxxxxxxxxx"),
// A8.6.32 CMN (immediate)
// Encoding A1 ARMv4*, ARMv5T*, ARMv6*, ARMv7
// cmn<c> <Rn>,#<const>
// Unpredictable if (0) is 1: xxxx00110111xxxx(0)(0)(0)(0)xxxxxxxxxxxx
new OpcodeARM(Index.arm_cmn__imm, "cmn", "xxxx00110111xxxxxxxxxxxxxxxxxxxx"),
// A8.6.35 CMP (immediate)
// Encoding A1 ARMv4*, ARMv5T*, ARMv6*, ARMv7
// cmp<c> <Rn>,#<const>
// Unpredictable if (0) is 1: xxxx00110101xxxx(0)(0)(0)(0)xxxxxxxxxxxx
new OpcodeARM(Index.arm_cmp__imm, "cmp", "xxxx00110101xxxxxxxxxxxxxxxxxxxx"),
// A8.6.99 MOVT
// Encoding A1 ARMv6T2, ARMv7
// movt<c> <Rd>,#<imm16>
new OpcodeARM(Index.arm_movt, "movt", "xxxx00110100xxxxxxxxxxxxxxxxxxxx"),
// A8.6.103 MSR (immediate)
// Encoding A1 ARMv4*, ARMv5T*, ARMv6*, ARMv7
// msr<c> <spec_reg>,#<const>
// Unpredictable if (1) is 0: xxxx00110010xx00(1)(1)(1)(1)xxxxxxxxxxxx
// must precede arm_msr__sys_imm in table
// must follow arm_nop in table
// must follow arm_sev in table
// must follow arm_wfe in table
// must follow arm_wfi in table
// must follow arm_yield in table
new OpcodeARM(Index.arm_msr__imm, "msr", "xxxx00110010xx00xxxxxxxxxxxxxxxx"),
// B6.1.6 MSR (immediate)
// Encoding A1 ARMv4*, ARMv5T*, ARMv6*, ARMv7
// msr<c> <spec_reg>,#<const>
// Unpredictable if (1) is 0: xxxx00110x10xxxx(1)(1)(1)(1)xxxxxxxxxxxx
// must follow arm_msr__imm in table in table
new OpcodeARM(Index.arm_msr__sys_imm, "msr", "xxxx00110x10xxxxxxxxxxxxxxxxxxxx"),
// A8.6.106 MVN (immediate)
// Encoding A1 ARMv4*, ARMv5T*, ARMv6*, ARMv7
// mvn{s}<c> <Rd>,#<const>
// Unpredictable if (0) is 1: xxxx0011111x(0)(0)(0)(0)xxxxxxxxxxxxxxxx
new OpcodeARM(Index.arm_mvn__imm, "mvn", "xxxx0011111xxxxxxxxxxxxxxxxxxxxx"),
// A8.6.142 RSB (immediate)
// Encoding A1 ARMv4*, ARMv5T*, ARMv6*, ARMv7
// rsb{s}<c> <Rd>,<Rn>,#<const>
new OpcodeARM(Index.arm_rsb__imm, "rsb", "xxxx0010011xxxxxxxxxxxxxxxxxxxxx"),
// A8.6.145 RSC (immediate)
// Encoding A1 ARMv4*, ARMv5T*, ARMv6*, ARMv7
// rsc{s}<c> <Rd>,<Rn>,#<const>
new OpcodeARM(Index.arm_rsc__imm, "rsc", "xxxx0010111xxxxxxxxxxxxxxxxxxxxx"),
// A8.6.151 SBC (immediate)
// Encoding A1 ARMv4*, ARMv5T*, ARMv6*, ARMv7
// sbc{s}<c> <Rd>,<Rn>,#<const>
new OpcodeARM(Index.arm_sbc__imm, "sbc", "xxxx0010110xxxxxxxxxxxxxxxxxxxxx"),
// A8.6.199 STRBT
// Encoding A1 ARMv4*, ARMv5T*, ARMv6*, ARMv7
// strbt<c> <Rt>,[<Rn>],#+/-<imm12>
// must precede arm_strb__imm in table
new OpcodeARM(Index.arm_strbt__imm, "strbt", "xxxx0100x110xxxxxxxxxxxxxxxxxxxx"),
// A8.6.197 STRB (immediate, ARM)
// Encoding A1 ARMv4*, ARMv5T*, ARMv6*, ARMv7
// strb<c> <Rt>,[<Rn>{,#+/-<imm12>}] strb<c> <Rt>,[<Rn>],#+/-<imm12> strb<c> <Rt>,[<Rn>,#+/-<imm12>]!
// must follow arm_strbt__imm in table
new OpcodeARM(Index.arm_strb__imm, "strb", "xxxx010xx1x0xxxxxxxxxxxxxxxxxxxx"),
// A8.6.212 SUB (immediate, ARM)
// Encoding A1 ARMv4*, ARMv5T*, ARMv6*, ARMv7
// sub{s}<c> <Rd>,<Rn>,#<const>
// A8.6.215 SUB (SP minus immediate)
// Encoding A1 ARMv4*, ARMv5T*, ARMv6*, ARMv7
// sub{s}<c> <Rd>,sp,#<const>
//
// must follow arm_adr__lower in table
new OpcodeARM(Index.arm_sub__imm, "sub", "xxxx0010010xxxxxxxxxxxxxxxxxxxxx"),
// Coprocessor instructions
// A8.6.28 CDP, CDP2
// Encoding A2 / T2 ARMv5T*, ARMv6*, ARMv7
// cdp2<c> <coproc>,<opc1>,<CRd>,<CRn>,<CRm>,<opc2>
// must precede arm_cdp in table
new OpcodeARM(Index.arm_cdp2, "cdp2", "11111110xxxxxxxxxxxxxxxxxxx0xxxx"),
// A8.6.28 CDP, CDP2
// Encoding A1 / T1 ARMv4*, ARMv5T*, ARMv6*, ARMv7
// cdp<c> <coproc>,<opc1>,<CRd>,<CRn>,<CRm>,<opc2>
// must follow arm_cdp2 in table
new OpcodeARM(Index.arm_cdp, "cdp", "xxxx1110xxxxxxxxxxxxxxxxxxx0xxxx"),
// A8.6.92 MCR, MCR2
// Encoding A2 / T2 ARMv5T*, ARMv6*, ARMv7
// mcr2<c> <coproc>,<opc1>,<Rt>,<CRn>,<CRm>{,<opc2>}
// must precede arm_mcr in table
new OpcodeARM(Index.arm_mcr2, "mcr2", "11111110xxx0xxxxxxxxxxxxxxx1xxxx"),
// A8.6.92 MCR, MCR2
// Encoding A1 / T2 ARMv4*, ARMv5T*, ARMv6*, ARMv7
// mcr<c> <coproc>,<opc1>,<Rt>,<CRn>,<CRm>{,<opc2>}
// must follow arm_mcr2 in table
new OpcodeARM(Index.arm_mcr, "mcr", "xxxx1110xxx0xxxxxxxxxxxxxxx1xxxx"),
// A8.6.100 MRC, MRC2
// Encoding A2 / T2 ARMv5T*, ARMv6*, ARMv7
// mrc2<c> <coproc>,<opc1>,<Rt>,<CRn>,<CRm>{,<opc2>}
// must precede arm_mrc in table
new OpcodeARM(Index.arm_mrc2, "mrc2", "11111110xxx1xxxxxxxxxxxxxxx1xxxx"),
// A8.6.100 MRC, MRC2
// Encoding A1 / T1 ARMv4*, ARMv5T*, ARMv6*, ARMv7
// mrc<c> <coproc>,<opc1>,<Rt>,<CRn>,<CRm>{,<opc2>}
// must follow arm_mrc2 in table
new OpcodeARM(Index.arm_mrc, "mrc", "xxxx1110xxx1xxxxxxxxxxxxxxx1xxxx"),
// A8.6.101 MRRC, MRRC2
// Encoding A2 / T1 ARMv6*, ARMv7
// mrrc2<c> <coproc>,<opc>,<Rt>,<Rt2>,<CRm>
// must precede arm_mrrc in table
// must precede arm_ldc__lit in table
// must precede arm_ldc__imm in table
new OpcodeARM(Index.arm_mrrc2, "mrrc2", "111111000101xxxxxxxxxxxxxxxxxxxx"),
// A8.6.101 MRRC, MRRC2
// Encoding A1 / T1 ARMv5TE*, ARMv6*, ARMv7
// mrrc<c> <coproc>,<opc>,<Rt>,<Rt2>,<CRm>
// must follow arm_mrrc2 in table
// must precede arm_ldc__lit in table
// must precede arm_ldc__imm in table
new OpcodeARM(Index.arm_mrrc, "mrrc", "xxxx11000101xxxxxxxxxxxxxxxxxxxx"),
// A8.6.52 LDC, LDC2 (literal)
// Encoding A2 / T2 ARMv5T*, ARMv6*, ARMv7
// ldc2{l}<c> <coproc>,<CRd>,<label> ldc2{l}<c> <coproc>,<CRd>,[pc,#-0]
// Special case ldc2{l}<c> <coproc>,<CRd>,[pc],<option>
// must precede arm_ldc__imm in table
// must follow arm_mrrc in table
// must follow arm_mrrc2 in table
new OpcodeARM(Index.arm_ldc2__lit, "ldc2", "1111110xxxx11111xxxxxxxxxxxxxxxx"),
// A8.6.52 LDC, LDC2 (literal)
// Encoding A1 / T1 ARMv4*, ARMv5T*, ARMv6*, ARMv7
// ldc{l}<c> <coproc>,<CRd>,<label> ldc{l}<c> <coproc>,<CRd>,[pc,#-0]
// Special case ldc{l}<c> <coproc>,<CRd>,[pc],<option>
// must follow arm_ldc2__lit in table
// must precede arm_ldc2__imm in table
new OpcodeARM(Index.arm_ldc__lit, "ldc", "xxxx110xxxx11111xxxxxxxxxxxxxxxx"),
// A8.6.51 LDC, LDC2 (immediate)
// Encoding A2 / T2 ARMv5T*, ARMv6*, ARMv7
// ldc2{l}<c> <coproc>,<CRd>,[<Rn>,#+/-<imm>]{!} ldc2{l}<c> <coproc>,<CRd>,[<Rn>],#+/-<imm>
// ldc2{l}<c> <coproc>,<CRd>,[<Rn>],<option>
// must precede arm_ldc__lit in table
new OpcodeARM(Index.arm_ldc2__imm, "ldc2", "1111110xxxx1xxxxxxxxxxxxxxxxxxxx"),
// A8.6.51 LDC, LDC2 (immediate)
// Encoding A1 / T1 ARMv4*, ARMv5T*, ARMv6*, ARMv7
// ldc{l}<c> <coproc>,<CRd>,[<Rn>,#+/-<imm>]{!} ldc{l}<c> <coproc>,<CRd>,[<Rn>],#+/-<imm>
// ldc{l}<c> <coproc>,<CRd>,[<Rn>],<option>
// must follow arm_ldc2__imm in table
// must follow arm_mrrc in table
// must follow arm_mrrc2 in table
new OpcodeARM(Index.arm_ldc__imm, "ldc", "xxxx110xxxx1xxxxxxxxxxxxxxxxxxxx"),
// A8.6.93 MCRR, MCRR2
// Encoding A2 / T2 ARMv6*, ARMv7
// mcrr2<c> <coproc>,<opc1>,<Rt>,<Rt2>,<CRm>
// must precede arm_mcrr in table
// must precede arm_stc in table
// must precede arm_stc2 in table
new OpcodeARM(Index.arm_mcrr2, "mcrr2", "111111000100xxxxxxxxxxxxxxxxxxxx"),
// A8.6.93 MCRR, MCRR2
// Encoding A1 / T1 ARMv5TE*, ARMv6*, ARMv7
// mcrr<c> <coproc>,<opc1>,<Rt>,<Rt2>,<CRm>
// must follow arm_mcrr2 in table
// must precede arm_stc in table
// must precede arm_stc2 in table
new OpcodeARM(Index.arm_mcrr, "mcrr", "xxxx11000100xxxxxxxxxxxxxxxxxxxx"),
// A8.6.188 STC, STC2
// Encoding A2 / T2 ARMv5T*, ARMv6*, ARMv7
// stc2{l}<c> <coproc>,<CRd>,[<Rn>,#+/-<imm>]{!} stc2{l}<c> <coproc>,<CRd>,[<Rn>],#+/-<imm>
// stc2{l}<c> <coproc>,<CRd>,[<Rn>],<option>
// must precede stc in table
// must follow arm_ldc2__lit in table
// must follow arm_mcrr in table
// must follow arm_mcrr2 in table
new OpcodeARM(Index.arm_stc2, "stc2", "1111110xxxx0xxxxxxxxxxxxxxxxxxxx"),
// A8.6.188 STC, STC2
// Encoding A1 / T1 ARMv4*, ARMv5T*, ARMv6*, ARMv7
// stc{l}<c> <coproc>,<CRd>,[<Rn>,#+/-<imm>]{!} stc{l}<c> <coproc>,<CRd>,[<Rn>],#+/-<imm>
// stc{l}<c> <coproc>,<CRd>,[<Rn>],<option>
// must follow arm_ldc2__lit in table
// must follow arm_stc2 in table
// must follow arm_mcrr in table
// must follow arm_mcrr2 in table
new OpcodeARM(Index.arm_stc, "stc", "xxxx110xxxx0xxxxxxxxxxxxxxxxxxxx"),
new OpcodeARM(Index.arm_undefined, "undefined", "111001111111xxxxxxxxxxxxxxx1xxxx"),
};
// Reference manual citations (e.g., "A8.6.97") refer to sections in the ARM Architecture
// Reference Manual ARMv7-A and ARMv7-R Edition, Errata markup
public static final OpcodeARM thumb_opcode_table[] = {
// must precede thumb_b_1 in table
new OpcodeARM(Index.thumb_undefined, "undefined", "11011110xxxxxxxx"),
// A8.6.97 MOV (register)
// Encoding T1 ARMv6*, ARMv7 if <Rd> and <Rm> both from R0-R7; ARMv4T, ARMv5T*, ARMv6*, ARMv7 otherwise
// mov<c> <Rd>,<Rm> If <Rd> is the PC, must be outside or last in IT block.
new OpcodeARM(Index.thumb_mov__reg, "mov", "01000110xxxxxxxx"),
// A8.6.2 ADC (register)
// Encoding T1 ARMv4T, ARMv5T*, ARMv6*, ARMv7
// adcs <Rdn>,<Rm> Outside IT block. adc<c> <Rdn>,<Rm> Inside IT block.
new OpcodeARM(Index.thumb_adc, "adc", "0100000101xxxxxx"),
// A8.6.4 ADD (immediate, Thumb)
// Encoding T1 ARMv4T, ARMv5T*, ARMv6*, ARMv7
// adds <Rd>,<Rn>,#<imm3> Outside IT block. add<c> <Rd>,<Rn>,#<imm3> Inside IT block.
new OpcodeARM(Index.thumb_add__reg_imm, "add", "0001110xxxxxxxxx"),
// A8.6.8 ADD (SP plus immediate)
// Encoding T2 ARMv4T, ARMv5T*, ARMv6*, ARMv7
// add<c> sp,sp,#<imm>
new OpcodeARM(Index.thumb_add__imm_to_sp, "add", "101100000xxxxxxx"),
// A8.6.4 ADD (immediate, Thumb)
// Encoding T2 ARMv4T, ARMv5T*, ARMv6*, ARMv7
// adds <Rdn>,#<imm8> Outside IT block. add<c> <Rdn>,#<imm8> Inside IT block.
new OpcodeARM(Index.thumb_add__imm, "add", "00110xxxxxxxxxxx"),
// A8.6.6 ADD (register)
// Encoding T1 ARMv4T, ARMv5T*, ARMv6*, ARMv7
// adds <Rd>,<Rn>,<Rm> Outside IT block. add<c> <Rd>,<Rn>,<Rm> Inside IT block.
new OpcodeARM(Index.thumb_add__reg_reg, "add", "0001100xxxxxxxxx"),
// A8.6.6 ADD (register)
// Encoding T2 ARMv6T2, ARMv7 if <Rdn> and <Rm> are both from R0-R7; ARMv4T, ARMv5T*, ARMv6*, ARMv7 otherwise
// add<c> <Rdn>,<Rm> If <Rdn> is the PC, must be outside or last in IT block.
// A8.6.9 ADD (SP plus register)
// Encoding T1 ARMv4T, ARMv5T*, ARMv6*, ARMv7
// add<c> <Rdm>, sp, <Rdm>
// A8.6.9 ADD (SP plus register)
// Encoding T2 ARMv4T, ARMv5T*, ARMv6*, ARMv7
// add<c> sp,<Rm>
//
new OpcodeARM(Index.thumb_add__reg, "add", "01000100xxxxxxxx"),
// A8.6.8 ADD (SP plus immediate)
// Encoding T1 ARMv4T, ARMv5T*, ARMv6*, ARMv7
// add<c> <Rd>,sp,#<imm>
new OpcodeARM(Index.thumb_add__sp_imm, "add", "10101xxxxxxxxxxx"),
// A8.6.10 ADR
// Encoding T1 ARMv4T, ARMv5T*, ARMv6*, ARMv7
// adr<c> <Rd>,<label> add <Rd>,pc,imm8 Alternative form
new OpcodeARM(Index.thumb_adr, "add", "10100xxxxxxxxxxx"),
// A8.6.12 AND (register)
// Encoding T1 ARMv4T, ARMv5T*, ARMv6*, ARMv7
// ands <Rdn>,<Rm> Outside IT block. and<c> <Rdn>,<Rm> Inside IT block.
new OpcodeARM(Index.thumb_and, "and", "0100000000xxxxxx"),
// A8.6.14 ASR (immediate)
// Encoding T1 ARMv4T, ARMv5T*, ARMv6*, ARMv7
// asrs <Rd>,<Rm>,#<imm> Outside IT block. asr<c> <Rd>,<Rm>,#<imm> Inside IT block.
new OpcodeARM(Index.thumb_asr__imm, "asr", "00010xxxxxxxxxxx"),
// A8.6.15 ASR (register)
// Encoding T1 ARMv4T, ARMv5T*, ARMv6*, ARMv7
// asrs <Rdn>,<Rm> Outside IT block. asr<c> <Rdn>,<Rm> Inside IT block.
new OpcodeARM(Index.thumb_asr__reg, "asr", "0100000100xxxxxx"),
// A8.6.218 SVC (previously SWI)
// Encoding T1 ARMv4T, ARMv5T*, ARMv6*, ARMv7
// svc<c> #<imm8>
// must precede thumb_b_1 in table
new OpcodeARM(Index.thumb_svc, "svc", "11011111xxxxxxxx"),
// A8.6.16 B
// Encoding T1 ARMv4T, ARMv5T*, ARMv6*, ARMv7
// b<c> <label> Not permitted in IT block.
// must follow thumb_b_1 in table
new OpcodeARM(Index.thumb_b_1, "b", "1101xxxxxxxxxxxx"),
// A8.6.16 B
// Encoding T2 ARMv4T, ARMv5T*, ARMv6*, ARMv7
// b<c> <label> Outside or last in IT block
new OpcodeARM(Index.thumb_b_2, "b", "11100xxxxxxxxxxx"),
// A8.6.20 BIC (register)
// Encoding T1 ARMv4T, ARMv5T*, ARMv6*, ARMv7
// bics <Rdn>,<Rm> Outside IT block. bic<c> <Rdn>,<Rm> Inside IT block.
new OpcodeARM(Index.thumb_bic, "bic", "0100001110xxxxxx"),
// A8.6.22 BKPT
// Encoding T1 ARMv5T*, ARMv6*, ARMv7
// bkpt #<imm8>
new OpcodeARM(Index.thumb_bkpt, "bkpt", "10111110xxxxxxxx"),
// A8.6.24 BLX (register)
// Encoding T1 ARMv5T*, ARMv6*, ARMv7
// blx<c> <Rm> Outside or last in IT block
// Unpredictable if (0) is 1: 010001111xxxx(0)(0)(0)
new OpcodeARM(Index.thumb_blx, "blx", "010001111xxxxxxx"),
// A8.6.25 BX
// Encoding T1 ARMv4T, ARMv5T*, ARMv6*, ARMv7
// bx<c> <Rm> Outside or last in IT block
// Unpredictable if (0) is 1: 010001110xxxx(0)(0)(0)
new OpcodeARM(Index.thumb_bx, "bx", "010001110xxxxxxx"),
// A8.6.27 CBNZ, CBZ
// Encoding T1 ARMv6T2, ARMv7
// cb{n}z <Rn>,<label> Not permitted in IT block.
new OpcodeARM(Index.thumb_cbnz_cbz, "cb", "1011x0x1xxxxxxxx"),
// A8.6.33 CMN (register)
// Encoding T1 ARMv4T, ARMv5T*, ARMv6*, ARMv7
// cmn<c> <Rn>,<Rm>
new OpcodeARM(Index.thumb_cmn, "cmn", "0100001011xxxxxx"),
// A8.6.35 CMP (immediate)
// Encoding T1 ARMv4T, ARMv5T*, ARMv6*, ARMv7
// cmp<c> <Rn>,#<imm8>
new OpcodeARM(Index.thumb_cmp__imm, "cmp", "00101xxxxxxxxxxx"),
// A8.6.36 CMP (register)
// Encoding T1 ARMv4T, ARMv5T*, ARMv6*, ARMv7
// cmp<c> <Rn>,<Rm> <Rn> and <Rm> both from R0-R7
new OpcodeARM(Index.thumb_cmp__reg, "cmp", "0100001010xxxxxx"),
// A8.6.36 CMP (register)
// Encoding T2 ARMv4T, ARMv5T*, ARMv6*, ARMv7
// cmp<c> <Rn>,<Rm> <Rn> and <Rm> not both from R0-R7
new OpcodeARM(Index.thumb_cmp__reg_hi, "cmp", "01000101xxxxxxxx"),
// A8.6.45 EOR (register)
// Encoding T1 ARMv4T, ARMv5T*, ARMv6*, ARMv7
// eors <Rdn>,<Rm> Outside IT block. eor<c> <Rdn>,<Rm> Inside IT block.
new OpcodeARM(Index.thumb_eor, "eor", "0100000001xxxxxx"),
// A8.6.110 NOP
// Encoding T1 ARMv6T2, ARMv7
// nop<c>
// must precede thumb_it in table
new OpcodeARM(Index.thumb_nop, "nop", "1011111100000000"),
// A8.6.158 SEV
// Encoding T1 ARMv7 (executes as NOP in ARMv6T2)
// sev<c>
// must precede thumb_it in table
new OpcodeARM(Index.thumb_sev, "sev", "1011111101000000"),
// A8.6.411 WFE
// Encoding T1 ARMv7 (executes as NOP in ARMv6T2)
// wfe<c>
// must precede thumb_it in table
new OpcodeARM(Index.thumb_wfe, "wfe", "1011111100100000"),
// A8.6.412 WFI
// Encoding T1 ARMv7 (executes as NOP in ARMv6T2)
// wfi<c>
// must precede thumb_it in table
new OpcodeARM(Index.thumb_wfi, "wfi", "1011111100110000"),
// A8.6.413 YIELD
// Encoding T1 ARMv7 (executes as NOP in ARMv6T2)
// yield<c>
// must precede thumb_it in table
new OpcodeARM(Index.thumb_yield, "yield", "1011111100010000"),
// A8.6.50 IT
// Encoding T1 ARMv6T2, ARMv7
// it{x{y{z}}} <firstcond> Not permitted in IT block
// must follow thumb_nop in table
// must follow thumb_sev in table
// must follow thumb_wfe in table
// must follow thumb_wfi in table
// must follow thumb_yield in table
new OpcodeARM(Index.thumb_it, "it", "10111111xxxxxxxx"),
// A8.6.53 LDM / LDMIA / LDMFD
// Encoding T1 ARMv4T, ARMv5T*, ARMv6*, ARMv7 (not in ThumbEE)
// ldm<c> <Rn>!,<registers> <Rn> not included in <registers> ldm<c> <Rn>,<registers> <Rn> included in <registers>
new OpcodeARM(Index.thumb_ldm, "ldm", "11001xxxxxxxxxxx"),
// A8.6.57 LDR (immediate, Thumb)
// Encoding T1 ARMv4T, ARMv5T*, ARMv6*, ARMv7
// ldr<c> <Rt>, [<Rn>{,#<imm>}]
new OpcodeARM(Index.thumb_ldr__imm, "ldr", "01101xxxxxxxxxxx"),
// A8.6.57 LDR (immediate, Thumb)
// Encoding T2 ARMv4T, ARMv5T*, ARMv6*, ARMv7
// ldr<c> <Rt>,[sp{,#<imm>}]
new OpcodeARM(Index.thumb_ldr__imm_sp, "ldr", "10011xxxxxxxxxxx"),
// A8.6.59 LDR (literal)
// Encoding T1 ARMv4T, ARMv5T*, ARMv6*, ARMv7
// ldr<c> <Rt>,<label>
new OpcodeARM(Index.thumb_ldr__lit, "ldr", "01001xxxxxxxxxxx"),
// A8.6.60 LDR (register)
// Encoding T1 ARMv4T, ARMv5T*, ARMv6*, ARMv7
// ldr<c> <Rt>,[<Rn>,<Rm>]
new OpcodeARM(Index.thumb_ldr__reg, "ldr", "0101100xxxxxxxxx"),
// A8.6.61 LDRB (immediate, Thumb)
// Encoding T1 ARMv4T, ARMv5T*, ARMv6*, ARMv7
// ldrb<c> <Rt>,[<Rn>{,#<imm5>}]
new OpcodeARM(Index.thumb_ldrb__imm, "ldrb", "01111xxxxxxxxxxx"),
// A8.6.64 LDRB (register)
// Encoding T1 ARMv4T, ARMv5T*, ARMv6*, ARMv7
// ldrb<c> <Rt>,[<Rn>,<Rm>]
new OpcodeARM(Index.thumb_ldrb__reg, "ldrb", "0101110xxxxxxxxx"),
// A8.6.73 LDRH (immediate, Thumb)
// Encoding T1 ARMv4T, ARMv5T*, ARMv6*, ARMv7
// ldrh<c> <Rt>,[<Rn>{,#<imm>}]
new OpcodeARM(Index.thumb_ldrh__imm, "ldrh", "10001xxxxxxxxxxx"),
// A8.6.76 LDRH (register)
// Encoding T1 ARMv4T, ARMv5T*, ARMv6*, ARMv7
// ldrh<c> <Rt>,[<Rn>,<Rm>]
new OpcodeARM(Index.thumb_ldrh__reg, "ldrh", "0101101xxxxxxxxx"),
// A8.6.80 LDRSB (register)
// Encoding T1 ARMv4T, ARMv5T*, ARMv6*, ARMv7
// ldrsb<c> <Rt>,[<Rn>,<Rm>]
new OpcodeARM(Index.thumb_ldrsb, "ldrsb", "0101011xxxxxxxxx"),
// A8.6.84 LDRSH (register)
// Encoding T1 ARMv4T, ARMv5T*, ARMv6*, ARMv7
// ldrsh<c> <Rt>,[<Rn>,<Rm>]
new OpcodeARM(Index.thumb_ldrsh, "ldrsh", "0101111xxxxxxxxx"),
// A8.6.97 MOV (register)
// Encoding T2 ARMv4T, ARMv5T*, ARMv6*, ARMv7
// movs <Rd>,<Rm> Not permitted in IT block
// must precede thumb_lsl__imm in table
new OpcodeARM(Index.thumb_movs, "movs", "0000000000xxxxxx"),
// A8.6.88 LSL (immediate)
// Encoding T1 ARMv4T, ARMv5T*, ARMv6*, ARMv7
// lsls <Rd>,<Rm>,#<imm5> Outside IT block. lsl<c> <Rd>,<Rm>,#<imm5> Inside IT block.
// must follow thumb_movs in table
new OpcodeARM(Index.thumb_lsl__imm, "lsl", "00000xxxxxxxxxxx"),
// A8.6.89 LSL (register)
// Encoding T1 ARMv4T, ARMv5T*, ARMv6*, ARMv7
// lsls <Rdn>,<Rm> Outside IT block. lsl<c> <Rdn>,<Rm> Inside IT block.
new OpcodeARM(Index.thumb_lsl__reg, "lsl", "0100000010xxxxxx"),
// A8.6.90 LSR (immediate)
// Encoding T1 ARMv4T, ARMv5T*, ARMv6*, ARMv7
// lsrs <Rd>,<Rm>,#<imm> Outside IT block. lsr<c> <Rd>,<Rm>,#<imm> Inside IT block.
new OpcodeARM(Index.thumb_lsr__imm, "lsr", "00001xxxxxxxxxxx"),
// A8.6.91 LSR (register)
// Encoding T1 ARMv4T, ARMv5T*, ARMv6*, ARMv7
// lsrs <Rdn>,<Rm> Outside IT block. lsr<c> <Rdn>,<Rm> Inside IT block.
new OpcodeARM(Index.thumb_lsr__reg, "lsr", "0100000011xxxxxx"),
// A8.6.96 MOV (immediate)
// Encoding T1 ARMv4T, ARMv5T*, ARMv6*, ARMv7
// movs <Rd>,#<imm8> Outside IT block. mov<c> <Rd>,#<imm8> Inside IT block.
new OpcodeARM(Index.thumb_mov__imm, "mov", "00100xxxxxxxxxxx"),
// A8.6.105 MUL
// Encoding T1 ARMv4T, ARMv5T*, ARMv6*, ARMv7
// muls <Rdm>,<Rn>,<Rdm> Outside IT block. mul<c> <Rdm>,<Rn>,<Rdm> Inside IT block.
new OpcodeARM(Index.thumb_mul, "mul", "0100001101xxxxxx"),
// A8.6.107 MVN (register)
// Encoding T1 ARMv4T, ARMv5T*, ARMv6*, ARMv7
// mvns <Rd>,<Rm> Outside IT block. mvn<c> <Rd>,<Rm> Inside IT block.
new OpcodeARM(Index.thumb_mvn, "mvn", "0100001111xxxxxx"),
// A8.6.114 ORR (register)
// Encoding T1 ARMv4T, ARMv5T*, ARMv6*, ARMv7
// orrs <Rdn>,<Rm> Outside IT block. orr<c> <Rdn>,<Rm> Inside IT block.
new OpcodeARM(Index.thumb_orr, "orr", "0100001100xxxxxx"),
// A8.6.122 POP
// Encoding T1 ARMv4T, ARMv5T*, ARMv6*, ARMv7
// pop<c> <registers>
new OpcodeARM(Index.thumb_pop, "pop", "1011110xxxxxxxxx"),
// A8.6.123 PUSH
// Encoding T1 ARMv4T, ARMv5T*, ARMv6*, ARMv7
// push<c> <registers>
new OpcodeARM(Index.thumb_push, "push", "1011010xxxxxxxxx"),
// A8.6.135 REV
// Encoding T1 ARMv6*, ARMv7
// rev<c> <Rd>,<Rm>
new OpcodeARM(Index.thumb_rev, "rev", "1011101000xxxxxx"),
// A8.6.136 REV16
// Encoding T1 ARMv6*, ARMv7
// rev16<c> <Rd>,<Rm>
new OpcodeARM(Index.thumb_rev16, "rev16", "1011101001xxxxxx"),
// A8.6.137 REVSH
// Encoding T1 ARMv6*, ARMv7
// revsh<c> <Rd>,<Rm>
new OpcodeARM(Index.thumb_revsh, "revsh", "1011101011xxxxxx"),
// A8.6.140 ROR (register)
// Encoding T1 ARMv4T, ARMv5T*, ARMv6*, ARMv7
// rors <Rdn>,<Rm> Outside IT block. ror<c> <Rdn>,<Rm> Inside IT block.
new OpcodeARM(Index.thumb_ror, "ror", "0100000111xxxxxx"),
// A8.6.142 RSB (immediate)
// Encoding T1 ARMv4T, ARMv5T*, ARMv6*, ARMv7
// rsbs <Rd>,<Rn>,#0 Outside IT block. rsb<c> <Rd>,<Rn>,#0 Inside IT block.
new OpcodeARM(Index.thumb_rsb, "rsb", "0100001001xxxxxx"),
// A8.6.152 SBC (register)
// Encoding T1 ARMv4T, ARMv5T*, ARMv6*, ARMv7
// sbcs <Rdn>,<Rm> Outside IT block. sbc<c> <Rdn>,<Rm> Inside IT block.
new OpcodeARM(Index.thumb_sbc, "sbc", "0100000110xxxxxx"),
// A8.6.157 SETEND
// Encoding T1 ARMv6*, ARMv7
// setend <endian_specifier> Not permitted in IT block
// Unpredictable if (1) is 0 or (0) is 1: 10110110010(1)x(0)(0)(0)
new OpcodeARM(Index.thumb_setend, "setend", "10110110010xxxxx"),
// A8.6.189 STM / STMIA / STMEA
// Encoding T1 ARMv4T, ARMv5T*, ARMv6*, ARMv7 (not in ThumbEE)
// stm<c> <Rn>!,<registers>
new OpcodeARM(Index.thumb_stm, "stm", "11000xxxxxxxxxxx"),
// A8.6.193 STR (immediate, Thumb)
// Encoding T1 ARMv4T, ARMv5T*, ARMv6*, ARMv7
// str<c> <Rt>, [<Rn>{,#<imm>}]
new OpcodeARM(Index.thumb_str__imm, "str", "01100xxxxxxxxxxx"),
// A8.6.193 STR (immediate, Thumb)
// Encoding T2 ARMv4T, ARMv5T*, ARMv6*, ARMv7
// str<c> <Rt>,[sp,#<imm>]
new OpcodeARM(Index.thumb_str__imm_sp, "str", "10010xxxxxxxxxxx"),
// A8.6.195 STR (register)
// Encoding T1 ARMv4T, ARMv5T*, ARMv6*, ARMv7
// str<c> <Rt>,[<Rn>,<Rm>]
new OpcodeARM(Index.thumb_str__reg, "str", "0101000xxxxxxxxx"),
// A8.6.196 STRB (immediate, Thumb)
// Encoding T1 ARMv4T, ARMv5T*, ARMv6*, ARMv7
// strb<c> <Rt>,[<Rn>,#<imm5>]
new OpcodeARM(Index.thumb_strb__imm, "strb", "01110xxxxxxxxxxx"),
// A8.6.198 STRB (register)
// Encoding T1 ARMv4T, ARMv5T*, ARMv6*, ARMv7
// strb<c> <Rt>,[<Rn>,<Rm>]
new OpcodeARM(Index.thumb_strb__reg, "strb", "0101010xxxxxxxxx"),
// A8.6.206 STRH (immediate, Thumb)
// Encoding T1 ARMv4T, ARMv5T*, ARMv6*, ARMv7
// strh<c> <Rt>,[<Rn>{,#<imm>}]
new OpcodeARM(Index.thumb_strh__imm, "strh", "10000xxxxxxxxxxx"),
// A8.6.208 STRH (register)
// Encoding T1 ARMv4T, ARMv5T*, ARMv6*, ARMv7
// strh<c> <Rt>,[<Rn>,<Rm>]
new OpcodeARM(Index.thumb_strh__reg, "strh", "0101001xxxxxxxxx"),
// A8.6.211 SUB (immediate, Thumb)
// Encoding T1 ARMv4T, ARMv5T*, ARMv6*, ARMv7
// subs <Rd>,<Rn>,#<imm3> Outside IT block. sub<c> <Rd>,<Rn>,#<imm3> Inside IT block.
new OpcodeARM(Index.thumb_sub__reg_imm, "sub", "0001111xxxxxxxxx"),
// A8.6.211 SUB (immediate, Thumb)
// Encoding T2 ARMv4T, ARMv5T*, ARMv6*, ARMv7
// subs <Rdn>,#<imm8> Outside IT block. sub<c> <Rdn>,#<imm8> Inside IT block.
new OpcodeARM(Index.thumb_sub__imm, "sub", "00111xxxxxxxxxxx"),
// A8.6.213 SUB (register)
// Encoding T1 ARMv4T, ARMv5T*, ARMv6*, ARMv7
// subs <Rd>,<Rn>,<Rm> Outside IT block. sub<c> <Rd>,<Rn>,<Rm> Inside IT block.
new OpcodeARM(Index.thumb_sub__reg_reg, "sub", "0001101xxxxxxxxx"),
// A8.6.215 SUB (SP minus immediate)
// Encoding T1 ARMv4T, ARMv5T*, ARMv6*, ARMv7
// sub<c> sp,sp,#<imm>
new OpcodeARM(Index.thumb_sub__imm_from_sp, "sub", "101100001xxxxxxx"),
// A8.6.223 SXTB
// Encoding T1 ARMv6*, ARMv7
// sxtb<c> <Rd>,<Rm>
new OpcodeARM(Index.thumb_sxtb, "sxtb", "1011001001xxxxxx"),
// A8.6.225 SXTH
// Encoding T1 ARMv6*, ARMv7
// sxth<c> <Rd>,<Rm>
new OpcodeARM(Index.thumb_sxth, "sxth", "1011001000xxxxxx"),
// A8.6.231 TST (register)
// Encoding T1 ARMv4T, ARMv5T*, ARMv6*, ARMv7
// tst<c> <Rn>,<Rm>
new OpcodeARM(Index.thumb_tst, "tst", "0100001000xxxxxx"),
// A8.6.263 UXTB
// Encoding T1 ARMv6*, ARMv7
// uxtb<c> <Rd>,<Rm>
new OpcodeARM(Index.thumb_uxtb, "uxtb", "1011001011xxxxxx"),
// A8.6.265 UXTH
// Encoding T1 ARMv6*, ARMv7
// uxth<c> <Rd>,<Rm>
new OpcodeARM(Index.thumb_uxth, "uxth", "1011001010xxxxxx"),
// B6.1.1 CPS
// Encoding T1 ARMv6*, ARMv7
// cps<effect> <iflags> Not permitted in IT block.
// Unpredictable if (0) is 1: 10110110011x(0)xxx
new OpcodeARM(Index.thumb_cps, "cps", "10110110011xxxxx"),
};
// Reference manual citations (e.g., "A8.6.1") refer to sections in the ARM Architecture
// Reference Manual ARMv7-A and ARMv7-R Edition, Errata markup
public static final OpcodeARM thumb2_opcode_table[] = {
// A8.6.1 ADC (immediate)
// Encoding T1 ARMv6T2, ARMv7
// adc{s}<c> <Rd>,<Rn>,#<const>
new OpcodeARM(Index.thumb2_adc__imm, "adc", "11110x01010xxxxx0xxxxxxxxxxxxxxx"),
// A8.6.2 ADC (register)
// Encoding T2 ARMv6T2, ARMv7
// adc{s}<c>.w <Rd>,<Rn>,<Rm>{,<shift>}
// Unpredictable if (0) is 1: 11101011010xxxxx(0)xxxxxxxxxxxxxxx
new OpcodeARM(Index.thumb2_adc__reg, "adc", "11101011010xxxxxxxxxxxxxxxxxxxxx"),
// A8.6.10 ADR
// Encoding T3 ARMv6T2, ARMv7
// adr<c>.w <Rd>,<label>
// must precede thumb2_addw in table
new OpcodeARM(Index.thumb2_adr__add, "add", "11110x10000011110xxxxxxxxxxxxxxx"),
// A8.6.32 CMN (immediate)
// Encoding T1 ARMv6T2, ARMv7
// cmn<c> <Rn>,#<const>
// must precede thumb2_add__imm in table
// must precede thumb2_addw__imm in table
new OpcodeARM(Index.thumb2_cmn__imm, "cmn", "11110x010001xxxx0xxx1111xxxxxxxx"),
// A8.6.4 ADD (immediate, Thumb)
// Encoding T4 ARMv6T2, ARMv7
// addw<c> <Rd>,<Rn>,#<imm12>
// A8.6.8 ADD (SP plus immediate)
// Encoding T4 ARMv6T2, ARMv7
// addw <Rd>,sp,#<imm12>
//
// must follow thumb2_adr__add in table
// must follow thumb2_cmn__imm in table
// must precede thumb2_add__imm in table
new OpcodeARM(Index.thumb2_addw, "addw", "11110x100000xxxx0xxxxxxxxxxxxxxx"),
// A8.6.4 ADD (immediate, Thumb)
// Encoding T3 ARMv6T2, ARMv7
// add{s}<c>.w <Rd>,<Rn>,#<const>
// A8.6.8 ADD (SP plus immediate)
// Encoding T3 ARMv6T2, ARMv7
// add{s}.w <Rd>,sp,#<const>
//
// must follow thumb2_addw__imm in table
// must follow thumb2_cmn__imm in table
new OpcodeARM(Index.thumb2_add__imm, "add", "11110x01000xxxxx0xxxxxxxxxxxxxxx"),
// A8.6.33 CMN (register)
// Encoding T2 ARMv6T2, ARMv7
// cmn<c>.w <Rn>,<Rm>{,<shift>}
// Unpredictable if (0) is 1: 111010110001xxxx(0)xxx1111xxxxxxxx
// must precede thumb2_add__reg in table
new OpcodeARM(Index.thumb2_cmn__reg, "cmn.w", "111010110001xxxxxxxx1111xxxxxxxx"),
// A8.6.6 ADD (register)
// Encoding T3 ARMv6T2, ARMv7
// add{s}<c>.w <Rd>,<Rn>,<Rm>{,<shift>}
// Unpredictable if (0) is 1: 11101011000xxxxx(0)xxxxxxxxxxxxxxx
// A8.6.9 ADD (SP plus register)
// Encoding T3 ARMv6T2, ARMv7
// add{s}<c>.w <Rd>,sp,<Rm>{,<shift>}
//
// must follow thumb2_cmn__reg in table
new OpcodeARM(Index.thumb2_add__reg, "add", "11101011000xxxxxxxxxxxxxxxxxxxxx"),
// A8.6.10 ADR
// Encoding T2 ARMv6T2, ARMv7
// adr<c>.w <Rd>,<label> sub <Rd>,pc,#0 Special case for subtraction of zero
// must precede thumb2_subw in table
new OpcodeARM(Index.thumb2_adr__sub, "sub", "11110x10101011110xxxxxxxxxxxxxxx"),
// A8.6.230 TST (immediate)
// Encoding T1 ARMv6T2, ARMv7
// tst<c> <Rn>,#<const>
// must precede thumb2_and__imm in table
new OpcodeARM(Index.thumb2_tst__imm, "tst", "11110x000001xxxx0xxx1111xxxxxxxx"),
// A8.6.11 AND (immediate)
// Encoding T1 ARMv6T2, ARMv7
// and{s}<c> <Rd>,<Rn>,#<const>
// must follow thumb2_and__imm in table
new OpcodeARM(Index.thumb2_and__imm, "and", "11110x00000xxxxx0xxxxxxxxxxxxxxx"),
// A8.6.231 TST (register)
// Encoding T2 ARMv6T2, ARMv7
// tst<c>.w <Rn>,<Rm>{,<shift>}
// Unpredictable if (0) is 1: 111010100001xxxx(0)xxx1111xxxxxxxx
// must precede thumb2_and__reg in table
new OpcodeARM(Index.thumb2_tst__reg, "tst.w", "111010100001xxxxxxxx1111xxxxxxxx"),
// A8.6.12 AND (register)
// Encoding T2 ARMv6T2, ARMv7
// and{s}<c>.w <Rd>,<Rn>,<Rm>{,<shift>}
// Unpredictable if (0) is 1: 11101010000xxxxx(0)xxxxxxxxxxxxxxx
// must follow thumb2_and__reg in table
new OpcodeARM(Index.thumb2_and__reg, "and", "11101010000xxxxxxxxxxxxxxxxxxxxx"),
// A8.6.14 ASR (immediate)
// Encoding T2 ARMv6T2, ARMv7
// asr{s}<c>.w <Rd>,<Rm>,#<imm>
// Unpredictable if (0) is 1: 11101010010x1111(0)xxxxxxxxx10xxxx
new OpcodeARM(Index.thumb2_asr__imm, "asr", "11101010010x1111xxxxxxxxxx10xxxx"),
// A8.6.15 ASR (register)
// Encoding T2 ARMv6T2, ARMv7
// asr{s}<c>.w <Rd>,<Rn>,<Rm>
new OpcodeARM(Index.thumb2_asr__reg, "asr", "11111010010xxxxx1111xxxx0000xxxx"),
// A8.6.26 BXJ
// Encoding T1 ARMv6T2, ARMv7
// bxj<c> <Rm> Outside or last in IT block
// Unpredictable if (1) is 0 or (0) is 1: 111100111100xxxx10(0)0(1)(1)(1)(1)(0)(0)(0)(0)(0)(0)(0)(0)
// must precede thumb2_b__cond in table
new OpcodeARM(Index.thumb2_bxj, "bxj", "111100111100xxxx10x0xxxxxxxxxxxx"),
// A8.6.30 CLREX
// Encoding T1 ARMv7
// clrex<c>
// Unpredictable if (1) is 0 or (0) is 1: 111100111011(1)(1)(1)(1)10(0)0(1)(1)(1)(1)0010(1)(1)(1)(1)
// must precede thumb2_b__cond in table
new OpcodeARM(Index.thumb2_clrex, "clrex", "111100111011xxxx10x0xxxx0010xxxx"),
// A8.6.40 DBG
// Encoding T1 ARMv7 (executes as NOP in ARMv6T2)
// dbg<c> #<option>
// Unpredictable if (1) is 0 or (0) is 1: 111100111010(1)(1)(1)(1)10(0)0(0)0001111xxxx
// must precede thumb2_b__cond in table
// must precede thumb2_cps in table
new OpcodeARM(Index.thumb2_dbg, "dbg", "111100111010xxxx10x0x0001111xxxx"),
// A8.6.110 NOP
// Encoding T2 ARMv6T2, ARMv7
// nop<c>.w
// Unpredictable if (1) is 0 or (0) is 1: 111100111010(1)(1)(1)(1)10(0)0(0)00000000000
// must precede thumb2_b__cond in table
// must precede thumb2_cps in table
new OpcodeARM(Index.thumb2_nop, "nop.w", "111100111010xxxx10x0x00000000000"),
// A8.6.158 SEV
// Encoding T2 ARMv7 (executes as NOP in ARMv6T2)
// sev<c>.w
// Unpredictable if (1) is 0 or (0) is 1: 111100111010(1)(1)(1)(1)10(0)0(0)00000000100
// must precede thumb2_b__cond in table
// must precede thumb2_cps in table
new OpcodeARM(Index.thumb2_sev, "sev.w", "111100111010xxxx10x0x00000000100"),
// B6.1.9 SMC (previously SMI)
// Encoding T1 Security Extensions (not in ARMv6K)
// smc<c> #<imm4>
// Unpredictable if (0) is 1: 111101111111xxxx1000(0)(0)(0)(0)(0)(0)(0)(0)(0)(0)(0)(0)
new OpcodeARM(Index.thumb2_smc, "smc", "111101111111xxxx1000xxxxxxxxxxxx"),
// A8.6.411 WFE
// Encoding T2 ARMv7 (executes as NOP in ARMv6T2)
// wfe<c>.w
// Unpredictable if (1) is 0 or (0) is 1: 111100111010(1)(1)(1)(1)10(0)0(0)00000000010
// must precede thumbw_b__cond in table
// must precede thumb2_cps in table
new OpcodeARM(Index.thumb2_wfe, "wfe.w", "111100111010xxxx10x0x00000000010"),
// A8.6.412 WFI
// Encoding T2 ARMv7 (executes as NOP in ARMv6T2)
// wfi<c>.w
// Unpredictable if (1) is 0 or (0) is 1: 111100111010(1)(1)(1)(1)10(0)0(0)00000000011
// must precede thumbw_b__cond in table
// must precede thumb2_cps in table
new OpcodeARM(Index.thumb2_wfi, "wfi.w", "111100111010xxxx10x0x00000000011"),
// A8.6.413 YIELD
// Encoding T2 ARMv7 (executes as NOP in ARMv6T2)
// yield<c>.w
// Unpredictable if (1) is 0 or (0) is 1: 111100111010(1)(1)(1)(1)10(0)0(0)00000000001
// must precede thumbw_b__cond in table
// must precede thumb2_cps in table
new OpcodeARM(Index.thumb2_yield, "yield.w", "111100111010xxxx10x0x00000000001"),
// B6.1.1 CPS
// Encoding T2 ARMv6T2, ARMv7
// cps<effect>.w <iflags>{,#<mode>} Not permitted in IT block. cps #<mode> Not permitted in IT block.
// Unpredictable if (1) is 0 or (0) is 1: 111100111010(1)(1)(1)(1)10(0)0(0)xxxxxxxxxxx
// must follow thumb2_dbg in table
// must follow thumb2_nop in table
// must follow thumb2_sev in table
// must follow thumb2_wfe in table
// must follow thumb2_wfi in table
// must follow thumb2_yield in table
// must precede thumb2_b__cond in table
new OpcodeARM(Index.thumb2_cps, "cps", "111100111010xxxx10x0xxxxxxxxxxxx"),
// A8.6.41 DMB
// Encoding T1 ARMv7
// dmb<c> #<option>
// Unpredictable if (1) is 0 or (0) is 1: 111100111011(1)(1)(1)(1)10(0)0(1)(1)(1)(1)0101xxxx
// must precede thumb2_b__cond in table
new OpcodeARM(Index.thumb2_dmb, "dmb", "111100111011xxxx10x0xxxx0101xxxx"),
// A8.6.42 DSB
// Encoding T1 ARMv7
// dsb<c> #<option>
// Unpredictable if (1) is 0 or (0) is 1: 111100111011(1)(1)(1)(1)10(0)0(1)(1)(1)(1)0100xxxx
// must precede thumb2_b__cond in table
new OpcodeARM(Index.thumb2_dsb, "dsb", "111100111011xxxx10x0xxxx0100xxxx"),
// A8.6.49 ISB
// Encoding T1 ARMv7
// isb<c> #<option>
// Unpredictable if (1) is 0 or (0) is 1: 111100111011(1)(1)(1)(1)10(0)0(1)(1)(1)(1)0110xxxx
// must precede thumb2_b__cond in table
new OpcodeARM(Index.thumb2_isb, "isb", "111100111011xxxx10x0xxxx0110xxxx"),
// A8.6.102 MRS
// Encoding T1 ARMv6T2, ARMv7
// mrs<c> <Rd>,<spec_reg>
// Unpredictable if (1) is 0 or (0) is 1: 111100111110(1)(1)(1)(1)10(0)0xxxx(0)(0)(0)(0)(0)(0)(0)(0)
// B6.1.5 MRS
// Encoding T1 ARMv6T2, ARMv7
// mrs<c> <Rd>,<spec_reg>
// Unpredictable if (1) is 0 or (0) is 1: 11110011111x(1)(1)(1)(1)10(0)0xxxx(0)(0)(0)(0)(0)(0)(0)(0)
//
// must precede thumb2_b__cond in table
new OpcodeARM(Index.thumb2_mrs, "mrs", "11110011111xxxxx10x0xxxxxxxxxxxx"),
// A8.6.104 MSR (register)
// Encoding T1 ARMv6T2, ARMv7
// msr<c> <spec_reg>,<Rn>
// Unpredictable if (0) is 1: 111100111000xxxx10(0)0xx00(0)(0)(0)(0)(0)(0)(0)(0)
// must precede thumb2_b__cond in table
// B6.1.7 MSR (register)
// Encoding T1 ARMv6T2, ARMv7
// msr<c> <spec_reg>,<Rn>
// Unpredictable if (0) is 1: 11110011100xxxxx10(0)0xxxx(0)(0)(0)(0)(0)(0)(0)(0)
//
// must precede thumb2_b__cond in table
new OpcodeARM(Index.thumb2_msr, "msr", "11110011100xxxxx10x0xxxxxxxxxxxx"),
// A8.6.16 B
// Encoding T3 ARMv6T2, ARMv7
// b<c>.w <label> Not permitted in IT block.
// must follow thumb2_bxj in table
// must follow thumb2_clrex in table
// must follow thumb2_cps in table
// must follow thumb2_dbg in table
// must follow thumb2_dmb in table
// must follow thumb2_dsb in table
// must follow thumb2_isb in table
// must follow thumb2_mrs in table
// must follow thumb2_msr in table
// must follow thumb2_nop in table
// must follow thumb2_sev in table
// must follow thumb2_wfe in table
// must follow thumb2_wfi in table
// must follow thumb2_yield in table
new OpcodeARM(Index.thumb2_b__cond, "b", "11110xxxxxxxxxxx10x0xxxxxxxxxxxx"),
// A8.6.16 B
// Encoding T4 ARMv6T2, ARMv7
// b<c>.w <label> Outside or last in IT block
new OpcodeARM(Index.thumb2_b__uncond, "b.w", "11110xxxxxxxxxxx10x1xxxxxxxxxxxx"),
// A8.6.17 BFC
// Encoding T1 ARMv6T2, ARMv7
// bfc<c> <Rd>,#<lsb>,#<width>
// Unpredictable if (0) is 1: 11110(0)11011011110xxxxxxxxx(0)xxxxx
// must precede thumb2_bfi in table
new OpcodeARM(Index.thumb2_bfc, "bfc", "11110x11011011110xxxxxxxxxxxxxxx"),
// A8.6.18 BFI
// Encoding T1 ARMv6T2, ARMv7
// bfi<c> <Rd>,<Rn>,#<lsb>,#<width>
// Unpredictable if (0) is 1: 11110(0)110110xxxx0xxxxxxxxx(0)xxxxx
// must follow thumb2_bfc in table
new OpcodeARM(Index.thumb2_bfi, "bfi", "11110x110110xxxx0xxxxxxxxxxxxxxx"),
// A8.6.154 SBFX
// Encoding T1 ARMv6T2, ARMv7
// sbfx<c> <Rd>,<Rn>,#<lsb>,#<width>
// Unpredictable if (0) is 1: 11110(0)110100xxxx0xxxxxxxxx(0)xxxxx
// A8.6.236 UBFX
// Encoding T1 ARMv6T2, ARMv7
// ubfx<c> <Rd>,<Rn>,#<lsb>,#<width>
// Unpredictable if (0) is 1: 11110(0)111100xxxx0xxxxxxxxx(0)xxxxx
//
new OpcodeARM(Index.thumb2_bfx, "bfx", "11110x11x100xxxx0xxxxxxxxxxxxxxx"),
// A8.6.19 BIC (immediate)
// Encoding T1 ARMv6T2, ARMv7
// bic{s}<c> <Rd>,<Rn>,#<const>
new OpcodeARM(Index.thumb2_bic__imm, "bic", "11110x00001xxxxx0xxxxxxxxxxxxxxx"),
// A8.6.20 BIC (register)
// Encoding T2 ARMv6T2, ARMv7
// bic{s}<c>.w <Rd>,<Rn>,<Rm>{,<shift>}
// Unpredictable if (0) is 1: 11101010001xxxxx(0)xxxxxxxxxxxxxxx
new OpcodeARM(Index.thumb2_bic__reg, "bic", "11101010001xxxxxxxxxxxxxxxxxxxxx"),
// A8.6.23 BL, BLX (immediate)
// Encoding T1 ARMv4T, ARMv5T*, ARMv6*, ARMv7 if J1 == J2 == 1; ARMv6T2, ARMv7 otherwise
// bl<c> <label> Outside or last in IT block
new OpcodeARM(Index.thumb2_bl, "bl", "11110xxxxxxxxxxx11x1xxxxxxxxxxxx"),
// A8.6.23 BL, BLX (immediate)
// Encoding T2 ARMv5T*, ARMv6*, ARMv7 if J1 == J2 == 1; ARMv6T2, ARMv7 otherwise
// blx<c> <label> Outside or last in IT block
new OpcodeARM(Index.thumb2_blx, "blx", "11110xxxxxxxxxxx11x0xxxxxxxxxxx0"),
// A8.6.31 CLZ
// Encoding T1 ARMv6T2, ARMv7
// clz<c> <Rd>,<Rm>
new OpcodeARM(Index.thumb2_clz, "clz", "111110101011xxxx1111xxxx1000xxxx"),
// A8.6.35 CMP (immediate)
// Encoding T2 ARMv6T2, ARMv7
// cmp<c>.w <Rn>,#<const>
// must precede thumb2_sub__imm in table
// must precede thumb2_subw in table
new OpcodeARM(Index.thumb2_cmp__imm, "cmp.w", "11110x011011xxxx0xxx1111xxxxxxxx"),
// A8.6.36 CMP (register)
// Encoding T3 ARMv6T2, ARMv7
// cmp<c>.w <Rn>, <Rm> {,<shift>}
// Unpredictable if (0) is 1: 111010111011xxxx(0)xxx1111xxxxxxxx
// must precede thumb2_sub__reg in table
// must precede thumb2_subw in table
new OpcodeARM(Index.thumb2_cmp__reg, "cmp.w", "111010111011xxxxxxxx1111xxxxxxxx"),
// A8.6.227 TEQ (immediate)
// Encoding T1 ARMv6T2, ARMv7
// teq<c> <Rn>,#<const>
// must precede thumb2_eor__imm in table
new OpcodeARM(Index.thumb2_teq__imm, "teq", "11110x001001xxxx0xxx1111xxxxxxxx"),
// A8.6.44 EOR (immediate)
// Encoding T1 ARMv6T2, ARMv7
// eor{s}<c> <Rd>,<Rn>,#<const>
// must follow thumb2_teq__imm in table
new OpcodeARM(Index.thumb2_eor__imm, "eor", "11110x00100xxxxx0xxxxxxxxxxxxxxx"),
// A8.6.228 TEQ (register)
// Encoding T1 ARMv6T2, ARMv7
// teq<c> <Rn>,<Rm>{,<shift>}
// Unpredictable if (0) is 1: 111010101001xxxx(0)xxx1111xxxxxxxx
// must precede thumb2_eor__reg in table
new OpcodeARM(Index.thumb2_teq__reg, "teq", "111010101001xxxxxxxx1111xxxxxxxx"),
// A8.6.45 EOR (register)
// Encoding T2 ARMv6T2, ARMv7
// eor{s}<c>.w <Rd>,<Rn>,<Rm>{,<shift>}
// Unpredictable if (0) is 1: 11101010100xxxxx(0)xxxxxxxxxxxxxxx
// must follow thumb2_teq__reg in table
new OpcodeARM(Index.thumb2_eor__reg, "eor", "11101010100xxxxxxxxxxxxxxxxxxxxx"),
// A8.6.122 POP
// Encoding T2 ARMv6T2, ARMv7
// pop<c>.w <registers> <registers> contains more than one register
// Unpredictable if (0) is 1: 1110100010111101xx(0)xxxxxxxxxxxxx
// must precede thumb2_ldm in table
new OpcodeARM(Index.thumb2_pop__regs, "pop.w", "1110100010111101xxxxxxxxxxxxxxxx"),
// A8.6.53 LDM / LDMIA / LDMFD
// Encoding T2 ARMv6T2, ARMv7
// ldm<c>.w <Rn>{!},<registers>
// Unpredictable if (0) is 1: 1110100010x1xxxxxx(0)xxxxxxxxxxxxx
// must follow thumb2_pop__regs in table
new OpcodeARM(Index.thumb2_ldm, "ldm.w", "1110100010x1xxxxxxxxxxxxxxxxxxxx"),
// A8.6.55 LDMDB / LDMEA
// Encoding T1 ARMv6T2, ARMv7; if ony 1 register, instead assemble to LDR<c><q> <Rt>,[<Rn>,#-4]{!} instruction
// ldmdb<c> <Rn>{!},<registers>
// Unpredictable if (0) is 1: 1110100100x1xxxxxx(0)xxxxxxxxxxxxx
new OpcodeARM(Index.thumb2_ldmdb, "ldmdb", "1110100100x1xxxxxxxxxxxxxxxxxxxx"),
// A8.6.117 PLD, PLDW (immediate)
// Encoding T1 ARMv6T2, ARMv7 for PLD; ARMv7 with MP Extensions for PLDW
// pld{w}<c> [<Rn>,#<imm12>]
// A8.6.117 PLD, PLDW (immediate)
// Encoding T2 ARMv6T2, ARMv7 for PLD; ARMv7 with MP Extensions for PLDW
// pld{w}<c> [<Rn>,#-<imm8>]
// A8.6.118 PLD (literal)
// Encoding T1 ARMv6T2, ARMv7
// pld<c> <label> pld<c> [pc,#-0] Special case
// Unpredictable if (0) is 1: 11111000x0(0)111111111xxxxxxxxxxxx
// A8.6.119 PLD, PLDW (register)
// Encoding T1 ARMv6T2, ARMv7 for PLD; ARMv7 with MP Extensions for PLDW
// pld{w}<c> [<Rn>,<Rm>{,lsl #<imm2>}]
//
// must precede thumb2_ldr in table
new OpcodeARM(Index.thumb2_pld, "pld", "11111000x0x1xxxx1111xxxxxxxxxxxx"),
// A8.6.120 PLI (immediate, literal)
// Encoding T1 ARMv7
// pli<c> [<Rn>,#<imm12>]
// A8.6.120 PLI (immediate, literal)
// Encoding T2 ARMv7
// pli<c> [<Rn>,#-<imm8>]
// A8.6.120 PLI (immediate, literal)
// Encoding T3 ARMv7
// pli<c> <label> pli<c> [pc,#-0] Special case
// must precede thumb2_ldr__imm in table
// A8.6.121 PLI (register)
// Encoding T1 ARMv7
// pli<c> [<Rn>,<Rm>{,lsl #<imm2>}]
// must precede thumb2_ldr in table
//
new OpcodeARM(Index.thumb2_pli, "pli", "11111001x001xxxx1111xxxxxxxxxxxx"),
// A8.6.122 POP
// Encoding T3 ARMv6T2, ARMv7
// pop<c>.w <registers> <registers> contains one register, <Rt>
// must precede thumb2_ldr in table
new OpcodeARM(Index.thumb2_pop__reg, "pop.w", "1111100001011101xxxx101100000100"),
// A8.6.57 LDR (immediate, Thumb)
// Encoding T3 ARMv6T2, ARMv7
// ldr<c>.w <Rt>,[<Rn>{,#<imm12>}]
// A8.6.57 LDR (immediate, Thumb)
// Encoding T4 ARMv6T2, ARMv7
// ldr<c> <Rt>,[<Rn>,#-<imm8>] ldr<c> <Rt>,[<Rn>],#+/-<imm8> ldr<c> <Rt>,[<Rn>,#+/-<imm8>]!
// A8.6.59 LDR (literal)
// Encoding T2 ARMv6T2, ARMv7
// ldr<c>.w <Rt>,<label> ldr<c>.w <Rt>,[pc,#-0] Special case
// A8.6.60 LDR (register)
// Encoding T2 ARMv6T2, ARMv7
// ldr<c>.w <Rt>,[<Rn>,<Rm>{,lsl #<imm2>}]
// A8.6.61 LDRB (immediate, Thumb)
// Encoding T2 ARMv6T2, ARMv7
// ldrb<c>.w <Rt>,[<Rn>{,#<imm12>}]
// A8.6.61 LDRB (immediate, Thumb)
// Encoding T3 ARMv6T2, ARMv7
// ldrb<c> <Rt>,[<Rn>,#-<imm8>] ldrb<c> <Rt>,[<Rn>],#+/-<imm8> ldrb<c> <Rt>,[<Rn>,#+/-<imm8>]!
// A8.6.63 LDRB (literal)
// Encoding T1 ARMv6T2, ARMv7
// ldrb<c> <Rt>,<label> ldrb<c> <Rt>,[pc,#-0] Special case
// A8.6.64 LDRB (register)
// Encoding T2 ARMv6T2, ARMv7
// ldrb<c>.w <Rt>,[<Rn>,<Rm>{,lsl #<imm2>}]
// A8.6.65 LDRBT
// Encoding T1 ARMv6T2, ARMv7
// ldrbt<c> <Rt>,[<Rn>,#<imm8>]
// A8.6.73 LDRH (immediate, Thumb)
// Encoding T2 ARMv6T2, ARMv7
// ldrh<c>.w <Rt>,[<Rn>{,#<imm12>}]
// A8.6.73 LDRH (immediate, Thumb)
// Encoding T3 ARMv6T2, ARMv7
// ldrh<c> <Rt>,[<Rn>,#-<imm8>] ldrh<c> <Rt>,[<Rn>],#+/-<imm8> ldrh<c> <Rt>,[<Rn>,#+/-<imm8>]!
// A8.6.75 LDRH (literal)
// Encoding T1 ARMv6T2, ARMv7
// ldrh<c> <Rt>,<label> ldrh<c> <Rt>,[pc,#-0] Special case
// A8.6.76 LDRH (register)
// Encoding T2 ARMv6T2, ARMv7
// ldrh<c>.w <Rt>,[<Rn>,<Rm>{,lsl #<imm2>}]
// A8.6.77 LDRHT
// Encoding T1 ARMv6T2, ARMv7
// ldrht<c> <Rt>,[<Rn>,#<imm8>]
// A8.6.78 LDRSB (immediate)
// Encoding T1 ARMv6T2, ARMv7
// ldrsb<c> <Rt>,[<Rn>,#<imm12>]
// A8.6.78 LDRSB (immediate)
// Encoding T2 ARMv6T2, ARMv7
// ldrsb<c> <Rt>,[<Rn>,#-<imm8>] ldrsb<c> <Rt>,[<Rn>],#+/-<imm8> ldrsb<c> <Rt>,[<Rn>,#+/-<imm8>]!
// A8.6.79 LDRSB (literal)
// Encoding T1 ARMv6T2, ARMv7
// ldrsb<c> <Rt>,<label> ldrsb<c> <Rt>,[pc,#-0] Special case
// A8.6.80 LDRSB (register)
// Encoding T2 ARMv6T2, ARMv7
// ldrsb<c>.w <Rt>,[<Rn>,<Rm>{,lsl #<imm2>}]
// A8.6.81 LDRSBT
// Encoding T1 ARMv6T2, ARMv7
// ldrsbt<c> <Rt>,[<Rn>,#<imm8>]
// A8.6.82 LDRSH (immediate)
// Encoding T1 ARMv6T2, ARMv7
// ldrsh<c> <Rt>,[<Rn>,#<imm12>]
// A8.6.82 LDRSH (immediate)
// Encoding T2 ARMv6T2, ARMv7
// ldrsh<c> <Rt>,[<Rn>,#-<imm8>] ldrsh<c> <Rt>,[<Rn>],#+/-<imm8> ldrsh<c> <Rt>,[<Rn>,#+/-<imm8>]!
// A8.6.83 LDRSH (literal)
// Encoding T1 ARMv6T2, ARMv7
// ldrsh<c> <Rt>,<label> ldrsh<c> <Rt>,[pc,#-0] Special case
// A8.6.84 LDRSH (register)
// Encoding T2 ARMv6T2, ARMv7
// ldrsh<c>.w <Rt>,[<Rn>,<Rm>{,lsl #<imm2>}]
// A8.6.85 LDRSHT
// Encoding T1 ARMv6T2, ARMv7
// ldrsht<c> <Rt>,[<Rn>,#<imm8>]
// A8.6.86 LDRT
// Encoding T1 ARMv6T2, ARMv7
// ldrt<c> <Rt>,[<Rn>,#<imm8>]
//
// must follow thumb2_pld in table
// must follow thumb2_pli in table
// must follow thumb2_pop_reg in table
// 1 1 1 1 1 0 0 s_1_8_8 u_1_7_7 op_1_6_6 bh_1_5_5 1 Rn_1_3_0 Rt_0_15_12 imm12_0_11_0
new OpcodeARM(Index.thumb2_ldr, "ldr", "1111100xxxx1xxxxxxxxxxxxxxxxxxxx"),
// A8.6.67 LDRD (literal)
// Encoding T1 ARMv6T2, ARMv7
// ldrd<c> <Rt>,<Rt2>,<label> ldrd<c> <Rt>,<Rt2>,[pc,#-0] Special case
// Unpredictable if (0) is 1: 1110100xx1(0)11111xxxxxxxxxxxxxxxx
// must precede thumb2_ldrex in table
// must precede thumb2_ldrd__imm in table
new OpcodeARM(Index.thumb2_ldrd__lit, "ldrd", "1110100xx1x11111xxxxxxxxxxxxxxxx"),
// A8.6.69 LDREX
// Encoding T1 ARMv6T2, ARMv7
// ldrex<c> <Rt>,[<Rn>{,#<imm>}]
// Unpredictable if (1) is 0: 111010000101xxxxxxxx(1)(1)(1)(1)xxxxxxxx
// must follow thumb2_ldrd__lit in table
// must precede thumb2_ldrd__imm in table and must encode (1)(1)(1)(1)
new OpcodeARM(Index.thumb2_ldrex, "ldrex", "111010000101xxxxxxxx1111xxxxxxxx"),
// A8.6.226 TBB, TBH
// Encoding T1 ARMv6T2, ARMv7
// tbb<c> [<Rn>,<Rm>] Outside or last in IT block tbh<c> [<Rn>,<Rm>,LSL #1] Outside or last in IT block
// Unpredictable if (1) is 0 or (0) is 1: 111010001101xxxx(1)(1)(1)(1)(0)(0)(0)(0)000xxxxx
// must precede thumb2_ldrexx in table
new OpcodeARM(Index.thumb2_tb, "tb", "111010001101xxxxxxxxxxxx000xxxxx"),
// A8.6.70 LDREXB
// Encoding T1 ARMv7
// ldrexb<c> <Rt>, [<Rn>]
// Unpredictable if (1) is 0: 111010001101xxxxxxxx(1)(1)(1)(1)0100(1)(1)(1)(1)
// A8.6.71 LDREXD
// Encoding T1 ARMv7
// ldrexd<c> <Rt>,<Rt2>,[<Rn>]
// Unpredictable if (1) is 0: 111010001101xxxxxxxxxxxx0111(1)(1)(1)(1)
// A8.6.72 LDREXH
// Encoding T1 ARMv7
// ldrexh<c> <Rt>, [<Rn>]
// Unpredictable if (1) is 0: 111010001101xxxxxxxx(1)(1)(1)(1)0101(1)(1)(1)(1)
//
// must follow thumb2_ldrd__lit in table
// must follow thumb2_tb in table
// must precede thumb2_ldrd__imm in table and encode Rt2/(1)(1)(1)(1)
new OpcodeARM(Index.thumb2_ldrexx, "ldrex", "111010001101xxxxxxxxxxxxxxxxxxxx"),
// A8.6.66 LDRD (immediate)
// Encoding T1 ARMv6T2, ARMv7
// ldrd<c> <Rt>,<Rt2>,[<Rn>{,#+/-<imm>}] ldrd<c> <Rt>,<Rt2>,[<Rn>],#+/-<imm> ldrd<c> <Rt>,<Rt2>,[<Rn>,#+/-<imm>]!
// must follow thumb2_ldrd__lit in table
// must follow thumb2_ldrex in table
new OpcodeARM(Index.thumb2_ldrd__imm, "ldrd", "1110100xx1x1xxxxxxxxxxxxxxxxxxxx"),
// A8.6.97 MOV (register)
// Encoding T3 ARMv6T2, ARMv7
// mov{s}<c>.w <Rd>,<Rm>
// Unpredictable if (0) is 1: 11101010010x1111(0)000xxxx0000xxxx
// must precede thumb2_lsl__imm in table
// must precede thumb2_orr__reg in table
new OpcodeARM(Index.thumb2_mov__reg, "mov", "11101010010x1111x000xxxx0000xxxx"),
// A8.6.88 LSL (immediate)
// Encoding T2 ARMv6T2, ARMv7
// lsl{s}<c>.w <Rd>,<Rm>,#<imm5>
// Unpredictable if (0) is 1: 11101010010x1111(0)xxxxxxxxx00xxxx
// must follow thumb2_mov_reg in table
new OpcodeARM(Index.thumb2_lsl__imm, "lsl", "11101010010x1111xxxxxxxxxx00xxxx"),
// A8.6.89 LSL (register)
// Encoding T2 ARMv6T2, ARMv7
// lsl{s}<c>.w <Rd>,<Rn>,<Rm>
new OpcodeARM(Index.thumb2_lsl__reg, "lsl", "11111010000xxxxx1111xxxx0000xxxx"),
// A8.6.90 LSR (immediate)
// Encoding T2 ARMv6T2, ARMv7
// lsr{s}<c>.w <Rd>,<Rm>,#<imm>
// Unpredictable if (0) is 1: 11101010010x1111(0)xxxxxxxxx01xxxx
new OpcodeARM(Index.thumb2_lsr__imm, "lsr", "11101010010x1111xxxxxxxxxx01xxxx"),
// A8.6.91 LSR (register)
// Encoding T2 ARMv6T2, ARMv7
// lsr{s}<c>.w <Rd>,<Rn>,<Rm>
new OpcodeARM(Index.thumb2_lsr__reg, "lsr", "11111010001xxxxx1111xxxx0000xxxx"),
// A8.6.105 MUL
// Encoding T2 ARMv6T2, ARMv7
// mul<c> <Rd>,<Rn>,<Rm>
// must precede thumb2_ml in table
new OpcodeARM(Index.thumb2_mul, "mul", "111110110000xxxx1111xxxx0000xxxx"),
// A8.6.94 MLA
// Encoding T1 ARMv6T2, ARMv7
// mla<c> <Rd>,<Rn>,<Rm>,<Ra>
// A8.6.95 MLS
// Encoding T1 ARMv6T2, ARMv7
// mls<c> <Rd>,<Rn>,<Rm>,<Ra>
//
// must follow thumb2_mul in table
new OpcodeARM(Index.thumb2_ml, "ml", "111110110000xxxxxxxxxxxx000xxxxx"),
// A8.6.96 MOV (immediate)
// Encoding T2 ARMv6T2, ARMv7
// mov{s}<c>.w <Rd>,#<const>
// must precede thumb2_orr__imm in table
new OpcodeARM(Index.thumb2_mov__imm, "mov", "11110x00010x11110xxxxxxxxxxxxxxx"),
// A8.6.96 MOV (immediate)
// Encoding T3 ARMv6T2, ARMv7
// movw<c> <Rd>,#<imm16>
// A8.6.99 MOVT
// Encoding T1 ARMv6T2, ARMv7
// movt<c> <Rd>,#<imm16>
//
new OpcodeARM(Index.thumb2_movx, "mov", "11110x10x100xxxx0xxxxxxxxxxxxxxx"),
// A8.6.106 MVN (immediate)
// Encoding T1 ARMv6T2, ARMv7
// mvn{s}<c> <Rd>,#<const>
// must precede thumb2_orn__imm in table
new OpcodeARM(Index.thumb2_mvn__imm, "mvn", "11110x00011x11110xxxxxxxxxxxxxxx"),
// A8.6.107 MVN (register)
// Encoding T2 ARMv6T2, ARMv7
// mvn{s}<c>.w <Rd>,<Rm>{,<shift>}
// Unpredictable if (0) is 1: 11101010011x1111(0)xxxxxxxxxxxxxxx
// must precede thumb2_orn__reg in table
new OpcodeARM(Index.thumb2_mvn__reg, "mvn", "11101010011x1111xxxxxxxxxxxxxxxx"),
// A8.6.111 ORN (immediate)
// Encoding T1 ARMv6T2, ARMv7
// orn{s}<c> <Rd>,<Rn>,#<const>
// must follow thumb2_mvn__imm in table
new OpcodeARM(Index.thumb2_orn__imm, "orn", "11110x00011xxxxx0xxxxxxxxxxxxxxx"),
// A8.6.112 ORN (register)
// Encoding T1 ARMv6T2, ARMv7
// orn{s}<c> <Rd>,<Rn>,<Rm>{,<shift>}
// Unpredictable if (0) is 1: 11101010011xxxxx(0)xxxxxxxxxxxxxxx
// must follow thumb2_mvn__reg in table
new OpcodeARM(Index.thumb2_orn__reg, "orn", "11101010011xxxxxxxxxxxxxxxxxxxxx"),
// A8.6.113 ORR (immediate)
// Encoding T1 ARMv6T2, ARMv7
// orr{s}<c> <Rd>,<Rn>,#<const>
// must follow thumb2_mov__imm in table
new OpcodeARM(Index.thumb2_orr__imm, "orr", "11110x00010xxxxx0xxxxxxxxxxxxxxx"),
// A8.6.141 RRX
// Encoding T1 ARMv6T2, ARMv7
// rrx{s}<c> <Rd>,<Rm>
// Unpredictable if (0) is 1: 11101010010x1111(0)000xxxx0011xxxx
// must precede thumb2_ror__imm in table
// must precede thumb2_orr__reg in table
new OpcodeARM(Index.thumb2_rrx, "rrx", "11101010010x1111x000xxxx0011xxxx"),
// A8.6.139 ROR (immediate)
// Encoding T1 ARMv6T2, ARMv7
// ror{s}<c> <Rd>,<Rm>,#<imm>
// Unpredictable if (0) is 1: 11101010010x1111(0)xxxxxxxxx11xxxx
// must precede thumb2_orr__reg in table
// must follow thumb2_rrx in table
new OpcodeARM(Index.thumb2_ror__imm, "ror", "11101010010x1111xxxxxxxxxx11xxxx"),
// A8.6.114 ORR (register)
// Encoding T2 ARMv6T2, ARMv7
// orr{s}<c>.w <Rd>,<Rn>,<Rm>{,<shift>}
// Unpredictable if (0) is 1: 11101010010xxxxx(0)xxxxxxxxxxxxxxx
// must follow thumb2_mov__reg in table
// must follow thumb2_ror__imm in table
// must follow thumb2_rrx in table
new OpcodeARM(Index.thumb2_orr__reg, "orr", "11101010010xxxxxxxxxxxxxxxxxxxxx"),
// A8.6.116 PKH
// Encoding T1 ARMv6T2, ARMv7
// pkhbt<c> <Rd>,<Rn>,<Rm>{,lsl #<imm>} pkhtb<c> <Rd>,<Rn>,<Rm>{,asr #<imm>}
// Unpredictable if (0) is 1: 111010101100xxxx(0)xxxxxxxxxx0xxxx
new OpcodeARM(Index.thumb2_pkh, "pkh", "111010101100xxxxxxxxxxxxxxx0xxxx"),
// A8.6.123 PUSH
// Encoding T2 ARMv6T2, ARMv7
// push<c>.w <registers> <registers> contains more than one register
// Unpredictable if (0) is 1: 1110100010101101(0)x(0)xxxxxxxxxxxxx
new OpcodeARM(Index.thumb2_push__regs, "push.w", "1110100010101101xxxxxxxxxxxxxxxx"),
// A8.6.123 PUSH
// Encoding T3 ARMv6T2, ARMv7
// push<c>.w <registers> <registers> contains one register, <Rt>
// must precede thumb2_str in table
new OpcodeARM(Index.thumb2_push__reg, "push.w", "1111100001001101xxxx110100000100"),
// A8.6.124 QADD
// Encoding T1 ARMv6T2, ARMv7
// qadd<c> <Rd>,<Rm>,<Rn>
// A8.6.128 QDADD
// Encoding T1 ARMv6T2, ARMv7
// qdadd<c> <Rd>,<Rm>,<Rn>
//
new OpcodeARM(Index.thumb2_qadd, "add", "111110101000xxxx1111xxxx100xxxxx"),
// A8.6.129 QDSUB
// Encoding T1 ARMv6T2, ARMv7
// qdsub<c> <Rd>,<Rm>,<Rn>
// A8.6.131 QSUB
// Encoding T1 ARMv6T2, ARMv7
// qsub<c> <Rd>,<Rm>,<Rn>
//
new OpcodeARM(Index.thumb2_qsub, "sub", "111110101000xxxx1111xxxx101xxxxx"),
// A8.6.125 QADD16
// Encoding T1 ARMv6T2, ARMv7
// qadd16<c> <Rd>,<Rn>,<Rm>
// A8.6.126 QADD8
// Encoding T1 ARMv6T2, ARMv7
// qadd8<c> <Rd>,<Rn>,<Rm>
// A8.6.127 QASX
// Encoding T1 ARMv6T2, ARMv7
// qasx<c> <Rd>,<Rn>,<Rm>
// A8.6.130 QSAX
// Encoding T1 ARMv6T2, ARMv7
// qsax<c> <Rd>,<Rn>,<Rm>
// A8.6.132 QSUB16
// Encoding T1 ARMv6T2, ARMv7
// qsub16<c> <Rd>,<Rn>,<Rm>
// A8.6.133 QSUB8
// Encoding T1 ARMv6T2, ARMv7
// qsub8<c> <Rd>,<Rn>,<Rm>
// A8.6.148 SADD16
// Encoding T1 ARMv6T2, ARMv7
// sadd16<c> <Rd>,<Rn>,<Rm>
// A8.6.149 SADD8
// Encoding T1 ARMv6T2, ARMv7
// sadd8<c> <Rd>,<Rn>,<Rm>
// A8.6.150 SASX
// Encoding T1 ARMv6T2, ARMv7
// sasx<c> <Rd>,<Rn>,<Rm>
// A8.6.159 SHADD16
// Encoding T1 ARMv6T2, ARMv7
// shadd16<c> <Rd>,<Rn>,<Rm>
// A8.6.160 SHADD8
// Encoding T1 ARMv6T2, ARMv7
// shadd8<c> <Rd>,<Rn>,<Rm>
// A8.6.161 SHASX
// Encoding T1 ARMv6T2, ARMv7
// shasx<c> <Rd>,<Rn>,<Rm>
// A8.6.162 SHSAX
// Encoding T1 ARMv6T2, ARMv7
// shsax<c> <Rd>,<Rn>,<Rm>
// A8.6.163 SHSUB16
// Encoding T1 ARMv6T2, ARMv7
// shsub16<c> <Rd>,<Rn>,<Rm>
// A8.6.164 SHSUB8
// Encoding T1 ARMv6T2, ARMv7
// shsub8<c> <Rd>,<Rn>,<Rm>
// A8.6.185 SSAX
// Encoding T1 ARMv6T2, ARMv7
// ssax<c> <Rd>,<Rn>,<Rm>
// A8.6.186 SSUB16
// Encoding T1 ARMv6T2, ARMv7
// ssub16<c> <Rd>,<Rn>,<Rm>
// A8.6.187 SSUB8
// Encoding T1 ARMv6T2, ARMv7
// ssub8<c> <Rd>,<Rn>,<Rm>
// A8.6.233 UADD16
// Encoding T1 ARMv6T2, ARMv7
// uadd16<c> <Rd>,<Rn>,<Rm>
// A8.6.234 UADD8
// Encoding T1 ARMv6T2, ARMv7
// uadd8<c> <Rd>,<Rn>,<Rm>
// A8.6.235 UASX
// Encoding T1 ARMv6T2, ARMv7
// uasx<c> <Rd>,<Rn>,<Rm>
// A8.6.238 UHADD16
// Encoding T1 ARMv6T2, ARMv7
// uhadd16<c> <Rd>,<Rn>,<Rm>
// A8.6.239 UHADD8
// Encoding T1 ARMv6T2, ARMv7
// uhadd8<c> <Rd>,<Rn>,<Rm>
// A8.6.240 UHASX
// Encoding T1 ARMv6T2, ARMv7
// uhasx<c> <Rd>,<Rn>,<Rm>
// A8.6.241 UHSAX
// Encoding T1 ARMv6T2, ARMv7
// uhsax<c> <Rd>,<Rn>,<Rm>
// A8.6.242 UHSUB16
// Encoding T1 ARMv6T2, ARMv7
// uhsub16<c> <Rd>,<Rn>,<Rm>
// A8.6.243 UHSUB8
// Encoding T1 ARMv6T2, ARMv7
// uhsub8<c> <Rd>,<Rn>,<Rm>
// A8.6.247 UQADD16
// Encoding T1 ARMv6T2, ARMv7
// uqadd16<c> <Rd>,<Rn>,<Rm>
// A8.6.248 UQADD8
// Encoding T1 ARMv6T2, ARMv7
// uqadd8<c> <Rd>,<Rn>,<Rm>
// A8.6.249 UQASX
// Encoding T1 ARMv6T2, ARMv7
// uqasx<c> <Rd>,<Rn>,<Rm>
// A8.6.250 UQSAX
// Encoding T1 ARMv6T2, ARMv7
// uqsax<c> <Rd>,<Rn>,<Rm>
// A8.6.251 UQSUB16
// Encoding T1 ARMv6T2, ARMv7
// uqsub16<c> <Rd>,<Rn>,<Rm>
// A8.6.252 UQSUB8
// Encoding T1 ARMv6T2, ARMv7
// uqsub8<c> <Rd>,<Rn>,<Rm>
// A8.6.257 USAX
// Encoding T1 ARMv6T2, ARMv7
// usax<c> <Rd>,<Rn>,<Rm>
// A8.6.258 USUB16
// Encoding T1 ARMv6T2, ARMv7
// usub16<c> <Rd>,<Rn>,<Rm>
// A8.6.259 USUB8
// Encoding T1 ARMv6T2, ARMv7
// usub8<c> <Rd>,<Rn>,<Rm>
//
// {s|u|}{h|q|}{asx|sax|{add|sub}{8|16}<c> <Rd>,<Rn>,<Rm>
// 1 1 1 1 1 0 1 0 1 op_1_6_4 Rn_1_3_0 1 1 1 1 Rd_0_11_8 u_0_6_0 h_0_5_0 q_0_4_0 Rm_0_3_0
new OpcodeARM(Index.thumb2__r_dnm_math, null, "111110101xxxxxxx1111xxxx0xxxxxxx"),
// A8.6.134 RBIT
// Encoding T1 ARMv6T2, ARMv7
// rbit<c> <Rd>,<Rm>
// A8.6.135 REV
// Encoding T2 ARMv6T2, ARMv7
// rev<c>.w <Rd>,<Rm>
// A8.6.136 REV16
// Encoding T2 ARMv6T2, ARMv7
// rev16<c>.w <Rd>,<Rm>
// A8.6.137 REVSH
// Encoding T2 ARMv6T2, ARMv7
// revsh<c>.w <Rd>,<Rm>
//
new OpcodeARM(Index.thumb2_reverse, "r", "111110101001xxxx1111xxxx10xxxxxx"),
// A8.6.140 ROR (register)
// Encoding T2 ARMv6T2, ARMv7
// ror{s}<c>.w <Rd>,<Rn>,<Rm>
new OpcodeARM(Index.thumb2_ror__reg, "ror", "11111010011xxxxx1111xxxx0000xxxx"),
// A8.6.142 RSB (immediate)
// Encoding T2 ARMv6T2, ARMv7
// rsb{s}<c>.w <Rd>,<Rn>,#<const>
new OpcodeARM(Index.thumb2_rsb__imm, "rsb", "11110x01110xxxxx0xxxxxxxxxxxxxxx"),
// A8.6.143 RSB (register)
// Encoding T1 ARMv6T2, ARMv7
// rsb{s}<c> <Rd>,<Rn>,<Rm>{,<shift>}
// Unpredictable if (0) is 1: 11101011110xxxxx(0)xxxxxxxxxxxxxxx
new OpcodeARM(Index.thumb2_rsb__reg, "rsb", "11101011110xxxxxxxxxxxxxxxxxxxxx"),
// A8.6.151 SBC (immediate)
// Encoding T1 ARMv6T2, ARMv7
// sbc{s}<c> <Rd>,<Rn>,#<const>
new OpcodeARM(Index.thumb2_sbc__imm, "sbc", "11110x01011xxxxx0xxxxxxxxxxxxxxx"),
// A8.6.152 SBC (register)
// Encoding T2 ARMv6T2, ARMv7
// sbc{s}<c>.w <Rd>,<Rn>,<Rm>{,<shift>}
// Unpredictable if (0) is 1: 11101011011xxxxx(0)xxxxxxxxxxxxxxx
new OpcodeARM(Index.thumb2_sbc__reg, "sbc", "11101011011xxxxxxxxxxxxxxxxxxxxx"),
// A8.6.155 SDIV
// Encoding T1 ARMv7-R
// sdiv<c> <Rd>,<Rn>,<Rm>
// Unpredictable if (1) is 0: 111110111001xxxx(1)(1)(1)(1)xxxx1111xxxx
new OpcodeARM(Index.thumb2_sdiv, "sdiv", "111110111001xxxxxxxxxxxx1111xxxx"),
// A8.6.156 SEL
// Encoding T1 ARMv6T2, ARMv7
// sel<c> <Rd>,<Rn>,<Rm>
new OpcodeARM(Index.thumb2_sel, "sel", "111110101010xxxx1111xxxx1000xxxx"),
// A8.6.178 SMULBB, SMULBT, SMULTB, SMULTT
// Encoding T1 ARMv6T2, ARMv7
// smul<x><y><c> <Rd>,<Rn>,<Rm>
// must precede thumb2_smla in table
new OpcodeARM(Index.thumb2_smul, "smul", "111110110001xxxx1111xxxx00xxxxxx"),
// A8.6.166 SMLABB, SMLABT, SMLATB, SMLATT
// Encoding T1 ARMv6T2, ARMv7
// smla<x><y><c> <Rd>,<Rn>,<Rm>,<Ra>
// must follow thumb2_smul in table
new OpcodeARM(Index.thumb2_smla, "smla", "111110110001xxxxxxxxxxxx00xxxxxx"),
// A8.6.177 SMUAD
// Encoding T1 ARMv6T2, ARMv7
// smuad{x}<c> <Rd>,<Rn>,<Rm>
// must precede thumb2_smlad in table
new OpcodeARM(Index.thumb2_smuad, "smuad", "111110110010xxxx1111xxxx000xxxxx"),
// A8.6.167 SMLAD
// Encoding T1 ARMv6T2, ARMv7
// smlad{x}<c> <Rd>,<Rn>,<Rm>,<Ra>
// must follow thumb2_smuad in table
new OpcodeARM(Index.thumb2_smlad, "smlad", "111110110010xxxxxxxxxxxx000xxxxx"),
// A8.6.168 SMLAL
// Encoding T1 ARMv6T2, ARMv7
// smlal<c> <RdLo>,<RdHi>,<Rn>,<Rm>
// A8.6.169 SMLALBB, SMLALBT, SMLALTB, SMLALTT
// Encoding T1 ARMv6T2, ARMv7
// smlal<x><y><c> <RdLo>,<RdHi>,<Rn>,<Rm>
//
new OpcodeARM(Index.thumb2_smlal, "smlal", "111110111100xxxxxxxxxxxxx0xxxxxx"),
// A8.6.170 SMLALD
// Encoding T1 ARMv6T2, ARMv7
// smlald{x}<c> <RdLo>,<RdHi>,<Rn>,<Rm>
new OpcodeARM(Index.thumb2_smlald, "smlald", "111110111100xxxxxxxxxxxx110xxxxx"),
// A8.6.180 SMULWB, SMULWT
// Encoding T1 ARMv6T2, ARMv7
// smulw<y><c> <Rd>,<Rn>,<Rm>
// must precede thumb2_smlaw in table
new OpcodeARM(Index.thumb2_smulw, "smulw", "111110110011xxxx1111xxxx000xxxxx"),
// A8.6.171 SMLAWB, SMLAWT
// Encoding T1 ARMv6T2, ARMv7
// smlaw<y><c> <Rd>,<Rn>,<Rm>,<Ra>
// must follow thumb2_smulw in table
new OpcodeARM(Index.thumb2_smlaw, "smlaw", "111110110011xxxxxxxxxxxx000xxxxx"),
// A8.6.181 SMUSD
// Encoding T1 ARMv6T2, ARMv7
// smusd{x}<c> <Rd>,<Rn>,<Rm>
new OpcodeARM(Index.thumb2_smusd, "smusd", "111110110100xxxx1111xxxx000xxxxx"),
// A8.6.172 SMLSD
// Encoding T1 ARMv6T2, ARMv7
// smlsd{x}<c> <Rd>,<Rn>,<Rm>,<Ra>
// must follow thumb2_smusd in table
new OpcodeARM(Index.thumb2_smlsd, "smlsd", "111110110100xxxxxxxxxxxx000xxxxx"),
// A8.6.173 SMLSLD
// Encoding T1 ARMv6T2, ARMv7
// smlsld{x}<c> <RdLo>,<RdHi>,<Rn>,<Rm>
new OpcodeARM(Index.thumb2_smlsld, "smlsld", "111110111101xxxxxxxxxxxx110xxxxx"),
// A8.6.176 SMMUL
// Encoding T1 ARMv6T2, ARMv7
// smmul{r}<c> <Rd>,<Rn>,<Rm>
// must precede thumb2_smmla in table
new OpcodeARM(Index.thumb2_smmul, "smmul", "111110110101xxxx1111xxxx000xxxxx"),
// A8.6.174 SMMLA
// Encoding T1 ARMv6T2, ARMv7
// smmla{r}<c> <Rd>,<Rn>,<Rm>,<Ra>
// must follow thumb2_smmul in table
new OpcodeARM(Index.thumb2_smmla, "smmla", "111110110101xxxxxxxxxxxx000xxxxx"),
// A8.6.175 SMMLS
// Encoding T1 ARMv6T2, ARMv7
// smmls{r}<c> <Rd>,<Rn>,<Rm>,<Ra>
new OpcodeARM(Index.thumb2_smmls, "smmls", "111110110110xxxxxxxxxxxx000xxxxx"),
// A8.6.179 SMULL
// Encoding T1 ARMv6T2, ARMv7
// smull<c> <RdLo>,<RdHi>,<Rn>,<Rm>
new OpcodeARM(Index.thumb2_smull, "smull", "111110111000xxxxxxxxxxxx0000xxxx"),
// A8.6.184 SSAT16
// Encoding T1 ARMv6T2, ARMv7
// ssat16<c> <Rd>,#<imm>,<Rn>
// Unpredictable if (0) is 1: 11110(0)110010xxxx0000xxxx00(0)(0)xxxx
// must precede thumb2_ssat in table
new OpcodeARM(Index.thumb2_ssat16, "ssat16", "11110x110010xxxx0000xxxx00xxxxxx"),
// A8.6.183 SSAT
// Encoding T1 ARMv6T2, ARMv7
// ssat<c> <Rd>,#<imm>,<Rn>{,<shift>}
// Unpredictable if (0) is 1: 11110(0)1100x0xxxx0xxxxxxxxx(0)xxxxx
// must follow thumb2_ssat16 in table
new OpcodeARM(Index.thumb2_ssat, "ssat", "11110x1100x0xxxx0xxxxxxxxxxxxxxx"),
// A8.6.189 STM / STMIA / STMEA
// Encoding T2 ARMv6T2, ARMv7
// stm<c>.w <Rn>{!},<registers>
// Unpredictable if (0) is 1: 1110100010x0xxxx(0)x(0)xxxxxxxxxxxxx
new OpcodeARM(Index.thumb2_stm, "stm.w", "1110100010x0xxxxxxxxxxxxxxxxxxxx"),
// A8.6.191 STMDB / STMFD
// Encoding T1 ARMv6T2, ARMv7
// stmdb<c> <Rn>{!},<registers>
// Unpredictable if (0) is 1: 1110100100x0xxxx(0)x(0)xxxxxxxxxxxxx
new OpcodeARM(Index.thumb2_stmdb, "stmdb", "1110100100x0xxxxxxxxxxxxxxxxxxxx"),
// A8.6.307 VLD1 (multiple single elements)
// Encoding T1 / A1 Advanced SIMD
// vld1<c>.<size> <list>, [<Rn>{@<align>}]{!} vld1<c>.<size> <list>, [<Rn>{@<align>}], <Rm>
// A8.6.310 VLD2 (multiple 2-element structures)
// Encoding T1 / A1 Advanced SIMD
// vld2<c>.<size> <list>, [<Rn>{@<align>}]{!} vld2<c>.<size> <list>, [<Rn>{@<align>}], <Rm>
// A8.6.313 VLD3 (multiple 3-element structures)
// Encoding T1 / A1 Advanced SIMD
// vld3<c>.<size> <list>, [<Rn>{@<align>}]{!} vld3<c>.<size> <list>, [<Rn>{@<align>}], <Rm>
// A8.6.316 VLD4 (multiple 4-element structures)
// Encoding T1 / A1 Advanced SIMD
// vld4<c>.<size> <list>, [<Rn>{@<align>}]{!} vld4<c>.<size> <list>, [<Rn>{@<align>}], <Rm>
//
// must precede thumb2_str in table
new OpcodeARM(Index.thumb2_vld__multi, "vld", "111110010x10xxxxxxxxxxxxxxxxxxxx"),
// A8.6.309 VLD1 (single element to all lanes)
// Encoding T1 / A1 Advanced SIMD
// vld1<c>.<size> <list>, [<Rn>{@<align>}]{!} vld1<c>.<size> <list>, [<Rn>{@<align>}], <Rm>
// A8.6.308 VLD1 (single element to one lane)
// Encoding T1 / A1 Advanced SIMD
// vld1<c>.<size> <list>, [<Rn>{@<align>}]{!} vld1<c>.<size> <list>, [<Rn>{@<align>}], <Rm>
// A8.6.312 VLD2 (single 2-element structure to all lanes)
// Encoding T1 / A1 Advanced SIMD
// vld2<c>.<size> <list>, [<Rn>{@<align>}]{!} vld2<c>.<size> <list>, [<Rn>{@<align>}], <Rm>
// A8.6.311 VLD2 (single 2-element structure to one lane)
// Encoding T1 / A1 Advanced SIMD
// vld2<c>.<size> <list>, [<Rn>{@<align>}]{!} vld2<c>.<size> <list>, [<Rn>{@<align>}], <Rm>
// A8.6.315 VLD3 (single 3-element structure to all lanes)
// Encoding T1 / A1 Advanced SIMD
// vld3<c>.<size> <list>, [<Rn>]{!} vld3<c>.<size> <list>, [<Rn>], <Rm>
// A8.6.314 VLD3 (single 3-element structure to one lane)
// Encoding T1 / A1 Advanced SIMD
// vld3<c>.<size> <list>, [<Rn>]{!} vld3<c>.<size> <list>, [<Rn>], <Rm>
// A8.6.318 VLD4 (single 4-element structure to all lanes)
// Encoding T1 / A1 Advanced SIMD
// vld4<c>.<size> <list>, [<Rn>{ @<align>}]{!} vld4<c>.<size> <list>, [<Rn>{ @<align>}], <Rm>
// A8.6.317 VLD4 (single 4-element structure to one lane)
// Encoding T1 / A1 Advanced SIMD
// vld4<c>.<size> <list>, [<Rn>{@<align>}]{!} vld4<c>.<size> <list>, [<Rn>{@<align>}], <Rm>
//
// must precede thumb2_str in table
new OpcodeARM(Index.thumb2_vld__xlane, "vld", "111110011x10xxxxxxxxxxxxxxxxxxxx"),
// A8.6.391 VST1 (multiple single elements)
// Encoding T1 / A1 Advanced SIMD
// vst1<c>.<size> <list>, [<Rn>{@<align>}]{!} vst1<c>.<size> <list>, [<Rn>{@<align>}], <Rm>
// A8.6.393 VST2 (multiple 2-element structures)
// Encoding T1 / A1 Advanced SIMD
// vst2<c>.<size> <list>, [<Rn>{@<align>}]{!} vst2<c>.<size> <list>, [<Rn>{@<align>}], <Rm>
// A8.6.395 VST3 (multiple 3-element structures)
// Encoding T1 / A1 Advanced SIMD
// vst3<c>.<size> <list>, [<Rn>{@<align>}]{!} vst3<c>.<size> <list>, [<Rn>{@<align>}], <Rm>
// A8.6.397 VST4 (multiple 4-element structures)
// Encoding T1 / A1 Advanced SIMD
// vst4<c>.<size> <list>, [<Rn>{@<align>}]{!} vst4<c>.<size> <list>, [<Rn>{@<align>}], <Rm>
//
// must precede thumb2_str in table
new OpcodeARM(Index.thumb2_vst__multi, "vst", "111110010x00xxxxxxxxxxxxxxxxxxxx"),
// A8.6.392 VST1 (single element from one lane)
// Encoding T1 / A1 Advanced SIMD
// vst1<c>.<size> <list>, [<Rn>{@<align>}]{!} vst1<c>.<size> <list>, [<Rn>{@<align>}], <Rm>
// A8.6.394 VST2 (single 2-element structure from one lane)
// Encoding T1 / A1 Advanced SIMD
// vst2<c>.<size> <list>, [<Rn>{@<align>}]{!} vst2<c>.<size> <list>, [<Rn>{@<align>}], <Rm>
// A8.6.396 VST3 (single 3-element structure from one lane)
// Encoding T1 / A1 Advanced SIMD
// vst3<c>.<size> <list>, [<Rn>]{!} vst3<c>.<size> <list>, [<Rn>], <Rm>
// A8.6.398 VST4 (single 4-element structure from one lane)
// Encoding T1 / A1 Advanced SIMD
// vst4<c>.<size> <list>, [<Rn>{@<align>}]{!} vst4<c>.<size> <list>, [<Rn>{@<align>}], <Rm>
//
// must precede thumb2_str in table
new OpcodeARM(Index.thumb2_vst__xlane, "vst", "111110011x00xxxxxxxxxxxxxxxxxxxx"),
// A8.6.193 STR (immediate, Thumb)
// Encoding T3 ARMv6T2, ARMv7
// str<c>.w <Rt>,[<Rn>,#<imm12>]
// A8.6.193 STR (immediate, Thumb)
// Encoding T4 ARMv6T2, ARMv7
// str<c> <Rt>,[<Rn>,#-<imm8>] str<c> <Rt>,[<Rn>],#+/-<imm8> str<c> <Rt>,[<Rn>,#+/-<imm8>]!
// A8.6.195 STR (register)
// Encoding T2 ARMv6T2, ARMv7
// str<c>.w <Rt>,[<Rn>,<Rm>{,lsl #<imm2>}]
// A8.6.196 STRB (immediate, Thumb)
// Encoding T2 ARMv6T2, ARMv7
// strb<c>.w <Rt>,[<Rn>,#<imm12>]
// A8.6.196 STRB (immediate, Thumb)
// Encoding T3 ARMv6T2, ARMv7
// strb<c> <Rt>,[<Rn>,#-<imm8>] strb<c> <Rt>,[<Rn>],#+/-<imm8> strb<c> <Rt>,[<Rn>,#+/-<imm8>]!
// A8.6.198 STRB (register)
// Encoding T2 ARMv6T2, ARMv7
// strb<c>.w <Rt>,[<Rn>,<Rm>{,lsl #<imm2>}]
// A8.6.199 STRBT
// Encoding T1 ARMv6T2, ARMv7
// strbt<c> <Rt>,[<Rn>,#<imm8>]
// A8.6.206 STRH (immediate, Thumb)
// Encoding T2 ARMv6T2, ARMv7
// strh<c>.w <Rt>,[<Rn>{,#<imm12>}]
// A8.6.206 STRH (immediate, Thumb)
// Encoding T3 ARMv6T2, ARMv7
// strh<c> <Rt>,[<Rn>,#-<imm8>] strh<c> <Rt>,[<Rn>],#+/-<imm8> strh<c> <Rt>,[<Rn>,#+/-<imm8>]!
// A8.6.208 STRH (register)
// Encoding T2 ARMv6T2, ARMv7
// strh<c>.w <Rt>,[<Rn>,<Rm>{,lsl #<imm2>}]
// A8.6.209 STRHT
// Encoding T1 ARMv6T2, ARMv7
// strht<c> <Rt>,[<Rn>,#<imm8>]
// A8.6.210 STRT
// Encoding T1 ARMv6T2, ARMv7
// strt<c> <Rt>,[<Rn>,#<imm8>]
//
// must follow thumb2_push__reg in table
// must follow thumb2_vld__multi in table
// must follow thumb2_vld__xlane in table
// must follow thumb2_vst__multi in table
// must follow thumb2_vst__xlane in table
new OpcodeARM(Index.thumb2_str, "str", "1111100xxxx0xxxxxxxxxxxxxxxxxxxx"),
// A8.6.202 STREX
// Encoding T1 ARMv6T2, ARMv7
// strex<c> <Rd>,<Rt>,[<Rn>{,#<imm>}]
// must precede thumb2_strd in table
new OpcodeARM(Index.thumb2_strex, "strex", "111010000100xxxxxxxxxxxxxxxxxxxx"),
// A8.6.203 STREXB
// Encoding T1 ARMv7
// strexb<c> <Rd>,<Rt>,[<Rn>]
// Unpredictable if (1) is 0: 111010001100xxxxxxxx(1)(1)(1)(1)0100xxxx
// must precede thumb2_strd in table
// A8.6.204 STREXD
// Encoding T1 ARMv7
// strexd<c> <Rd>,<Rt>,<Rt2>,[<Rn>]
// A8.6.205 STREXH
// Encoding T1 ARMv7
// strexh<c> <Rd>,<Rt>,[<Rn>]
// Unpredictable if (1) is 0: 111010001100xxxxxxxx(1)(1)(1)(1)0101xxxx
//
// must precede thumb2_strd in table
new OpcodeARM(Index.thumb2_strexx, "strex", "111010001100xxxxxxxxxxxx01xxxxxx"),
// A8.6.200 STRD (immediate)
// Encoding T1 ARMv6T2, ARMv7
// strd<c> <Rt>,<Rt2>,[<Rn>{,#+/-<imm>}] strd<c> <Rt>,<Rt2>,[<Rn>],#+/-<imm>
// strd<c> <Rt>,<Rt2>,[<Rn>,#+/-<imm>]!
// must follow thumb2_strex in table
// must follow thumb2_strexx in table
new OpcodeARM(Index.thumb2_strd, "strd", "1110100xx1x0xxxxxxxxxxxxxxxxxxxx"),
// A8.6.211 SUB (immediate, Thumb)
// Encoding T4 ARMv6T2, ARMv7
// subw<c> <Rd>,<Rn>,#<imm12>
// A8.6.215 SUB (SP minus immediate)
// Encoding T3 ARMv6T2, ARMv7
// subw <Rd>,sp,#<imm12>
//
// must follow thumb2_adr__sub in table
// must follow thumb2_cmp__imm in table
new OpcodeARM(Index.thumb2_subw, "subw", "11110x101010xxxx0xxxxxxxxxxxxxxx"),
// A8.6.211 SUB (immediate, Thumb)
// Encoding T3 ARMv6T2, ARMv7
// sub{s}<c>.w <Rd>,<Rn>,#<const>
// A8.6.215 SUB (SP minus immediate)
// Encoding T2 ARMv6T2, ARMv7
// sub{s}.w <Rd>,sp,#<const>
//
// must follow thumb2_cmp__imm in table
new OpcodeARM(Index.thumb2_sub__imm, "sub", "11110x01101xxxxx0xxxxxxxxxxxxxxx"),
// A8.6.213 SUB (register)
// Encoding T2 ARMv6T2, ARMv7
// sub{s}<c>.w <Rd>,<Rn>,<Rm>{,<shift>}
// Unpredictable if (0) is 1: 11101011101xxxxx(0)xxxxxxxxxxxxxxx
// A8.6.216 SUB (SP minus register)
// Encoding T1 ARMv6T2, ARMv7
// sub{s} <Rd>,sp,<Rm>{,<shift>}
// Unpredictable if (0) is 1: 11101011101x1101(0)xxxxxxxxxxxxxxx
//
// must follow thumb2_cmp__reg in table
new OpcodeARM(Index.thumb2_sub__reg, "sub", "11101011101xxxxxxxxxxxxxxxxxxxxx"),
// A8.6.223 SXTB
// Encoding T2 ARMv6T2, ARMv7
// sxtb<c>.w <Rd>,<Rm>{,<rotation>}
// Unpredictable if (0) is 1: 11111010010011111111xxxx1(0)xxxxxx
// must precede thumb2_sxtab in table
new OpcodeARM(Index.thumb2_sxtb, "sxtb.w", "11111010010011111111xxxx1xxxxxxx"),
// A8.6.220 SXTAB
// Encoding T1 ARMv6T2, ARMv7
// sxtab<c> <Rd>,<Rn>,<Rm>{,<rotation>}
// Unpredictable if (0) is 1: 111110100100xxxx1111xxxx1(0)xxxxxx
// must follow thumb2_sxtb in table
new OpcodeARM(Index.thumb2_sxtab, "sxtab", "111110100100xxxx1111xxxx1xxxxxxx"),
// A8.6.224 SXTB16
// Encoding T1 ARMv6T2, ARMv7
// sxtb16<c> <Rd>,<Rm>{,<rotation>}
// Unpredictable if (0) is 1: 11111010001011111111xxxx1(0)xxxxxx
// must precede thumb2_sxtab16 in table
new OpcodeARM(Index.thumb2_sxtb16, "sxtb16", "11111010001011111111xxxx1xxxxxxx"),
// A8.6.221 SXTAB16
// Encoding T1 ARMv6T2, ARMv7
// sxtab16<c> <Rd>,<Rn>,<Rm>{,<rotation>}
// Unpredictable if (0) is 1: 111110100010xxxx1111xxxx1(0)xxxxxx
// must follow thumb2_sxtb16 in table
new OpcodeARM(Index.thumb2_sxtab16, "sxtab16", "111110100010xxxx1111xxxx1xxxxxxx"),
// A8.6.225 SXTH
// Encoding T2 ARMv6T2, ARMv7
// sxth<c>.w <Rd>,<Rm>{,<rotation>}
// Unpredictable if (0) is 1: 11111010000011111111xxxx1(0)xxxxxx
// must precede thumb2_sxtah in table
new OpcodeARM(Index.thumb2_sxth, "sxth.w", "11111010000011111111xxxx1xxxxxxx"),
// A8.6.222 SXTAH
// Encoding T1 ARMv6T2, ARMv7
// sxtah<c> <Rd>,<Rn>,<Rm>{,<rotation>}
// Unpredictable if (0) is 1: 111110100000xxxx1111xxxx1(0)xxxxxx
// must follow thumb2_sxth in table
new OpcodeARM(Index.thumb2_sxtah, "sxtah", "111110100000xxxx1111xxxx1xxxxxxx"),
// A8.6.226 TBB, TBH
// Encoding T1 ARMv6T2, ARMv7
// tbb<c> [<Rn>,<Rm>] Outside or last in IT block tbh<c> [<Rn>,<Rm>,LSL #1] Outside or last in IT block
// Unpredictable if (1) is 0 or (0) is 1: 111010001101xxxx(1)(1)(1)(1)(0)(0)(0)(0)000xxxxx
new OpcodeARM(Index.thumb2_tb, "tb", "111010001101xxxxxxxxxxxx000xxxxx"),
// A8.6.237 UDIV
// Encoding T1 ARMv7-R
// udiv<c> <Rd>,<Rn>,<Rm>
// Unpredictable if (1) is 0: 111110111011xxxx(1)(1)(1)(1)xxxx1111xxxx
new OpcodeARM(Index.thumb2_udiv, "udiv", "111110111011xxxxxxxxxxxx1111xxxx"),
// A8.6.244 UMAAL
// Encoding T1 ARMv6T2, ARMv7
// umaal<c> <RdLo>,<RdHi>,<Rn>,<Rm>
new OpcodeARM(Index.thumb2_umaal, "umaal", "111110111110xxxxxxxxxxxx0110xxxx"),
// A8.6.245 UMLAL
// Encoding T1 ARMv6T2, ARMv7
// umlal<c> <RdLo>,<RdHi>,<Rn>,<Rm>
new OpcodeARM(Index.thumb2_umlal, "umlal", "111110111110xxxxxxxxxxxx0000xxxx"),
// A8.6.246 UMULL
// Encoding T1 ARMv6T2, ARMv7
// umull<c> <RdLo>,<RdHi>,<Rn>,<Rm>
new OpcodeARM(Index.thumb2_umull, "umull", "111110111010xxxxxxxxxxxx0000xxxx"),
// A8.6.253 USAD8
// Encoding T1 ARMv6T2, ARMv7
// usad8<c> <Rd>,<Rn>,<Rm>
new OpcodeARM(Index.thumb2_usad8, "usad8", "111110110111xxxx1111xxxx0000xxxx"),
// A8.6.254 USADA8
// Encoding T1 ARMv6T2, ARMv7
// usada8<c> <Rd>,<Rn>,<Rm>,<Ra>
new OpcodeARM(Index.thumb2_usada8, "usada8", "111110110111xxxxxxxxxxxx0000xxxx"),
// A8.6.256 USAT16
// Encoding T1 ARMv6T2, ARMv7
// usat16<c> <Rd>,#<imm4>,<Rn>
// Unpredictable if (0) is 1: 11110(0)111010xxxx0000xxxx00(0)(0)xxxx
// must precede thumb2_usat in table
new OpcodeARM(Index.thumb2_usat16, "usat16", "11110x111010xxxx0000xxxx00xxxxxx"),
// A8.6.255 USAT
// Encoding T1 ARMv6T2, ARMv7
// usat<c> <Rd>,#<imm5>,<Rn>{,<shift>}
// Unpredictable if (0) is 1: 11110(0)1110x0xxxx0xxxxxxxxx(0)xxxxx
// must follow thumb2_usat16 in table
new OpcodeARM(Index.thumb2_usat, "usat", "11110x1110x0xxxx0xxxxxxxxxxxxxxx"),
// A8.6.263 UXTB
// Encoding T2 ARMv6T2, ARMv7
// uxtb<c>.w <Rd>,<Rm>{,<rotation>}
// Unpredictable if (0) is 1: 11111010010111111111xxxx1(0)xxxxxx
// must precede thumb2_uxtab in table
new OpcodeARM(Index.thumb2_uxtb, "uxtb.w", "11111010010111111111xxxx1xxxxxxx"),
// A8.6.260 UXTAB
// Encoding T1 ARMv6T2, ARMv7
// uxtab<c> <Rd>,<Rn>,<Rm>{,<rotation>}
// Unpredictable if (0) is 1: 111110100101xxxx1111xxxx1(0)xxxxxx
// must follow thumb2_uxtb in table
new OpcodeARM(Index.thumb2_uxtab, "uxtab", "111110100101xxxx1111xxxx1xxxxxxx"),
// A8.6.264 UXTB16
// Encoding T1 ARMv6T2, ARMv7
// uxtb16<c> <Rd>,<Rm>{,<rotation>}
// Unpredictable if (0) is 1: 11111010001111111111xxxx1(0)xxxxxx
// must precede thumb2_uxtab16 in table
new OpcodeARM(Index.thumb2_uxtb16, "uxtb16", "11111010001111111111xxxx1xxxxxxx"),
// A8.6.261 UXTAB16
// Encoding T1 ARMv6T2, ARMv7
// uxtab16<c> <Rd>,<Rn>,<Rm>{,<rotation>}
// Unpredictable if (0) is 1: 111110100011xxxx1111xxxx1(0)xxxxxx
// must follow thumb2_uxtb16 in table
new OpcodeARM(Index.thumb2_uxtab16, "uxtab16", "111110100011xxxx1111xxxx1xxxxxxx"),
// A8.6.265 UXTH
// Encoding T2 ARMv6T2, ARMv7
// uxth<c>.w <Rd>,<Rm>{,<rotation>}
// Unpredictable if (0) is 1: 11111010000111111111xxxx1(0)xxxxxx
// must precede thumb2_uxtabh in table
new OpcodeARM(Index.thumb2_uxth, "uxth.w", "11111010000111111111xxxx1xxxxxxx"),
// A8.6.262 UXTAH
// Encoding T1 ARMv6T2, ARMv7
// uxtah<c> <Rd>,<Rn>,<Rm>{,<rotation>}
// Unpredictable if (0) is 1: 111110100001xxxx1111xxxx1(0)xxxxxx
// must follow thumb2_uxth in table
new OpcodeARM(Index.thumb2_uxtah, "uxtah", "111110100001xxxx1111xxxx1xxxxxxx"),
// VFP and Advanced SIMD instructions
// A8.6.266 VABA, VABAL
// Encoding T1 / A1 Advanced SIMD
// vaba<c>.<dt> <Qd>, <Qn>, <Qm> vaba<c>.<dt> <Dd>, <Dn>, <Dm>
new OpcodeARM(Index.thumb2_vaba, "vaba", "111x11110xxxxxxxxxxx0111xxx1xxxx"),
// A8.6.267 VABD, VABDL (integer)
// Encoding T1 / A1 Advanced SIMD
// vabd<c>.<dt> <Qd>, <Qn>, <Qm> vabd<c>.<dt> <Dd>, <Dn>, <Dm>
new OpcodeARM(Index.thumb2_vabd__int, "vabd", "111x11110xxxxxxxxxxx0111xxx0xxxx"),
// A8.6.268 VABD (floating-point)
// Encoding T1 / A1 Advanced SIMD (UNDEFINED in integer-only variant)
// vabd<c>.f32 <Qd>, <Qn>, <Qm> vabd<c>.f32 <Dd>, <Dn>, <Dm>
new OpcodeARM(Index.thumb2_vabd__f32, "vabd", "111111110x1xxxxxxxxx1101xxx0xxxx"),
// A8.6.269 VABS
// Encoding T1 / A1 Advanced SIMD (F = 1 UNDEFINED in integer-only variant)
// vabs<c>.<dt> <Qd>, <Qm> vabs<c>.<dt> <Dd>, <Dm>
// must precede thumb2_vabdl in table
new OpcodeARM(Index.thumb2_vabs, "vabs", "111111111x11xx01xxxx0x110xx0xxxx"),
// A8.6.269 VABS
// Encoding T2 / A2 VFPv2, VFPv3 (sz = 1 UNDEFINED in single-precision only variants)
// vabs<c>.f64 <Dd>, <Dm> vabs<c>.f32 <Sd>, <Sm>
new OpcodeARM(Index.thumb2_vabs__f, "vabs", "111011101x110000xxxx101x11x0xxxx"),
// A8.6.270 VACGE, VACGT, VACLE, VACLT
// Encoding T1 / A1 Advanced SIMD (UNDEFINED in integer-only variant)
// vacge<c>.f32 <Qd>, <Qn>, <Qm> vacge<c>.f32 <Dd>, <Dn>, <Dm>
// vacgt<c>.f32 <Qd>, <Qn>, <Qm> vacgt<c>.f32 <Dd>, <Dn>, <Dm>
new OpcodeARM(Index.thumb2_vacge_vacgt, "vac", "111111110xxxxxxxxxxx1110xxx1xxxx"),
// A8.6.271 VADD (integer)
// Encoding T1 / A1 Advanced SIMD
// vadd<c>.<dt> <Qd>, <Qn>, <Qm> vadd<c>.<dt> <Dd>, <Dn>, <Dm>
new OpcodeARM(Index.thumb2_vadd__int, "vadd", "111011110xxxxxxxxxxx1000xxx0xxxx"),
// A8.6.272 VADD (floating-point)
// Encoding T1 / A1 Advanced SIMD (UNDEFINED in integer-only variants)
// vadd<c>.f32 <Qd>, <Qn>, <Qm> vadd<c>.f32 <Dd>, <Dn>, <Dm>
new OpcodeARM(Index.thumb2_vadd__f32, "vadd", "111011110x0xxxxxxxxx1101xxx0xxxx"),
// A8.6.272 VADD (floating-point)
// Encoding T2 / A2 VFPv2, VFPv3 (sz = 1 UNDEFINED in single-precision only variants)
// vadd<c>.f64 <Dd>, <Dn>, <Dm> vadd<c>.f32 <Sd>, <Sn>, <Sm>
new OpcodeARM(Index.thumb2_vadd__fp_f, "vadd", "111011100x11xxxxxxxx101xx0x0xxxx"),
// A8.6.273 VADDHN
// Encoding T1 / A1 Advanced SIMD
// vaddhn<c>.<dt> <Dd>, <Qn>, <Qm>
new OpcodeARM(Index.thumb2_vaddhn, "vaddhn", "111011111xxxxxxxxxxx0100x0x0xxxx"),
// A8.6.276 VAND (register)
// Encoding T1 / A1 Advanced SIMD
// vand<c> <Qd>, <Qn>, <Qm> vand<c> <Dd>, <Dn>, <Dm>
new OpcodeARM(Index.thumb2_vand, "vand", "111011110x00xxxxxxxx0001xxx1xxxx"),
// A8.6.278 VBIC (register)
// Encoding T1 / A1 Advanced SIMD
// vbic<c> <Qd>, <Qn>, <Qm> vbic<c> <Dd>, <Dn>, <Dm>
new OpcodeARM(Index.thumb2_vbic__reg, "vbic", "111011110x01xxxxxxxx0001xxx1xxxx"),
// A8.6.304 VEOR - MUST PRECEDE VBIF/VBIT/VBSL
// Encoding T1 / A1 Advanced SIMD
// veor<c> <Qd>, <Qn>, <Qm> veor<c> <Dd>, <Dn>, <Dm>
// A8.6.279 VBIF, VBIT, VBSL
// Encoding T1 / A1 Advanced SIMD
// vbif<c> <Qd>, <Qn>, <Qm> vbif<c> <Dd>, <Dn>, <Dm> vbit<c> <Qd>, <Qn>, <Qm
// vbit<c> <Dd>, <Dn>, <Dm> vbsl<c> <Qd>, <Qn>, <Qm> vbsl<c> <Dd>, <Dn>, <Dm>
//
new OpcodeARM(Index.thumb2_vbif_vbit_vbsl_veor, "v", "111111110xxxxxxxxxxx0001xxx1xxxx"),
// A8.6.280 VCEQ (register)
// Encoding T1 / A1 Advanced SIMD
// vceq<c>.<dt> <Qd>, <Qn>, <Qm> vceq<c>.<dt> <Dd>, <Dn>, <Dm>
new OpcodeARM(Index.thumb2_vceq__reg_int, "vceq", "111111110xxxxxxxxxxx1000xxx1xxxx"),
// A8.6.280 VCEQ (register)
// Encoding T2 / A2 Advanced SIMD (UNDEFINED in integer-only variant)
// vceq<c>.f32 <Qd>, <Qn>, <Qm> vceq<c>.f32 <Dd>, <Dn>, <Dm>
new OpcodeARM(Index.thumb2_vceq__reg_f32, "vceq", "111011110x0xxxxxxxxx1110xxx0xxxx"),
// A8.6.281 VCEQ (immediate #0)
// Encoding T1 / A1 Advanced SIMD (F = 1 UNDEFINED in integer-only variants)
// vceq<c>.<dt> <Qd>, <Qm>, #0 vceq<c>.<dt> <Dd>, <Dm>, #0
// must precede thumb2_vaddl_vaddw in table
// must precede thumb2_vabal in table
new OpcodeARM(Index.thumb2_vceq__imm0, "vceq", "111111111x11xx01xxxx0x010xx0xxxx"),
// A8.6.282 VCGE (register)
// Encoding T1 / A1 Advanced SIMD
// vcge<c>.<dt> <Qd>, <Qn>, <Qm> vcge<c>.<dt> <Dd>, <Dn>, <Dm>
new OpcodeARM(Index.thumb2_vcge__reg_int, "vcge", "111x11110xxxxxxxxxxx0011xxx1xxxx"),
// A8.6.282 VCGE (register)
// Encoding T2 / A2 Advanced SIMD (UNDEFINED in integer-only variant)
// vcge<c>.f32 <Qd>, <Qn>, <Qm> vcge<c>.f32 <Dd>, <Dn>, <Dm>
new OpcodeARM(Index.thumb2_vcge__reg_f32, "vcge", "111111110x0xxxxxxxxx1110xxx0xxxx"),
// A8.6.284 VCGT (register)
// Encoding T1 / A1 Advanced SIMD
// vcgt<c>.<dt> <Qd>, <Qn>, <Qm> vcgt<c>.<dt> <Dd>, <Dn>, <Dm>
new OpcodeARM(Index.thumb2_vcgt__reg_int, "vcgt", "111x11110xxxxxxxxxxx0011xxx0xxxx"),
// A8.6.284 VCGT (register)
// Encoding T2 / A2 Advanced SIMD (UNDEFINED in integer-only variant)
// vcgt<c>.f32 <Qd>, <Qn>, <Qm> vcgt<c>.f32 <Dd>, <Dn>, <Dm>
new OpcodeARM(Index.thumb2_vcgt__reg_f32, "vcgt", "111111110x1xxxxxxxxx1110xxx0xxxx"),
// A8.6.283 VCGE (immediate #0)
// Encoding T1 / A1 Advanced SIMD (F = 1 UNDEFINED in integer-only variants)
// vcge<c>.<dt> <Qd>, <Qm>, #0 vcge<c>.<dt> <Dd>, <Dm>, #0
// must precede thumb2_vaddl_vaddw in table
new OpcodeARM(Index.thumb2_vcge__imm0, "vcge", "111111111x11xx01xxxx0x001xx0xxxx"),
// A8.6.285 VCGT (immediate #0)
// Encoding T1 / A1 Advanced SIMD (F = 1 UNDEFINED in integer-only variants)
// vcgt<c>.<dt> <Qd>, <Qm>, #0 vcgt<c>.<dt> <Dd>, <Dm>, #0
// must precede thumb2_vaddl_vaddw in table
new OpcodeARM(Index.thumb2_vcgt__imm0, "vcgt", "111111111x11xx01xxxx0x000xx0xxxx"),
// A8.6.287 VCLE (immediate #0)
// Encoding T1 / A1 Advanced SIMD (F = 1 UNDEFINED in integer-only variants)
// vcle<c>.<dt> <Qd>, <Qm>, #0 vcle<c>.<dt> <Dd>, <Dm>, #0
// must precede thumb2_vaddl_vaddw in table
new OpcodeARM(Index.thumb2_vcle, "vcle", "111111111x11xx01xxxx0x011xx0xxxx"),
// A8.6.288 VCLS
// Encoding T1 / A1 Advanced SIMD
// vcls<c>.<dt> <Qd>, <Qm> vcls<c>.<dt> <Dd>, <Dm>
new OpcodeARM(Index.thumb2_vcls, "vcls", "111111111x11xx00xxxx01000xx0xxxx"),
// A8.6.290 VCLT (immediate #0)
// Encoding T1 / A1 Advanced SIMD (F = 1 UNDEFINED in integer-only variants)
// vclt<c>.<dt> <Qd>, <Qm>, #0 vclt<c>.<dt> <Dd>, <Dm>, #0
new OpcodeARM(Index.thumb2_vclt, "vclt", "111111111x11xx01xxxx0x100xx0xxxx"),
// A8.6.291 VCLZ
// Encoding T1 / A1 Advanced SIMD
// vclz<c>.<dt> <Qd>, <Qm> vclz<c>.<dt> <Dd>, <Dm>
new OpcodeARM(Index.thumb2_vclz, "vclz", "111111111x11xx00xxxx01001xx0xxxx"),
// A8.6.292 VCMP, VCMPE
// Encoding T1 / A1 VFPv2, VFPv3 (sz = 1 UNDEFINED in single-precision only variants)
// vcmp{e}<c>.f64 <Dd>, <Dm> vcmp{e}<c>.f32 <Sd>, <Sm>
new OpcodeARM(Index.thumb2_vcmp__reg, "vcmp", "111011101x110100xxxx101xx1x0xxxx"),
// A8.6.292 VCMP, VCMPE
// Encoding T2 / A2 VFPv2, VFPv3 (sz = 1 UNDEFINED in single-precision only variants)
// vcmp{e}<c>.f64 <Dd>, #0.0 vcmp{e}<c>.f32 <Sd>, #0.0
// Unpredictable if (0) is 1: 111011101x110101xxxx101xx1(0)0(0)(0)(0)(0)
new OpcodeARM(Index.thumb2_vcmp__to_0, "vcmp", "111011101x110101xxxx101xx1x0xxxx"),
// A8.6.293 VCNT
// Encoding T1 / A1 Advanced SIMD
// vcnt<c>.8 <Qd>, <Qm> vcnt<c>.8 <Dd>, <Dm>
new OpcodeARM(Index.thumb2_vcnt, "vcnt", "111111111x11xx00xxxx01010xx0xxxx"),
// A8.6.294 VCVT (between floating-point and integer, Advanced SIMD)
// Encoding T1 / A1 Advanced SIMD (UNDEFINED in integer-only variant)
// vcvt<c>.<Td>.<Tm> <Qd>, <Qm> vcvt<c>.<Td>.<Tm> <Dd>, <Dm>
new OpcodeARM(Index.thumb2_vcvt__fp_i_vec, "vcvt", "111111111x11xx11xxxx011xxxx0xxxx"),
// A8.6.297 VCVT (between floating-point and fixed-point, VFP)
// Encoding T1 / A1 VFPv3 (sf = 1 UNDEFINED in single-precision only variants)
// vcvt<c>.<Td>.f64 <Dd>, <Dd>, #<fbits> vcvt<c>.<Td>.f32 <Sd>, <Sd>, #<fbits>
// vcvt<c>.f64.<Td> <Dd>, <Dd>, #<fbits> vcvt<c>.f32.<Td> <Sd>, <Sd>, #<fbits>
// must precede thumb2_vcvt__fp_i_reg in table
new OpcodeARM(Index.thumb2_vcvt__fp_fix_reg, "vcvt", "111011101x111x1xxxxx101xx1x0xxxx"),
// A8.6.295 VCVT, VCVTR (between floating-point and integer, VFP)
// Encoding T1 / A1 VFPv2, VFPv3 (sz = 1 UNDEFINED in single-precision only variants)
// vcvt{r}<c>.s32.f64 <Sd>, <Dm> vcvt{r}<c>.s32.f32 <Sd>, <Sm> vcvt{r}<c>.u32.f64 <Sd>, <Dm>
// vcvt{r}<c>.u32.f32 <Sd>, <Sm> vcvt<c>.f64.<Tm> <Dd>, <Sm> vcvt<c>.f32.<Tm> <Sd>, <Sm>
// must follow thumb2_vcvt__fp_fix_reg in table
new OpcodeARM(Index.thumb2_vcvt__fp_i_reg, "vcvt", "111011101x111xxxxxxx101xx1x0xxxx"),
// A8.6.277 VBIC (immediate)
// Encoding T1 / A1 Advanced SIMD
// vbic<c>.<dt> <Qd>, #<imm> vbic<c>.<dt> <Dd>, #<imm>
// A8.6.346 VORR (immediate)
// Encoding T1 / A1 Advanced SIMD
// vorr<c>.<dt> <Qd>, #<imm> vorr<c>.<dt> <Dd>, #<imm>
// A8.6.340 VMVN (immediate)
// Encoding T1 / A1 Advanced SIMD
// vmvn<c>.<dt> <Qd>, #<imm> vmvn<c>.<dt> <Dd>, #<imm>
// A8.6.326 VMOV (immediate)
// Encoding T1 / A1 Advanced SIMD
// vmov<c>.<dt> <Qd>, #<imm> vmov<c>.<dt> <Dd>, #<imm>
//
// must precede thumb2_vcvt__fp_fix_vec in table
new OpcodeARM(Index.thumb2_vmov_vbitwise, "_", "111x11111x000xxxxxxxxxxx0xx1xxxx"),
// A8.6.296 VCVT (between floating-point and fixed-point, Advanced SIMD)
// Encoding T1 / A1 Advanced SIMD (UNDEFINED in integer-only variant)
// vcvt<c>.<Td>.<Tm> <Qd>, <Qm>, #<fbits> vcvt<c>.<Td>.<Tm> <Dd>, <Dm>, #<fbits>
// must follow thumb2_vmov_vbitwise in table
new OpcodeARM(Index.thumb2_vcvt__fp_fix_vec, "vcvt", "111x11111xxxxxxxxxxx111x0xx1xxxx"),
// A8.6.298 VCVT (between double-precision and single-precision)
// Encoding T1 / A1 VFPv2, VFPv3 (UNDEFINED in single-precision only variants)
// vcvt<c>.f64.f32 <Dd>, <Sm> vcvt<c>.f32.f64 <Sd>, <Dm>
new OpcodeARM(Index.thumb2_vcvt__dp_sp, "vcvt", "111011101x110111xxxx101x11x0xxxx"),
// A8.6.299 VCVT (between half-precision and single-precision, Advanced SIMD)
// Encoding T1 / A1 Advanced SIMD with half-precision extensions (UNDEFINED in integer-only variant)
// vcvt<c>.f32.f16 <Qd>, <Dm> vcvt<c>.f16.f32 <Dd>, <Qm>
new OpcodeARM(Index.thumb2_vcvt__hp_sp_vec, "vcvt", "111111111x11xx10xxxx011x00x0xxxx"),
// A8.6.300 VCVTB, VCVTT (between half-precision and single-precision, VFP)
// Encoding T1 / A1 VFPv3 half-precision extensions
// vcvt<y><c>.f32.f16 <Sd>, <Sm> vcvt<y><c>.f16.f32 <Sd>, <Sm>
new OpcodeARM(Index.thumb2_vcvt__hp_sp_reg, "vcvt", "111011101x11001xxxxx1010x1x0xxxx"),
// A8.6.301 VDIV
// Encoding T1 / A1 VFPv2, VFPv3 (sz = 1 UNDEFINED in single-precision only variants)
// vdiv<c>.f64 <Dd>, <Dn>, <Dm> vdiv<c>.f32 <Sd>, <Sn>, <Sm>
new OpcodeARM(Index.thumb2_vdiv, "vdiv", "111011101x00xxxxxxxx101xx0x0xxxx"),
// A8.6.302 VDUP (scalar)
// Encoding T1 / A1 Advanced SIMD
// vdup<c>.<size> <Qd>, <Dm[x]> vdup<c>.<size> <Dd>, <Dm[x]>
new OpcodeARM(Index.thumb2_vdup__scalar, "vdup", "111111111x11xxxxxxxx11000xx0xxxx"),
// A8.6.303 VDUP (ARM core register)
// Encoding T1 / A1 Advanced SIMD
// vdup<c>.<size> <Qd>, <Rt> vdup<c>.<size> <Dd>, <Rt>
// Unpredictable if (0) is 1: 111011101xx0xxxxxxxx1011x0x1(0)(0)(0)(0)
new OpcodeARM(Index.thumb2_vdup__reg, "vdup", "111011101xx0xxxxxxxx1011x0x1xxxx"),
// A8.6.305 VEXT
// Encoding T1 / A1 Advanced SIMD
// vext<c>.8 <Qd>, <Qn>, <Qm>, #<imm> vext<c>.8 <Dd>, <Dn>, <Dm>, #<imm>
new OpcodeARM(Index.thumb2_vext, "vext.8", "111011111x11xxxxxxxxxxxxxxx0xxxx"),
// A8.6.306 VHADD, VHSUB
// Encoding T1 / A1 Advanced SIMD
// vh<op><c> <Qd>, <Qn>, <Qm> vh<op><c> <Dd>, <Dn>, <Dm>
new OpcodeARM(Index.thumb2_vhadd_vhsub, "vh", "111x11110xxxxxxxxxxx00x0xxx0xxxx"),
// A8.6.320 VLDR
// Encoding T1 / A1 VFPv2, VFPv3, Advanced SIMD
// vldr<c> <Dd>, [<Rn>{, #+/-<imm>}] vldr<c> <Dd>, <label> vldr<c> <Dd>, [pc,#-0] Special case
// must precede thumb2_vldm__64 in table
new OpcodeARM(Index.thumb2_vldr__64, "vldr", "11101101xx01xxxxxxxx1011xxxxxxxx"),
// A8.6.354 VPOP
// Encoding T1 / A1 VFPv2, VFPv3, Advanced SIMD
// vpop <list> <list> is consecutive 64-bit registers
// A8.6.354 VPOP
// Encoding T2 / A2 VFPv2, VFPv3
// vpop <list> <list> is consecutive 32-bit registers
// must precede thumb2_vldm__32 in table
// must precede thumb2_vldm__64 in table
new OpcodeARM(Index.thumb2_vpop, "vpop", "111011001x111101xxxx101xxxxxxxxx"),
// A8.6.332 VMOV (between two ARM core registers and a doubleword extension register)
// Encoding T1 / A1 VFPv2, VFPv3, Advanced SIMD
// vmov<c> <Dm>, <Rt>, <Rt2> vmov<c> <Rt>, <Rt2>, <Dm>
// must precede thumb2_vldm_32 in table
// must precede thumb2_vldm_64 in table
new OpcodeARM(Index.thumb2_vmov_9, "vmov", "11101100010xxxxxxxxx101100x1xxxx"),
// A8.6.319 VLDM
// Encoding T1 / A1 VFPv2, VFPv3, Advanced SIMD
// vldm{mode}<c> <Rn>{!}, <list> <list> is consecutive 64-bit registers
// must follow thumb2_vldr_1 in table
// must follow thumb2_vpop in table
// must follow thumb2_vmov_9 in table
new OpcodeARM(Index.thumb2_vldm__64, "vldm", "1110110xxxx1xxxxxxxx1011xxxxxxxx"),
// A8.6.320 VLDR
// Encoding T2 / A2 VFPv2, VFPv3
// vldr<c> <Sd>, [<Rn>{, #+/-<imm>}] vldr<c> <Sd>, <label> vldr<c> <Sd>, [pc,#-0] Special case
// must precede thumb2_vldm__32 in table
new OpcodeARM(Index.thumb2_vldr__32, "vldr", "11101101xx01xxxxxxxx1010xxxxxxxx"),
// A8.6.331 VMOV (between two ARM core registers and two single-precision registers)
// Encoding T1 / A1 VFPv2, VFPv3
// vmov<c> <Sm>, <Sm1>, <Rt>, <Rt2> vmov<c> <Rt>, <Rt2>, <Sm>, <Sm1>
// must precede thumb2_vldm__32 in table
new OpcodeARM(Index.thumb2_vmov_8, "vmov", "11101100010xxxxxxxxx101000x1xxxx"),
// A8.6.319 VLDM
// Encoding T2 / A2 VFPv2, VFPv3
// vldm{mode}<c> <Rn>{!}, <list> <list> is consecutive 32-bit registers
// must follow thumb2_vldr__32 in table
// must follow thumb2_vpop in table
// must follow thumb2_vmov_8 in table
new OpcodeARM(Index.thumb2_vldm__32, "vldm", "1110110xxxx1xxxxxxxx1010xxxxxxxx"),
// A8.6.321 VMAX, VMIN (integer)
// Encoding T1 / A1 Advanced SIMD
// vmax<c>.<dt> <Qd>, <Qn>, <Qm> vmax<c>.<dt> <Dd>, <Dn>, <Dm>
// vmin<c>.<dt> <Qd>, <Qn>, <Qm> vmin<c>.<dt> <Dd>, <Dn>, <Dm>
new OpcodeARM(Index.thumb2_vmax_vmin__int, "v", "111x11110xxxxxxxxxxx0110xxxxxxxx"),
// A8.6.322 VMAX, VMIN (floating-point)
// Encoding T1 / A1 Advanced SIMD (UNDEFINED in integer-only variant)
// vmax<c>.f32 <Qd>, <Qn>, <Qm> vmax<c>.f32 <Dd>, <Dn>, <Dm>
// vmin<c>.f32 <Qd>, <Qn>, <Qm> vmin<c>.f32 <Dd>, <Dn>, <Dm>
new OpcodeARM(Index.thumb2_vmax_vmin__fp, "v", "111011110xxxxxxxxxxx1111xxx0xxxx"),
// A8.6.323 VMLA, VMLAL, VMLS, VMLSL (integer)
// Encoding T1 / A1 Advanced SIMD
// v<op><c>.<dt> <Qd>, <Qn>, <Qm> v<op><c>.<dt> <Dd>, <Dn>, <Dm>
new OpcodeARM(Index.thumb2_vml__int, "vml", "111x11110xxxxxxxxxxx1001xxx0xxxx"),
// A8.6.406 VTBL, VTBX
// Encoding T1 / A1 Advanced SIMD
// v<op><c>.8 <Dd>, <list>, <Dm>
// must precede thumb2_vml__int_long in table
new OpcodeARM(Index.thumb2_vtb, "vtb", "111111111x11xxxxxxxx10xxxxx0xxxx"),
// A8.6.323 VMLA, VMLAL, VMLS, VMLSL (integer)
// Encoding T2 / A2 Advanced SIMD
// v<op>l<c>.<dt> <Qd>, <Dn>, <Dm>
// must follow thumb2_vtb in table
new OpcodeARM(Index.thumb2_vml__int_long, "vml", "111x11111xxxxxxxxxxx10x0x0x0xxxx"),
// A8.6.324 VMLA, VMLS (floating-point)
// Encoding T1 / A1 Advanced SIMD (UNDEFINED in integer-only variant)
// v<op><c>.f32 <Qd>, <Qn>, <Qm> v<op><c>.f32 <Dd>, <Dn>, <Dm>
new OpcodeARM(Index.thumb2_vml__f32, "vml", "111011110xxxxxxxxxxx1101xxx1xxxx"),
// A8.6.324 VMLA, VMLS (floating-point)
// Encoding T2 / A2 VFPv2, VFPv3 (sz = 1 UNDEFINED in single-precision only variants)
// v<op><c>.f64 <Dd>, <Dn>, <Dm> v<op><c>.f32 <Sd>, <Sn>, <Sm>
new OpcodeARM(Index.thumb2_vml__fp, "vml", "111011100x00xxxxxxxx101xxxx0xxxx"),
// A8.6.277 VBIC (immediate)
// Encoding T1 / A1 Advanced SIMD
// vbic<c>.<dt> <Qd>, #<imm> vbic<c>.<dt> <Dd>, #<imm>
// A8.6.326 VMOV (immediate)
// Encoding T1 / A1 Advanced SIMD
// vmov<c>.<dt> <Qd>, #<imm> vmov<c>.<dt> <Dd>, #<imm>
// A8.6.346 VORR (immediate)
// Encoding T1 / A1 Advanced SIMD
// vorr<c>.<dt> <Qd>, #<imm> vorr<c>.<dt> <Dd>, #<imm>
// A8.6.340 VMVN (immediate)
// Encoding T1 / A1 Advanced SIMD
// vmvn<c>.<dt> <Qd>, #<imm> vmvn<c>.<dt> <Dd>, #<imm>
//
// must follow thumb2_vorr__imm in table
new OpcodeARM(Index.thumb2_vmov_vbitwise, null, "111x11111x000xxxxxxxxxxx0xx1xxxx"),
// A8.6.326 VMOV (immediate)
// Encoding T2 / A2 VFPv3 (sz = 1 UNDEFINED in single-precision only variants)
// vmov<c>.f64 <Dd>, #<imm> vmov<c>.f32 <Sd>, #<imm>
// Unpredictable if (0) is 1: 111011101x11xxxxxxxx101x(0)0(0)0xxxx
new OpcodeARM(Index.thumb2_vmov__imm, "vmov", "111011101x11xxxxxxxx101xx0x0xxxx"),
// A8.6.327 VMOV (register)
// Encoding T1 / A1 Advanced SIMD
// vmov<c> <Qd>, <Qm> vmov<c> <Dd>, <Dm>
// A8.6.347 VORR (register)
// Encoding T1 / A1 Advanced SIMD
// vorr<c> <Qd>, <Qn>, <Qm> vorr<c> <Dd>, <Dn>, <Dm>
//
new OpcodeARM(Index.thumb2_vmov_vorr, "vmov", "111011110x10xxxxxxxx0001xxx1xxxx"),
// A8.6.327 VMOV (register)
// Encoding T2 / A2 VFPv2, VFPv3 (sz = 1 UNDEFINED in single-precision only variants)
// vmov<c>.f64 <Dd>, <Dm> vmov<c>.f32 <Sd>, <Sm>
new OpcodeARM(Index.thumb2_vmov__reg_f, "vmov", "111011101x110000xxxx101x01x0xxxx"),
// A8.6.328 VMOV (ARM core register to scalar)
// Encoding T1 / A1 VFPv2, VFPv3, Advanced SIMD for word version (opc1:opc2 == '0x00')'; Advanced SIMD otherwise
// vmov<c>.<size> <Dd[x]>, <Rt>
// Unpredictable if (0) is 1: 111011100xx0xxxxxxxx1011xxx1(0)(0)(0)(0)
new OpcodeARM(Index.thumb2_vmov_5, "vmov", "111011100xx0xxxxxxxx1011xxx1xxxx"),
// A8.6.329 VMOV (scalar to ARM core register)
// Encoding T1 / A1 VFPv2, VFPv3, Advanced SIMD for word version (U:opc1:opc2 == '00x00'); Advanced SIMD otherwise
// vmov<c>.<dt> <Rt>, <Dn[x]>
// Unpredictable if (0) is 1: 11101110xxx1xxxxxxxx1011xxx1(0)(0)(0)(0)
new OpcodeARM(Index.thumb2_vmov_6, "vmov", "11101110xxx1xxxxxxxx1011xxx1xxxx"),
// A8.6.330 VMOV (between ARM core register and single-precision register)
// Encoding T1 / A1 VFPv2, VFPv3
// vmov<c> <Sn>, <Rt> vmov<c> <Rt>, <Sn>
// Unpredictable if (0) is 1: 11101110000xxxxxxxxx1010x(0)(0)1(0)(0)(0)(0)
new OpcodeARM(Index.thumb2_vmov_7, "vmov", "11101110000xxxxxxxxx1010xxx1xxxx"),
// A8.6.333 VMOVL
// Encoding T1 / A1 Advanced SIMD
// vmovl<c>.<dt> <Qd>, <Dm>
// must precede thumb2_vshll__various in table
new OpcodeARM(Index.thumb2_vmovl, "vmovl", "111x11111xxxx000xxxx101000x1xxxx"),
// A8.6.384 VSHLL
// Encoding T1 / A1 Advanced SIMD
// vshll<c>.<type><size> <Qd>, <Dm>, #<imm> (0 < <imm> < <size>)
// must follow thumb2_vmovl in table
new OpcodeARM(Index.thumb2_vshll__various, "vshll", "111x11111xxxxxxxxxxx101000x1xxxx"),
// A8.6.334 VMOVN
// Encoding T1 / A1 Advanced SIMD
// vmovn<c>.<dt> <Dd>, <Qm>
// must precede thumb2_vqmov in table
new OpcodeARM(Index.thumb2_vmovn, "vmovn", "111111111x11xx10xxxx001000x0xxxx"),
// A8.6.335 VMRS
// Encoding T1 / A1 VFPv2, VFPv3, Advanced SIMD
// vmrs<c> <Rt>, fpscr
// Unpredictable if (0) is 1: 1110111011110001xxxx10100(0)(0)1(0)(0)(0)(0)
// B6.1.14 VMRS
// Encoding T1 /A1 (cond) VFPv2, VFPv3, Advanced SIMD
// vmrs<c> <Rt>,<spec_reg>
// Unpredictable if (0) is 1: 111011101111xxxxxxxx1010(0)(0)(0)1(0)(0)(0)(0)
//
new OpcodeARM(Index.thumb2_vmrs, "vmrs", "111011101111xxxxxxxx10100xx1xxxx"),
// A8.6.336 VMSR
// Encoding T1 / A1 VFPv2, VFPv3, Advanced SIMD
// vmsr<c> fpscr, <Rt>
// Unpredictable if (0) is 1: 1110111011100001xxxx10100(0)(0)1(0)(0)(0)(0)
// B6.1.15 VMSR
// Encoding T1 /A1 (cond) VFPv2, VFPv3, Advanced SIMD
// vmsr<c> <spec_reg>,<Rt>
// Unpredictable if (0) is 1: 111011101110xxxxxxxx1010(0)(0)(0)1(0)(0)(0)(0)
//
new OpcodeARM(Index.thumb2_vmsr, "vmsr", "111011101110xxxxxxxx10100xx1xxxx"),
// A8.6.337 VMUL, VMULL (integer and polynomial)
// Encoding T1 / A1 Advanced SIMD
// vmul<c>.<dt> <Qd>, <Qn>, <Qm> vmul<c>.<dt> <Dd>, <Dn>, <Dm>
new OpcodeARM(Index.thumb2_vmul_1, "vmul", "111x11110xxxxxxxxxxx1001xxx1xxxx"),
// A8.6.337 VMUL, VMULL (integer and polynomial)
// Encoding T2 / A2 Advanced SIMD
// vmull<c>.<dt> <Qd>, <Dn>, <Dm>
new OpcodeARM(Index.thumb2_vmull, "vmull", "111x11111xxxxxxxxxxx11x0x0x0xxxx"),
// A8.6.338 VMUL (floating-point)
// Encoding T1 / A1 Advanced SIMD (UNDEFINED in integer-only variant)
// vmul<c>.f32 <Qd>, <Qn>, <Qm> vmul<c>.f32 <Dd>, <Dn>, <Dm>
new OpcodeARM(Index.thumb2_vmul__f32, "vmul", "111111110x0xxxxxxxxx1101xxx1xxxx"),
// A8.6.338 VMUL (floating-point)
// Encoding T2 / A2 VFPv2, VFPv3 (sz = 1 UNDEFINED in single-precision only variants)
// vmul<c>.f64 <Dd>, <Dn>, <Dm> vmul<c>.f32 <Sd>, <Sn>, <Sm>
new OpcodeARM(Index.thumb2_vmul__fp_2, "vmul", "111011100x10xxxxxxxx101xx0x0xxxx"),
// A8.6.360 VQDMULL
// Encoding T2 / A2 Advanced SIMD
// vqdmull<c>.<dt> <Qd>,<Dn>,<Dm[x]>
// must precede thumb2_vmul__scalar in table
new OpcodeARM(Index.thumb2_vqdmull__scalar, "vqdmul", "111011111xxxxxxxxxxx1011x1x0xxxx"),
// A8.6.339 VMUL, VMULL (by scalar)
// Encoding T1 / A1 Advanced SIMD (F = 1 UNDEFINED in integer-only variants)
// vmul<c>.<dt> <Qd>, <Qn>, <Dm[x]> vmul<c>.<dt> <Dd>, <Dn>, <Dm[x]>
// A8.6.339 VMUL, VMULL (by scalar)
// Encoding T2 / A2 Advanced SIMD
// vmull<c>.<dt> <Qd>, <Dn>, <Dm[x]>
// must follow thumb2_vqdmull__scalar in table
//
new OpcodeARM(Index.thumb2_vmul__scalar, "vmul", "111x11111xxxxxxxxxxx10xxx1x0xxxx"),
// A8.6.341 VMVN (register)
// Encoding T1 / A1 Advanced SIMD
// vmvn<c> <Qd>, <Qm> vmvn<c> <Dd>, <Dm>
new OpcodeARM(Index.thumb2_vmvn, "vmvn", "111111111x11xx00xxxx01011xx0xxxx"),
// A8.6.342 VNEG
// Encoding T1 / A1 Advanced SIMD (F = 1 UNDEFINED in integer-only variants)
// vneg<c>.<dt> <Qd>, <Qm> vneg<c>.<dt> <Dd>, <Dm>
new OpcodeARM(Index.thumb2_vneg, "vneg", "111111111x11xx01xxxx0x111xx0xxxx"),
// A8.6.342 VNEG
// Encoding T2 / A2 VFPv2, VFPv3 (sz = 1 UNDEFINED in single-precision only variants)
// vneg<c>.f64 <Dd>, <Dm> vneg<c>.f32 <Sd>, <Sm>
new OpcodeARM(Index.thumb2_vneg__f, "vneg", "111011101x110001xxxx101x01x0xxxx"),
// A8.6.343 VNMLA, VNMLS, VNMUL
// Encoding T1 / A1 VFPv2, VFPv3 (sz = 1 UNDEFINED in single-precision only variants)
// vnmla<c>.f64 <Dd>, <Dn>, <Dm> vnmla<c>.f32 <Sd>, <Sn>, <Sm>
// vnmls<c>.f64 <Dd>, <Dn>, <Dm> vnmls<c>.f32 <Sd>, <Sn>, <Sm>
new OpcodeARM(Index.thumb2_vnml, "vnml", "111011100x01xxxxxxxx101xxxx0xxxx"),
// A8.6.343 VNMLA, VNMLS, VNMUL
// Encoding T2 / A2 VFPv2, VFPv3 (sz = 1 UNDEFINED in single-precision only variants)
// vnmul<c>.f64 <Dd>, <Dn>, <Dm> vnmul<c>.f32 <Sd>, <Sn>, <Sm>
new OpcodeARM(Index.thumb2_vnmul, "vnmul", "111011100x10xxxxxxxx101xx1x0xxxx"),
// A8.6.345 VORN (register)
// Encoding T1 / A1 Advanced SIMD
// vorn<c> <Qd>, <Qn>, <Qm> vorn<c> <Dd>, <Dn>, <Dm>
new OpcodeARM(Index.thumb2_vorn, "vorn", "111011110x11xxxxxxxx0001xxx1xxxx"),
// A8.6.348 VPADAL
// Encoding T1 / A1 Advanced SIMD
// vpadal<c>.<dt> <Qd>, <Qm> vpadal<c>.<dt> <Dd>, <Dm>
new OpcodeARM(Index.thumb2_vpadal, "vpadal", "111111111x11xx00xxxx0110xxx0xxxx"),
// A8.6.349 VPADD (integer)
// Encoding T1 / A1 Advanced SIMD
// vpadd<c>.<dt> <Dd>, <Dn>, <Dm>
new OpcodeARM(Index.thumb2_vpadd__int, "vpadd", "111011110xxxxxxxxxxx1011xxx1xxxx"),
// A8.6.350 VPADD (floating-point)
// Encoding T1 / A1 Advanced SIMD (UNDEFINED in integer-only variant)
// vpadd<c>.f32 <Dd>, <Dn>, <Dm>
new OpcodeARM(Index.thumb2_vpadd__f32, "vpadd", "111111110x0xxxxxxxxx1101xxx0xxxx"),
// A8.6.351 VPADDL
// Encoding T1 / A1 Advanced SIMD
// vpaddl<c>.<dt> <Qd>, <Qm> vpaddl<c>.<dt> <Dd>, <Dm>
new OpcodeARM(Index.thumb2_vpaddl, "vpaddl", "111111111x11xx00xxxx0010xxx0xxxx"),
// A8.6.352 VPMAX, VPMIN (integer)
// Encoding T1 / A1 Advanced SIMD
// vp<op><c>.<dt> <Dd>, <Dn>, <Dm>
new OpcodeARM(Index.thumb2_vpmax_vpmin__int, "vp", "111x11110xxxxxxxxxxx1010xxxxxxxx"),
// A8.6.353 VPMAX, VPMIN (floating-point)
// Encoding T1 / A1 Advanced SIMD (UNDEFINED in integer-only variant)
// vp<op><c>.f32 <Dd>, <Dn>, <Dm>
new OpcodeARM(Index.thumb2_vpmax_vpmin__fp, "vp", "111111110xxxxxxxxxxx1111xxx0xxxx"),
// A8.6.355 VPUSH
// Encoding T1 / A1 VFPv2, VFPv3, Advanced SIMD
// vpush<c> <list> <list> is consecutive 64-bit registers
// A8.6.355 VPUSH
// Encoding T2 / A2 VFPv2, VFPv3
// vpush<c> <list> <list> is consecutive 32-bit registers
// must precede thumb2_vstm_1 in table
new OpcodeARM(Index.thumb2_vpush, "vpush", "111011010x101101xxxx101xxxxxxxxx"),
// A8.6.356 VQABS
// Encoding T1 / A1 Advanced SIMD
// vqabs<c>.<dt> <Qd>,<Qm> vqabs<c>.<dt> <Dd>,<Dm>
// must precede thumb2_vstm_2 in table
// must precede thumb2_vabdl in table
new OpcodeARM(Index.thumb2_vqabs, "vqabs", "111111111x11xx00xxxx01110xx0xxxx"),
// A8.6.362 VQNEG
// Encoding T1 / A1 Advanced SIMD
// vqneg<c>.<dt> <Qd>,<Qm> vqneg<c>.<dt> <Dd>,<Dm>
// must precede thumb2_vabdl in table
new OpcodeARM(Index.thumb2_vqneg, "vqneg", "111111111x11xx00xxxx01111xx0xxxx"),
// A8.6.267 VABD, VABDL (integer)
// Encoding T2 / A2 Advanced SIMD
// vabdl<c>.<dt> <Qd>, <Dn>, <Dm>
// must follow thumb2_vabs in table
// must follow thumb2_vqabs in table
// must follow thumb2_vqneg in table
new OpcodeARM(Index.thumb2_vabdl, "vabdl", "111x11111xxxxxxxxxxx0111x0x0xxxx"),
// A8.6.357 VQADD
// Encoding T1 / A1 Advanced SIMD
// vqadd<c>.<dt> <Qd>,<Qn>,<Qm> vqadd<c>.<dt> <Dd>,<Dn>,<Dm>
new OpcodeARM(Index.thumb2_vqadd, "vqadd", "111x11110xxxxxxxxxxx0000xxx1xxxx"),
// A8.6.358 VQDMLAL, VQDMLSL
// Encoding T1 / A1 Advanced SIMD
// vqd<op><c>.<dt> <Qd>,<Dn>,<Dm>
new OpcodeARM(Index.thumb2_vqdml__vec, "vqdml", "111011111xxxxxxxxxxx10x1x0x0xxxx"),
// A8.6.358 VQDMLAL, VQDMLSL
// Encoding T2 / A2 Advanced SIMD
// vqd<op><c>.<dt> <Qd>,<Dn>,<Dm[x]>
new OpcodeARM(Index.thumb2_vqdml__scalar, "vqdml", "111011111xxxxxxxxxxx0x11x1x0xxxx"),
// A8.6.359 VQDMULH
// Encoding T1 / A1 Advanced SIMD
// vqdmulh<c>.<dt> <Qd>,<Qn>,<Qm> vqdmulh<c>.<dt> <Dd>,<Dn>,<Dm>
new OpcodeARM(Index.thumb2_vqdmulh__vec, "vqdmulh", "111011110xxxxxxxxxxx1011xxx0xxxx"),
// A8.6.359 VQDMULH
// Encoding T2 / A2 Advanced SIMD
// vqdmulh<c>.<dt> <Qd>,<Qn>,<Dm[x]> vqdmulh<c>.<dt> <Dd>,<Dn>,<Dm[x]>
new OpcodeARM(Index.thumb2_vqdmulh__scalar, "vqdmulh", "111x11111xxxxxxxxxxx1100x1x0xxxx"),
// A8.6.360 VQDMULL
// Encoding T1 / A1 Advanced SIMD
// vqdmull<c>.<dt> <Qd>,<Dn>,<Dm>
new OpcodeARM(Index.thumb2_vqdmull__vec, "vqdmull", "111011111xxxxxxxxxxx1101x0x0xxxx"),
// A8.6.361 VQMOVN, VQMOVUN
// Encoding T1 / A1 Advanced SIMD
// vqmov{u}n<c>.<type><size> <Dd>, <Qm>
// must follow thumb2_vmovn in table
new OpcodeARM(Index.thumb2_vqmov, "vqmov", "111111111x11xx10xxxx0010xxx0xxxx"),
// A8.6.363 VQRDMULH
// Encoding T1 / A1 Advanced SIMD
// vqrdmulh<c>.<dt> <Qd>,<Qn>,<Qm> vqrdmulh<c>.<dt> <Dd>,<Dn>,<Dm>
new OpcodeARM(Index.thumb2_vqrdmulh__vec, "vqrdmulh", "111111110xxxxxxxxxxx1011xxx0xxxx"),
// A8.6.363 VQRDMULH
// Encoding T2 / A2 Advanced SIMD
// vqrdmulh<c>.<dt> <Qd>,<Qn>,<Dm[x]> vqrdmulh<c>.<dt> <Dd>,<Dn>,<Dm[x]>
new OpcodeARM(Index.thumb2_vqrdmulh__scalar, "vqrdmulh", "111x11111xxxxxxxxxxx1101x1x0xxxx"),
// A8.6.364 VQRSHL
// Encoding T1 / A1 Advanced SIMD
// vqrshl<c>.<type><size> <Qd>,<Qm>,<Qn> vqrshl<c>.<type><size> <Dd>,<Dm>,<Dn>
new OpcodeARM(Index.thumb2_vqrshl, "vqrshl", "111x11110xxxxxxxxxxx0101xxx1xxxx"),
// A8.6.377 VRSHRN
// Encoding T1 / A1 Advanced SIMD
// vrshrn<c>.i<size> <Dd>, <Qm>, #<imm>
// must precede thumb2_vqrshr in table
new OpcodeARM(Index.thumb2_vrshrn, "vrshrn", "111011111xxxxxxxxxxx100001x1xxxx"),
// A8.6.365 VQRSHRN, VQRSHRUN
// Encoding T1 / A1 Advanced SIMD
// vqrshr{u}n<c>.<type><size> <Dd>,<Qm>,#<imm>
// must follow thumb2_vrshrn in table
new OpcodeARM(Index.thumb2_vqrshr, "vqrshr", "111x11111xxxxxxxxxxx100x01x1xxxx"),
// A8.6.366 VQSHL (register)
// Encoding T1 / A1 Advanced SIMD
// vqshl<c>.<type><size> <Qd>,<Qm>,<Qn> vqshl<c>.<type><size> <Dd>,<Dm>,<Dn>
new OpcodeARM(Index.thumb2_vqshl__reg, "vqshl", "111x11110xxxxxxxxxxx0100xxx1xxxx"),
// A8.6.367 VQSHL, VQSHLU (immediate)
// Encoding T1 / A1 Advanced SIMD
// vqshl{u}<c>.<type><size> <Qd>,<Qm>,#<imm> vqshl{u}<c>.<type><size> <Dd>,<Dm>,#<imm>
new OpcodeARM(Index.thumb2_vqshl__imm, "vqshl", "111x11111xxxxxxxxxxx011xxxx1xxxx"),
// A8.6.386 VSHRN
// Encoding T1 / A1 Advanced SIMD
// vshrn<c>.i<size> <Dd>, <Qm>, #<imm>
// must precede thumb2_vqshr in table
new OpcodeARM(Index.thumb2_vshrn, "vshrn", "111011111xxxxxxxxxxx100000x1xxxx"),
// A8.6.368 VQSHRN, VQSHRUN
// Encoding T1 / A1 Advanced SIMD
// vqshr{u}n<c>.<type><size> <Dd>,<Qm>,#<imm>
// must follow thumb2_vshrn in table
new OpcodeARM(Index.thumb2_vqshr, "vqshr", "111x11111xxxxxxxxxxx100x00x1xxxx"),
// A8.6.369 VQSUB
// Encoding T1 / A1 Advanced SIMD
// vqsub<c>.<type><size> <Qd>, <Qn>, <Qm> vqsub<c>.<type><size> <Dd>, <Dn>, <Dm>
new OpcodeARM(Index.thumb2_vqsub, "vqsub", "111x11110xxxxxxxxxxx0010xxx1xxxx"),
// A8.6.371 VRECPE
// Encoding T1 / A1 Advanced SIMD (F = 1 UNDEFINED in integer-only variants)
// vrecpe<c>.<dt> <Qd>, <Qm> vrecpe<c>.<dt> <Dd>, <Dm>
// must precede thumb2_vraddhn in table
new OpcodeARM(Index.thumb2_vrecpe, "vrecpe", "111111111x11xx11xxxx010x0xx0xxxx"),
// A8.6.378 VRSQRTE
// Encoding T1 / A1 Advanced SIMD (F = 1 UNDEFINED in integer-only variants)
// vrsqrte<c>.<dt> <Qd>, <Qm> vrsqrte<c>.<dt> <Dd>, <Dm>
// must precede thumb2_vabal in table
// must precede thumb2_vraddhn in table
new OpcodeARM(Index.thumb2_vrsqrte, "vrsqrte", "111111111x11xx11xxxx010x1xx0xxxx"),
// A8.6.370 VRADDHN
// Encoding T1 / A1 Advanced SIMD
// vraddhn<c>.<dt> <Dd>, <Qn>, <Qm>
// must follow thumb2_vrecpe in table
// must follow thumb2_vrsqrte in table
new OpcodeARM(Index.thumb2_vraddhn, "vraddhn", "111111111xxxxxxxxxxx0100x0x0xxxx"),
// A8.6.372 VRECPS
// Encoding T1 / A1 Advanced SIMD (UNDEFINED in integer-only variant)
// vrecps<c>.f32 <Qd>, <Qn>, <Qm> vrecps<c>.f32 <Dd>, <Dn>, <Dm>
new OpcodeARM(Index.thumb2_vrecps, "vrecps", "111011110x0xxxxxxxxx1111xxx1xxxx"),
// A8.6.373 VREV16, VREV32, VREV64
// Encoding T1 / A1 Advanced SIMD
// vrev<n><c>.<size> <Qd>, <Qm> vrev<n><c>.<size> <Dd>, <Dm>
new OpcodeARM(Index.thumb2_vrev, "vrev", "111111111x11xx00xxxx000xxxx0xxxx"),
// A8.6.374 VRHADD
// Encoding T1 / A1 Advanced SIMD
// vrhadd<c> <Qd>, <Qn>, <Qm> vrhadd<c> <Dd>, <Dn>, <Dm>
new OpcodeARM(Index.thumb2_vrhadd, "vrhadd", "111x11110xxxxxxxxxxx0001xxx0xxxx"),
// A8.6.375 VRSHL
// Encoding T1 / A1 Advanced SIMD
// vrshl<c>.<type><size> <Qd>, <Qm>, <Qn> vrshl<c>.<type><size> <Dd>, <Dm>, <Dn>
new OpcodeARM(Index.thumb2_vrshl, "vrshl", "111x11110xxxxxxxxxxx0101xxx0xxxx"),
// A8.6.376 VRSHR
// Encoding T1 / A1 Advanced SIMD
// vrshr<c>.<type><size> <Qd>, <Qm>, #<imm> vrshr<c>.<type><size> <Dd>, <Dm>, #<imm>
new OpcodeARM(Index.thumb2_vrshr, "vrshr", "111x11111xxxxxxxxxxx0010xxx1xxxx"),
// A8.6.266 VABA, VABAL
// Encoding T2 / A2 Advanced SIMD
// vabal<c>.<dt> <Qd>, <Dn>, <Dm>
// must follow thumb2_vceq__imm0 in table
// must follow thumb2_vrsqrte in table
new OpcodeARM(Index.thumb2_vabal, "vabal", "111x11111xxxxxxxxxxx0101x0x0xxxx"),
// A8.6.379 VRSQRTS
// Encoding T1 / A1 Advanced SIMD (UNDEFINED in integer-only variant)
// vrsqrts<c>.f32 <Qd>, <Qn>, <Qm> vrsqrts<c>.f32 <Dd>, <Dn>, <Dm>
new OpcodeARM(Index.thumb2_vrsqrts, "vrsqrts", "111011110x1xxxxxxxxx1111xxx1xxxx"),
// A8.6.380 VRSRA
// Encoding T1 / A1 Advanced SIMD
// vrsra<c>.<type><size> <Qd>, <Qm>, #<imm> vrsra<c>.<type><size> <Dd>, <Dm>, #<imm>
new OpcodeARM(Index.thumb2_vrsra, "vrsra", "111x11111xxxxxxxxxxx0011xxx1xxxx"),
// A8.6.381 VRSUBHN
// Encoding T1 / A1 Advanced SIMD
// vrsubhn<c>.<dt> <Dd>, <Qn>, <Qm>
new OpcodeARM(Index.thumb2_vrsubhn, "vrsubhn", "111111111xxxxxxxxxxx0110x0x0xxxx"),
// A8.6.382 VSHL (immediate)
// Encoding T1 / A1 Advanced SIMD
// vshl<c>.i<size> <Qd>, <Qm>, #<imm> vshl<c>.i<size> <Dd>, <Dm>, #<imm>
new OpcodeARM(Index.thumb2_vshl__imm, "vshl.i", "111011111xxxxxxxxxxx0101xxx1xxxx"),
// A8.6.383 VSHL (register)
// Encoding T1 / A1 Advanced SIMD
// vshl<c>.i<size> <Qd>, <Qm>, <Qn> vshl<c>.i<size> <Dd>, <Dm>, <Dn>
new OpcodeARM(Index.thumb2_vshl__reg, "vshl", "111x11110xxxxxxxxxxx0100xxx0xxxx"),
// A8.6.384 VSHLL
// Encoding T2 / A2 Advanced SIMD
// vshll<c>.<type><size> <Qd>, <Dm>, #<imm> (<imm> == <size>)
new OpcodeARM(Index.thumb2_vshll__max, "vshll", "111111111x11xx10xxxx001100x0xxxx"),
// A8.6.385 VSHR
// Encoding T1 / A1 Advanced SIMD
// vshr<c>.<type><size> <Qd>, <Qm>, #<imm> vshr<c>.<type><size> <Dd>, <Dm>, #<imm>
new OpcodeARM(Index.thumb2_vshr, "vshr", "111x11111xxxxxxxxxxx0000xxx1xxxx"),
// A8.6.387 VSLI
// Encoding T1 / A1 Advanced SIMD
// vsli<c>.<size> <Qd>, <Qm>, #<imm> vsli<c>.<size> <Dd>, <Dm>, #<imm>
new OpcodeARM(Index.thumb2_vsli, "vsli.", "111111111xxxxxxxxxxx0101xxx1xxxx"),
// A8.6.388 VSQRT
// Encoding T1 / A1 VFPv2, VFPv3 (sz = 1 UNDEFINED in single-precision only variants)
// vsqrt<c>.f64 <Dd>, <Dm> vsqrt<c>.f32 <Sd>, <Sm>
new OpcodeARM(Index.thumb2_vsqrt, "vsqrt", "111011101x110001xxxx101x11x0xxxx"),
// A8.6.389 VSRA
// Encoding T1 / A1 Advanced SIMD
// vsra<c>.<type><size> <Qd>, <Qm>, #<imm> vsra<c>.<type><size> <Dd>, <Dm>, #<imm>
new OpcodeARM(Index.thumb2_vsra, "vsra", "111x11111xxxxxxxxxxx0001xxx1xxxx"),
// A8.6.390 VSRI
// Encoding T1 / A1 Advanced SIMD
// vsri<c>.<size> <Qd>, <Qm>, #<imm> vsri<c>.<size> <Dd>, <Dm>, #<imm>
new OpcodeARM(Index.thumb2_vsri, "vsri.", "111111111xxxxxxxxxxx0100xxx1xxxx"),
// A8.6.400 VSTR
// Encoding T1 / A1 VFPv2, VFPv3, Advanced SIMD
// vstr<c> <Dd>, [<Rn>{, #+/-<imm>}]
// must precede thumb2_vstm_1 in table
new OpcodeARM(Index.thumb2_vstr__64, "vstr", "11101101xx00xxxxxxxx1011xxxxxxxx"),
// A8.6.399 VSTM
// Encoding T1 / A1 VFPv2, VFPv3, Advanced SIMD
// vstm{mode}<c> <Rn>{!}, <list> <list> is consecutive 64-bit registers
// must follow thumb2_vstr_1 in table
new OpcodeARM(Index.thumb2_vstm__64, "vstm", "1110110xxxx0xxxxxxxx1011xxxxxxxx"),
// A8.6.400 VSTR
// Encoding T2 / A2 VFPv2, VFPv3
// vstr<c> <Sd>, [<Rn>{, #+/-<imm>}]
// must precede thumb2_vstm_2 in table
new OpcodeARM(Index.thumb2_vstr__32, "vstr", "11101101xx00xxxxxxxx1010xxxxxxxx"),
// A8.6.399 VSTM
// Encoding T2 / A2 VFPv2, VFPv3
// vstm{mode}<c> <Rn>{!}, <list> <list> is consecutive 32-bit registers
// must follow thumb2_vstr_1 in table
new OpcodeARM(Index.thumb2_vstm__32, "vstm", "1110110xxxx0xxxxxxxx1010xxxxxxxx"),
// A8.6.401 VSUB (integer)
// Encoding T1 / A1 Advanced SIMD
// vsub<c>.<dt> <Qd>, <Qn>, <Qm> vsub<c>.<dt> <Dd>, <Dn>, <Dm>
new OpcodeARM(Index.thumb2_vsub__int, "vsub", "111111110xxxxxxxxxxx1000xxx0xxxx"),
// A8.6.402 VSUB (floating-point)
// Encoding T1 / A1 Advanced SIMD (UNDEFINED in integer-only variant)
// vsub<c>.f32 <Qd>, <Qn>, <Qm> vsub<c>.f32 <Dd>, <Dn>, <Dm>
new OpcodeARM(Index.thumb2_vsub__f32, "vsub", "111011110x1xxxxxxxxx1101xxx0xxxx"),
// A8.6.402 VSUB (floating-point)
// Encoding T2 / A2 VFPv2, VFPv3 (sz = 1 UNDEFINED in single-precision only variants)
// vsub<c>.f64 <Dd>, <Dn>, <Dm> vsub<c>.f32 <Sd>, <Sn>, <Sm>
new OpcodeARM(Index.thumb2_vsub__fp_f, "vsub", "111011100x11xxxxxxxx101xx1x0xxxx"),
// A8.6.403 VSUBHN
// Encoding T1 / A1 Advanced SIMD
// vsubhn<c>.<dt> <Dd>, <Qn>, <Qm>
new OpcodeARM(Index.thumb2_vsubhn, "vsubhn", "111011111xxxxxxxxxxx0110x0x0xxxx"),
// A8.6.404 VSUBL, VSUBW
// Encoding T1 / A1 Advanced SIMD
// vsubl<c>.<dt> <Qd>, <Dn>, <Dm> vsubw<c>.<dt> {<Qd>,} <Qn>, <Dm>
new OpcodeARM(Index.thumb2_vsubl_vsubw, "vsub", "111x11111xxxxxxxxxxx001xx0x0xxxx"),
// A8.6.405 VSWP
// Encoding T1 / A1 Advanced SIMD
// vswp<c> <Qd>, <Qm> vswp<c> <Dd>, <Dm>
new OpcodeARM(Index.thumb2_vswp, "vswp", "111111111x11xx10xxxx00000xx0xxxx"),
// A8.6.407 VTRN
// Encoding T1 / A1 Advanced SIMD
// vtrn<c>.<size> <Qd>, <Qm> vtrn<c>.<size> <Dd>, <Dm>
// must precede thumb2_vaddl_vaddw in table
// must precede thumb2_vml__scalar in table
new OpcodeARM(Index.thumb2_vtrn, "vtrn", "111111111x11xx10xxxx00001xx0xxxx"),
// A8.6.408 VTST
// Encoding T1 / A1 Advanced SIMD
// vtst<c>.<size> <Qd>, <Qn>, <Qm> vtst<c>.<size> <Dd>, <Dn>, <Dm>
new OpcodeARM(Index.thumb2_vtst, "vtst", "111011110xxxxxxxxxxx1000xxx1xxxx"),
// A8.6.409 VUZP
// Encoding T1 / A1 Advanced SIMD
// vuzp<c>.<size> <Qd>, <Qm> vuzp<c>.<size> <Dd>, <Dm>
// must precede thumb2_vaddl_vaddw in table
// must precede thumb2_vml__scalar in table
new OpcodeARM(Index.thumb2_vuzp, "vuzp", "111111111x11xx10xxxx00010xx0xxxx"),
// A8.6.410 VZIP
// Encoding T1 / A1 Advanced SIMD
// vzip<c>.<size> <Qd>, <Qm> vzip<c>.<size> <Dd>, <Dm>
// must precede thumb2_vaddl_vaddw in table
// must precede thumb2_vml__scalar in table
new OpcodeARM(Index.thumb2_vzip, "vzip", "111111111x11xx10xxxx00011xx0xxxx"),
// A8.6.325 VMLA, VMLAL, VMLS, VMLSL (by scalar)
// Encoding T1 / A1 Advanced SIMD (F = 1 UNDEFINED in integer-only variants)
// v<op><c>.<dt> <Qd>, <Qn>, <Dm[x]> v<op><c>.<dt> <Dd>, <Dn>, <Dm[x]>
// v<op>l<c>.<dt> <Qd>, <Dn>, <Dm[x]>
// must follow thumb2_vtrn in table
// must follow thumb2_vuzp in table
// must follow thumb2_vzip in table
new OpcodeARM(Index.thumb2_vml__scalar, "vml", "111x11111xxxxxxxxxxx0xxxx1x0xxxx"),
// A8.6.274 VADDL, VADDW
// Encoding T1 / A1 Advanced SIMD
// vaddl<c>.<dt> <Qd>, <Dn>, <Dm> vaddw<c>.<dt> <Qd>, <Qn>, <Dm>
// must follow thumb2_vceq__imm0 in table
// must follow thumb2_vcge__imm0 in table
// must follow thumb2_vcgt__imm0 in table
// must follow thumb2_vcle in table
// must follow thumb2_vtrn in table
// must follow thumb2_vuzp in table
// must follow thumb2_vzip in table
new OpcodeARM(Index.thumb2_vaddl_vaddw, "vadd", "111x11111xxxxxxxxxxx000xx0x0xxxx"),
// Coprocessor Data Processing instructions
// must follow VFP data processing instructions in table
// (VMLA, VMLS, VNMLA, VNMLS, VNMUL, VMUL, VDIV, VMOV, VABS, VNEG
// VSQRT, VCVTB, VCVIT, VCMP, VCMPE, VCVT, VCVTR)
// A8.6.28 CDP, CDP2
// Encoding T1 / A1 ARMv6T2, ARMv7
// cdp<c> <coproc>,<opc1>,<CRd>,<CRn>,<CRm>,<opc2>
new OpcodeARM(Index.thumb2_cdp, "cdp", "11101110xxxxxxxxxxxxxxxxxxx0xxxx"),
// A8.6.28 CDP, CDP2
// Encoding T2 /A2 ARMv6T2, ARMv7
// cdp2<c> <coproc>,<opc1>,<CRd>,<CRn>,<CRm>,<opc2>
new OpcodeARM(Index.thumb2_cdp2, "cdp2", "11111110xxxxxxxxxxxxxxxxxxx0xxxx"),
// must follow VMOV 64-bit transfer between ARM core and extension registers in table
// A8.6.92 MCR, MCR2
// Encoding T1 / A1 ARMv6T2, ARMv7
// mcr<c> <coproc>,<opc1>,<Rt>,<CRn>,<CRm>{,<opc2>}
// A8.6.92 MCR, MCR2
// Encoding T2 / A2 ARMv6T2, ARMv7
// mcr2<c> <coproc>,<opc1>,<Rt>,<CRn>,<CRm>{,<opc2>}
//
new OpcodeARM(Index.thumb2_mcr, "mcr", "111x1110xxx0xxxxxxxxxxxxxxx1xxxx"),
// A8.6.93 MCRR, MCRR2
// Encoding T1 / A1 ARMv6T2, ARMv7
// mcrr<c> <coproc>,<opc1>,<Rt>,<Rt2>,<CRm>
// A8.6.93 MCRR, MCRR2
// Encoding T2 / A2 ARMv6T2, ARMv7
// mcrr2<c> <coproc>,<opc1>,<Rt>,<Rt2>,<CRm>
// must precede thumb2_stc in table
//
new OpcodeARM(Index.thumb2_mcrr, "mcrr", "111x11000100xxxxxxxxxxxxxxxxxxxx"),
// A8.6.188 STC, STC2
// Encoding T1 / A1 ARMv6T2, ARMv7
// stc{l}<c> <coproc>,<CRd>,[<Rn>,#+/-<imm>]{!} stc{l}<c> <coproc>,<CRd>,[<Rn>],#+/-<imm>
// stc{l}<c> <coproc>,<CRd>,[<Rn>],<option>
// A8.6.188 STC, STC2
// Encoding T2 / A2 ARMv6T2, ARMv7
// stc2{l}<c> <coproc>,<CRd>,[<Rn>,#+/-<imm>]{!} stc2{l}<c> <coproc>,<CRd>,[<Rn>],#+/-<imm>
// stc2{l}<c> <coproc>,<CRd>,[<Rn>],<option>
//
// must follow thumb2_mcrr in table
// must follow thumb2_mcrr2 in table
// must follow thumb2_vstm__32 in table
new OpcodeARM(Index.thumb2_stc, "stc", "111x110xxxx0xxxxxxxxxxxxxxxxxxxx"),
// A8.6.100 MRC, MRC2
// Encoding T1 / A1 ARMv6T2, ARMv7
// mrc<c> <coproc>,<opc1>,<Rt>,<CRn>,<CRm>{,<opc2>}
// A8.6.100 MRC, MRC2
// Encoding T2 / A2 ARMv6T2, ARMv7
// mrc2<c> <coproc>,<opc1>,<Rt>,<CRn>,<CRm>{,<opc2>}
//
new OpcodeARM(Index.thumb2_mrc, "mrc", "111x1110xxx1xxxxxxxxxxxxxxx1xxxx"),
// A8.6.101 MRRC, MRRC2
// Encoding T1 / A1 ARMv6T2, ARMv7
// mrrc<c> <coproc>,<opc>,<Rt>,<Rt2>,<CRm>
// A8.6.101 MRRC, MRRC2
// Encoding T2 / A2 ARMv6T2, ARMv7
// mrrc2<c> <coproc>,<opc>,<Rt>,<Rt2>,<CRm>
//
// must precede thumb2_ldc in table
new OpcodeARM(Index.thumb2_mrrc, "mrrc", "111x11000101xxxxxxxxxxxxxxxxxxxx"),
// A8.6.51 LDC, LDC2 (immediate)
// Encoding T1 / A1 ARMv6T2, ARMv7
// ldc{l}<c> <coproc>,<CRd>,[<Rn>,#+/-<imm>]{!} ldc{l}<c> <coproc>,<CRd>,[<Rn>],#+/-<imm>
// ldc{l}<c> <coproc>,<CRd>,[<Rn>],<option>
// A8.6.52 LDC, LDC2 (literal)
// Encoding T1 /A1 (cond) ARMv6T2, ARMv7
// ldc{l}<c> <coproc>,<CRd>,<label> ldc{l}<c> <coproc>,<CRd>,[pc,#-0]
// Special case ldc{l}<c> <coproc>,<CRd>,[pc],<option>
// A8.6.52 LDC, LDC2 (literal)
// Encoding T2 / A2 ARMv6T2, ARMv7
// ldc2{l}<c> <coproc>,<CRd>,<label> ldc2{l}<c> <coproc>,<CRd>,[pc,#-0]
// Special case ldc2{l}<c> <coproc>,<CRd>,[pc],<option>
// A8.6.51 LDC, LDC2 (immediate)
// Encoding T2 / A1 ARMv6T2, ARMv7
// ldc2{l}<c> <coproc>,<CRd>,[<Rn>,#+/-<imm>]{!} ldc2{l}<c> <coproc>,<CRd>,[<Rn>],#+/-<imm>
// ldc2{l}<c> <coproc>,<CRd>,[<Rn>],<option>
//
// must follow thumb_mrrc in table
new OpcodeARM(Index.thumb2_ldc, "ldc", "111x110xxxx1xxxxxxxxxxxxxxxxxxxx"),
// B6.1.8 RFE
// Encoding T1 ARMv6T2, ARMv7
// rfedb<c> <Rn>{!} Outside or last in IT block
// Unpredictable if (1) is 0 or (0) is 1: 1110100000x1xxxx(1)(1)(0)(0)(0)(0)(0)(0)(0)(0)(0)(0)(0)(0)(0)(0)
// B6.1.8 RFE
// Encoding T2 ARMv6T2, ARMv7
// rfe{ia}<c> <Rn>{!} Outside or last in IT block
// Unpredictable if (1) is 0 or (0) is 1: 1110100110x1xxxx(1)(1)(0)(0)(0)(0)(0)(0)(0)(0)(0)(0)(0)(0)(0)(0)
//
new OpcodeARM(Index.thumb2_rfe, "rfe", "1110100xx0x1xxxxxxxxxxxxxxxxxxxx"),
// B6.1.10 SRS
// Encoding T1 ARMv6T2, ARMv7
// srsdb<c> sp{!},#<mode>
// Unpredictable if (1) is 0 or (0) is 1: 1110100000x0(1)(1)(0)(1)(1)(1)(0)(0)(0)(0)(0)(0)(0)(0)(0)xxxxx
// B6.1.10 SRS
// Encoding T2 ARMv6T2, ARMv7
// srs{ia}<c> sp{!},#<mode>
// Unpredictable if (1) is 0 or (0) is 1: 1110100110x0(1)(1)(0)(1)(1)(1)(0)(0)(0)(0)(0)(0)(0)(0)(0)xxxxx
//
new OpcodeARM(Index.thumb2_srs, "srs", "1110100xx0x0xxxxxxxxxxxxxxxxxxxx"),
// B6.1.13 SUBS PC, LR and related instructions
// Encoding T1 ARMv6T2, ARMv7
// subs<c> pc,lr,#<imm8> Outside or last in IT block
// Unpredictable if (1) is 0 or (0) is 1: 111100111101(1)(1)(1)(0)10(0)0(1)(1)(1)(1)xxxxxxxx
new OpcodeARM(Index.thumb2_subs, "subs", "111100111101xxxx10x0xxxxxxxxxxxx"),
};
// Reference manual citations (e.g., "A9.4.1") refer to sections in the ARM Architecture
// Reference Manual ARMv7-A and ARMv7-R Edition, Errata markup
public static final OpcodeARM thumbEE_opcode_table[] = {
// A9.4.1 LDR (register)
// Encoding T1 ThumbEE
// ldr<c> <Rt>,[<Rn>,<Rm>, lsl #2]
// 0 1 0 1 1 0 0 Rm Rn Rt
new OpcodeARM(Index.thumbEE_ldr_1, "ldr", "0101100xxxxxxxxx"),
// A9.4.2 LDRH (register)
// Encoding T1 ThumbEE
// ldrh<c> <Rt>,[<Rn>,<Rm>, lsl #1]
// 0 1 0 1 1 0 1 Rm Rn Rt
new OpcodeARM(Index.thumbEE_ldrh, "ldrh", "0101101xxxxxxxxx"),
// A9.4.3 LDRSH (register)
// Encoding T1 ThumbEE
// ldrsh<c> <Rt>,[<Rn>,<Rm>, lsl #1]
// 0 1 0 1 1 1 1 Rm Rn Rt
new OpcodeARM(Index.thumbEE_ldrsh, "ldrsh", "0101111xxxxxxxxx"),
// A9.4.4 STR (register)
// Encoding T1 ThumbEE
// str<c> <Rt>,[<Rn>,<Rm>, lsl #2]
// 0 1 0 1 0 0 0 Rm Rn Rt
new OpcodeARM(Index.thumbEE_str_1, "str", "0101000xxxxxxxxx"),
// A9.4.5 STRH (register)
// Encoding T1 ThumbEE
// strh<c> <Rt>,[<Rn>,<Rm>, lsl #1]
// 0 1 0 1 0 0 1 Rm Rn Rt
new OpcodeARM(Index.thumbEE_strh, "strh", "0101001xxxxxxxxx"),
// A9.5.1 CHKA
// Encoding E1 ThumbEE
// chka<c> <Rn>,<Rm>
// 1 1 0 0 1 0 1 0 N Rm Rn
new OpcodeARM(Index.thumbEE_chka, "chka", "11001010xxxxxxxx"),
// A9.5.2 HB, HBL
// Encoding E1 ThumbEE
// hb{l}<c> #<HandlerID>
// 1 1 0 0 0 0 1 L handler
new OpcodeARM(Index.thumbEE_hb, "hb", "1100001xxxxxxxxx"),
// A9.5.3 HBLP
// Encoding E1 ThumbEE
// hblp<c> #<imm>, #<HandlerID>
// 1 1 0 0 0 1 imm5 handler
new OpcodeARM(Index.thumbEE_hblp, "hblp", "110001xxxxxxxxxx"),
// A9.5.4 HBP
// Encoding E1 ThumbEE
// hbp<c> #<imm>, #<HandlerID>
// 1 1 0 0 0 0 0 0 imm3 handler
new OpcodeARM(Index.thumbEE_hbp, "hbp", "11000000xxxxxxxx"),
// A9.5.5 LDR (immediate)
// Encoding E1 ThumbEE
// ldr<c> <Rt>,[R9{, #<imm>}]
// 1 1 0 0 1 1 0 imm6 Rt
new OpcodeARM(Index.thumbEE_ldr_2, "ldr", "1100110xxxxxxxxx"),
// A9.5.5 LDR (immediate)
// Encoding E2 ThumbEE
// ldr<c> <Rt>,[R10{, #<imm>}]
// 1 1 0 0 1 0 1 1 imm5 Rt
new OpcodeARM(Index.thumbEE_ldr_3, "ldr", "11001011xxxxxxxx"),
// A9.5.5 LDR (immediate)
// Encoding E3 ThumbEE
// ldr<c> <Rt>,[<Rn>{, #-<imm>}]
// 1 1 0 0 1 0 0 imm3 Rn Rt
new OpcodeARM(Index.thumbEE_ldr_4, "ldr", "1100100xxxxxxxxx"),
// A9.5.6 STR (immediate)
// Encoding E1 ThumbEE
// str<c> <Rt>, [R9, #<imm>]
// 1 1 0 0 1 1 1 imm6 Rt
new OpcodeARM(Index.thumbEE_str_2, "str", "1100111xxxxxxxxx"),
};
// Reference manual citations (e.g., "A9.3.1") refer to sections in the ARM Architecture
// Reference Manual ARMv7-A and ARMv7-R Edition, Errata markup
public static final OpcodeARM thumbEE_thumb2_opcode_table[] = {
// A9.3.1 ENTERX, LEAVEX
// Encoding T1 ThumbEE
// enterx Not permitted in IT block. leavex Not permitted in IT block.
// Unpredictable if (1) is 0 or (0) is 1: 111100111011(1)(1)(1)(1)10(0)0(1)(1)(1)(1)000x(1)(1)(1)(1)
new OpcodeARM(Index.thumb2_enterx_leavex, "enterx", "111100111011xxxx10x0xxxx000xxxxx"),
};
// private members
private final Index index; // Opcode index
private final String mnemonic; // Mnemonic
private final String opcodePattern; // Opcode pattern of '1', '0', 'x'
private int opcodeMask; // Mask of bits to check in opcode pattern
private int opcodeResult; // expected result after applying masked bits
/**
* ARM opcode constructor.
*
* @param index
* opcode index
* @param mnemonic
* mnemonic
* @param pattern
* opcode pattern of '1', '0', 'x'
*/
public OpcodeARM(Index index, String mnemonic, String pattern) {
this.index = index;
this.opcodePattern = pattern;
this.mnemonic = mnemonic;
initOpcode();
}
/**
* Get the index of an opcode entry.
*
* @return opcode index
*/
public Index getIndex() {
return index;
}
/**
* Get the mnemonic of an opcode entry.
*
* @return mnemonic
*/
public String getMnemonic() {
return mnemonic;
}
/**
* Get the mask of bits to check for an opcode entry.
*
* @return mask of bits to check
*/
public int getOpcodeMask() {
return opcodeMask;
}
/**
* Get the bit mask pattern of '1', '0', 'x' for an opcode entry.
*
* @return opcode pattern
*/
public String getOpcodePattern() {
return opcodePattern;
}
/**
* Get the expected result after applying masked bits of an opcode entry.
*
* @return expected result after applying masked bits
*/
public int getOpcodeResult() {
return opcodeResult;
}
/**
* Initialize an opcode entry by converting the opcode pattern into a bit
* mask and figure out the expected result after applying the mask.
*/
protected void initOpcode() {
char[] pattern = opcodePattern.toCharArray();
int size = opcodePattern.length();
opcodeMask = opcodeResult = 0;
for (int i = 0; i < size; i++) {
opcodeMask = opcodeMask << 1;
opcodeResult = opcodeResult << 1;
switch (pattern[i]) {
case '0':
opcodeMask |= 1;
opcodeResult |= 0;
break;
case '1':
opcodeMask |= 1;
opcodeResult |= 1;
break;
default: // case 'x'
break;
}
}
}
}