Skip to content

Instantly share code, notes, and snippets.

@agustingianni
Created July 20, 2016 19:35
Show Gist options
  • Save agustingianni/5415bf8450a257acc8b4ed10877b4f8e to your computer and use it in GitHub Desktop.
Save agustingianni/5415bf8450a257acc8b4ed10877b4f8e to your computer and use it in GitHub Desktop.
// Author: Agustin Gianni ([email protected]).
// License: BSD variant "if you steal my shit i'll cut you".
#include <iostream>
#include <random>
#include <limits>
#include <cassert>
#include <cstdio>
using namespace std;
unsigned eSize16 = 16;
unsigned eSize32 = 32;
typedef enum ARMEncoding {
eEncodingA1,
eEncodingA2,
eEncodingA3,
eEncodingA4,
eEncodingA5,
eEncodingT1,
eEncodingT2,
eEncodingT3,
eEncodingT4,
eEncodingT5
} ARMEncoding;
typedef enum ARMVFPVersion {
VFPv1 = 1 << 14,
VFPv2 = 1 << 15,
VFPv3 = 1 << 16,
VFPv4 = 1 << 17,
AdvancedSIMD = 1 << 18,
AdvancedSIMDv2 = 1 << 19,
VFPAll = VFPv1 | VFPv2 | VFPv3 | VFPv4,
AdvancedSIMDAll = AdvancedSIMD | AdvancedSIMDv2,
VFPv1_ABOVE = (VFPv1 | VFPv2 | VFPv3 | AdvancedSIMD),
VFPv2_ABOVE = (VFPv2 | VFPv3 | AdvancedSIMD),
VFPv2v3 = (VFPv2 | VFPv3)
} ARMVFPVersion;
typedef enum ARMVariants {
ARMv4 = 1 << 0,
ARMv4T = 1 << 1,
ARMv4All = ARMv4 | ARMv4T, // ARMv4*
ARMv5 = 1 << 2,
ARMv5T = 1 << 3,
ARMv5TE = 1 << 4,
ARMv5TEJ = 1 << 5,
ARMv5TEAll = ARMv5TE | ARMv5TEJ, // ARMv5TE*
ARMv5TAll = ARMv5 | ARMv5T | ARMv5TE | ARMv5TEJ, // ARMv5T*
ARMv6 = 1 << 6,
ARMv6K = 1 << 7,
ARMv6T2 = 1 << 8,
ARMv6All = ARMv6 | ARMv6K | ARMv6T2, // ARMv6*
ARMv7 = 1 << 9,
ARMv7S = 1 << 10,
ARMv7VE = 1 << 11,
ARMv7R = 1 << 12,
ARMv7All = ARMv7 | ARMv7S | ARMv7S | ARMv7VE | ARMv7R, // ARMv7*
ARMv8 = 1 << 13,
ARMSecurityExtension = 1 << 14,
ARMvAll = 0xffffffff,
} ARMVariants;
typedef struct ARMOpcode {
uint32_t mask;
uint32_t value;
uint32_t variants;
unsigned ins_size;
ARMEncoding encoding;
const char *name;
} ARMOpcode;
// Format: (mask, value, version, encoding, decoder_function, name)
ARMOpcode arm_opcodes[] = {
{ 0x0fe00000, 0x02a00000, ARMv4All | ARMv5TAll | ARMv6All | ARMv7, eSize32, eEncodingA1, "ADC Immediate"},
{ 0x0fe00010, 0x00a00000, ARMv4All | ARMv5TAll | ARMv6All | ARMv7, eSize32, eEncodingA1, "ADC Register"},
{ 0x0fe00090, 0x00a00010, ARMv4All | ARMv5TAll | ARMv6All | ARMv7, eSize32, eEncodingA1, "ADC (register-shifted register)"},
{ 0x0fe00000, 0x02800000, ARMv4All | ARMv5TAll | ARMv6All | ARMv7, eSize32, eEncodingA1, "ADD (immediate, ARM)"},
{ 0x0fe00010, 0x00800000, ARMv4All | ARMv5TAll | ARMv6All | ARMv7, eSize32, eEncodingA1, "ADD (register, ARM)"},
{ 0x0fe00090, 0x00800010, ARMv4All | ARMv5TAll | ARMv6All | ARMv7, eSize32, eEncodingA1, "ADD (register-shifted register)"},
{ 0x0fef0000, 0x028d0000, ARMv4All | ARMv5TAll | ARMv6All | ARMv7, eSize32, eEncodingA1, "ADD (SP plus immediate)"},
{ 0x0fef0010, 0x008d0000, ARMv4All | ARMv5TAll | ARMv6All | ARMv7, eSize32, eEncodingA1, "ADD (SP plus register, ARM)"},
{ 0x0fff0000, 0x028f0000, ARMv4All | ARMv5TAll | ARMv6All | ARMv7, eSize32, eEncodingA1, "ADR"},
{ 0x0fff0000, 0x024f0000, ARMv4All | ARMv5TAll | ARMv6All | ARMv7, eSize32, eEncodingA2, "ADR"},
{ 0x0fe00000, 0x02000000, ARMv4All | ARMv5TAll | ARMv6All | ARMv7, eSize32, eEncodingA1, "AND (immediate)"},
{ 0x0fe00010, 0x00000000, ARMv4All | ARMv5TAll | ARMv6All | ARMv7, eSize32, eEncodingA1, "AND (register)"},
{ 0x0fe00090, 0x00000010, ARMv4All | ARMv5TAll | ARMv6All | ARMv7, eSize32, eEncodingA1, "AND (register-shifted register)"},
{ 0x0fef0070, 0x01a00040, ARMv4All | ARMv5TAll | ARMv6All | ARMv7, eSize32, eEncodingA1, "ASR (immediate)"},
{ 0x0fef00f0, 0x01a00050, ARMv4All | ARMv5TAll | ARMv6All | ARMv7, eSize32, eEncodingA1, "ASR (register)"},
{ 0x0fe0007f, 0x07c0001f, ARMv6T2 | ARMv7, eSize32, eEncodingA1, "BFC"},
{ 0x0fe00070, 0x07c00010, ARMv6T2 | ARMv7, eSize32, eEncodingA1, "BFI"},
{ 0x0fe00000, 0x03c00000, ARMv4All | ARMv5TAll | ARMv6All | ARMv7, eSize32, eEncodingA1, "BIC (immediate)"},
{ 0x0fe00010, 0x01c00000, ARMv4All | ARMv5TAll | ARMv6All | ARMv7, eSize32, eEncodingA1, "BIC (register)"},
{ 0x0fe00090, 0x01c00010, ARMv4All | ARMv5TAll | ARMv6All | ARMv7, eSize32, eEncodingA1, "BIC (register-shifted register)"},
{ 0x0ff000f0, 0x01200070, ARMv5TAll | ARMv6All | ARMv7, eSize32, eEncodingA1, "BKPT"},
{ 0xfe000000, 0xfa000000, ARMv5TAll | ARMv6All | ARMv7, eSize32, eEncodingA2, "BL, BLX (immediate)"},
{ 0x0f000000, 0x0b000000, ARMv4All | ARMv5TAll | ARMv6All | ARMv7, eSize32, eEncodingA1, "BL, BLX (immediate)"},
{ 0x0f000000, 0x0a000000, ARMv4All | ARMv5TAll | ARMv6All | ARMv7, eSize32, eEncodingA1, "B"},
{ 0x0ffffff0, 0x012fff30, ARMv5TAll | ARMv6All | ARMv7, eSize32, eEncodingA1, "BLX (register)"},
{ 0x0ffffff0, 0x012fff10, ARMv4T | ARMv5TAll | ARMv6All | ARMv7, eSize32, eEncodingA1, "BX"},
{ 0x0ffffff0, 0x012fff20, ARMv5TEJ | ARMv6All | ARMv7, eSize32, eEncodingA1, "BXJ"},
{ 0xfff1fe20, 0xf1000000, ARMv6All | ARMv7, eSize32, eEncodingA1, "CPS (ARM)"},
{ 0xff000010, 0xfe000000, ARMv5TAll | ARMv6All | ARMv7, eSize32, eEncodingA2, "CDP, CDP2"},
{ 0x0f000010, 0x0e000000, ARMv4All | ARMv5TAll | ARMv6All | ARMv7, eSize32, eEncodingA1, "CDP, CDP2"},
{ 0xffffffff, 0xf57ff01f, ARMv6K | ARMv7, eSize32, eEncodingA1, "CLREX"},
{ 0x0fff0ff0, 0x016f0f10, ARMv5TAll | ARMv6All | ARMv7, eSize32, eEncodingA1, "CLZ"},
{ 0x0ff0f000, 0x03700000, ARMv4All | ARMv5TAll | ARMv6All | ARMv7, eSize32, eEncodingA1, "CMN (immediate)"},
{ 0x0ff0f010, 0x01700000, ARMv4All | ARMv5TAll | ARMv6All | ARMv7, eSize32, eEncodingA1, "CMN (register)"},
{ 0x0ff0f090, 0x01700010, ARMv4All | ARMv5TAll | ARMv6All | ARMv7, eSize32, eEncodingA1, "CMN (register-shifted register)"},
{ 0x0ff0f000, 0x03500000, ARMv4All | ARMv5TAll | ARMv6All | ARMv7, eSize32, eEncodingA1, "CMP (immediate)"},
{ 0x0ff0f010, 0x01500000, ARMv4All | ARMv5TAll | ARMv6All | ARMv7, eSize32, eEncodingA1, "CMP (register)"},
{ 0x0ff0f090, 0x01500010, ARMv4All | ARMv5TAll | ARMv6All | ARMv7, eSize32, eEncodingA1, "CMP (register-shifted register)"},
{ 0x0ffffff0, 0x0320f0f0, ARMv7, eSize32, eEncodingA1, "DBG"},
{ 0xfffffff0, 0xf57ff050, ARMv7, eSize32, eEncodingA1, "DMB"},
{ 0xfffffff0, 0xf57ff040, ARMv7, eSize32, eEncodingA1, "DSB"},
{ 0x0fe00000, 0x02200000, ARMv4All | ARMv5TAll | ARMv6All | ARMv7, eSize32, eEncodingA1, "EOR (immediate)"},
{ 0x0fe00010, 0x00200000, ARMv4All | ARMv5TAll | ARMv6All | ARMv7, eSize32, eEncodingA1, "EOR (register)"},
{ 0x0fe00090, 0x00200010, ARMv4All | ARMv5TAll | ARMv6All | ARMv7, eSize32, eEncodingA1, "EOR (register-shifted register)"},
{ 0xfffffff0, 0xf57ff060, ARMv7, eSize32, eEncodingA1, "ISB"},
{ 0xfe50ffff, 0xf8100a00, ARMv6All | ARMv7, eSize32, eEncodingA1, "RFE"},
{ 0xfe100000, 0xfc100000, ARMv5TAll | ARMv6All | ARMv7, eSize32, eEncodingA2, "LDC, LDC2 (immediate)"},
{ 0x0e100000, 0x0c100000, ARMv4All | ARMv5TAll | ARMv6All | ARMv7, eSize32, eEncodingA1, "LDC, LDC2 (immediate)"},
{ 0xfe1f0000, 0xfc1f0000, ARMv5TAll | ARMv6All | ARMv7, eSize32, eEncodingA2, "LDC, LDC2 (literal)"},
{ 0x0e1f0000, 0x0c1f0000, ARMv4All | ARMv5TAll | ARMv6All | ARMv7, eSize32, eEncodingA1, "LDC, LDC2 (literal)"},
{ 0x0fd00000, 0x08900000, ARMv4All | ARMv5TAll | ARMv6All | ARMv7, eSize32, eEncodingA1, "LDM/LDMIA/LDMFD (ARM)"},
{ 0x0fd00000, 0x08100000, ARMv4All | ARMv5TAll | ARMv6All | ARMv7, eSize32, eEncodingA1, "LDMDA/LDMFA"},
{ 0x0fd00000, 0x09100000, ARMv4All | ARMv5TAll | ARMv6All | ARMv7, eSize32, eEncodingA1, "LDMDB/LDMEA"},
{ 0x0fd00000, 0x09900000, ARMv4All | ARMv5TAll | ARMv6All | ARMv7, eSize32, eEncodingA1, "LDMIB/LDMED"},
{ 0xff30f000, 0xf510f000, ARMv5TEAll | ARMv6All | ARMv7, eSize32, eEncodingA1, "PLD, PLDW (immediate)"},
{ 0xff7ff000, 0xf55ff000, ARMv5TEAll | ARMv6All | ARMv7, eSize32, eEncodingA1, "PLD (literal)"},
{ 0xff30f010, 0xf710f000, ARMv5TEAll | ARMv6All | ARMv7, eSize32, eEncodingA1, "PLD, PLDW (register)"},
{ 0xff70f010, 0xf650f000, ARMv7, eSize32, eEncodingA1, "PLI (register)"},
{ 0xff70f000, 0xf450f000, ARMv7, eSize32, eEncodingA1, "PLI (immediate, literal)"},
{ 0x0e500000, 0x04100000, ARMv4All | ARMv5TAll | ARMv6All | ARMv7, eSize32, eEncodingA1, "LDR (immediate, ARM)"},
{ 0x0f7f0000, 0x051f0000, ARMv4All | ARMv5TAll | ARMv6All | ARMv7, eSize32, eEncodingA1, "LDR (literal)"},
{ 0x0e500010, 0x06100000, ARMv4All | ARMv5TAll | ARMv6All | ARMv7, eSize32, eEncodingA1, "LDR (register, ARM)"},
{ 0x0e500000, 0x04500000, ARMv4All | ARMv5TAll | ARMv6All | ARMv7, eSize32, eEncodingA1, "LDRB (immediate, ARM)"},
{ 0x0f7f0000, 0x055f0000, ARMv4All | ARMv5TAll | ARMv6All | ARMv7, eSize32, eEncodingA1, "LDRB (literal)"},
{ 0x0e500010, 0x06500000, ARMv4All | ARMv5TAll | ARMv6All | ARMv7, eSize32, eEncodingA1, "LDRB (register)"},
{ 0x0f700000, 0x04700000, ARMv4All | ARMv5TAll | ARMv6All | ARMv7, eSize32, eEncodingA1, "LDRBT"},
{ 0x0f700010, 0x06700000, ARMv4All | ARMv5TAll | ARMv6All | ARMv7, eSize32, eEncodingA2, "LDRBT"},
{ 0x0e5000f0, 0x004000d0, ARMv5TEAll | ARMv6All | ARMv7, eSize32, eEncodingA1, "LDRD (immediate)"},
{ 0x0f7f00f0, 0x014f00d0, ARMv5TEAll | ARMv6All | ARMv7, eSize32, eEncodingA1, "LDRD (literal)"},
{ 0x0e500ff0, 0x000000d0, ARMv5TEAll | ARMv6All | ARMv7, eSize32, eEncodingA1, "LDRD (register)"},
{ 0x0ff00fff, 0x01900f9f, ARMv6All | ARMv7, eSize32, eEncodingA1, "LDREX"},
{ 0x0ff00fff, 0x01d00f9f, ARMv6K | ARMv7, eSize32, eEncodingA1, "LDREXB"},
{ 0x0ff00fff, 0x01b00f9f, ARMv6K | ARMv7, eSize32, eEncodingA1, "LDREXD"},
{ 0x0ff00fff, 0x01f00f9f, ARMv6K | ARMv7, eSize32, eEncodingA1, "LDREXH"},
{ 0x0e5000f0, 0x005000b0, ARMv4All | ARMv5TAll | ARMv6All | ARMv7, eSize32, eEncodingA1, "LDRH (immediate, ARM)"},
{ 0x0f7f00f0, 0x015f00b0, ARMv4All | ARMv5TAll | ARMv6All | ARMv7, eSize32, eEncodingA1, "LDRH (literal)"},
{ 0x0e500ff0, 0x001000b0, ARMv4All | ARMv5TAll | ARMv6All | ARMv7, eSize32, eEncodingA1, "LDRH (register)"},
{ 0x0f7000f0, 0x007000b0, ARMv6T2 | ARMv7, eSize32, eEncodingA1, "LDRHT"},
{ 0x0f700ff0, 0x003000b0, ARMv6T2 | ARMv7, eSize32, eEncodingA2, "LDRHT"},
{ 0x0e5000f0, 0x005000d0, ARMv4All | ARMv5TAll | ARMv6All | ARMv7, eSize32, eEncodingA1, "LDRSB (immediate)"},
{ 0x0f7f00f0, 0x015f00d0, ARMv4All | ARMv5TAll | ARMv6All | ARMv7, eSize32, eEncodingA1, "LDRSB (literal)"},
{ 0x0e500ff0, 0x001000d0, ARMv4All | ARMv5TAll | ARMv6All | ARMv7, eSize32, eEncodingA1, "LDRSB (register)"},
{ 0x0f7000f0, 0x007000d0, ARMv6T2 | ARMv7, eSize32, eEncodingA1, "LDRSBT"},
{ 0x0f700ff0, 0x003000d0, ARMv6T2 | ARMv7, eSize32, eEncodingA2, "LDRSBT"},
{ 0x0e5000f0, 0x005000f0, ARMv4All | ARMv5TAll | ARMv6All | ARMv7, eSize32, eEncodingA1, "LDRSH (immediate)"},
{ 0x0f7f00f0, 0x015f00f0, ARMv4All | ARMv5TAll | ARMv6All | ARMv7, eSize32, eEncodingA1, "LDRSH (literal)"},
{ 0x0e500ff0, 0x001000f0, ARMv4All | ARMv5TAll | ARMv6All | ARMv7, eSize32, eEncodingA1, "LDRSH (register)"},
{ 0x0f7000f0, 0x007000f0, ARMv6T2 | ARMv7, eSize32, eEncodingA1, "LDRSHT"},
{ 0x0f700ff0, 0x003000f0, ARMv6T2 | ARMv7, eSize32, eEncodingA2, "LDRSHT"},
{ 0x0f700000, 0x04300000, ARMv4All | ARMv5TAll | ARMv6All | ARMv7, eSize32, eEncodingA1, "LDRT"},
{ 0x0f700010, 0x06300000, ARMv4All | ARMv5TAll | ARMv6All | ARMv7, eSize32, eEncodingA2, "LDRT"},
{ 0x0fef0070, 0x01a00000, ARMv4All | ARMv5TAll | ARMv6All | ARMv7, eSize32, eEncodingA1, "LSL (immediate)"},
{ 0x0fef00f0, 0x01a00010, ARMv4All | ARMv5TAll | ARMv6All | ARMv7, eSize32, eEncodingA1, "LSL (register)"},
{ 0x0fef0070, 0x01a00020, ARMv4All | ARMv5TAll | ARMv6All | ARMv7, eSize32, eEncodingA1, "LSR (immediate)"},
{ 0x0fef00f0, 0x01a00030, ARMv4All | ARMv5TAll | ARMv6All | ARMv7, eSize32, eEncodingA1, "LSR (register)"},
{ 0xff100010, 0xfe000010, ARMv5TAll | ARMv6All | ARMv7, eSize32, eEncodingA2, "MCR, MCR2"},
{ 0x0f100010, 0x0e000010, ARMv4All | ARMv5TAll | ARMv6All | ARMv7, eSize32, eEncodingA1, "MCR, MCR2"},
{ 0xfff00000, 0xfc400000, ARMv6All | ARMv7, eSize32, eEncodingA2, "MCRR, MCRR2"},
{ 0x0ff00000, 0x0c400000, ARMv5TEAll | ARMv6All | ARMv7, eSize32, eEncodingA1, "MCRR, MCRR2"},
{ 0x0fe000f0, 0x00200090, ARMv4All | ARMv5TAll | ARMv6All | ARMv7, eSize32, eEncodingA1, "MLA"},
{ 0x0ff000f0, 0x00600090, ARMv6T2 | ARMv7, eSize32, eEncodingA1, "MLS"},
{ 0x0fef0000, 0x03a00000, ARMv4All | ARMv5TAll | ARMv6All | ARMv7, eSize32, eEncodingA1, "MOV (immediate)"},
{ 0x0ff00000, 0x03000000, ARMv6T2 | ARMv7, eSize32, eEncodingA2, "MOV (immediate)"},
{ 0x0fef0ff0, 0x01a00000, ARMv4All | ARMv5TAll | ARMv6All | ARMv7, eSize32, eEncodingA1, "MOV (register, ARM)"},
{ 0x0ff00000, 0x03400000, ARMv6T2 | ARMv7, eSize32, eEncodingA1, "MOVT"},
{ 0xff100010, 0xfe100010, ARMv5TAll | ARMv6All | ARMv7, eSize32, eEncodingA2, "MRC, MRC2"},
{ 0x0f100010, 0x0e100010, ARMv4All | ARMv5TAll | ARMv6All | ARMv7, eSize32, eEncodingA1, "MRC, MRC2"},
{ 0xfff00000, 0xfc500000, ARMv6All | ARMv7, eSize32, eEncodingA2, "MRRC, MRRC2"},
{ 0x0ff00000, 0x0c500000, ARMv5TEAll | ARMv6All | ARMv7, eSize32, eEncodingA1, "MRRC, MRRC2"},
{ 0x0fbf0fff, 0x010f0000, ARMv4All | ARMv5TAll | ARMv6All | ARMv7, eSize32, eEncodingA1, "MRS"},
{ 0x0fb0f000, 0x0320f000, ARMv4All | ARMv5TAll | ARMv6All | ARMv7, eSize32, eEncodingA1, "MSR (immediate)"},
{ 0x0fb0fff0, 0x0120f000, ARMv4All | ARMv5TAll | ARMv6All | ARMv7, eSize32, eEncodingA1, "MSR (register)"},
{ 0x0fe0f0f0, 0x00000090, ARMv4All | ARMv5TAll | ARMv6All | ARMv7, eSize32, eEncodingA1, "MUL"},
{ 0x0fef0000, 0x03e00000, ARMv4All | ARMv5TAll | ARMv6All | ARMv7, eSize32, eEncodingA1, "MVN (immediate)"},
{ 0x0fef0010, 0x01e00000, ARMv4All | ARMv5TAll | ARMv6All | ARMv7, eSize32, eEncodingA1, "MVN (register)"},
{ 0x0fef0090, 0x01e00010, ARMv4All | ARMv5TAll | ARMv6All | ARMv7, eSize32, eEncodingA1, "MVN (register-shifted register)"},
{ 0x0fffffff, 0x0320f000, ARMv6K | ARMv6T2 | ARMv7, eSize32, eEncodingA1, "NOP"},
{ 0x0fe00000, 0x03800000, ARMv4All | ARMv5TAll | ARMv6All | ARMv7, eSize32, eEncodingA1, "ORR (immediate)"},
{ 0x0fe00010, 0x01800000, ARMv4All | ARMv5TAll | ARMv6All | ARMv7, eSize32, eEncodingA1, "ORR (register)"},
{ 0x0fe00090, 0x01800010, ARMv4All | ARMv5TAll | ARMv6All | ARMv7, eSize32, eEncodingA1, "ORR (register-shifted register)"},
{ 0x0ff00030, 0x06800010, ARMv6All | ARMv7, eSize32, eEncodingA1, "PKH"},
{ 0x0fff0000, 0x08bd0000, ARMv4All | ARMv5TAll | ARMv6All | ARMv7, eSize32, eEncodingA1, "POP (ARM)"},
{ 0x0fff0fff, 0x049d0004, ARMv4All | ARMv5TAll | ARMv6All | ARMv7, eSize32, eEncodingA2, "POP (ARM)"},
{ 0x0fff0000, 0x092d0000, ARMv4All | ARMv5TAll | ARMv6All | ARMv7, eSize32, eEncodingA1, "PUSH"},
{ 0x0fff0fff, 0x052d0004, ARMv4All | ARMv5TAll | ARMv6All | ARMv7, eSize32, eEncodingA2, "PUSH"},
{ 0x0ff00ff0, 0x01000050, ARMv5TEAll | ARMv6All | ARMv7, eSize32, eEncodingA1, "QADD"},
{ 0x0ff00ff0, 0x06200f10, ARMv6All | ARMv7, eSize32, eEncodingA1, "QADD16"},
{ 0x0ff00ff0, 0x06200f90, ARMv6All | ARMv7, eSize32, eEncodingA1, "QADD8"},
{ 0x0ff00ff0, 0x06200f30, ARMv6All | ARMv7, eSize32, eEncodingA1, "QASX"},
{ 0x0ff00ff0, 0x01400050, ARMv5TEAll | ARMv6All | ARMv7, eSize32, eEncodingA1, "QDADD"},
{ 0x0ff00ff0, 0x01600050, ARMv5TEAll | ARMv6All | ARMv7, eSize32, eEncodingA1, "QDSUB"},
{ 0x0ff00ff0, 0x06200f50, ARMv6All | ARMv7, eSize32, eEncodingA1, "QSAX"},
{ 0x0ff00ff0, 0x01200050, ARMv5TEAll | ARMv6All | ARMv7, eSize32, eEncodingA1, "QSUB"},
{ 0x0ff00ff0, 0x06200f70, ARMv6All | ARMv7, eSize32, eEncodingA1, "QSUB16"},
{ 0x0ff00ff0, 0x06200ff0, ARMv6All | ARMv7, eSize32, eEncodingA1, "QSUB8"},
{ 0x0fff0ff0, 0x06ff0f30, ARMv6T2 | ARMv7, eSize32, eEncodingA1, "RBIT"},
{ 0x0fff0ff0, 0x06bf0f30, ARMv6All | ARMv7, eSize32, eEncodingA1, "REV"},
{ 0x0fff0ff0, 0x06bf0fb0, ARMv6All | ARMv7, eSize32, eEncodingA1, "REV16"},
{ 0x0fff0ff0, 0x06ff0fb0, ARMv6All | ARMv7, eSize32, eEncodingA1, "REVSH"},
{ 0x0fef0070, 0x01a00060, ARMv4All | ARMv5TAll | ARMv6All | ARMv7, eSize32, eEncodingA1, "ROR (immediate)"},
{ 0x0fef00f0, 0x01a00070, ARMv4All | ARMv5TAll | ARMv6All | ARMv7, eSize32, eEncodingA1, "ROR (register)"},
{ 0x0fef0ff0, 0x01a00060, ARMv4All | ARMv5TAll | ARMv6All | ARMv7, eSize32, eEncodingA1, "RRX"},
{ 0x0fe00000, 0x02600000, ARMv4All | ARMv5TAll | ARMv6All | ARMv7, eSize32, eEncodingA1, "RSB (immediate)"},
{ 0x0fe00010, 0x00600000, ARMv4All | ARMv5TAll | ARMv6All | ARMv7, eSize32, eEncodingA1, "RSB (register)"},
{ 0x0fe00090, 0x00600010, ARMv4All | ARMv5TAll | ARMv6All | ARMv7, eSize32, eEncodingA1, "RSB (register-shifted register)"},
{ 0x0fe00000, 0x02e00000, ARMv4All | ARMv5TAll | ARMv6All | ARMv7, eSize32, eEncodingA1, "RSC (immediate)"},
{ 0x0fe00010, 0x00e00000, ARMv4All | ARMv5TAll | ARMv6All | ARMv7, eSize32, eEncodingA1, "RSC (register)"},
{ 0x0fe00090, 0x00e00010, ARMv4All | ARMv5TAll | ARMv6All | ARMv7, eSize32, eEncodingA1, "RSC (register-shifted register)"},
{ 0x0ff00ff0, 0x06100f10, ARMv6All | ARMv7, eSize32, eEncodingA1, "SADD16"},
{ 0x0ff00ff0, 0x06100f90, ARMv6All | ARMv7, eSize32, eEncodingA1, "SADD8"},
{ 0x0ff00ff0, 0x06100f30, ARMv6All | ARMv7, eSize32, eEncodingA1, "SASX"},
{ 0x0fe00000, 0x02c00000, ARMv4All | ARMv5TAll | ARMv6All | ARMv7, eSize32, eEncodingA1, "SBC (immediate)"},
{ 0x0fe00010, 0x00c00000, ARMv4All | ARMv5TAll | ARMv6All | ARMv7, eSize32, eEncodingA1, "SBC (register)"},
{ 0x0fe00090, 0x00c00010, ARMv4All | ARMv5TAll | ARMv6All | ARMv7, eSize32, eEncodingA1, "SBC (register-shifted register)"},
{ 0x0fe00070, 0x07a00050, ARMv6T2 | ARMv7, eSize32, eEncodingA1, "SBFX"},
{ 0x0ff0f0f0, 0x0710f010, ARMv7VE, eSize32, eEncodingA1, "SDIV"},
{ 0x0ff00ff0, 0x06800fb0, ARMv6All | ARMv7, eSize32, eEncodingA1, "SEL"},
{ 0xfffffdff, 0xf1010000, ARMv6All | ARMv7, eSize32, eEncodingA1, "SETEND"},
{ 0x0fffffff, 0x0320f004, ARMv6K | ARMv7, eSize32, eEncodingA1, "SEV"},
{ 0x0ff00ff0, 0x06300f10, ARMv6All | ARMv7, eSize32, eEncodingA1, "SHADD16"},
{ 0x0ff00ff0, 0x06300f90, ARMv6All | ARMv7, eSize32, eEncodingA1, "SHADD8"},
{ 0x0ff00ff0, 0x06300f30, ARMv6All | ARMv7, eSize32, eEncodingA1, "SHASX"},
{ 0x0ff00ff0, 0x06300f50, ARMv6All | ARMv7, eSize32, eEncodingA1, "SHSAX"},
{ 0x0ff00ff0, 0x06300f70, ARMv6All | ARMv7, eSize32, eEncodingA1, "SHSUB16"},
{ 0x0ff00ff0, 0x06300ff0, ARMv6All | ARMv7, eSize32, eEncodingA1, "SHSUB8"},
{ 0x0ff00090, 0x01000080, ARMv5TEAll | ARMv6All | ARMv7, eSize32, eEncodingA1, "SMLABB, SMLABT, SMLATB, SMLATT"},
{ 0x0ff000d0, 0x07000010, ARMv6All | ARMv7, eSize32, eEncodingA1, "SMLAD"},
{ 0x0fe000f0, 0x00e00090, ARMv4All | ARMv5TAll | ARMv6All | ARMv7, eSize32, eEncodingA1, "SMLAL"},
{ 0x0ff00090, 0x01400080, ARMv5TEAll | ARMv6All | ARMv7, eSize32, eEncodingA1, "SMLALBB, SMLALBT, SMLALTB, SMLALTT"},
{ 0x0ff000d0, 0x07400010, ARMv6All | ARMv7, eSize32, eEncodingA1, "SMLALD"},
{ 0x0ff000b0, 0x01200080, ARMv5TEAll | ARMv6All | ARMv7, eSize32, eEncodingA1, "SMLAWB, SMLAWT"},
{ 0x0ff000d0, 0x07000050, ARMv6All | ARMv7, eSize32, eEncodingA1, "SMLSD"},
{ 0x0ff000d0, 0x07400050, ARMv6All | ARMv7, eSize32, eEncodingA1, "SMLSLD"},
{ 0x0ff000d0, 0x07500010, ARMv6All | ARMv7, eSize32, eEncodingA1, "SMMLA"},
{ 0x0ff000d0, 0x075000d0, ARMv6All | ARMv7, eSize32, eEncodingA1, "SMMLS"},
{ 0x0ff0f0d0, 0x0750f010, ARMv6All | ARMv7, eSize32, eEncodingA1, "SMMUL"},
{ 0x0ff0f0d0, 0x0700f010, ARMv6All | ARMv7, eSize32, eEncodingA1, "SMUAD"},
{ 0x0ff0f090, 0x01600080, ARMv5TEAll | ARMv6All | ARMv7, eSize32, eEncodingA1, "SMULBB, SMULBT, SMULTB, SMULTT"},
{ 0x0fe000f0, 0x00c00090, ARMv4All | ARMv5TAll | ARMv6All | ARMv7, eSize32, eEncodingA1, "SMULL"},
{ 0x0ff0f0b0, 0x012000a0, ARMv5TEAll | ARMv6All | ARMv7, eSize32, eEncodingA1, "SMULWB, SMULWT"},
{ 0x0ff0f0d0, 0x0700f050, ARMv6All | ARMv7, eSize32, eEncodingA1, "SMUSD"},
{ 0x0fe00030, 0x06a00010, ARMv6All | ARMv7, eSize32, eEncodingA1, "SSAT"},
{ 0x0ff00ff0, 0x06a00f30, ARMv6All | ARMv7, eSize32, eEncodingA1, "SSAT16"},
{ 0x0ff00ff0, 0x06100f50, ARMv6All | ARMv7, eSize32, eEncodingA1, "SSAX"},
{ 0x0ff00ff0, 0x06100f70, ARMv6All | ARMv7, eSize32, eEncodingA1, "SSUB16"},
{ 0x0ff00ff0, 0x06100ff0, ARMv6All | ARMv7, eSize32, eEncodingA1, "SSUB8"},
{ 0xfe100000, 0xfc000000, ARMv5TAll | ARMv6All | ARMv7, eSize32, eEncodingA2, "STC, STC2"},
{ 0x0e100000, 0x0c000000, ARMv4All | ARMv5TAll | ARMv6All | ARMv7, eSize32, eEncodingA1, "STC, STC2"},
{ 0x0fd00000, 0x08800000, ARMv4All | ARMv5TAll | ARMv6All | ARMv7, eSize32, eEncodingA1, "STM (STMIA, STMEA)"},
{ 0x0fd00000, 0x08000000, ARMv4All | ARMv5TAll | ARMv6All | ARMv7, eSize32, eEncodingA1, "STMDA (STMED)"},
{ 0x0fd00000, 0x09000000, ARMv4All | ARMv5TAll | ARMv6All | ARMv7, eSize32, eEncodingA1, "STMDB (STMFD)"},
{ 0x0fd00000, 0x09800000, ARMv4All | ARMv5TAll | ARMv6All | ARMv7, eSize32, eEncodingA1, "STMIB (STMFA)"},
{ 0x0e500000, 0x04000000, ARMv4All | ARMv5TAll | ARMv6All | ARMv7, eSize32, eEncodingA1, "STR (immediate, ARM)"},
{ 0x0e500010, 0x06000000, ARMv4All | ARMv5TAll | ARMv6All | ARMv7, eSize32, eEncodingA1, "STR (register)"},
{ 0x0e500000, 0x04400000, ARMv4All | ARMv5TAll | ARMv6All | ARMv7, eSize32, eEncodingA1, "STRB (immediate, ARM)"},
{ 0x0e500010, 0x06400000, ARMv4All | ARMv5TAll | ARMv6All | ARMv7, eSize32, eEncodingA1, "STRB (register)"},
{ 0x0f700000, 0x04600000, ARMv4All | ARMv5TAll | ARMv6All | ARMv7, eSize32, eEncodingA1, "STRBT"},
{ 0x0f700010, 0x06600000, ARMv4All | ARMv5TAll | ARMv6All | ARMv7, eSize32, eEncodingA2, "STRBT"},
{ 0x0e5000f0, 0x004000f0, ARMv5TEAll | ARMv6All | ARMv7, eSize32, eEncodingA1, "STRD (immediate)"},
{ 0x0e500ff0, 0x000000f0, ARMv5TEAll | ARMv6All | ARMv7, eSize32, eEncodingA1, "STRD (register)"},
{ 0x0ff00ff0, 0x01800f90, ARMv6All | ARMv7, eSize32, eEncodingA1, "STREX"},
{ 0x0ff00ff0, 0x01c00f90, ARMv6K | ARMv7, eSize32, eEncodingA1, "STREXB"},
{ 0x0ff00ff0, 0x01a00f90, ARMv6K | ARMv7, eSize32, eEncodingA1, "STREXD"},
{ 0x0ff00ff0, 0x01e00f90, ARMv6K | ARMv7, eSize32, eEncodingA1, "STREXH"},
{ 0x0e5000f0, 0x004000b0, ARMv4All | ARMv5TAll | ARMv6All | ARMv7, eSize32, eEncodingA1, "STRH (immediate, ARM)"},
{ 0x0e500ff0, 0x000000b0, ARMv4All | ARMv5TAll | ARMv6All | ARMv7, eSize32, eEncodingA1, "STRH (register)"},
{ 0x0f7000f0, 0x006000b0, ARMv6T2 | ARMv7, eSize32, eEncodingA1, "STRHT"},
{ 0x0f700ff0, 0x002000b0, ARMv6T2 | ARMv7, eSize32, eEncodingA2, "STRHT"},
{ 0x0f700000, 0x04200000, ARMv4All | ARMv5TAll | ARMv6All | ARMv7, eSize32, eEncodingA1, "STRT"},
{ 0x0f700010, 0x06200000, ARMv4All | ARMv5TAll | ARMv6All | ARMv7, eSize32, eEncodingA2, "STRT"},
{ 0x0fe00000, 0x02400000, ARMv4All | ARMv5TAll | ARMv6All | ARMv7, eSize32, eEncodingA1, "SUB (immediate, ARM)"},
{ 0x0fe00010, 0x00400000, ARMv4All | ARMv5TAll | ARMv6All | ARMv7, eSize32, eEncodingA1, "SUB (register)"},
{ 0x0fe00090, 0x00400010, ARMv4All | ARMv5TAll | ARMv6All | ARMv7, eSize32, eEncodingA1, "SUB (register-shifted register)"},
{ 0x0fef0000, 0x024d0000, ARMv4All | ARMv5TAll | ARMv6All | ARMv7, eSize32, eEncodingA1, "SUB (SP minus immediate)"},
{ 0x0fef0010, 0x004d0000, ARMv4All | ARMv5TAll | ARMv6All | ARMv7, eSize32, eEncodingA1, "SUB (SP minus register)"},
{ 0x0f000000, 0x0f000000, ARMv4All | ARMv5TAll | ARMv6All | ARMv7, eSize32, eEncodingA1, "SVC"},
{ 0x0fb00ff0, 0x01000090, ARMv4All | ARMv5TAll | ARMv7 | ARMv7VE, eSize32, eEncodingA1, "SWP, SWPB"},
{ 0x0ff003f0, 0x06a00070, ARMv6All | ARMv7, eSize32, eEncodingA1, "SXTAB"},
{ 0x0ff003f0, 0x06800070, ARMv6All | ARMv7, eSize32, eEncodingA1, "SXTAB16"},
{ 0x0ff003f0, 0x06b00070, ARMv6All | ARMv7, eSize32, eEncodingA1, "SXTAH"},
{ 0x0fff03f0, 0x06af0070, ARMv6All | ARMv7, eSize32, eEncodingA1, "SXTB"},
{ 0x0fff03f0, 0x068f0070, ARMv6All | ARMv7, eSize32, eEncodingA1, "SXTB16"},
{ 0x0fff03f0, 0x06bf0070, ARMv6All | ARMv7, eSize32, eEncodingA1, "SXTH"},
{ 0x0ff0f000, 0x03300000, ARMv4All | ARMv5TAll | ARMv6All | ARMv7, eSize32, eEncodingA1, "TEQ (immediate)"},
{ 0x0ff0f010, 0x01300000, ARMv4All | ARMv5TAll | ARMv6All | ARMv7, eSize32, eEncodingA1, "TEQ (register)"},
{ 0x0ff0f090, 0x01300010, ARMv4All | ARMv5TAll | ARMv6All | ARMv7, eSize32, eEncodingA1, "TEQ (register-shifted register)"},
{ 0x0ff0f000, 0x03100000, ARMv4All | ARMv5TAll | ARMv6All | ARMv7, eSize32, eEncodingA1, "TST (immediate)"},
{ 0x0ff0f010, 0x01100000, ARMv4All | ARMv5TAll | ARMv6All | ARMv7, eSize32, eEncodingA1, "TST (register)"},
{ 0x0ff0f090, 0x01100010, ARMv4All | ARMv5TAll | ARMv6All | ARMv7, eSize32, eEncodingA1, "TST (register-shifted register)"},
{ 0x0ff00ff0, 0x06500f10, ARMv6All | ARMv7, eSize32, eEncodingA1, "UADD16"},
{ 0x0ff00ff0, 0x06500f90, ARMv6All | ARMv7, eSize32, eEncodingA1, "UADD8"},
{ 0x0ff00ff0, 0x06500f30, ARMv6All | ARMv7, eSize32, eEncodingA1, "UASX"},
{ 0x0fe00070, 0x07e00050, ARMv6T2 | ARMv7, eSize32, eEncodingA1, "UBFX"},
{ 0xfff000f0, 0xe7f000f0, ARMv4T | ARMv5TAll | ARMv6 | ARMv7, eSize32, eEncodingA1, "UDF"},
{ 0x0ff0f0f0, 0x0730f010, ARMv7VE, eSize32, eEncodingA1, "UDIV"},
{ 0x0ff00ff0, 0x06700f10, ARMv6All | ARMv7, eSize32, eEncodingA1, "UHADD16"},
{ 0x0ff00ff0, 0x06700f90, ARMv6All | ARMv7, eSize32, eEncodingA1, "UHADD8"},
{ 0x0ff00ff0, 0x06700f30, ARMv6All | ARMv7, eSize32, eEncodingA1, "UHASX"},
{ 0x0ff00ff0, 0x06700f50, ARMv6All | ARMv7, eSize32, eEncodingA1, "UHSAX"},
{ 0x0ff00ff0, 0x06700f70, ARMv6All | ARMv7, eSize32, eEncodingA1, "UHSUB16"},
{ 0x0ff00ff0, 0x06700ff0, ARMv6All | ARMv7, eSize32, eEncodingA1, "UHSUB8"},
{ 0x0ff000f0, 0x00400090, ARMv6All | ARMv7, eSize32, eEncodingA1, "UMAAL"},
{ 0x0fe000f0, 0x00a00090, ARMv4All | ARMv5TAll | ARMv6All | ARMv7, eSize32, eEncodingA1, "UMLAL"},
{ 0x0fe000f0, 0x00800090, ARMv4All | ARMv5TAll | ARMv6All | ARMv7, eSize32, eEncodingA1, "UMULL"},
{ 0x0ff00ff0, 0x06600f10, ARMv6All | ARMv7, eSize32, eEncodingA1, "UQADD16"},
{ 0x0ff00ff0, 0x06600f90, ARMv6All | ARMv7, eSize32, eEncodingA1, "UQADD8"},
{ 0x0ff00ff0, 0x06600f30, ARMv6All | ARMv7, eSize32, eEncodingA1, "UQASX"},
{ 0x0ff00ff0, 0x06600f50, ARMv6All | ARMv7, eSize32, eEncodingA1, "UQSAX"},
{ 0x0ff00ff0, 0x06600f70, ARMv6All | ARMv7, eSize32, eEncodingA1, "UQSUB16"},
{ 0x0ff00ff0, 0x06600ff0, ARMv6All | ARMv7, eSize32, eEncodingA1, "UQSUB8"},
{ 0x0ff0f0f0, 0x0780f010, ARMv6All | ARMv7, eSize32, eEncodingA1, "USAD8"},
{ 0x0ff000f0, 0x07800010, ARMv6All | ARMv7, eSize32, eEncodingA1, "USADA8"},
{ 0x0fe00030, 0x06e00010, ARMv6All | ARMv7, eSize32, eEncodingA1, "USAT"},
{ 0x0ff00ff0, 0x06e00f30, ARMv6All | ARMv7, eSize32, eEncodingA1, "USAT16"},
{ 0x0ff00ff0, 0x06500f50, ARMv6All | ARMv7, eSize32, eEncodingA1, "USAX"},
{ 0x0ff00ff0, 0x06500f70, ARMv6All | ARMv7, eSize32, eEncodingA1, "USUB16"},
{ 0x0ff00ff0, 0x06500ff0, ARMv6All | ARMv7, eSize32, eEncodingA1, "USUB8"},
{ 0x0ff003f0, 0x06e00070, ARMv6All | ARMv7, eSize32, eEncodingA1, "UXTAB"},
{ 0x0ff003f0, 0x06c00070, ARMv6All | ARMv7, eSize32, eEncodingA1, "UXTAB16"},
{ 0x0ff003f0, 0x06f00070, ARMv6All | ARMv7, eSize32, eEncodingA1, "UXTAH"},
{ 0x0fff03f0, 0x06ef0070, ARMv6All | ARMv7, eSize32, eEncodingA1, "UXTB"},
{ 0x0fff03f0, 0x06cf0070, ARMv6All | ARMv7, eSize32, eEncodingA1, "UXTB16"},
{ 0x0fff03f0, 0x06ff0070, ARMv6All | ARMv7, eSize32, eEncodingA1, "UXTH"},
{ 0x0fffffff, 0x0320f002, ARMv6K | ARMv7, eSize32, eEncodingA1, "WFE"},
{ 0x0fffffff, 0x0320f003, ARMv6K | ARMv7, eSize32, eEncodingA1, "WFI"},
{ 0x0fffffff, 0x0320f001, ARMv6K | ARMv7, eSize32, eEncodingA1, "YIELD"},
{ 0x0fffffff, 0x0160006e, ARMv7VE, eSize32, eEncodingA1, "ERET"},
{ 0x0ff000f0, 0x01400070, ARMv7VE, eSize32, eEncodingA1, "HVC"},
{ 0x0e508000, 0x08508000, ARMv4All | ARMv5TAll | ARMv6All | ARMv7, eSize32, eEncodingA1, "LDM (exception return)"},
{ 0x0e708000, 0x08500000, ARMv4All | ARMv5TAll | ARMv6All | ARMv7, eSize32, eEncodingA1, "LDM (User registers)"},
{ 0x0fb00eff, 0x01000200, ARMv7VE, eSize32, eEncodingA1, "MRS (Banked register)"},
{ 0xfe5fffe0, 0xf84d0500, ARMv6All | ARMv7, eSize32, eEncodingA1, "SRS, ARM"},
{ 0x0e700000, 0x08400000, ARMv4All | ARMv5TAll | ARMv6All | ARMv7, eSize32, eEncodingA1, "STM (User registers)"},
{ 0x0e10f000, 0x0210f000, ARMv4All | ARMv5TAll | ARMv6All | ARMv7, eSize32, eEncodingA1, "SUBS PC, LR and related instructions, ARM"},
{ 0x0e10f010, 0x0010f000, ARMv4All | ARMv5TAll | ARMv6All | ARMv7, eSize32, eEncodingA2, "SUBS PC, LR and related instructions, ARM"},
{ 0xfe800f10, 0xf2000710, AdvancedSIMD, eSize32, eEncodingA1, "VABA, VABAL"},
{ 0xfe800f50, 0xf2800500, AdvancedSIMD, eSize32, eEncodingA2, "VABA, VABAL"},
{ 0xfe800f10, 0xf2000700, AdvancedSIMD, eSize32, eEncodingA1, "VABD, VABDL (integer)"},
{ 0xfe800f50, 0xf2800700, AdvancedSIMD, eSize32, eEncodingA2, "VABD, VABDL (integer)"},
{ 0xffa00f10, 0xf3200d00, AdvancedSIMD, eSize32, eEncodingA1, "VABD (floating-point)"},
{ 0xffb30b90, 0xf3b10300, AdvancedSIMD, eSize32, eEncodingA1, "VABS"},
{ 0x0fbf0ed0, 0x0eb00ac0, VFPv2 | VFPv3 | VFPv4, eSize32, eEncodingA2, "VABS"},
{ 0xff800f10, 0xf3000e10, AdvancedSIMD, eSize32, eEncodingA1, "VACGE, VACGT, VACLE, VACLT"},
{ 0xff800f10, 0xf2000800, AdvancedSIMD, eSize32, eEncodingA1, "VADD (integer)"},
{ 0xffa00f10, 0xf2000d00, AdvancedSIMD, eSize32, eEncodingA1, "VADD (floating-point)"},
{ 0x0fb00e50, 0x0e300a00, VFPv2 | VFPv3 | VFPv4, eSize32, eEncodingA2, "VADD (floating-point)"},
{ 0xff800f50, 0xf2800400, AdvancedSIMD, eSize32, eEncodingA1, "VADDHN"},
{ 0xfe800e50, 0xf2800000, AdvancedSIMD, eSize32, eEncodingA1, "VADDL, VADDW"},
{ 0xffb00f10, 0xf2000110, AdvancedSIMD, eSize32, eEncodingA1, "VAND (register)"},
{ 0xfeb800b0, 0xf2800030, AdvancedSIMD, eSize32, eEncodingA1, "VBIC (immediate)"},
{ 0xffb00f10, 0xf2100110, AdvancedSIMD, eSize32, eEncodingA1, "VBIC (register)"},
{ 0xff800f10, 0xf3000110, AdvancedSIMD, eSize32, eEncodingA1, "VBIF, VBIT, VBSL"},
{ 0xff800f10, 0xf3000810, AdvancedSIMD, eSize32, eEncodingA1, "VCEQ (register)"},
{ 0xffa00f10, 0xf2000e00, AdvancedSIMD, eSize32, eEncodingA2, "VCEQ (register)"},
{ 0xffb30b90, 0xf3b10100, AdvancedSIMD, eSize32, eEncodingA1, "VCEQ (immediate #0)"},
{ 0xfe800f10, 0xf2000310, AdvancedSIMD, eSize32, eEncodingA1, "VCGE (register)"},
{ 0xffa00f10, 0xf3000e00, AdvancedSIMD, eSize32, eEncodingA2, "VCGE (register)"},
{ 0xffb30b90, 0xf3b10080, AdvancedSIMD, eSize32, eEncodingA1, "VCGE (immediate #0)"},
{ 0xfe800f10, 0xf2000300, AdvancedSIMD, eSize32, eEncodingA1, "VCGT (register)"},
{ 0xffa00f10, 0xf3200e00, AdvancedSIMD, eSize32, eEncodingA2, "VCGT (register)"},
{ 0xffb30b90, 0xf3b10000, AdvancedSIMD, eSize32, eEncodingA1, "VCGT (immediate #0)"},
{ 0xffb30b90, 0xf3b10180, AdvancedSIMD, eSize32, eEncodingA1, "VCLE (immediate #0)"},
{ 0xffb30f90, 0xf3b00400, AdvancedSIMD, eSize32, eEncodingA1, "VCLS"},
{ 0xffb30b90, 0xf3b10200, AdvancedSIMD, eSize32, eEncodingA1, "VCLT (immediate #0)"},
{ 0xffb30f90, 0xf3b00480, AdvancedSIMD, eSize32, eEncodingA1, "VCLZ"},
{ 0x0fbf0e50, 0x0eb40a40, VFPv2 | VFPv3 | VFPv4, eSize32, eEncodingA1, "VCMP, VCMPE"},
{ 0x0fbf0e7f, 0x0eb50a40, VFPv2 | VFPv3 | VFPv4, eSize32, eEncodingA2, "VCMP, VCMPE"},
{ 0xffb30f90, 0xf3b00500, AdvancedSIMD, eSize32, eEncodingA1, "VCNT"},
{ 0xffb30e10, 0xf3b30600, AdvancedSIMD, eSize32, eEncodingA1, "VCVT (between floating-point and integer, AdvancedSIMD)"},
{ 0x0fb80e50, 0x0eb80a40, VFPv2 | VFPv3 | VFPv4, eSize32, eEncodingA1, "VCVT, VCVTR (between floating-point and integer, Floating-point)"},
{ 0xfe800e90, 0xf2800e10, AdvancedSIMD, eSize32, eEncodingA1, "VCVT (between floating-point and fixed-point, AdvancedSIMD)"},
{ 0x0fba0e50, 0x0eba0a40, VFPv3 | VFPv4, eSize32, eEncodingA1, "VCVT (between floating-point and fixed-point, Floating-point)"},
{ 0x0fbf0ed0, 0x0eb70ac0, VFPv2 | VFPv3 | VFPv4, eSize32, eEncodingA1, "VCVT (between double-precision and single-precision)"},
{ 0xffb30ed0, 0xf3b20600, AdvancedSIMD, eSize32, eEncodingA1, "VCVT (between half-precision and single-precision, AdvancedSIMD)"},
{ 0x0fbe0f50, 0x0eb20a40, VFPv3 | VFPv4, eSize32, eEncodingA1, "VCVTB, VCVTT"},
{ 0x0fb00e50, 0x0e800a00, VFPv2 | VFPv3 | VFPv4, eSize32, eEncodingA1, "VDIV"},
{ 0xffb00f90, 0xf3b00c00, AdvancedSIMD, eSize32, eEncodingA1, "VDUP (scalar)"},
{ 0x0f900f5f, 0x0e800b10, AdvancedSIMD, eSize32, eEncodingA1, "VDUP (ARM core register)"},
{ 0xffb00f10, 0xf3000110, AdvancedSIMD, eSize32, eEncodingA1, "VEOR"},
{ 0xffb00010, 0xf2b00000, AdvancedSIMD, eSize32, eEncodingA1, "VEXT"},
{ 0xff800f10, 0xf2000c10, AdvancedSIMDv2, eSize32, eEncodingA1, "VFMA, VFMS"},
{ 0x0fb00e10, 0x0ea00a00, VFPv4, eSize32, eEncodingA2, "VFMA, VFMS"},
{ 0x0fb00e10, 0x0e900a00, VFPv4, eSize32, eEncodingA1, "VFNMA, VFNMS"},
{ 0xfe800d10, 0xf2000000, AdvancedSIMD, eSize32, eEncodingA1, "VHADD, VHSUB"},
{ 0xffb00000, 0xf4200000, AdvancedSIMD, eSize32, eEncodingA1, "VLD1 (multiple single elements)"},
{ 0xffb00300, 0xf4a00000, AdvancedSIMD, eSize32, eEncodingA1, "VLD1 (single element to one lane)"},
{ 0xffb00f00, 0xf4a00c00, AdvancedSIMD, eSize32, eEncodingA1, "VLD1 (single element to all lanes)"},
{ 0xffb00000, 0xf4200000, AdvancedSIMD, eSize32, eEncodingA1, "VLD2 (multiple 2-element structures)"},
{ 0xffb00300, 0xf4a00100, AdvancedSIMD, eSize32, eEncodingA1, "VLD2 (single 2-element structure to one lane)"},
{ 0xffb00f00, 0xf4a00d00, AdvancedSIMD, eSize32, eEncodingA1, "VLD2 (single 2-element structure to all lanes)"},
{ 0xffb00000, 0xf4200000, AdvancedSIMD, eSize32, eEncodingA1, "VLD3 (multiple 3-element structures)"},
{ 0xffb00300, 0xf4a00200, AdvancedSIMD, eSize32, eEncodingA1, "VLD3 (single 3-element structure to one lane)"},
{ 0xffb00f00, 0xf4a00e00, AdvancedSIMD, eSize32, eEncodingA1, "VLD3 (single 3-element structure to all lanes)"},
{ 0xffb00000, 0xf4200000, AdvancedSIMD, eSize32, eEncodingA1, "VLD4 (multiple 4-element structures)"},
{ 0xffb00300, 0xf4a00300, AdvancedSIMD, eSize32, eEncodingA1, "VLD4 (single 4-element structure to one lane)"},
{ 0xffb00f00, 0xf4a00f00, AdvancedSIMD, eSize32, eEncodingA1, "VLD4 (single 4-element structure to all lanes)"},
{ 0x0e100f00, 0x0c100b00, VFPv2 | VFPv3 | VFPv4 | AdvancedSIMD, eSize32, eEncodingA1, "VLDM"},
{ 0x0e100f00, 0x0c100a00, VFPv2 | VFPv3 | VFPv4, eSize32, eEncodingA2, "VLDM"},
{ 0x0f300f00, 0x0d100b00, VFPv2 | VFPv3 | VFPv4 | AdvancedSIMD, eSize32, eEncodingA1, "VLDR"},
{ 0x0f300f00, 0x0d100a00, VFPv2 | VFPv3 | VFPv4, eSize32, eEncodingA2, "VLDR"},
{ 0xfe800f00, 0xf2000600, AdvancedSIMD, eSize32, eEncodingA1, "VMAX, VMIN (integer)"},
{ 0xff800f10, 0xf2000f00, AdvancedSIMD, eSize32, eEncodingA1, "VMAX, VMIN (floating-point)"},
{ 0xfe800f10, 0xf2000900, AdvancedSIMD, eSize32, eEncodingA1, "VMLA, VMLAL, VMLS, VMLSL (integer)"},
{ 0xfe800d50, 0xf2800800, AdvancedSIMD, eSize32, eEncodingA2, "VMLA, VMLAL, VMLS, VMLSL (integer)"},
{ 0xff800f10, 0xf2000d10, AdvancedSIMD, eSize32, eEncodingA1, "VMLA, VMLS (floating-point)"},
{ 0x0fb00e10, 0x0e000a00, VFPv2 | VFPv3 | VFPv4, eSize32, eEncodingA2, "VMLA, VMLS (floating-point)"},
{ 0xfe800a50, 0xf2800040, AdvancedSIMD, eSize32, eEncodingA1, "VMLA, VMLAL, VMLS, VMLSL (by scalar)"},
{ 0xfe800b50, 0xf2800240, AdvancedSIMD, eSize32, eEncodingA2, "VMLA, VMLAL, VMLS, VMLSL (by scalar)"},
{ 0xfeb80090, 0xf2800010, AdvancedSIMD, eSize32, eEncodingA1, "VMOV (immediate)"},
{ 0x0fb00ef0, 0x0eb00a00, VFPv3 | VFPv4, eSize32, eEncodingA2, "VMOV (immediate)"},
{ 0xffb00f10, 0xf2200110, AdvancedSIMD, eSize32, eEncodingA1, "VMOV (register)"},
{ 0x0fbf0ed0, 0x0eb00a40, VFPv2 | VFPv3 | VFPv4, eSize32, eEncodingA2, "VMOV (register)"},
{ 0x0f900f1f, 0x0e000b10, AdvancedSIMD, eSize32, eEncodingA1, "VMOV (ARM core register to scalar)"},
{ 0x0f100f1f, 0x0e100b10, AdvancedSIMD, eSize32, eEncodingA1, "VMOV (scalar to ARM core register)"},
{ 0x0fe00f7f, 0x0e000a10, VFPv2 | VFPv3 | VFPv4, eSize32, eEncodingA1, "VMOV (between ARM core register and single-precision register)"},
{ 0x0fe00fd0, 0x0c400a10, VFPv2 | VFPv3 | VFPv4, eSize32, eEncodingA1, "VMOV (between two ARM core registers and two single-precision registers)"},
{ 0x0fe00fd0, 0x0c400b10, VFPv2 | VFPv3 | VFPv4 | AdvancedSIMD, eSize32, eEncodingA1, "VMOV (between two ARM core registers and a doubleword extension register)"},
{ 0xfe870fd0, 0xf2800a10, AdvancedSIMD, eSize32, eEncodingA1, "VMOVL"},
{ 0xffb30fd0, 0xf3b20200, AdvancedSIMD, eSize32, eEncodingA1, "VMOVN"},
{ 0x0ff00fff, 0x0ef00a10, VFPv2 | VFPv3 | VFPv4 | AdvancedSIMD, eSize32, eEncodingA1, "VMRS"},
{ 0x0ff00fff, 0x0ee00a10, VFPv2 | VFPv3 | VFPv4 | AdvancedSIMD, eSize32, eEncodingA1, "VMSR"},
{ 0xfe800f10, 0xf2000910, AdvancedSIMD, eSize32, eEncodingA1, "VMUL, VMULL (integer and polynomial)"},
{ 0xfe800d50, 0xf2800c00, AdvancedSIMD, eSize32, eEncodingA2, "VMUL, VMULL (integer and polynomial)"},
{ 0xffa00f10, 0xf3000d10, AdvancedSIMD, eSize32, eEncodingA1, "VMUL (floating-point)"},
{ 0x0fb00e50, 0x0e200a00, VFPv2 | VFPv3 | VFPv4, eSize32, eEncodingA2, "VMUL (floating-point)"},
{ 0xfe800e50, 0xf2800840, AdvancedSIMD, eSize32, eEncodingA1, "VMUL, VMULL (by scalar)"},
{ 0xfe800f50, 0xf2800a40, AdvancedSIMD, eSize32, eEncodingA2, "VMUL, VMULL (by scalar)"},
{ 0xfeb800b0, 0xf2800030, AdvancedSIMD, eSize32, eEncodingA1, "VMVN (immediate)"},
{ 0xffb30f90, 0xf3b00580, AdvancedSIMD, eSize32, eEncodingA1, "VMVN (register)"},
{ 0xffb30b90, 0xf3b10380, AdvancedSIMD, eSize32, eEncodingA1, "VNEG"},
{ 0x0fbf0ed0, 0x0eb10a40, VFPv2 | VFPv3 | VFPv4, eSize32, eEncodingA2, "VNEG"},
{ 0x0fb00e10, 0x0e100a00, VFPv2 | VFPv3 | VFPv4, eSize32, eEncodingA1, "VNMLA, VNMLS, VNMUL"},
{ 0x0fb00e50, 0x0e200a40, VFPv2 | VFPv3 | VFPv4, eSize32, eEncodingA2, "VNMLA, VNMLS, VNMUL"},
{ 0xffb00f10, 0xf2300110, AdvancedSIMD, eSize32, eEncodingA1, "VORN (register)"},
{ 0xfeb800b0, 0xf2800010, AdvancedSIMD, eSize32, eEncodingA1, "VORR (immediate)"},
{ 0xffb00f10, 0xf2200110, AdvancedSIMD, eSize32, eEncodingA1, "VORR (register)"},
{ 0xffb30f10, 0xf3b00600, AdvancedSIMD, eSize32, eEncodingA1, "VPADAL"},
{ 0xff800f10, 0xf2000b10, AdvancedSIMD, eSize32, eEncodingA1, "VPADD (integer)"},
{ 0xffa00f10, 0xf3000d00, AdvancedSIMD, eSize32, eEncodingA1, "VPADD (floating-point)"},
{ 0xffb30f10, 0xf3b00200, AdvancedSIMD, eSize32, eEncodingA1, "VPADDL"},
{ 0xfe800f00, 0xf2000a00, AdvancedSIMD, eSize32, eEncodingA1, "VPMAX, VPMIN (integer)"},
{ 0xff800f10, 0xf3000f00, AdvancedSIMD, eSize32, eEncodingA1, "VPMAX, VPMIN (floating-point)"},
{ 0x0fbf0f00, 0x0cbd0b00, VFPv2 | VFPv3 | VFPv4 | AdvancedSIMD, eSize32, eEncodingA1, "VPOP"},
{ 0x0fbf0f00, 0x0cbd0a00, VFPv2 | VFPv3 | VFPv4, eSize32, eEncodingA2, "VPOP"},
{ 0x0fbf0f00, 0x0d2d0b00, VFPv2 | VFPv3 | VFPv4 | AdvancedSIMD, eSize32, eEncodingA1, "VPUSH"},
{ 0x0fbf0f00, 0x0d2d0a00, VFPv2 | VFPv3 | VFPv4, eSize32, eEncodingA2, "VPUSH"},
{ 0xffb30f90, 0xf3b00700, AdvancedSIMD, eSize32, eEncodingA1, "VQABS"},
{ 0xfe800f10, 0xf2000010, AdvancedSIMD, eSize32, eEncodingA1, "VQADD"},
{ 0xff800d50, 0xf2800900, AdvancedSIMD, eSize32, eEncodingA1, "VQDMLAL, VQDMLSL"},
{ 0xff800b50, 0xf2800340, AdvancedSIMD, eSize32, eEncodingA2, "VQDMLAL, VQDMLSL"},
{ 0xff800f10, 0xf2000b00, AdvancedSIMD, eSize32, eEncodingA1, "VQDMULH"},
{ 0xfe800f50, 0xf2800c40, AdvancedSIMD, eSize32, eEncodingA2, "VQDMULH"},
{ 0xff800f50, 0xf2800d00, AdvancedSIMD, eSize32, eEncodingA1, "VQDMULL"},
{ 0xff800f50, 0xf2800b40, AdvancedSIMD, eSize32, eEncodingA2, "VQDMULL"},
{ 0xffb30f10, 0xf3b20200, AdvancedSIMD, eSize32, eEncodingA1, "VQMOVN, VQMOVUN"},
{ 0xffb30f90, 0xf3b00780, AdvancedSIMD, eSize32, eEncodingA1, "VQNEG"},
{ 0xff800f10, 0xf3000b00, AdvancedSIMD, eSize32, eEncodingA1, "VQRDMULH"},
{ 0xfe800f50, 0xf2800d40, AdvancedSIMD, eSize32, eEncodingA2, "VQRDMULH"},
{ 0xfe800f10, 0xf2000510, AdvancedSIMD, eSize32, eEncodingA1, "VQRSHL"},
{ 0xfe800ed0, 0xf2800850, AdvancedSIMD, eSize32, eEncodingA1, "VQRSHRN, VQRSHRUN"},
{ 0xfe800f10, 0xf2000410, AdvancedSIMD, eSize32, eEncodingA1, "VQSHL (register)"},
{ 0xfe800e10, 0xf2800610, AdvancedSIMD, eSize32, eEncodingA1, "VQSHL, VQSHLU (immediate)"},
{ 0xfe800ed0, 0xf2800810, AdvancedSIMD, eSize32, eEncodingA1, "VQSHRN, VQSHRUN"},
{ 0xfe800f10, 0xf2000210, AdvancedSIMD, eSize32, eEncodingA1, "VQSUB"},
{ 0xff800f50, 0xf3800400, AdvancedSIMD, eSize32, eEncodingA1, "VRADDHN"},
{ 0xffb30e90, 0xf3b30400, AdvancedSIMD, eSize32, eEncodingA1, "VRECPE"},
{ 0xffa00f10, 0xf2000f10, AdvancedSIMD, eSize32, eEncodingA1, "VRECPS"},
{ 0xffb30e10, 0xf3b00000, AdvancedSIMD, eSize32, eEncodingA1, "VREV16, VREV32, VREV64"},
{ 0xfe800f10, 0xf2000100, AdvancedSIMD, eSize32, eEncodingA1, "VRHADD"},
{ 0xfe800f10, 0xf2000500, AdvancedSIMD, eSize32, eEncodingA1, "VRSHL"},
{ 0xfe800f10, 0xf2800210, AdvancedSIMD, eSize32, eEncodingA1, "VRSHR"},
{ 0xff800fd0, 0xf2800850, AdvancedSIMD, eSize32, eEncodingA1, "VRSHRN"},
{ 0xffb30e90, 0xf3b30480, AdvancedSIMD, eSize32, eEncodingA1, "VRSQRTE"},
{ 0xffa00f10, 0xf2200f10, AdvancedSIMD, eSize32, eEncodingA1, "VRSQRTS"},
{ 0xfe800f10, 0xf2800310, AdvancedSIMD, eSize32, eEncodingA1, "VRSRA"},
{ 0xff800f50, 0xf3800600, AdvancedSIMD, eSize32, eEncodingA1, "VRSUBHN"},
{ 0xff800f10, 0xf2800510, AdvancedSIMD, eSize32, eEncodingA1, "VSHL (immediate)"},
{ 0xfe800f10, 0xf2000400, AdvancedSIMD, eSize32, eEncodingA1, "VSHL (register)"},
{ 0xfe800fd0, 0xf2800a10, AdvancedSIMD, eSize32, eEncodingA1, "VSHLL"},
{ 0xffb30fd0, 0xf3b20300, AdvancedSIMD, eSize32, eEncodingA2, "VSHLL"},
{ 0xfe800f10, 0xf2800010, AdvancedSIMD, eSize32, eEncodingA1, "VSHR"},
{ 0xff800fd0, 0xf2800810, AdvancedSIMD, eSize32, eEncodingA1, "VSHRN"},
{ 0xff800f10, 0xf3800510, AdvancedSIMD, eSize32, eEncodingA1, "VSLI"},
{ 0x0fbf0ed0, 0x0eb10ac0, VFPv2 | VFPv3 | VFPv4, eSize32, eEncodingA1, "VSQRT"},
{ 0xfe800f10, 0xf2800110, AdvancedSIMD, eSize32, eEncodingA1, "VSRA"},
{ 0xff800f10, 0xf3800410, AdvancedSIMD, eSize32, eEncodingA1, "VSRI"},
{ 0xffb00000, 0xf4000000, AdvancedSIMD, eSize32, eEncodingA1, "VST1 (multiple single elements)"},
{ 0xffb00300, 0xf4800000, AdvancedSIMD, eSize32, eEncodingA1, "VST1 (single element from one lane)"},
{ 0xffb00000, 0xf4000000, AdvancedSIMD, eSize32, eEncodingA1, "VST2 (multiple 2-element structures)"},
{ 0xffb00300, 0xf4800100, AdvancedSIMD, eSize32, eEncodingA1, "VST2 (single 2-element structure from one lane)"},
{ 0xffb00000, 0xf4000000, AdvancedSIMD, eSize32, eEncodingA1, "VST3 (multiple 3-element structures)"},
{ 0xffb00300, 0xf4800200, AdvancedSIMD, eSize32, eEncodingA1, "VST3 (single 3-element structure from one lane)"},
{ 0xffb00000, 0xf4000000, AdvancedSIMD, eSize32, eEncodingA1, "VST4 (multiple 4-element structures)"},
{ 0xffb00300, 0xf4800300, AdvancedSIMD, eSize32, eEncodingA1, "VST4 (single 4-element structure from one lane)"},
{ 0x0e100f00, 0x0c000b00, VFPv2 | VFPv3 | VFPv4 | AdvancedSIMD, eSize32, eEncodingA1, "VSTM"},
{ 0x0e100f00, 0x0c000a00, VFPv2 | VFPv3 | VFPv4, eSize32, eEncodingA2, "VSTM"},
{ 0x0f300f00, 0x0d000b00, VFPv2 | VFPv3 | VFPv4 | AdvancedSIMD, eSize32, eEncodingA1, "VSTR"},
{ 0x0f300f00, 0x0d000a00, VFPv2 | VFPv3 | VFPv4, eSize32, eEncodingA2, "VSTR"},
{ 0xff800f10, 0xf3000800, AdvancedSIMD, eSize32, eEncodingA1, "VSUB (integer)"},
{ 0xffa00f10, 0xf2200d00, AdvancedSIMD, eSize32, eEncodingA1, "VSUB (floating-point)"},
{ 0x0fb00e50, 0x0e300a40, VFPv2 | VFPv3 | VFPv4, eSize32, eEncodingA2, "VSUB (floating-point)"},
{ 0xff800f50, 0xf2800600, AdvancedSIMD, eSize32, eEncodingA1, "VSUBHN"},
{ 0xfe800e50, 0xf2800200, AdvancedSIMD, eSize32, eEncodingA1, "VSUBL, VSUBW"},
{ 0xffb30f90, 0xf3b20000, AdvancedSIMD, eSize32, eEncodingA1, "VSWP"},
{ 0xffb00c10, 0xf3b00800, AdvancedSIMD, eSize32, eEncodingA1, "VTBL, VTBX"},
{ 0xffb30f90, 0xf3b20080, AdvancedSIMD, eSize32, eEncodingA1, "VTRN"},
{ 0xff800f10, 0xe2000810, AdvancedSIMD, eSize32, eEncodingA1, "VTST"},
{ 0xffb30f90, 0xf3b20100, AdvancedSIMD, eSize32, eEncodingA1, "VUZP"},
{ 0xffb30f90, 0xf3b20180, AdvancedSIMD, eSize32, eEncodingA1, "VZIP"},
{ 0x00000000, 0x00000000, ARMvAll, eSize32, eEncodingA1, "UNKNOWN"}
};
ARMOpcode thumb_opcodes[] = {
{ 0xfbe08000, 0xf1400000, ARMv6T2 | ARMv7, eSize32, eEncodingT1, "ADC Immediate"},
{ 0xffffffc0, 0x00004140, ARMv4T | ARMv5TAll | ARMv6All | ARMv7, eSize16, eEncodingT1, "ADC Register"},
{ 0xffe08000, 0xeb400000, ARMv6T2 | ARMv7, eSize32, eEncodingT2, "ADC Register"},
{ 0xfffffe00, 0x00001c00, ARMv4T | ARMv5TAll | ARMv6All | ARMv7, eSize16, eEncodingT1, "ADD (immediate, Thumb)"},
{ 0xfffff800, 0x00003000, ARMv4T | ARMv5TAll | ARMv6All | ARMv7, eSize16, eEncodingT2, "ADD (immediate, Thumb)"},
{ 0xfbe08000, 0xf1000000, ARMv6T2 | ARMv7, eSize32, eEncodingT3, "ADD (immediate, Thumb)"},
{ 0xfbf08000, 0xf2000000, ARMv6T2 | ARMv7, eSize32, eEncodingT4, "ADD (immediate, Thumb)"},
{ 0xfffffe00, 0x00001800, ARMv4T | ARMv5TAll | ARMv6All | ARMv7, eSize16, eEncodingT1, "ADD (register, Thumb)"},
{ 0xffffff00, 0x00004400, ARMv4T | ARMv5TAll | ARMv6All | ARMv7, eSize16, eEncodingT2, "ADD (register, Thumb)"},
{ 0xffe08000, 0xeb000000, ARMv6T2 | ARMv7, eSize32, eEncodingT3, "ADD (register, Thumb)"},
{ 0xfffff800, 0x0000a800, ARMv4T | ARMv5TAll | ARMv6All | ARMv7, eSize16, eEncodingT1, "ADD (SP plus immediate)"},
{ 0xffffff80, 0x0000b000, ARMv4T | ARMv5TAll | ARMv6All | ARMv7, eSize16, eEncodingT2, "ADD (SP plus immediate)"},
{ 0xfbef8000, 0xf10d0000, ARMv6T2 | ARMv7, eSize32, eEncodingT3, "ADD (SP plus immediate)"},
{ 0xfbff8000, 0xf20d0000, ARMv6T2 | ARMv7, eSize32, eEncodingT4, "ADD (SP plus immediate)"},
{ 0xffffff78, 0x00004468, ARMv4T | ARMv5TAll | ARMv6All | ARMv7, eSize16, eEncodingT1, "ADD (SP plus register, Thumb)"},
{ 0xffffff87, 0x00004485, ARMv4T | ARMv5TAll | ARMv6All | ARMv7, eSize16, eEncodingT2, "ADD (SP plus register, Thumb)"},
{ 0xffef8000, 0xeb0d0000, ARMv6T2 | ARMv7, eSize32, eEncodingT3, "ADD (SP plus register, Thumb)"},
{ 0xfffff800, 0x0000a000, ARMv4T | ARMv5TAll | ARMv6All | ARMv7, eSize16, eEncodingT1, "ADR"},
{ 0xfbff8000, 0xf2af0000, ARMv6T2 | ARMv7, eSize32, eEncodingT2, "ADR"},
{ 0xfbff8000, 0xf20f0000, ARMv6T2 | ARMv7, eSize32, eEncodingT3, "ADR"},
{ 0xfbe08000, 0xf0000000, ARMv6T2 | ARMv7, eSize32, eEncodingT1, "AND (immediate)"},
{ 0xffffffc0, 0x00004000, ARMv4T | ARMv5TAll | ARMv6All | ARMv7, eSize16, eEncodingT1, "AND (register)"},
{ 0xffe08000, 0xea000000, ARMv6T2 | ARMv7, eSize32, eEncodingT2, "AND (register)"},
{ 0xfffff800, 0x00001000, ARMv4T | ARMv5TAll | ARMv6All | ARMv7, eSize16, eEncodingT1, "ASR (immediate)"},
{ 0xffef8030, 0xea4f0020, ARMv6T2 | ARMv7, eSize32, eEncodingT2, "ASR (immediate)"},
{ 0xffffffc0, 0x00004100, ARMv4T | ARMv5TAll | ARMv6All | ARMv7, eSize16, eEncodingT1, "ASR (register)"},
{ 0xffe0f0f0, 0xfa40f000, ARMv6T2 | ARMv7, eSize32, eEncodingT2, "ASR (register)"},
{ 0xfffff000, 0x0000d000, ARMv4T | ARMv5TAll | ARMv6All | ARMv7, eSize16, eEncodingT1, "B"},
{ 0xfffff800, 0x0000e000, ARMv4T | ARMv5TAll | ARMv6All | ARMv7, eSize16, eEncodingT2, "B"},
{ 0xf800d000, 0xf0008000, ARMv6T2 | ARMv7, eSize32, eEncodingT3, "B"},
{ 0xf800d000, 0xf0009000, ARMv6T2 | ARMv7, eSize32, eEncodingT4, "B"},
{ 0xffff8020, 0xf36f0000, ARMv6T2 | ARMv7, eSize32, eEncodingT1, "BFC"},
{ 0xfff08020, 0xf3600000, ARMv6T2 | ARMv7, eSize32, eEncodingT1, "BFI"},
{ 0xfbe08000, 0xf0200000, ARMv6T2 | ARMv7, eSize32, eEncodingT1, "BIC (immediate)"},
{ 0xffffffc0, 0x00004380, ARMv4T | ARMv5TAll | ARMv6All | ARMv7, eSize16, eEncodingT1, "BIC (register)"},
{ 0xffe08000, 0xea200000, ARMv6T2 | ARMv7, eSize32, eEncodingT2, "BIC (register)"},
{ 0xffffff00, 0x0000be00, ARMv5TAll | ARMv6All | ARMv7, eSize16, eEncodingT1, "BKPT"},
{ 0xf800d000, 0xf000d000, ARMv4T | ARMv5TAll | ARMv6All | ARMv7, eSize32, eEncodingT1, "BL, BLX (immediate)"},
{ 0xf800d000, 0xf000c000, ARMv5TAll | ARMv6All | ARMv7, eSize32, eEncodingT2, "BL, BLX (immediate)"},
{ 0xffffff87, 0x00004780, ARMv5TAll | ARMv6All | ARMv7, eSize16, eEncodingT1, "BLX (register)"},
{ 0xffffff87, 0x00004700, ARMv4T | ARMv5TAll | ARMv6All | ARMv7, eSize16, eEncodingT1, "BX"},
{ 0xfff0ffff, 0xf3c08f00, ARMv6T2 | ARMv7, eSize32, eEncodingT1, "BXJ"},
{ 0xffffffe8, 0x0000b660, ARMv6All | ARMv7, eSize16, eEncodingT1, "CPS (Thumb)"},
{ 0xfffff800, 0xf3af8000, ARMv6T2 | ARMv7, eSize32, eEncodingT2, "CPS (Thumb)"},
{ 0xfffff500, 0x0000b100, ARMv6T2 | ARMv7, eSize16, eEncodingT1, "CBNZ, CBZ"},
{ 0xff000010, 0xee000000, ARMv6T2 | ARMv7, eSize32, eEncodingT1, "CDP, CDP2"},
{ 0xff000010, 0xfe000000, ARMv6T2 | ARMv7, eSize32, eEncodingT2, "CDP, CDP2"},
{ 0xffffffff, 0xf3bf8f2f, ARMv7, eSize32, eEncodingT1, "CLREX"},
{ 0xfff0f0f0, 0xfab0f080, ARMv6T2 | ARMv7, eSize32, eEncodingT1, "CLZ"},
{ 0xfbf08f00, 0xf1100f00, ARMv6T2 | ARMv7, eSize32, eEncodingT1, "CMN (immediate)"},
{ 0xffffffc0, 0x000042c0, ARMv4T | ARMv5TAll | ARMv6All | ARMv7, eSize16, eEncodingT1, "CMN (register)"},
{ 0xfff08f00, 0xeb100f00, ARMv6T2 | ARMv7, eSize32, eEncodingT2, "CMN (register)"},
{ 0xfffff800, 0x00002800, ARMv4T | ARMv5TAll | ARMv6All | ARMv7, eSize16, eEncodingT1, "CMP (immediate)"},
{ 0xfbf08f00, 0xf1b00f00, ARMv6T2 | ARMv7, eSize32, eEncodingT2, "CMP (immediate)"},
{ 0xffffffc0, 0x00004280, ARMv4T | ARMv5TAll | ARMv6All | ARMv7, eSize16, eEncodingT1, "CMP (register)"},
{ 0xffffff00, 0x00004500, ARMv4T | ARMv5TAll | ARMv6All | ARMv7, eSize16, eEncodingT2, "CMP (register)"},
{ 0xfff08f00, 0xebb00f00, ARMv6T2 | ARMv7, eSize32, eEncodingT3, "CMP (register)"},
{ 0xfffffff0, 0xf3af80f0, ARMv7, eSize32, eEncodingT1, "DBG"},
{ 0xfffffff0, 0xf3bf8f50, ARMv7, eSize32, eEncodingT1, "DMB"},
{ 0xfffffff0, 0xf3bf8f40, ARMv7, eSize32, eEncodingT1, "DSB"},
{ 0xfbe08000, 0xf0800000, ARMv6T2 | ARMv7, eSize32, eEncodingT1, "EOR (immediate)"},
{ 0xffffffc0, 0x00004040, ARMv4T | ARMv5TAll | ARMv6All | ARMv7, eSize16, eEncodingT1, "EOR (register)"},
{ 0xffe08000, 0xea800000, ARMv6T2 | ARMv7, eSize32, eEncodingT2, "EOR (register)"},
{ 0xfffffff0, 0xf3bf8f60, ARMv7, eSize32, eEncodingT1, "ISB"},
{ 0xffffff00, 0x0000bf00, ARMv6T2 | ARMv7, eSize16, eEncodingT1, "IT"},
{ 0xffd0ffff, 0xe810c000, ARMv6T2 | ARMv7, eSize32, eEncodingT1, "RFE"},
{ 0xffd0ffff, 0xe990c000, ARMv6T2 | ARMv7, eSize32, eEncodingT2, "RFE"},
{ 0xfe100000, 0xec100000, ARMv6T2 | ARMv7, eSize32, eEncodingT1, "LDC, LDC2 (immediate)"},
{ 0xfe100000, 0xfc100000, ARMv6T2 | ARMv7, eSize32, eEncodingT2, "LDC, LDC2 (immediate)"},
{ 0xfe1f0000, 0xec1f0000, ARMv6T2 | ARMv7, eSize32, eEncodingT1, "LDC, LDC2 (literal)"},
{ 0xfe1f0000, 0xfc1f0000, ARMv6T2 | ARMv7, eSize32, eEncodingT2, "LDC, LDC2 (literal)"},
{ 0xfffff800, 0x0000c800, ARMv4T | ARMv5TAll | ARMv6All | ARMv7, eSize16, eEncodingT1, "LDM/LDMIA/LDMFD (Thumb)"},
{ 0xffd02000, 0xe8900000, ARMv6T2 | ARMv7, eSize32, eEncodingT2, "LDM/LDMIA/LDMFD (Thumb)"},
{ 0xffd02000, 0xe9100000, ARMv6T2 | ARMv7, eSize32, eEncodingT1, "LDMDB/LDMEA"},
{ 0xfffff800, 0x00006800, ARMv4T | ARMv5TAll | ARMv6All | ARMv7, eSize16, eEncodingT1, "LDR (immediate, Thumb)"},
{ 0xfffff800, 0x00009800, ARMv4T | ARMv5TAll | ARMv6All | ARMv7, eSize16, eEncodingT2, "LDR (immediate, Thumb)"},
{ 0xfff00000, 0xf8d00000, ARMv6T2 | ARMv7, eSize32, eEncodingT3, "LDR (immediate, Thumb)"},
{ 0xfff00800, 0xf8500800, ARMv6T2 | ARMv7, eSize32, eEncodingT4, "LDR (immediate, Thumb)"},
{ 0xfff0ffc0, 0xf910f000, ARMv7, eSize32, eEncodingT1, "PLI (register)"},
{ 0xfffff800, 0x00004800, ARMv4T | ARMv5TAll | ARMv6All | ARMv7, eSize16, eEncodingT1, "LDR (literal)"},
{ 0xff7f0000, 0xf85f0000, ARMv6T2 | ARMv7, eSize32, eEncodingT2, "LDR (literal)"},
{ 0xfffffe00, 0x00005800, ARMv4T | ARMv5TAll | ARMv6All | ARMv7, eSize16, eEncodingT1, "LDR (register, Thumb)"},
{ 0xfff00fc0, 0xf8500000, ARMv6T2 | ARMv7, eSize32, eEncodingT2, "LDR (register, Thumb)"},
{ 0xfffff800, 0x00007800, ARMv4T | ARMv5TAll | ARMv6All | ARMv7, eSize16, eEncodingT1, "LDRB (immediate, Thumb)"},
{ 0xfff00000, 0xf8900000, ARMv6T2 | ARMv7, eSize32, eEncodingT2, "LDRB (immediate, Thumb)"},
{ 0xfff00800, 0xf8100800, ARMv6T2 | ARMv7, eSize32, eEncodingT3, "LDRB (immediate, Thumb)"},
{ 0xff7f0000, 0xf81f0000, ARMv6T2 | ARMv7, eSize32, eEncodingT1, "LDRB (literal)"},
{ 0xfffffe00, 0x00005c00, ARMv4T | ARMv5TAll | ARMv6All | ARMv7, eSize16, eEncodingT1, "LDRB (register)"},
{ 0xfff00fc0, 0xf8100000, ARMv6T2 | ARMv7, eSize32, eEncodingT2, "LDRB (register)"},
{ 0xfff00f00, 0xf8100e00, ARMv6T2 | ARMv7, eSize32, eEncodingT1, "LDRBT"},
{ 0xfe500000, 0xe8500000, ARMv6T2 | ARMv7, eSize32, eEncodingT1, "LDRD (immediate)"},
{ 0xfe5f0000, 0xe85f0000, ARMv6T2 | ARMv7, eSize32, eEncodingT1, "LDRD (literal)"},
{ 0xfff00f00, 0xe8500f00, ARMv6T2 | ARMv7, eSize32, eEncodingT1, "LDREX"},
{ 0xfff00fff, 0xe8d00f4f, ARMv7, eSize32, eEncodingT1, "LDREXB"},
{ 0xfff000ff, 0xe8d0007f, ARMv7, eSize32, eEncodingT1, "LDREXD"},
{ 0xfff00fff, 0xe8d00f5f, ARMv7, eSize32, eEncodingT1, "LDREXH"},
{ 0xfffff800, 0x00008800, ARMv4T | ARMv5TAll | ARMv6All | ARMv7, eSize16, eEncodingT1, "LDRH (immediate, Thumb)"},
{ 0xfff00000, 0xf8b00000, ARMv6T2 | ARMv7, eSize32, eEncodingT2, "LDRH (immediate, Thumb)"},
{ 0xfff00800, 0xf8300800, ARMv6T2 | ARMv7, eSize32, eEncodingT3, "LDRH (immediate, Thumb)"},
{ 0xff7f0000, 0xf83f0000, ARMv6T2 | ARMv7, eSize32, eEncodingT1, "LDRH (literal)"},
{ 0xfffffe00, 0x00005a00, ARMv4T | ARMv5TAll | ARMv6All | ARMv7, eSize16, eEncodingT1, "LDRH (register)"},
{ 0xfff00fc0, 0xf8300000, ARMv6T2 | ARMv7, eSize32, eEncodingT2, "LDRH (register)"},
{ 0xfff00f00, 0xf8300e00, ARMv6T2 | ARMv7, eSize32, eEncodingT1, "LDRHT"},
{ 0xfff00000, 0xf9900000, ARMv6T2 | ARMv7, eSize32, eEncodingT1, "LDRSB (immediate)"},
{ 0xfff00800, 0xf9100800, ARMv6T2 | ARMv7, eSize32, eEncodingT2, "LDRSB (immediate)"},
{ 0xff7f0000, 0xf91f0000, ARMv6T2 | ARMv7, eSize32, eEncodingT1, "LDRSB (literal)"},
{ 0xfffffe00, 0x00005600, ARMv4T | ARMv5TAll | ARMv6All | ARMv7, eSize16, eEncodingT1, "LDRSB (register)"},
{ 0xfff00fc0, 0xf9100000, ARMv6T2 | ARMv7, eSize32, eEncodingT2, "LDRSB (register)"},
{ 0xfff00f00, 0xf9100e00, ARMv6T2 | ARMv7, eSize32, eEncodingT1, "LDRSBT"},
{ 0xfff00000, 0xf9b00000, ARMv6T2 | ARMv7, eSize32, eEncodingT1, "LDRSH (immediate)"},
{ 0xfff00800, 0xf9300800, ARMv6T2 | ARMv7, eSize32, eEncodingT2, "LDRSH (immediate)"},
{ 0xff7f0000, 0xf93f0000, ARMv6T2 | ARMv7, eSize32, eEncodingT1, "LDRSH (literal)"},
{ 0xfffffe00, 0x00005e00, ARMv4T | ARMv5TAll | ARMv6All | ARMv7, eSize16, eEncodingT1, "LDRSH (register)"},
{ 0xfff00fc0, 0xf9300000, ARMv6T2 | ARMv7, eSize32, eEncodingT2, "LDRSH (register)"},
{ 0xfff00f00, 0xf9300e00, ARMv6T2 | ARMv7, eSize32, eEncodingT1, "LDRSHT"},
{ 0xfff00f00, 0xf8500e00, ARMv6T2 | ARMv7, eSize32, eEncodingT1, "LDRT"},
{ 0xfffff800, 0x00000000, ARMv4T | ARMv5TAll | ARMv6All | ARMv7, eSize16, eEncodingT1, "LSL (immediate)"},
{ 0xffef8030, 0xea4f0000, ARMv6T2 | ARMv7, eSize32, eEncodingT2, "LSL (immediate)"},
{ 0xffffffc0, 0x00004080, ARMv4T | ARMv5TAll | ARMv6All | ARMv7, eSize16, eEncodingT1, "LSL (register)"},
{ 0xffe0f0f0, 0xfa00f000, ARMv6T2 | ARMv7, eSize32, eEncodingT2, "LSL (register)"},
{ 0xfffff800, 0x00000800, ARMv4T | ARMv5TAll | ARMv6All | ARMv7, eSize16, eEncodingT1, "LSR (immediate)"},
{ 0xffef8030, 0xea4f0010, ARMv6T2 | ARMv7, eSize32, eEncodingT2, "LSR (immediate)"},
{ 0xffffffc0, 0x000040c0, ARMv4T | ARMv5TAll | ARMv6All | ARMv7, eSize16, eEncodingT1, "LSR (register)"},
{ 0xffe0f0f0, 0xfa20f000, ARMv6T2 | ARMv7, eSize32, eEncodingT2, "LSR (register)"},
{ 0xff100010, 0xee000010, ARMv6T2 | ARMv7, eSize32, eEncodingT1, "MCR, MCR2"},
{ 0xff100010, 0xfe000010, ARMv6T2 | ARMv7, eSize32, eEncodingT2, "MCR, MCR2"},
{ 0xfff00000, 0xec400000, ARMv6T2 | ARMv7, eSize32, eEncodingT1, "MCRR, MCRR2"},
{ 0xfff00000, 0xec400000, ARMv6T2 | ARMv7, eSize32, eEncodingT2, "MCRR, MCRR2"},
{ 0xfff000f0, 0xfb000000, ARMv6T2 | ARMv7, eSize32, eEncodingT1, "MLA"},
{ 0xfff000f0, 0xfb000010, ARMv6T2 | ARMv7, eSize32, eEncodingT1, "MLS"},
{ 0xfffff800, 0x00002000, ARMv4T | ARMv5TAll | ARMv6All | ARMv7, eSize16, eEncodingT1, "MOV (immediate)"},
{ 0xfbef8000, 0xf04f0000, ARMv6T2 | ARMv7, eSize32, eEncodingT2, "MOV (immediate)"},
{ 0xfbf08000, 0xf2400000, ARMv6T2 | ARMv7, eSize32, eEncodingT3, "MOV (immediate)"},
{ 0xffffff00, 0x00004600, ARMv4T | ARMv5TAll | ARMv6All | ARMv7, eSize16, eEncodingT1, "MOV (register, Thumb)"},
{ 0xffffffc0, 0x00000000, ARMv4T | ARMv5TAll | ARMv6All | ARMv7, eSize16, eEncodingT2, "MOV (register, Thumb)"},
{ 0xffeff0f0, 0xea4f0000, ARMv6T2 | ARMv7, eSize32, eEncodingT3, "MOV (register, Thumb)"},
{ 0xfbf08000, 0xf2c00000, ARMv6T2 | ARMv7, eSize32, eEncodingT1, "MOVT"},
{ 0xff100010, 0xee100010, ARMv6T2 | ARMv7, eSize32, eEncodingT1, "MRC, MRC2"},
{ 0xff100010, 0xfe100010, ARMv6T2 | ARMv7, eSize32, eEncodingT2, "MRC, MRC2"},
{ 0xfff00000, 0xec500000, ARMv6T2 | ARMv7, eSize32, eEncodingT1, "MRRC, MRRC2"},
{ 0xfff00000, 0xfc500000, ARMv6T2 | ARMv7, eSize32, eEncodingT2, "MRRC, MRRC2"},
{ 0xffeff0ff, 0xf3ef8000, ARMv6T2 | ARMv7, eSize32, eEncodingT1, "MRS"},
{ 0xffe0f0ff, 0xf3808000, ARMv6T2 | ARMv7, eSize32, eEncodingT1, "MSR (register)"},
{ 0xffffffc0, 0x00004340, ARMv4T | ARMv5TAll | ARMv6All | ARMv7, eSize16, eEncodingT1, "MUL"},
{ 0xfff0f0f0, 0xfb00f000, ARMv6T2 | ARMv7, eSize32, eEncodingT2, "MUL"},
{ 0xfbef8000, 0xf06f0000, ARMv6T2 | ARMv7, eSize32, eEncodingT1, "MVN (immediate)"},
{ 0xffffffc0, 0x000043c0, ARMv4T | ARMv5TAll | ARMv6All | ARMv7, eSize16, eEncodingT1, "MVN (register)"},
{ 0xffef8000, 0xea6f0000, ARMv6T2 | ARMv7, eSize32, eEncodingT2, "MVN (register)"},
{ 0xffffffff, 0x0000bf00, ARMv6T2 | ARMv7, eSize16, eEncodingT1, "NOP"},
{ 0xffffffff, 0xf3af8000, ARMv6T2 | ARMv7, eSize32, eEncodingT2, "NOP"},
{ 0xfbe08000, 0xf0600000, ARMv6T2 | ARMv7, eSize32, eEncodingT1, "ORN (immediate)"},
{ 0xffe08000, 0xea600000, ARMv6T2 | ARMv7, eSize32, eEncodingT1, "ORN (register)"},
{ 0xfbe08000, 0xf0400000, ARMv6T2 | ARMv7, eSize32, eEncodingT1, "ORR (immediate)"},
{ 0xffffffc0, 0x00004300, ARMv4T | ARMv5TAll | ARMv6All | ARMv7, eSize16, eEncodingT1, "ORR (register)"},
{ 0xffe08000, 0xea400000, ARMv6T2 | ARMv7, eSize32, eEncodingT2, "ORR (register)"},
{ 0xffe08000, 0xeac00000, ARMv6T2 | ARMv7, eSize32, eEncodingT1, "PKH"},
{ 0xffd0f000, 0xf890f000, ARMv6T2 | ARMv7, eSize32, eEncodingT1, "PLD, PLDW (immediate)"},
{ 0xffd0ff00, 0xf810fc00, ARMv6T2 | ARMv7, eSize32, eEncodingT2, "PLD, PLDW (immediate)"},
{ 0xff7ff000, 0xf81ff000, ARMv6T2 | ARMv7, eSize32, eEncodingT1, "PLD (literal)"},
{ 0xffd0ffc0, 0xf810f000, ARMv6T2 | ARMv7, eSize32, eEncodingT1, "PLD, PLDW (register)"},
{ 0xfff0f000, 0xf990f000, ARMv7, eSize32, eEncodingT1, "PLI (immediate, literal)"},
{ 0xfff0ff00, 0xf910fc00, ARMv7, eSize32, eEncodingT2, "PLI (immediate, literal)"},
{ 0xff7ff000, 0xf91ff000, ARMv7, eSize32, eEncodingT3, "PLI (immediate, literal)"},
{ 0xfffffe00, 0x0000bc00, ARMv4T | ARMv5TAll | ARMv6All | ARMv7, eSize16, eEncodingT1, "POP (Thumb)"},
{ 0xffff2000, 0xe8bd0000, ARMv6T2 | ARMv7, eSize32, eEncodingT2, "POP (Thumb)"},
{ 0xffff0fff, 0xf85d0b04, ARMv6T2 | ARMv7, eSize32, eEncodingT3, "POP (Thumb)"},
{ 0xfffffe00, 0x0000b400, ARMv4T | ARMv5TAll | ARMv6All | ARMv7, eSize16, eEncodingT1, "PUSH"},
{ 0xffffa000, 0xe92d0000, ARMv6T2 | ARMv7, eSize32, eEncodingT2, "PUSH"},
{ 0xffff0fff, 0xf84d0d04, ARMv6T2 | ARMv7, eSize32, eEncodingT3, "PUSH"},
{ 0xfff0f0f0, 0xfa80f080, ARMv6T2 | ARMv7, eSize32, eEncodingT1, "QADD"},
{ 0xfff0f0f0, 0xfa90f010, ARMv6T2 | ARMv7, eSize32, eEncodingT1, "QADD16"},
{ 0xfff0f0f0, 0xfa80f010, ARMv6T2 | ARMv7, eSize32, eEncodingT1, "QADD8"},
{ 0xfff0f0f0, 0xfaa0f010, ARMv6T2 | ARMv7, eSize32, eEncodingT1, "QASX"},
{ 0xfff0f0f0, 0xfa80f090, ARMv6T2 | ARMv7, eSize32, eEncodingT1, "QDADD"},
{ 0xfff0f0f0, 0xfa80f0b0, ARMv6T2 | ARMv7, eSize32, eEncodingT1, "QDSUB"},
{ 0xfff0f0f0, 0xfae0f010, ARMv6T2 | ARMv7, eSize32, eEncodingT1, "QSAX"},
{ 0xfff0f0f0, 0xfa80f0a0, ARMv6T2 | ARMv7, eSize32, eEncodingT1, "QSUB"},
{ 0xfff0f0f0, 0xfad0f010, ARMv6T2 | ARMv7, eSize32, eEncodingT1, "QSUB16"},
{ 0xfff0f0f0, 0xfac0f010, ARMv6T2 | ARMv7, eSize32, eEncodingT1, "QSUB8"},
{ 0xfff0f0f0, 0xfa90f0a0, ARMv6T2 | ARMv7, eSize32, eEncodingT1, "RBIT"},
{ 0xffffffc0, 0x0000ba00, ARMv6All | ARMv7, eSize16, eEncodingT1, "REV"},
{ 0xfff0f0f0, 0xfa90f080, ARMv6T2 | ARMv7, eSize32, eEncodingT2, "REV"},
{ 0xffffffc0, 0x0000ba40, ARMv6All | ARMv7, eSize16, eEncodingT1, "REV16"},
{ 0xfff0f0f0, 0xfa90f090, ARMv6T2 | ARMv7, eSize32, eEncodingT2, "REV16"},
{ 0xffffffc0, 0x0000bac0, ARMv6All | ARMv7, eSize16, eEncodingT1, "REVSH"},
{ 0xfff0f0f0, 0xfa90f0b0, ARMv6T2 | ARMv7, eSize32, eEncodingT2, "REVSH"},
{ 0xffef8030, 0xea4f0030, ARMv6T2 | ARMv7, eSize32, eEncodingT1, "ROR (immediate)"},
{ 0xffffffc0, 0x000041c0, ARMv4T | ARMv5TAll | ARMv6All | ARMv7, eSize16, eEncodingT1, "ROR (register)"},
{ 0xffe0f0f0, 0xfa60f000, ARMv6T2 | ARMv7, eSize32, eEncodingT2, "ROR (register)"},
{ 0xffeff0f0, 0xea4f0030, ARMv6T2 | ARMv7, eSize32, eEncodingT1, "RRX"},
{ 0xffffffc0, 0x00004240, ARMv4T | ARMv5TAll | ARMv6All | ARMv7, eSize16, eEncodingT1, "RSB (immediate)"},
{ 0xfbe08000, 0xf1c00000, ARMv6T2 | ARMv7, eSize32, eEncodingT2, "RSB (immediate)"},
{ 0xffe08000, 0xebc00000, ARMv6T2 | ARMv7, eSize32, eEncodingT1, "RSB (register)"},
{ 0xfff0f0f0, 0xfa90f000, ARMv6T2 | ARMv7, eSize32, eEncodingT1, "SADD16"},
{ 0xfff0f0f0, 0xfa80f000, ARMv6T2 | ARMv7, eSize32, eEncodingT1, "SADD8"},
{ 0xfff0f0f0, 0xfaa0f000, ARMv6T2 | ARMv7, eSize32, eEncodingT1, "SASX"},
{ 0xfbe08000, 0xf1600000, ARMv6T2 | ARMv7, eSize32, eEncodingT1, "SBC (immediate)"},
{ 0xffffffc0, 0x00004180, ARMv4T | ARMv5TAll | ARMv6All | ARMv7, eSize16, eEncodingT1, "SBC (register)"},
{ 0xffe08000, 0xeb600000, ARMv6T2 | ARMv7, eSize32, eEncodingT2, "SBC (register)"},
{ 0xfff08020, 0xf3400000, ARMv6T2 | ARMv7, eSize32, eEncodingT1, "SBFX"},
{ 0xfff0f0f0, 0xfb90f0f0, ARMv7R | ARMv7VE, eSize32, eEncodingT1, "SDIV"},
{ 0xfff0f0f0, 0xfaa0f080, ARMv6T2 | ARMv7, eSize32, eEncodingT1, "SEL"},
{ 0xfffffff7, 0x0000b650, ARMv6All | ARMv7, eSize16, eEncodingT1, "SETEND"},
{ 0xffffffff, 0x0000bf40, ARMv7, eSize16, eEncodingT1, "SEV"},
{ 0xffffffff, 0xf3af8004, ARMv7, eSize32, eEncodingT2, "SEV"},
{ 0xfff0f0f0, 0xfa90f020, ARMv6T2 | ARMv7, eSize32, eEncodingT1, "SHADD16"},
{ 0xfff0f0f0, 0xfa80f020, ARMv6T2 | ARMv7, eSize32, eEncodingT1, "SHADD8"},
{ 0xfff0f0f0, 0xfaa0f020, ARMv6T2 | ARMv7, eSize32, eEncodingT1, "SHASX"},
{ 0xfff0f0f0, 0xfae0f020, ARMv6T2 | ARMv7, eSize32, eEncodingT1, "SHSAX"},
{ 0xfff0f0f0, 0xfad0f020, ARMv6T2 | ARMv7, eSize32, eEncodingT1, "SHSUB16"},
{ 0xfff0f0f0, 0xfac0f020, ARMv6T2 | ARMv7, eSize32, eEncodingT1, "SHSUB8"},
{ 0xfff000c0, 0xfb100000, ARMv6T2 | ARMv7, eSize32, eEncodingT1, "SMLABB, SMLABT, SMLATB, SMLATT"},
{ 0xfff000e0, 0xfb200000, ARMv6T2 | ARMv7, eSize32, eEncodingT1, "SMLAD"},
{ 0xfff000f0, 0xfbc00000, ARMv6T2 | ARMv7, eSize32, eEncodingT1, "SMLAL"},
{ 0xfff000c0, 0xfbc00080, ARMv6T2 | ARMv7, eSize32, eEncodingT1, "SMLALBB, SMLALBT, SMLALTB, SMLALTT"},
{ 0xfff000e0, 0xfbc000c0, ARMv6T2 | ARMv7, eSize32, eEncodingT1, "SMLALD"},
{ 0xfff000e0, 0xfb300000, ARMv6T2 | ARMv7, eSize32, eEncodingT1, "SMLAWB, SMLAWT"},
{ 0xfff000e0, 0xfb400000, ARMv6T2 | ARMv7, eSize32, eEncodingT1, "SMLSD"},
{ 0xfff000e0, 0xfbd000c0, ARMv6T2 | ARMv7, eSize32, eEncodingT1, "SMLSLD"},
{ 0xfff000e0, 0xfb500000, ARMv6T2 | ARMv7, eSize32, eEncodingT1, "SMMLA"},
{ 0xfff000e0, 0xfb600000, ARMv6T2 | ARMv7, eSize32, eEncodingT1, "SMMLS"},
{ 0xfff0f0e0, 0xfb50f000, ARMv6T2 | ARMv7, eSize32, eEncodingT1, "SMMUL"},
{ 0xfff0f0e0, 0xfb20f000, ARMv6T2 | ARMv7, eSize32, eEncodingT1, "SMUAD"},
{ 0xfff0f0c0, 0xfb10f000, ARMv6T2 | ARMv7, eSize32, eEncodingT1, "SMULBB, SMULBT, SMULTB, SMULTT"},
{ 0xfff000f0, 0xfb800000, ARMv6T2 | ARMv7, eSize32, eEncodingT1, "SMULL"},
{ 0xfff0f0e0, 0xfb30f000, ARMv6T2 | ARMv7, eSize32, eEncodingT1, "SMULWB, SMULWT"},
{ 0xfff0f0e0, 0xfb40f000, ARMv6T2 | ARMv7, eSize32, eEncodingT1, "SMUSD"},
{ 0xffd08020, 0xf3000000, ARMv6T2 | ARMv7, eSize32, eEncodingT1, "SSAT"},
{ 0xfff0f0f0, 0xf3200000, ARMv6T2 | ARMv7, eSize32, eEncodingT1, "SSAT16"},
{ 0xfff0f0f0, 0xfae0f000, ARMv6T2 | ARMv7, eSize32, eEncodingT1, "SSAX"},
{ 0xfff0f0f0, 0xfad0f000, ARMv6T2 | ARMv7, eSize32, eEncodingT1, "SSUB16"},
{ 0xfff0f0f0, 0xfac0f000, ARMv6T2 | ARMv7, eSize32, eEncodingT1, "SSUB8"},
{ 0xfe100000, 0xec000000, ARMv6T2 | ARMv7, eSize32, eEncodingT1, "STC, STC2"},
{ 0xfe100000, 0xfc000000, ARMv6T2 | ARMv7, eSize32, eEncodingT2, "STC, STC2"},
{ 0xfffff800, 0x0000c000, ARMv4T | ARMv5TAll | ARMv6All | ARMv7, eSize16, eEncodingT1, "STM (STMIA, STMEA)"},
{ 0xffd0a000, 0xe8800000, ARMv6T2 | ARMv7, eSize32, eEncodingT2, "STM (STMIA, STMEA)"},
{ 0xffd0a000, 0xe9000000, ARMv6T2 | ARMv7, eSize32, eEncodingT1, "STMDB (STMFD)"},
{ 0xfffff800, 0x00006000, ARMv4T | ARMv5TAll | ARMv6All | ARMv7, eSize16, eEncodingT1, "STR (immediate, Thumb)"},
{ 0xfffff800, 0x00009000, ARMv4T | ARMv5TAll | ARMv6All | ARMv7, eSize16, eEncodingT2, "STR (immediate, Thumb)"},
{ 0xfff00000, 0xf8c00000, ARMv6T2 | ARMv7, eSize32, eEncodingT3, "STR (immediate, Thumb)"},
{ 0xfff00800, 0xf8400800, ARMv6T2 | ARMv7, eSize32, eEncodingT4, "STR (immediate, Thumb)"},
{ 0xfffffe00, 0x00005000, ARMv4T | ARMv5TAll | ARMv6All | ARMv7, eSize16, eEncodingT1, "STR (register)"},
{ 0xfff00fc0, 0xf8400000, ARMv6T2 | ARMv7, eSize32, eEncodingT2, "STR (register)"},
{ 0xfffff800, 0x00007000, ARMv4T | ARMv5TAll | ARMv6All | ARMv7, eSize16, eEncodingT1, "STRB (immediate, Thumb)"},
{ 0xfff00000, 0xf8800000, ARMv6T2 | ARMv7, eSize32, eEncodingT2, "STRB (immediate, Thumb)"},
{ 0xfff00800, 0xf8000800, ARMv6T2 | ARMv7, eSize32, eEncodingT3, "STRB (immediate, Thumb)"},
{ 0xfffffe00, 0x00005400, ARMv4T | ARMv5TAll | ARMv6All | ARMv7, eSize16, eEncodingT1, "STRB (register)"},
{ 0xfff00fc0, 0xf8000000, ARMv6T2 | ARMv7, eSize32, eEncodingT2, "STRB (register)"},
{ 0xfff00f00, 0xf8000e00, ARMv6T2 | ARMv7, eSize32, eEncodingT1, "STRBT"},
{ 0xfe500000, 0xe8400000, ARMv6T2 | ARMv7, eSize32, eEncodingT1, "STRD (immediate)"},
{ 0xfff00000, 0xe8400000, ARMv6T2 | ARMv7, eSize32, eEncodingT1, "STREX"},
{ 0xfff00ff0, 0xe8c00f40, ARMv7, eSize32, eEncodingT1, "STREXB"},
{ 0xfff000f0, 0xe8c00070, ARMv7, eSize32, eEncodingT1, "STREXD"},
{ 0xfff00ff0, 0xe8c00f50, ARMv7, eSize32, eEncodingT1, "STREXH"},
{ 0xfffff800, 0x00008000, ARMv4T | ARMv5TAll | ARMv6All | ARMv7, eSize16, eEncodingT1, "STRH (immediate, Thumb)"},
{ 0xfff00000, 0xf8a00000, ARMv6T2 | ARMv7, eSize32, eEncodingT2, "STRH (immediate, Thumb)"},
{ 0xfff00800, 0xf8200800, ARMv6T2 | ARMv7, eSize32, eEncodingT3, "STRH (immediate, Thumb)"},
{ 0xfffffe00, 0x00005200, ARMv4T | ARMv5TAll | ARMv6All | ARMv7, eSize16, eEncodingT1, "STRH (register)"},
{ 0xfff00fc0, 0xf8200000, ARMv6T2 | ARMv7, eSize32, eEncodingT2, "STRH (register)"},
{ 0xfff00f00, 0xf8200e00, ARMv6T2 | ARMv7, eSize32, eEncodingT1, "STRHT"},
{ 0xfff00f00, 0xf8400e00, ARMv6T2 | ARMv7, eSize32, eEncodingT1, "STRT"},
{ 0xfffffe00, 0x00001e00, ARMv4T | ARMv5TAll | ARMv6All | ARMv7, eSize16, eEncodingT1, "SUB (immediate, Thumb)"},
{ 0xfffff800, 0x00003800, ARMv4T | ARMv5TAll | ARMv6All | ARMv7, eSize16, eEncodingT2, "SUB (immediate, Thumb)"},
{ 0xfbe08000, 0xf1a00000, ARMv6T2 | ARMv7, eSize32, eEncodingT3, "SUB (immediate, Thumb)"},
{ 0xfbf08000, 0xf2a00000, ARMv6T2 | ARMv7, eSize32, eEncodingT4, "SUB (immediate, Thumb)"},
{ 0xfffffe00, 0x00001a00, ARMv4T | ARMv5TAll | ARMv6All | ARMv7, eSize16, eEncodingT1, "SUB (register)"},
{ 0xffe08000, 0xeba00000, ARMv6T2 | ARMv7, eSize32, eEncodingT2, "SUB (register)"},
{ 0xffffff80, 0x0000b080, ARMv4T | ARMv5TAll | ARMv6All | ARMv7, eSize16, eEncodingT1, "SUB (SP minus immediate)"},
{ 0xfbef8000, 0xf1ad0000, ARMv6T2 | ARMv7, eSize32, eEncodingT2, "SUB (SP minus immediate)"},
{ 0xfbff8000, 0xf2ad0000, ARMv6T2 | ARMv7, eSize32, eEncodingT3, "SUB (SP minus immediate)"},
{ 0xffef8000, 0xebad0000, ARMv6T2 | ARMv7, eSize32, eEncodingT1, "SUB (SP minus register)"},
{ 0xffffff00, 0x0000df00, ARMv4T | ARMv5TAll | ARMv6All | ARMv7, eSize16, eEncodingT1, "SVC"},
{ 0xfff0f0c0, 0xfa40f080, ARMv6T2 | ARMv7, eSize32, eEncodingT1, "SXTAB"},
{ 0xfff0f0c0, 0xfa20f080, ARMv6T2 | ARMv7, eSize32, eEncodingT1, "SXTAB16"},
{ 0xfff0f0c0, 0xfa00f080, ARMv6T2 | ARMv7, eSize32, eEncodingT1, "SXTAH"},
{ 0xffffffc0, 0x0000b240, ARMv6All | ARMv7, eSize16, eEncodingT1, "SXTB"},
{ 0xfffff0c0, 0xfa4ff080, ARMv6T2 | ARMv7, eSize32, eEncodingT2, "SXTB"},
{ 0xfffff0c0, 0xfa2ff080, ARMv6T2 | ARMv7, eSize32, eEncodingT1, "SXTB16"},
{ 0xffffffc0, 0x0000b200, ARMv6All | ARMv7, eSize16, eEncodingT1, "SXTH"},
{ 0xfffff0c0, 0xfa0ff080, ARMv6T2 | ARMv7, eSize32, eEncodingT2, "SXTH"},
{ 0xfff0fff0, 0xe8d0f000, ARMv6T2 | ARMv7, eSize32, eEncodingT1, "TBB"},
{ 0xfff0fff0, 0xe8d0f010, ARMv6T2 | ARMv7, eSize32, eEncodingT1, "TBH"},
{ 0xfbf08f00, 0xf0900f00, ARMv6T2 | ARMv7, eSize32, eEncodingT1, "TEQ (immediate)"},
{ 0xfff08f00, 0xea900f00, ARMv6T2 | ARMv7, eSize32, eEncodingT1, "TEQ (register)"},
{ 0xfbf08f00, 0xf0100f00, ARMv6T2 | ARMv7, eSize32, eEncodingT1, "TST (immediate)"},
{ 0xffffffc0, 0x00004200, ARMv4T | ARMv5TAll | ARMv6All | ARMv7, eSize16, eEncodingT1, "TST (register)"},
{ 0xfff08f00, 0xea100f00, ARMv6T2 | ARMv7, eSize32, eEncodingT2, "TST (register)"},
{ 0xfff0f0f0, 0xfa90f040, ARMv6T2 | ARMv7, eSize32, eEncodingT1, "UADD16"},
{ 0xfff0f0f0, 0xfa80f040, ARMv6T2 | ARMv7, eSize32, eEncodingT1, "UADD8"},
{ 0xfff0f0f0, 0xfaa0f040, ARMv6T2 | ARMv7, eSize32, eEncodingT1, "UASX"},
{ 0xfff08020, 0xf3c00000, ARMv6T2 | ARMv7, eSize32, eEncodingT1, "UBFX"},
{ 0xffffff00, 0x0000de00, ARMv4T | ARMv5TAll | ARMv6 | ARMv7, eSize16, eEncodingT1, "UDF"},
{ 0xfff0f000, 0xf7f0a000, ARMv6T2 | ARMv7, eSize32, eEncodingT2, "UDF"},
{ 0xfff0f0f0, 0xfbb0f0f0, ARMv7R | ARMv7VE, eSize32, eEncodingT1, "UDIV"},
{ 0xfff0f0f0, 0xfa90f060, ARMv6T2 | ARMv7, eSize32, eEncodingT1, "UHADD16"},
{ 0xfff0f0f0, 0xfa80f060, ARMv6T2 | ARMv7, eSize32, eEncodingT1, "UHADD8"},
{ 0xfff0f0f0, 0xfaa0f060, ARMv6T2 | ARMv7, eSize32, eEncodingT1, "UHASX"},
{ 0xfff0f0f0, 0xfae0f060, ARMv6T2 | ARMv7, eSize32, eEncodingT1, "UHSAX"},
{ 0xfff0f0f0, 0xfad0f060, ARMv6T2 | ARMv7, eSize32, eEncodingT1, "UHSUB16"},
{ 0xfff0f0f0, 0xfac0f060, ARMv6T2 | ARMv7, eSize32, eEncodingT1, "UHSUB8"},
{ 0xfff000f0, 0xfbe00060, ARMv6T2 | ARMv7, eSize32, eEncodingT1, "UMAAL"},
{ 0xfff000f0, 0xfbe00000, ARMv6T2 | ARMv7, eSize32, eEncodingT1, "UMLAL"},
{ 0xfff000f0, 0xfba00000, ARMv6T2 | ARMv7, eSize32, eEncodingT1, "UMULL"},
{ 0xfff0f0f0, 0xfa90f050, ARMv6T2 | ARMv7, eSize32, eEncodingT1, "UQADD16"},
{ 0xfff0f0f0, 0xfa80f050, ARMv6T2 | ARMv7, eSize32, eEncodingT1, "UQADD8"},
{ 0xfff0f0f0, 0xfaa0f050, ARMv6T2 | ARMv7, eSize32, eEncodingT1, "UQASX"},
{ 0xfff0f0f0, 0xfae0f050, ARMv6T2 | ARMv7, eSize32, eEncodingT1, "UQSAX"},
{ 0xfff0f0f0, 0xfad0f050, ARMv6T2 | ARMv7, eSize32, eEncodingT1, "UQSUB16"},
{ 0xfff0f0f0, 0xfac0f050, ARMv6T2 | ARMv7, eSize32, eEncodingT1, "UQSUB8"},
{ 0xfff0f0f0, 0xfb70f000, ARMv6T2 | ARMv7, eSize32, eEncodingT1, "USAD8"},
{ 0xfff000f0, 0xfb700000, ARMv6T2 | ARMv7, eSize32, eEncodingT1, "USADA8"},
{ 0xffd08020, 0xf3800000, ARMv6T2 | ARMv7, eSize32, eEncodingT1, "USAT"},
{ 0xfff0f0f0, 0xf3a00000, ARMv6T2 | ARMv7, eSize32, eEncodingT1, "USAT16"},
{ 0xfff0f0f0, 0xfae0f040, ARMv6T2 | ARMv7, eSize32, eEncodingT1, "USAX"},
{ 0xfff0f0f0, 0xfad0f040, ARMv6T2 | ARMv7, eSize32, eEncodingT1, "USUB16"},
{ 0xfff0f0f0, 0xfac0f040, ARMv6T2 | ARMv7, eSize32, eEncodingT1, "USUB8"},
{ 0xfff0f0c0, 0xfa50f080, ARMv6T2 | ARMv7, eSize32, eEncodingT1, "UXTAB"},
{ 0xfff0f0c0, 0xfa30f080, ARMv6T2 | ARMv7, eSize32, eEncodingT1, "UXTAB16"},
{ 0xfff0f0c0, 0xfa10f080, ARMv6T2 | ARMv7, eSize32, eEncodingT1, "UXTAH"},
{ 0xffffffc0, 0x0000b2c0, ARMv6All | ARMv7, eSize16, eEncodingT1, "UXTB"},
{ 0xfffff0c0, 0xfa5ff080, ARMv6T2 | ARMv7, eSize32, eEncodingT2, "UXTB"},
{ 0xfffff0c0, 0xfa3ff080, ARMv6T2 | ARMv7, eSize32, eEncodingT1, "UXTB16"},
{ 0xffffffc0, 0x0000b280, ARMv6All | ARMv7, eSize16, eEncodingT1, "UXTH"},
{ 0xfffff0c0, 0xfa1ff080, ARMv6T2 | ARMv7, eSize32, eEncodingT2, "UXTH"},
{ 0xffffffff, 0x0000bf20, ARMv7, eSize16, eEncodingT1, "WFE"},
{ 0xffffffff, 0xf3af8002, ARMv7, eSize32, eEncodingT2, "WFE"},
{ 0xffffffff, 0x0000bf30, ARMv7, eSize16, eEncodingT1, "WFI"},
{ 0xffffffff, 0xf3af8003, ARMv7, eSize32, eEncodingT2, "WFI"},
{ 0xffffffff, 0x0000bf10, ARMv7, eSize16, eEncodingT1, "YIELD"},
{ 0xffffffff, 0xf3af8001, ARMv7, eSize32, eEncodingT2, "YIELD"},
{ 0xffffff00, 0xf3de8f00, ARMv6T2 | ARMv7VE, eSize32, eEncodingT1, "ERET"},
{ 0xfff0f000, 0xf7e08000, ARMv7VE, eSize32, eEncodingT1, "HVC"},
{ 0xffe0f0ef, 0xf3e08020, ARMv7VE, eSize32, eEncodingT1, "MRS (Banked register)"},
{ 0xfff0ffff, 0xf7f08000, ARMSecurityExtension, eSize32, eEncodingT1, "SMC (previously SMI)"},
{ 0x0ffffff0, 0x01600070, ARMSecurityExtension, eSize32, eEncodingT2, "SMC (previously SMI)"},
{ 0xffdfffe0, 0xe80dc000, ARMv6T2 | ARMv7, eSize32, eEncodingT1, "SRS, Thumb"},
{ 0xffdfffe0, 0xe98dc000, ARMv6T2 | ARMv7, eSize32, eEncodingT2, "SRS, Thumb"},
{ 0xffffff00, 0xf3de8f00, ARMv6T2 | ARMv7, eSize32, eEncodingT1, "SUBS PC, LR, Thumb"},
{ 0xef800f10, 0xef000710, AdvancedSIMD, eSize32, eEncodingT1, "VABA, VABAL"},
{ 0xef800f50, 0xef800500, AdvancedSIMD, eSize32, eEncodingT2, "VABA, VABAL"},
{ 0xef800f10, 0xef000700, AdvancedSIMD, eSize32, eEncodingT1, "VABD, VABDL (integer)"},
{ 0xef800f50, 0xef800700, AdvancedSIMD, eSize32, eEncodingT2, "VABD, VABDL (integer)"},
{ 0xffa00f10, 0xff200d00, AdvancedSIMD, eSize32, eEncodingT1, "VABD (floating-point)"},
{ 0xffb30b90, 0xffb10300, AdvancedSIMD, eSize32, eEncodingT1, "VABS"},
{ 0xffbf0ed0, 0xeeb00ac0, VFPv2 | VFPv3 | VFPv4, eSize32, eEncodingT2, "VABS"},
{ 0xff800f10, 0xff000e10, AdvancedSIMD, eSize32, eEncodingT1, "VACGE, VACGT, VACLE, VACLT"},
{ 0xff800f10, 0xef000800, AdvancedSIMD, eSize32, eEncodingT1, "VADD (integer)"},
{ 0xffa00f10, 0xef000d00, AdvancedSIMD, eSize32, eEncodingT1, "VADD (floating-point)"},
{ 0xffb00e50, 0xee300a00, VFPv2 | VFPv3 | VFPv4, eSize32, eEncodingT2, "VADD (floating-point)"},
{ 0xff800f50, 0xef800400, AdvancedSIMD, eSize32, eEncodingT1, "VADDHN"},
{ 0xef800e50, 0xef800000, AdvancedSIMD, eSize32, eEncodingT1, "VADDL, VADDW"},
{ 0xffb00f10, 0xef000110, AdvancedSIMD, eSize32, eEncodingT1, "VAND (register)"},
{ 0xefb800b0, 0xef800030, AdvancedSIMD, eSize32, eEncodingT1, "VBIC (immediate)"},
{ 0xffb00f10, 0xef100110, AdvancedSIMD, eSize32, eEncodingT1, "VBIC (register)"},
{ 0xff800f10, 0xff000110, AdvancedSIMD, eSize32, eEncodingT1, "VBIF, VBIT, VBSL"},
{ 0xff800f10, 0xff000810, AdvancedSIMD, eSize32, eEncodingT1, "VCEQ (register)"},
{ 0xffa00f10, 0xef000e00, AdvancedSIMD, eSize32, eEncodingT2, "VCEQ (register)"},
{ 0xffb30b90, 0xffb10100, AdvancedSIMD, eSize32, eEncodingT1, "VCEQ (immediate #0)"},
{ 0xef800f10, 0xef000310, AdvancedSIMD, eSize32, eEncodingT1, "VCGE (register)"},
{ 0xffa00f10, 0xff000e00, AdvancedSIMD, eSize32, eEncodingT2, "VCGE (register)"},
{ 0xffb30b90, 0xffb10080, AdvancedSIMD, eSize32, eEncodingT1, "VCGE (immediate #0)"},
{ 0xef800f10, 0xef000300, AdvancedSIMD, eSize32, eEncodingT1, "VCGT (register)"},
{ 0xffa00f10, 0xff200e00, AdvancedSIMD, eSize32, eEncodingT2, "VCGT (register)"},
{ 0xffb30b90, 0xffb10000, AdvancedSIMD, eSize32, eEncodingT1, "VCGT (immediate #0)"},
{ 0xffb30b90, 0xffb10180, AdvancedSIMD, eSize32, eEncodingT1, "VCLE (immediate #0)"},
{ 0xffb30f90, 0xffb00400, AdvancedSIMD, eSize32, eEncodingT1, "VCLS"},
{ 0xffb30b90, 0xffb10200, AdvancedSIMD, eSize32, eEncodingT1, "VCLT (immediate #0)"},
{ 0xffb30f90, 0xffb00480, AdvancedSIMD, eSize32, eEncodingT1, "VCLZ"},
{ 0xffbf0e50, 0xeeb40a40, VFPv2 | VFPv3 | VFPv4, eSize32, eEncodingT1, "VCMP, VCMPE"},
{ 0xffbf0e7f, 0xeeb50a40, VFPv2 | VFPv3 | VFPv4, eSize32, eEncodingT2, "VCMP, VCMPE"},
{ 0xffb30f90, 0xffb00500, AdvancedSIMD, eSize32, eEncodingT1, "VCNT"},
{ 0xffb30e10, 0xffb30600, AdvancedSIMD, eSize32, eEncodingT1, "VCVT (between floating-point and integer, AdvancedSIMD)"},
{ 0xffb80e50, 0xeeb80a40, VFPv2 | VFPv3 | VFPv4, eSize32, eEncodingT1, "VCVT, VCVTR (between floating-point and integer, Floating-point)"},
{ 0xef800e90, 0xef800e10, AdvancedSIMD, eSize32, eEncodingT1, "VCVT (between floating-point and fixed-point, AdvancedSIMD)"},
{ 0xffba0e50, 0xeeba0a40, VFPv3 | VFPv4, eSize32, eEncodingT1, "VCVT (between floating-point and fixed-point, Floating-point)"},
{ 0xffbf0ed0, 0xeeb70ac0, VFPv2 | VFPv3 | VFPv4, eSize32, eEncodingT1, "VCVT (between double-precision and single-precision)"},
{ 0xffb30ed0, 0xffb20600, AdvancedSIMD, eSize32, eEncodingT1, "VCVT (between half-precision and single-precision, AdvancedSIMD)"},
{ 0xffbe0f50, 0xeeb20a40, VFPv3 | VFPv4, eSize32, eEncodingT1, "VCVTB, VCVTT"},
{ 0xffb00e50, 0xee800a00, VFPv2 | VFPv3 | VFPv4, eSize32, eEncodingT1, "VDIV"},
{ 0xffb00f90, 0xffb00c00, AdvancedSIMD, eSize32, eEncodingT1, "VDUP (scalar)"},
{ 0xff900f5f, 0xee800b10, AdvancedSIMD, eSize32, eEncodingT1, "VDUP (ARM core register)"},
{ 0xffb00f10, 0xff000110, AdvancedSIMD, eSize32, eEncodingT1, "VEOR"},
{ 0xffb00010, 0xefb00000, AdvancedSIMD, eSize32, eEncodingT1, "VEXT"},
{ 0xff800f10, 0xef000c10, AdvancedSIMDv2, eSize32, eEncodingT1, "VFMA, VFMS"},
{ 0xffb00e10, 0xeea00a00, VFPv4, eSize32, eEncodingT2, "VFMA, VFMS"},
{ 0xffb00e10, 0xee900a00, VFPv4, eSize32, eEncodingT1, "VFNMA, VFNMS"},
{ 0xef800d10, 0xef000000, AdvancedSIMD, eSize32, eEncodingT1, "VHADD, VHSUB"},
{ 0xffb00000, 0xf9200000, AdvancedSIMD, eSize32, eEncodingT1, "VLD1 (multiple single elements)"},
{ 0xffb00300, 0xf9a00000, AdvancedSIMD, eSize32, eEncodingT1, "VLD1 (single element to one lane)"},
{ 0xffb00f00, 0xf9a00c00, AdvancedSIMD, eSize32, eEncodingT1, "VLD1 (single element to all lanes)"},
{ 0xffb00000, 0xf9200000, AdvancedSIMD, eSize32, eEncodingT1, "VLD2 (multiple 2-element structures)"},
{ 0xffb00300, 0xf9a00100, AdvancedSIMD, eSize32, eEncodingT1, "VLD2 (single 2-element structure to one lane)"},
{ 0xffb00f00, 0xf9a00d00, AdvancedSIMD, eSize32, eEncodingT1, "VLD2 (single 2-element structure to all lanes)"},
{ 0xffb00000, 0xf9200000, AdvancedSIMD, eSize32, eEncodingT1, "VLD3 (multiple 3-element structures)"},
{ 0xffb00300, 0xf9a00200, AdvancedSIMD, eSize32, eEncodingT1, "VLD3 (single 3-element structure to one lane)"},
{ 0xffb00f00, 0xf9a00e00, AdvancedSIMD, eSize32, eEncodingT1, "VLD3 (single 3-element structure to all lanes)"},
{ 0xffb00000, 0xf9200000, AdvancedSIMD, eSize32, eEncodingT1, "VLD4 (multiple 4-element structures)"},
{ 0xffb00300, 0xf9a00300, AdvancedSIMD, eSize32, eEncodingT1, "VLD4 (single 4-element structure to one lane)"},
{ 0xffb00f00, 0xf9a00f00, AdvancedSIMD, eSize32, eEncodingT1, "VLD4 (single 4-element structure to all lanes)"},
{ 0xfe100f00, 0xec100b00, VFPv2 | VFPv3 | VFPv4 | AdvancedSIMD, eSize32, eEncodingT1, "VLDM"},
{ 0xfe100f00, 0xec100a00, VFPv2 | VFPv3 | VFPv4, eSize32, eEncodingT2, "VLDM"},
{ 0xff300f00, 0xed100b00, VFPv2 | VFPv3 | VFPv4 | AdvancedSIMD, eSize32, eEncodingT1, "VLDR"},
{ 0xff300f00, 0xed100a00, VFPv2 | VFPv3 | VFPv4, eSize32, eEncodingT2, "VLDR"},
{ 0xef800f00, 0xef000600, AdvancedSIMD, eSize32, eEncodingT1, "VMAX, VMIN (integer)"},
{ 0xff800f10, 0xef000f00, AdvancedSIMD, eSize32, eEncodingT1, "VMAX, VMIN (floating-point)"},
{ 0xef800f10, 0xef000900, AdvancedSIMD, eSize32, eEncodingT1, "VMLA, VMLAL, VMLS, VMLSL (integer)"},
{ 0xef800d50, 0xef800800, AdvancedSIMD, eSize32, eEncodingT2, "VMLA, VMLAL, VMLS, VMLSL (integer)"},
{ 0xff800f10, 0xef000d10, AdvancedSIMD, eSize32, eEncodingT1, "VMLA, VMLS (floating-point)"},
{ 0xffb00e10, 0xee000a00, VFPv2 | VFPv3 | VFPv4, eSize32, eEncodingT2, "VMLA, VMLS (floating-point)"},
{ 0xef800a50, 0xef800040, AdvancedSIMD, eSize32, eEncodingT1, "VMLA, VMLAL, VMLS, VMLSL (by scalar)"},
{ 0xef800b50, 0xef800240, AdvancedSIMD, eSize32, eEncodingT2, "VMLA, VMLAL, VMLS, VMLSL (by scalar)"},
{ 0xefb80090, 0xef800010, AdvancedSIMD, eSize32, eEncodingT1, "VMOV (immediate)"},
{ 0xffb00ef0, 0xeeb00a00, VFPv3 | VFPv4, eSize32, eEncodingT2, "VMOV (immediate)"},
{ 0xffb00f10, 0xef200110, AdvancedSIMD, eSize32, eEncodingT1, "VMOV (register)"},
{ 0xffbf0ed0, 0xeeb00a40, VFPv2 | VFPv3 | VFPv4, eSize32, eEncodingT2, "VMOV (register)"},
{ 0xff900f1f, 0xee000b10, AdvancedSIMD, eSize32, eEncodingT1, "VMOV (ARM core register to scalar)"},
{ 0xff100f1f, 0xee100b10, AdvancedSIMD, eSize32, eEncodingT1, "VMOV (scalar to ARM core register)"},
{ 0xffe00f7f, 0xee000a10, VFPv2 | VFPv3 | VFPv4, eSize32, eEncodingT1, "VMOV (between ARM core register and single-precision register)"},
{ 0xffe00fd0, 0xec400a10, VFPv2 | VFPv3 | VFPv4, eSize32, eEncodingT1, "VMOV (between two ARM core registers and two single-precision registers)"},
{ 0xffe00fd0, 0xec400b10, VFPv2 | VFPv3 | VFPv4 | AdvancedSIMD, eSize32, eEncodingT1, "VMOV (between two ARM core registers and a doubleword extension register)"},
{ 0xef870fd0, 0xef800a10, AdvancedSIMD, eSize32, eEncodingT1, "VMOVL"},
{ 0xffb30fd0, 0xffb20200, AdvancedSIMD, eSize32, eEncodingT1, "VMOVN"},
{ 0xfff00fff, 0xeef00a10, VFPv2 | VFPv3 | VFPv4 | AdvancedSIMD, eSize32, eEncodingT1, "VMRS"},
{ 0xfff00fff, 0xeee00a10, VFPv2 | VFPv3 | VFPv4 | AdvancedSIMD, eSize32, eEncodingT1, "VMSR"},
{ 0xef800f10, 0xef000910, AdvancedSIMD, eSize32, eEncodingT1, "VMUL, VMULL (integer and polynomial)"},
{ 0xef800d50, 0xef800c00, AdvancedSIMD, eSize32, eEncodingT2, "VMUL, VMULL (integer and polynomial)"},
{ 0xffa00f10, 0xff000d10, AdvancedSIMD, eSize32, eEncodingT1, "VMUL (floating-point)"},
{ 0xffb00e50, 0xee200a00, VFPv2 | VFPv3 | VFPv4, eSize32, eEncodingT2, "VMUL (floating-point)"},
{ 0xef800e50, 0xef800840, AdvancedSIMD, eSize32, eEncodingT1, "VMUL, VMULL (by scalar)"},
{ 0xef800f50, 0xef800a40, AdvancedSIMD, eSize32, eEncodingT2, "VMUL, VMULL (by scalar)"},
{ 0xefb800b0, 0xef800030, AdvancedSIMD, eSize32, eEncodingT1, "VMVN (immediate)"},
{ 0xffb30f90, 0xffb00580, AdvancedSIMD, eSize32, eEncodingT1, "VMVN (register)"},
{ 0xffb30b90, 0xffb10380, AdvancedSIMD, eSize32, eEncodingT1, "VNEG"},
{ 0xffbf0ed0, 0xeeb10a40, VFPv2 | VFPv3 | VFPv4, eSize32, eEncodingT2, "VNEG"},
{ 0xffb00e10, 0xee100a00, VFPv2 | VFPv3 | VFPv4, eSize32, eEncodingT1, "VNMLA, VNMLS, VNMUL"},
{ 0xffb00e50, 0xee200a40, VFPv2 | VFPv3 | VFPv4, eSize32, eEncodingT2, "VNMLA, VNMLS, VNMUL"},
{ 0xffb00f10, 0xef300110, AdvancedSIMD, eSize32, eEncodingT1, "VORN (register)"},
{ 0xefb800b0, 0xef800010, AdvancedSIMD, eSize32, eEncodingT1, "VORR (immediate)"},
{ 0xffb00f10, 0xef200110, AdvancedSIMD, eSize32, eEncodingT1, "VORR (register)"},
{ 0xffb30f10, 0xffb00600, AdvancedSIMD, eSize32, eEncodingT1, "VPADAL"},
{ 0xff800f10, 0xef000b10, AdvancedSIMD, eSize32, eEncodingT1, "VPADD (integer)"},
{ 0xffa00f10, 0xff000d00, AdvancedSIMD, eSize32, eEncodingT1, "VPADD (floating-point)"},
{ 0xffb30f10, 0xffb00200, AdvancedSIMD, eSize32, eEncodingT1, "VPADDL"},
{ 0xef800f00, 0xef000a00, AdvancedSIMD, eSize32, eEncodingT1, "VPMAX, VPMIN (integer)"},
{ 0xff800f10, 0xff000f00, AdvancedSIMD, eSize32, eEncodingT1, "VPMAX, VPMIN (floating-point)"},
{ 0xffbf0f00, 0xecbd0b00, VFPv2 | VFPv3 | VFPv4 | AdvancedSIMD, eSize32, eEncodingT1, "VPOP"},
{ 0xffbf0f00, 0xecbd0a00, VFPv2 | VFPv3 | VFPv4, eSize32, eEncodingT2, "VPOP"},
{ 0xffbf0f00, 0xed2d0b00, VFPv2 | VFPv3 | VFPv4 | AdvancedSIMD, eSize32, eEncodingT1, "VPUSH"},
{ 0xffbf0f00, 0xed2d0a00, VFPv2 | VFPv3 | VFPv4, eSize32, eEncodingT2, "VPUSH"},
{ 0xffb30f90, 0xffb00700, AdvancedSIMD, eSize32, eEncodingT1, "VQABS"},
{ 0xef800f10, 0xef000010, AdvancedSIMD, eSize32, eEncodingT1, "VQADD"},
{ 0xff800d50, 0xef800900, AdvancedSIMD, eSize32, eEncodingT1, "VQDMLAL, VQDMLSL"},
{ 0xff800b50, 0xef800340, AdvancedSIMD, eSize32, eEncodingT2, "VQDMLAL, VQDMLSL"},
{ 0xff800f10, 0xef000b00, AdvancedSIMD, eSize32, eEncodingT1, "VQDMULH"},
{ 0xef800f50, 0xef800c40, AdvancedSIMD, eSize32, eEncodingT2, "VQDMULH"},
{ 0xff800f50, 0xef800d00, AdvancedSIMD, eSize32, eEncodingT1, "VQDMULL"},
{ 0xff800f50, 0xef800b40, AdvancedSIMD, eSize32, eEncodingT2, "VQDMULL"},
{ 0xffb30f10, 0xffb20200, AdvancedSIMD, eSize32, eEncodingT1, "VQMOVN, VQMOVUN"},
{ 0xffb30f90, 0xffb00780, AdvancedSIMD, eSize32, eEncodingT1, "VQNEG"},
{ 0xff800f10, 0xff000b00, AdvancedSIMD, eSize32, eEncodingT1, "VQRDMULH"},
{ 0xef800f50, 0xef800d40, AdvancedSIMD, eSize32, eEncodingT2, "VQRDMULH"},
{ 0xef800f10, 0xef000510, AdvancedSIMD, eSize32, eEncodingT1, "VQRSHL"},
{ 0xef800ed0, 0xef800850, AdvancedSIMD, eSize32, eEncodingT1, "VQRSHRN, VQRSHRUN"},
{ 0xef800f10, 0xef000410, AdvancedSIMD, eSize32, eEncodingT1, "VQSHL (register)"},
{ 0xef800e10, 0xef800610, AdvancedSIMD, eSize32, eEncodingT1, "VQSHL, VQSHLU (immediate)"},
{ 0xef800ed0, 0xef800810, AdvancedSIMD, eSize32, eEncodingT1, "VQSHRN, VQSHRUN"},
{ 0xef800f10, 0xef000210, AdvancedSIMD, eSize32, eEncodingT1, "VQSUB"},
{ 0xff800f50, 0xff800400, AdvancedSIMD, eSize32, eEncodingT1, "VRADDHN"},
{ 0xffb30e90, 0xffb30400, AdvancedSIMD, eSize32, eEncodingT1, "VRECPE"},
{ 0xffa00f10, 0xef000f10, AdvancedSIMD, eSize32, eEncodingT1, "VRECPS"},
{ 0xffb30e10, 0xffb00000, AdvancedSIMD, eSize32, eEncodingT1, "VREV16, VREV32, VREV64"},
{ 0xef800f10, 0xef000100, AdvancedSIMD, eSize32, eEncodingT1, "VRHADD"},
{ 0xef800f10, 0xef000500, AdvancedSIMD, eSize32, eEncodingT1, "VRSHL"},
{ 0xef800f10, 0xef800210, AdvancedSIMD, eSize32, eEncodingT1, "VRSHR"},
{ 0xff800fd0, 0xef800850, AdvancedSIMD, eSize32, eEncodingT1, "VRSHRN"},
{ 0xffb30e90, 0xffb30480, AdvancedSIMD, eSize32, eEncodingT1, "VRSQRTE"},
{ 0xffa00f10, 0xef200f10, AdvancedSIMD, eSize32, eEncodingT1, "VRSQRTS"},
{ 0xef800f10, 0xef800310, AdvancedSIMD, eSize32, eEncodingT1, "VRSRA"},
{ 0xff800f50, 0xff800600, AdvancedSIMD, eSize32, eEncodingT1, "VRSUBHN"},
{ 0xff800f10, 0xef800510, AdvancedSIMD, eSize32, eEncodingT1, "VSHL (immediate)"},
{ 0xef800f10, 0xef000400, AdvancedSIMD, eSize32, eEncodingT1, "VSHL (register)"},
{ 0xef800fd0, 0xef800a10, AdvancedSIMD, eSize32, eEncodingT1, "VSHLL"},
{ 0xffb30fd0, 0xffb20300, AdvancedSIMD, eSize32, eEncodingT2, "VSHLL"},
{ 0xef800f10, 0xef800010, AdvancedSIMD, eSize32, eEncodingT1, "VSHR"},
{ 0xff800fd0, 0xef800810, AdvancedSIMD, eSize32, eEncodingT1, "VSHRN"},
{ 0xff800f10, 0xff800510, AdvancedSIMD, eSize32, eEncodingT1, "VSLI"},
{ 0xffbf0ed0, 0xeeb10ac0, VFPv2 | VFPv3 | VFPv4, eSize32, eEncodingT1, "VSQRT"},
{ 0xef800f10, 0xef800110, AdvancedSIMD, eSize32, eEncodingT1, "VSRA"},
{ 0xff800f10, 0xff800410, AdvancedSIMD, eSize32, eEncodingT1, "VSRI"},
{ 0xffb00000, 0xf9000000, AdvancedSIMD, eSize32, eEncodingT1, "VST1 (multiple single elements)"},
{ 0xffb00300, 0xf9800000, AdvancedSIMD, eSize32, eEncodingT1, "VST1 (single element from one lane)"},
{ 0xffb00000, 0xf9000000, AdvancedSIMD, eSize32, eEncodingT1, "VST2 (multiple 2-element structures)"},
{ 0xffb00300, 0xf9800100, AdvancedSIMD, eSize32, eEncodingT1, "VST2 (single 2-element structure from one lane)"},
{ 0xffb00000, 0xf9000000, AdvancedSIMD, eSize32, eEncodingT1, "VST3 (multiple 3-element structures)"},
{ 0xffb00300, 0xf9800200, AdvancedSIMD, eSize32, eEncodingT1, "VST3 (single 3-element structure from one lane)"},
{ 0xffb00000, 0xf9000000, AdvancedSIMD, eSize32, eEncodingT1, "VST4 (multiple 4-element structures)"},
{ 0xffb00300, 0xf9800300, AdvancedSIMD, eSize32, eEncodingT1, "VST4 (single 4-element structure from one lane)"},
{ 0xfe100f00, 0xec000b00, VFPv2 | VFPv3 | VFPv4 | AdvancedSIMD, eSize32, eEncodingT1, "VSTM"},
{ 0xfe100f00, 0xec000a00, VFPv2 | VFPv3 | VFPv4, eSize32, eEncodingT2, "VSTM"},
{ 0xff300f00, 0xed000b00, VFPv2 | VFPv3 | VFPv4 | AdvancedSIMD, eSize32, eEncodingT1, "VSTR"},
{ 0xff300f00, 0xed000a00, VFPv2 | VFPv3 | VFPv4, eSize32, eEncodingT2, "VSTR"},
{ 0xff800f10, 0xff000800, AdvancedSIMD, eSize32, eEncodingT1, "VSUB (integer)"},
{ 0xffa00f10, 0xef200d00, AdvancedSIMD, eSize32, eEncodingT1, "VSUB (floating-point)"},
{ 0xffb00e50, 0xee300a40, VFPv2 | VFPv3 | VFPv4, eSize32, eEncodingT2, "VSUB (floating-point)"},
{ 0xff800f50, 0xef800600, AdvancedSIMD, eSize32, eEncodingT1, "VSUBHN"},
{ 0xef800e50, 0xef800200, AdvancedSIMD, eSize32, eEncodingT1, "VSUBL, VSUBW"},
{ 0xffb30f90, 0xffb20000, AdvancedSIMD, eSize32, eEncodingT1, "VSWP"},
{ 0xffb00c10, 0xffb00800, AdvancedSIMD, eSize32, eEncodingT1, "VTBL, VTBX"},
{ 0xffb30f90, 0xffb20080, AdvancedSIMD, eSize32, eEncodingT1, "VTRN"},
{ 0xff800f10, 0xef000810, AdvancedSIMD, eSize32, eEncodingT1, "VTST"},
{ 0xffb30f90, 0xffb20100, AdvancedSIMD, eSize32, eEncodingT1, "VUZP"},
{ 0xffb30f90, 0xffb20180, AdvancedSIMD, eSize32, eEncodingT1, "VZIP"},
{ 0x00000000, 0x00000000, ARMvAll, eSize32, eEncodingA1, "UNKNOWN"}
};
const size_t n_arm_opcodes = sizeof(arm_opcodes) / sizeof(arm_opcodes[0]);
const size_t n_thumb_opcodes = sizeof(thumb_opcodes) / sizeof(thumb_opcodes[0]);
inline uint32_t get_bit(uint32_t val, uint32_t lsb) {
return (val >> lsb) & 1;
}
template<class T> T get_random_int() {
static random_device rd;
uniform_int_distribution<T> uniform_dist(numeric_limits<T>::min(), numeric_limits<T>::max());
return uniform_dist(rd);
}
uint32_t get_masked_random(uint32_t mask, uint32_t value, uint32_t size = 32) {
uint32_t r = get_random_int<uint32_t>() & ((size != 32) ? 0xffff : 0xffffffff);
for (uint32_t i = 0; i < size; ++i) {
if (mask & (1 << i)) {
if (value & (1 << i)) {
r |= value & (1 << i);
} else {
r &= ~(1 << i);
}
}
}
assert((r & mask) == value);
return r;
}
void test_arm(unsigned n, unsigned start, unsigned finish) {
uint32_t mask;
uint32_t value;
uint32_t op_code;
if (start == finish || finish > n_arm_opcodes) {
finish = n_arm_opcodes - 1;
}
for (unsigned i = start; i < finish; ++i) {
mask = arm_opcodes[i].mask;
value = arm_opcodes[i].value;
printf("Generating ARM instruction `%s` with mask=0x%.8x and value=0x%.8x\n", arm_opcodes[i].name, mask, value);
for (unsigned j = 0; j < n; ++j) {
op_code = get_masked_random(mask, value);
// We avoid generating condition codes of 0b1111.
if (get_bit(mask, 28) == 0) {
op_code &= 0xefffffff;
}
printf(" 0x%.8x\n", op_code);
}
}
}
void test_thumb(unsigned n, unsigned start, unsigned finish) {
uint32_t mask;
uint32_t value;
uint32_t size;
uint32_t op_code;
if (start == finish || finish > n_thumb_opcodes) {
finish = n_thumb_opcodes - 1;
}
for (unsigned i = start; i < finish; ++i) {
mask = thumb_opcodes[i].mask;
value = thumb_opcodes[i].value;
size = thumb_opcodes[i].ins_size == eSize16 ? 16 : 32;
printf("Generating THUMB instruction `%s` with size=%u mask=0x%.8x and value=0x%.8x\n", arm_opcodes[i].name, size, mask, value);
for (unsigned j = 0; j < n; ++j) {
op_code = get_masked_random(mask, value, size);
if (size == 16)
printf(" 0x%.4x\n", op_code);
else
printf(" 0x%.8x\n", op_code);
}
}
}
int main(int argc, char **argv) {
unsigned n = std::stoi(argv[1]);
unsigned i = std::stoi(argv[2]);
unsigned j = std::stoi(argv[3]);
printf("Generating %u instructions starting at position %u and ending at position %u\n", n, i, j);
test_thumb(n, i, j);
return 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment