Files
Peter Goodman 3808e9951d Refactor and add sparc (#454)
* Refactors the code to improve directory layout, use more std::string_view in place of std::string, deletes some deprecated functions, deprecates some other functions for eventual deletion, and includes semantics for sparcv8 (sparc32) and sparcv9 (sparc64)

* Update new dir layout with llvm 11 support

* Whoops missing files

* Drop llvm 800 from workflow

* Minor fix

* Move where the install directives are in CMake

* Minor fixes

* Rename tools/ to bin/.

* Minor tweaks

* Should fix issues
2020-10-28 15:11:42 -04:00

77434 lines
2.2 MiB
Plaintext

/*
* Copyright (c) 2017 Trail of Bits, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include "Decode.h"
namespace remill {
namespace aarch64 {
namespace {
const char *const kIClassName[] = {
nullptr, "ABS", "ADC", "ADCS", "ADD", "ADDHN",
"ADDP", "ADDS", "ADDV", "ADR", "ADRP", "AESD",
"AESE", "AESIMC", "AESMC", "AND", "ANDS", "ASRV",
"B", "BFM", "BIC", "BICS", "BIF", "BIT",
"BL", "BLR", "BR", "BRK", "BSL", "CAS",
"CASA", "CASAB", "CASAH", "CASAL", "CASALB", "CASALH",
"CASB", "CASH", "CASL", "CASLB", "CASLH", "CASP",
"CASPA", "CASPAL", "CASPL", "CBNZ", "CBZ", "CCMN",
"CCMP", "CLREX", "CLS", "CLZ", "CMEQ", "CMGE",
"CMGT", "CMHI", "CMHS", "CMLE", "CMLT", "CMTST",
"CNT", "CRC32B", "CRC32CB", "CRC32CH", "CRC32CW", "CRC32CX",
"CRC32H", "CRC32W", "CRC32X", "CSEL", "CSINC", "CSINV",
"CSNEG", "DCPS1", "DCPS2", "DCPS3", "DMB", "DRPS",
"DSB", "DUP", "EON", "EOR", "ERET", "ESB",
"EXT", "EXTR", "FABD", "FABS", "FACGE", "FACGT",
"FADD", "FADDP", "FCCMP", "FCCMPE", "FCMEQ", "FCMGE",
"FCMGT", "FCMLE", "FCMLT", "FCMP", "FCMPE", "FCSEL",
"FCVT", "FCVTAS", "FCVTAU", "FCVTL", "FCVTMS", "FCVTMU",
"FCVTN", "FCVTNS", "FCVTNU", "FCVTPS", "FCVTPU", "FCVTXN",
"FCVTZS", "FCVTZU", "FDIV", "FMADD", "FMAX", "FMAXNM",
"FMAXNMP", "FMAXNMV", "FMAXP", "FMAXV", "FMIN", "FMINNM",
"FMINNMP", "FMINNMV", "FMINP", "FMINV", "FMLA", "FMLS",
"FMOV", "FMSUB", "FMUL", "FMULX", "FNEG", "FNMADD",
"FNMSUB", "FNMUL", "FRECPE", "FRECPS", "FRECPX", "FRINTA",
"FRINTI", "FRINTM", "FRINTN", "FRINTP", "FRINTX", "FRINTZ",
"FRSQRTE", "FRSQRTS", "FSQRT", "FSUB", "HINT", "HLT",
"HVC", "INS", "ISB", "LD1", "LD1R", "LD2",
"LD2R", "LD3", "LD3R", "LD4", "LD4R", "LDADD",
"LDADDA", "LDADDAB", "LDADDAH", "LDADDAL", "LDADDALB", "LDADDALH",
"LDADDB", "LDADDH", "LDADDL", "LDADDLB", "LDADDLH", "LDAR",
"LDARB", "LDARH", "LDAXP", "LDAXR", "LDAXRB", "LDAXRH",
"LDCLR", "LDCLRA", "LDCLRAB", "LDCLRAH", "LDCLRAL", "LDCLRALB",
"LDCLRALH", "LDCLRB", "LDCLRH", "LDCLRL", "LDCLRLB", "LDCLRLH",
"LDEOR", "LDEORA", "LDEORAB", "LDEORAH", "LDEORAL", "LDEORALB",
"LDEORALH", "LDEORB", "LDEORH", "LDEORL", "LDEORLB", "LDEORLH",
"LDLAR", "LDLARB", "LDLARH", "LDNP", "LDP", "LDPSW",
"LDR", "LDRB", "LDRH", "LDRSB", "LDRSH", "LDRSW",
"LDSET", "LDSETA", "LDSETAB", "LDSETAH", "LDSETAL", "LDSETALB",
"LDSETALH", "LDSETB", "LDSETH", "LDSETL", "LDSETLB", "LDSETLH",
"LDSMAX", "LDSMAXA", "LDSMAXAB", "LDSMAXAH", "LDSMAXAL", "LDSMAXALB",
"LDSMAXALH", "LDSMAXB", "LDSMAXH", "LDSMAXL", "LDSMAXLB", "LDSMAXLH",
"LDSMIN", "LDSMINA", "LDSMINAB", "LDSMINAH", "LDSMINAL", "LDSMINALB",
"LDSMINALH", "LDSMINB", "LDSMINH", "LDSMINL", "LDSMINLB", "LDSMINLH",
"LDTR", "LDTRB", "LDTRH", "LDTRSB", "LDTRSH", "LDTRSW",
"LDUMAX", "LDUMAXA", "LDUMAXAB", "LDUMAXAH", "LDUMAXAL", "LDUMAXALB",
"LDUMAXALH", "LDUMAXB", "LDUMAXH", "LDUMAXL", "LDUMAXLB", "LDUMAXLH",
"LDUMIN", "LDUMINA", "LDUMINAB", "LDUMINAH", "LDUMINAL", "LDUMINALB",
"LDUMINALH", "LDUMINB", "LDUMINH", "LDUMINL", "LDUMINLB", "LDUMINLH",
"LDUR", "LDURB", "LDURH", "LDURSB", "LDURSH", "LDURSW",
"LDXP", "LDXR", "LDXRB", "LDXRH", "LSLV", "LSRV",
"MADD", "MLA", "MLS", "MOVI", "MOVK", "MOVN",
"MOVZ", "MRS", "MSR", "MSUB", "MUL", "MVNI",
"NEG", "NOP", "NOT", "ORN", "ORR", "PMUL",
"PMULL", "PRFM", "PRFUM", "PSB", "RADDHN", "RBIT",
"RET", "REV", "REV16", "REV32", "REV64", "RORV",
"RSHRN", "RSUBHN", "SABA", "SABAL", "SABD", "SABDL",
"SADALP", "SADDL", "SADDLP", "SADDLV", "SADDW", "SBC",
"SBCS", "SBFM", "SCVTF", "SDIV", "SEV", "SEVL",
"SHA1C", "SHA1H", "SHA1M", "SHA1P", "SHA1SU0", "SHA1SU1",
"SHA256H", "SHA256H2", "SHA256SU0", "SHA256SU1", "SHADD", "SHL",
"SHLL", "SHRN", "SHSUB", "SLI", "SMADDL", "SMAX",
"SMAXP", "SMAXV", "SMC", "SMIN", "SMINP", "SMINV",
"SMLAL", "SMLSL", "SMOV", "SMSUBL", "SMULH", "SMULL",
"SQABS", "SQADD", "SQDMLAL", "SQDMLSL", "SQDMULH", "SQDMULL",
"SQNEG", "SQRDMLAH", "SQRDMLSH", "SQRDMULH", "SQRSHL", "SQRSHRN",
"SQRSHRUN", "SQSHL", "SQSHLU", "SQSHRN", "SQSHRUN", "SQSUB",
"SQXTN", "SQXTUN", "SRHADD", "SRI", "SRSHL", "SRSHR",
"SRSRA", "SSHL", "SSHLL", "SSHR", "SSRA", "SSUBL",
"SSUBW", "ST1", "ST2", "ST3", "ST4", "STADD",
"STADDB", "STADDH", "STADDL", "STADDLB", "STADDLH", "STCLR",
"STCLRB", "STCLRH", "STCLRL", "STCLRLB", "STCLRLH", "STEOR",
"STEORB", "STEORH", "STEORL", "STEORLB", "STEORLH", "STLLR",
"STLLRB", "STLLRH", "STLR", "STLRB", "STLRH", "STLXP",
"STLXR", "STLXRB", "STLXRH", "STNP", "STP", "STR",
"STRB", "STRH", "STSET", "STSETB", "STSETH", "STSETL",
"STSETLB", "STSETLH", "STSMAX", "STSMAXB", "STSMAXH", "STSMAXL",
"STSMAXLB", "STSMAXLH", "STSMIN", "STSMINB", "STSMINH", "STSMINL",
"STSMINLB", "STSMINLH", "STTR", "STTRB", "STTRH", "STUMAX",
"STUMAXB", "STUMAXH", "STUMAXL", "STUMAXLB", "STUMAXLH", "STUMIN",
"STUMINB", "STUMINH", "STUMINL", "STUMINLB", "STUMINLH", "STUR",
"STURB", "STURH", "STXP", "STXR", "STXRB", "STXRH",
"SUB", "SUBHN", "SUBS", "SUQADD", "SVC", "SWP",
"SWPA", "SWPAB", "SWPAH", "SWPAL", "SWPALB", "SWPALH",
"SWPB", "SWPH", "SWPL", "SWPLB", "SWPLH", "SYS",
"SYSL", "TBL", "TBNZ", "TBX", "TBZ", "TRN1",
"TRN2", "UABA", "UABAL", "UABD", "UABDL", "UADALP",
"UADDL", "UADDLP", "UADDLV", "UADDW", "UBFM", "UCVTF",
"UDIV", "UHADD", "UHSUB", "UMADDL", "UMAX", "UMAXP",
"UMAXV", "UMIN", "UMINP", "UMINV", "UMLAL", "UMLSL",
"UMOV", "UMSUBL", "UMULH", "UMULL", "UQADD", "UQRSHL",
"UQRSHRN", "UQSHL", "UQSHRN", "UQSUB", "UQXTN", "URECPE",
"URHADD", "URSHL", "URSHR", "URSQRTE", "URSRA", "USHL",
"USHLL", "USHR", "USQADD", "USRA", "USUBL", "USUBW",
"UZP1", "UZP2", "WFE", "WFI", "XTN", "YIELD",
"ZIP1", "ZIP2",
};
const char *const kIFormName[] = {
nullptr,
"ABS_ASIMDMISC_R",
"ABS_ASISDMISC_R",
"ADCS_32_ADDSUB_CARRY",
"ADCS_64_ADDSUB_CARRY",
"ADC_32_ADDSUB_CARRY",
"ADC_64_ADDSUB_CARRY",
"ADDHN_ASIMDDIFF_N",
"ADDP_ASIMDSAME_ONLY",
"ADDP_ASISDPAIR_ONLY",
"ADDS_32S_ADDSUB_EXT",
"ADDS_32S_ADDSUB_IMM",
"ADDS_32_ADDSUB_SHIFT",
"ADDS_64S_ADDSUB_EXT",
"ADDS_64S_ADDSUB_IMM",
"ADDS_64_ADDSUB_SHIFT",
"ADDV_ASIMDALL_ONLY",
"ADD_32_ADDSUB_EXT",
"ADD_32_ADDSUB_IMM",
"ADD_32_ADDSUB_SHIFT",
"ADD_64_ADDSUB_EXT",
"ADD_64_ADDSUB_IMM",
"ADD_64_ADDSUB_SHIFT",
"ADD_ASIMDSAME_ONLY",
"ADD_ASISDSAME_ONLY",
"ADRP_ONLY_PCRELADDR",
"ADR_ONLY_PCRELADDR",
"AESD_B_CRYPTOAES",
"AESE_B_CRYPTOAES",
"AESIMC_B_CRYPTOAES",
"AESMC_B_CRYPTOAES",
"ANDS_32S_LOG_IMM",
"ANDS_32_LOG_SHIFT",
"ANDS_64S_LOG_IMM",
"ANDS_64_LOG_SHIFT",
"AND_32_LOG_IMM",
"AND_32_LOG_SHIFT",
"AND_64_LOG_IMM",
"AND_64_LOG_SHIFT",
"AND_ASIMDSAME_ONLY",
"ASRV_32_DP_2SRC",
"ASRV_64_DP_2SRC",
"ASR_ASRV_32_DP_2SRC",
"ASR_ASRV_64_DP_2SRC",
"ASR_SBFM_32M_BITFIELD",
"ASR_SBFM_64M_BITFIELD",
"AT_SYS_CR_SYSTEM",
"BFC_BFM_32M_BITFIELD",
"BFC_BFM_64M_BITFIELD",
"BFI_BFM_32M_BITFIELD",
"BFI_BFM_64M_BITFIELD",
"BFM_32M_BITFIELD",
"BFM_64M_BITFIELD",
"BFXIL_BFM_32M_BITFIELD",
"BFXIL_BFM_64M_BITFIELD",
"BICS_32_LOG_SHIFT",
"BICS_64_LOG_SHIFT",
"BIC_32_LOG_SHIFT",
"BIC_64_LOG_SHIFT",
"BIC_ASIMDIMM_L_HL",
"BIC_ASIMDIMM_L_SL",
"BIC_ASIMDSAME_ONLY",
"BIF_ASIMDSAME_ONLY",
"BIT_ASIMDSAME_ONLY",
"BLR_64_BRANCH_REG",
"BL_ONLY_BRANCH_IMM",
"BRK_EX_EXCEPTION",
"BR_64_BRANCH_REG",
"BSL_ASIMDSAME_ONLY",
"B_ONLY_BRANCH_IMM",
"B_ONLY_CONDBRANCH",
"CASAB_C32_LDSTEXCL",
"CASAH_C32_LDSTEXCL",
"CASALB_C32_LDSTEXCL",
"CASALH_C32_LDSTEXCL",
"CASAL_C32_LDSTEXCL",
"CASAL_C64_LDSTEXCL",
"CASA_C32_LDSTEXCL",
"CASA_C64_LDSTEXCL",
"CASB_C32_LDSTEXCL",
"CASH_C32_LDSTEXCL",
"CASLB_C32_LDSTEXCL",
"CASLH_C32_LDSTEXCL",
"CASL_C32_LDSTEXCL",
"CASL_C64_LDSTEXCL",
"CASPAL_CP32_LDSTEXCL",
"CASPAL_CP64_LDSTEXCL",
"CASPA_CP32_LDSTEXCL",
"CASPA_CP64_LDSTEXCL",
"CASPL_CP32_LDSTEXCL",
"CASPL_CP64_LDSTEXCL",
"CASP_CP32_LDSTEXCL",
"CASP_CP64_LDSTEXCL",
"CAS_C32_LDSTEXCL",
"CAS_C64_LDSTEXCL",
"CBNZ_32_COMPBRANCH",
"CBNZ_64_COMPBRANCH",
"CBZ_32_COMPBRANCH",
"CBZ_64_COMPBRANCH",
"CCMN_32_CONDCMP_IMM",
"CCMN_32_CONDCMP_REG",
"CCMN_64_CONDCMP_IMM",
"CCMN_64_CONDCMP_REG",
"CCMP_32_CONDCMP_IMM",
"CCMP_32_CONDCMP_REG",
"CCMP_64_CONDCMP_IMM",
"CCMP_64_CONDCMP_REG",
"CINC_CSINC_32_CONDSEL",
"CINC_CSINC_64_CONDSEL",
"CINV_CSINV_32_CONDSEL",
"CINV_CSINV_64_CONDSEL",
"CLREX_BN_SYSTEM",
"CLS_32_DP_1SRC",
"CLS_64_DP_1SRC",
"CLS_ASIMDMISC_R",
"CLZ_32_DP_1SRC",
"CLZ_64_DP_1SRC",
"CLZ_ASIMDMISC_R",
"CMEQ_ASIMDMISC_Z",
"CMEQ_ASIMDSAME_ONLY",
"CMEQ_ASISDMISC_Z",
"CMEQ_ASISDSAME_ONLY",
"CMGE_ASIMDMISC_Z",
"CMGE_ASIMDSAME_ONLY",
"CMGE_ASISDMISC_Z",
"CMGE_ASISDSAME_ONLY",
"CMGT_ASIMDMISC_Z",
"CMGT_ASIMDSAME_ONLY",
"CMGT_ASISDMISC_Z",
"CMGT_ASISDSAME_ONLY",
"CMHI_ASIMDSAME_ONLY",
"CMHI_ASISDSAME_ONLY",
"CMHS_ASIMDSAME_ONLY",
"CMHS_ASISDSAME_ONLY",
"CMLE_ASIMDMISC_Z",
"CMLE_ASISDMISC_Z",
"CMLT_ASIMDMISC_Z",
"CMLT_ASISDMISC_Z",
"CMN_ADDS_32S_ADDSUB_EXT",
"CMN_ADDS_32S_ADDSUB_IMM",
"CMN_ADDS_32_ADDSUB_SHIFT",
"CMN_ADDS_64S_ADDSUB_EXT",
"CMN_ADDS_64S_ADDSUB_IMM",
"CMN_ADDS_64_ADDSUB_SHIFT",
"CMP_SUBS_32S_ADDSUB_EXT",
"CMP_SUBS_32S_ADDSUB_IMM",
"CMP_SUBS_32_ADDSUB_SHIFT",
"CMP_SUBS_64S_ADDSUB_EXT",
"CMP_SUBS_64S_ADDSUB_IMM",
"CMP_SUBS_64_ADDSUB_SHIFT",
"CMTST_ASIMDSAME_ONLY",
"CMTST_ASISDSAME_ONLY",
"CNEG_CSNEG_32_CONDSEL",
"CNEG_CSNEG_64_CONDSEL",
"CNT_ASIMDMISC_R",
"CRC32B_32C_DP_2SRC",
"CRC32CB_32C_DP_2SRC",
"CRC32CH_32C_DP_2SRC",
"CRC32CW_32C_DP_2SRC",
"CRC32CX_64C_DP_2SRC",
"CRC32H_32C_DP_2SRC",
"CRC32W_32C_DP_2SRC",
"CRC32X_64C_DP_2SRC",
"CSEL_32_CONDSEL",
"CSEL_64_CONDSEL",
"CSETM_CSINV_32_CONDSEL",
"CSETM_CSINV_64_CONDSEL",
"CSET_CSINC_32_CONDSEL",
"CSET_CSINC_64_CONDSEL",
"CSINC_32_CONDSEL",
"CSINC_64_CONDSEL",
"CSINV_32_CONDSEL",
"CSINV_64_CONDSEL",
"CSNEG_32_CONDSEL",
"CSNEG_64_CONDSEL",
"DCPS1_DC_EXCEPTION",
"DCPS2_DC_EXCEPTION",
"DCPS3_DC_EXCEPTION",
"DC_SYS_CR_SYSTEM",
"DMB_BO_SYSTEM",
"DRPS_64E_BRANCH_REG",
"DSB_BO_SYSTEM",
"DUP_ASIMDINS_DR_R",
"DUP_ASIMDINS_DV_V",
"DUP_ASISDONE_ONLY",
"EON_32_LOG_SHIFT",
"EON_64_LOG_SHIFT",
"EOR_32_LOG_IMM",
"EOR_32_LOG_SHIFT",
"EOR_64_LOG_IMM",
"EOR_64_LOG_SHIFT",
"EOR_ASIMDSAME_ONLY",
"ERET_64E_BRANCH_REG",
"ESB_HI_SYSTEM",
"EXTR_32_EXTRACT",
"EXTR_64_EXTRACT",
"EXT_ASIMDEXT_ONLY",
"FABD_ASIMDSAME_ONLY",
"FABD_ASIMDSAMEFP16_ONLY",
"FABD_ASISDSAME_ONLY",
"FABD_ASISDSAMEFP16_ONLY",
"FABS_D_FLOATDP1",
"FABS_H_FLOATDP1",
"FABS_S_FLOATDP1",
"FABS_ASIMDMISC_R",
"FABS_ASIMDMISCFP16_R",
"FACGE_ASIMDSAME_ONLY",
"FACGE_ASIMDSAMEFP16_ONLY",
"FACGE_ASISDSAME_ONLY",
"FACGE_ASISDSAMEFP16_ONLY",
"FACGT_ASIMDSAME_ONLY",
"FACGT_ASIMDSAMEFP16_ONLY",
"FACGT_ASISDSAME_ONLY",
"FACGT_ASISDSAMEFP16_ONLY",
"FADDP_ASIMDSAME_ONLY",
"FADDP_ASIMDSAMEFP16_ONLY",
"FADDP_ASISDPAIR_ONLY_H",
"FADDP_ASISDPAIR_ONLY_SD",
"FADD_D_FLOATDP2",
"FADD_H_FLOATDP2",
"FADD_S_FLOATDP2",
"FADD_ASIMDSAME_ONLY",
"FADD_ASIMDSAMEFP16_ONLY",
"FCCMPE_D_FLOATCCMP",
"FCCMPE_H_FLOATCCMP",
"FCCMPE_S_FLOATCCMP",
"FCCMP_D_FLOATCCMP",
"FCCMP_H_FLOATCCMP",
"FCCMP_S_FLOATCCMP",
"FCMEQ_ASIMDMISC_FZ",
"FCMEQ_ASIMDMISCFP16_FZ",
"FCMEQ_ASIMDSAME_ONLY",
"FCMEQ_ASIMDSAMEFP16_ONLY",
"FCMEQ_ASISDMISC_FZ",
"FCMEQ_ASISDMISCFP16_FZ",
"FCMEQ_ASISDSAME_ONLY",
"FCMEQ_ASISDSAMEFP16_ONLY",
"FCMGE_ASIMDMISC_FZ",
"FCMGE_ASIMDMISCFP16_FZ",
"FCMGE_ASIMDSAME_ONLY",
"FCMGE_ASIMDSAMEFP16_ONLY",
"FCMGE_ASISDMISC_FZ",
"FCMGE_ASISDMISCFP16_FZ",
"FCMGE_ASISDSAME_ONLY",
"FCMGE_ASISDSAMEFP16_ONLY",
"FCMGT_ASIMDMISC_FZ",
"FCMGT_ASIMDMISCFP16_FZ",
"FCMGT_ASIMDSAME_ONLY",
"FCMGT_ASIMDSAMEFP16_ONLY",
"FCMGT_ASISDMISC_FZ",
"FCMGT_ASISDMISCFP16_FZ",
"FCMGT_ASISDSAME_ONLY",
"FCMGT_ASISDSAMEFP16_ONLY",
"FCMLE_ASIMDMISC_FZ",
"FCMLE_ASIMDMISCFP16_FZ",
"FCMLE_ASISDMISC_FZ",
"FCMLE_ASISDMISCFP16_FZ",
"FCMLT_ASIMDMISC_FZ",
"FCMLT_ASIMDMISCFP16_FZ",
"FCMLT_ASISDMISC_FZ",
"FCMLT_ASISDMISCFP16_FZ",
"FCMPE_DZ_FLOATCMP",
"FCMPE_D_FLOATCMP",
"FCMPE_HZ_FLOATCMP",
"FCMPE_H_FLOATCMP",
"FCMPE_SZ_FLOATCMP",
"FCMPE_S_FLOATCMP",
"FCMP_DZ_FLOATCMP",
"FCMP_D_FLOATCMP",
"FCMP_HZ_FLOATCMP",
"FCMP_H_FLOATCMP",
"FCMP_SZ_FLOATCMP",
"FCMP_S_FLOATCMP",
"FCSEL_D_FLOATSEL",
"FCSEL_H_FLOATSEL",
"FCSEL_S_FLOATSEL",
"FCVTAS_32D_FLOAT2INT",
"FCVTAS_32H_FLOAT2INT",
"FCVTAS_32S_FLOAT2INT",
"FCVTAS_64D_FLOAT2INT",
"FCVTAS_64H_FLOAT2INT",
"FCVTAS_64S_FLOAT2INT",
"FCVTAS_ASIMDMISC_R",
"FCVTAS_ASIMDMISCFP16_R",
"FCVTAS_ASISDMISC_R",
"FCVTAS_ASISDMISCFP16_R",
"FCVTAU_32D_FLOAT2INT",
"FCVTAU_32H_FLOAT2INT",
"FCVTAU_32S_FLOAT2INT",
"FCVTAU_64D_FLOAT2INT",
"FCVTAU_64H_FLOAT2INT",
"FCVTAU_64S_FLOAT2INT",
"FCVTAU_ASIMDMISC_R",
"FCVTAU_ASIMDMISCFP16_R",
"FCVTAU_ASISDMISC_R",
"FCVTAU_ASISDMISCFP16_R",
"FCVTL_ASIMDMISC_L",
"FCVTMS_32D_FLOAT2INT",
"FCVTMS_32H_FLOAT2INT",
"FCVTMS_32S_FLOAT2INT",
"FCVTMS_64D_FLOAT2INT",
"FCVTMS_64H_FLOAT2INT",
"FCVTMS_64S_FLOAT2INT",
"FCVTMS_ASIMDMISC_R",
"FCVTMS_ASIMDMISCFP16_R",
"FCVTMS_ASISDMISC_R",
"FCVTMS_ASISDMISCFP16_R",
"FCVTMU_32D_FLOAT2INT",
"FCVTMU_32H_FLOAT2INT",
"FCVTMU_32S_FLOAT2INT",
"FCVTMU_64D_FLOAT2INT",
"FCVTMU_64H_FLOAT2INT",
"FCVTMU_64S_FLOAT2INT",
"FCVTMU_ASIMDMISC_R",
"FCVTMU_ASIMDMISCFP16_R",
"FCVTMU_ASISDMISC_R",
"FCVTMU_ASISDMISCFP16_R",
"FCVTNS_32D_FLOAT2INT",
"FCVTNS_32H_FLOAT2INT",
"FCVTNS_32S_FLOAT2INT",
"FCVTNS_64D_FLOAT2INT",
"FCVTNS_64H_FLOAT2INT",
"FCVTNS_64S_FLOAT2INT",
"FCVTNS_ASIMDMISC_R",
"FCVTNS_ASIMDMISCFP16_R",
"FCVTNS_ASISDMISC_R",
"FCVTNS_ASISDMISCFP16_R",
"FCVTNU_32D_FLOAT2INT",
"FCVTNU_32H_FLOAT2INT",
"FCVTNU_32S_FLOAT2INT",
"FCVTNU_64D_FLOAT2INT",
"FCVTNU_64H_FLOAT2INT",
"FCVTNU_64S_FLOAT2INT",
"FCVTNU_ASIMDMISC_R",
"FCVTNU_ASIMDMISCFP16_R",
"FCVTNU_ASISDMISC_R",
"FCVTNU_ASISDMISCFP16_R",
"FCVTN_ASIMDMISC_N",
"FCVTPS_32D_FLOAT2INT",
"FCVTPS_32H_FLOAT2INT",
"FCVTPS_32S_FLOAT2INT",
"FCVTPS_64D_FLOAT2INT",
"FCVTPS_64H_FLOAT2INT",
"FCVTPS_64S_FLOAT2INT",
"FCVTPS_ASIMDMISC_R",
"FCVTPS_ASIMDMISCFP16_R",
"FCVTPS_ASISDMISC_R",
"FCVTPS_ASISDMISCFP16_R",
"FCVTPU_32D_FLOAT2INT",
"FCVTPU_32H_FLOAT2INT",
"FCVTPU_32S_FLOAT2INT",
"FCVTPU_64D_FLOAT2INT",
"FCVTPU_64H_FLOAT2INT",
"FCVTPU_64S_FLOAT2INT",
"FCVTPU_ASIMDMISC_R",
"FCVTPU_ASIMDMISCFP16_R",
"FCVTPU_ASISDMISC_R",
"FCVTPU_ASISDMISCFP16_R",
"FCVTXN_ASIMDMISC_N",
"FCVTXN_ASISDMISC_N",
"FCVTZS_32D_FLOAT2FIX",
"FCVTZS_32D_FLOAT2INT",
"FCVTZS_32H_FLOAT2FIX",
"FCVTZS_32H_FLOAT2INT",
"FCVTZS_32S_FLOAT2FIX",
"FCVTZS_32S_FLOAT2INT",
"FCVTZS_64D_FLOAT2FIX",
"FCVTZS_64D_FLOAT2INT",
"FCVTZS_64H_FLOAT2FIX",
"FCVTZS_64H_FLOAT2INT",
"FCVTZS_64S_FLOAT2FIX",
"FCVTZS_64S_FLOAT2INT",
"FCVTZS_ASIMDMISC_R",
"FCVTZS_ASIMDMISCFP16_R",
"FCVTZS_ASIMDSHF_C",
"FCVTZS_ASISDMISC_R",
"FCVTZS_ASISDMISCFP16_R",
"FCVTZS_ASISDSHF_C",
"FCVTZU_32D_FLOAT2FIX",
"FCVTZU_32D_FLOAT2INT",
"FCVTZU_32H_FLOAT2FIX",
"FCVTZU_32H_FLOAT2INT",
"FCVTZU_32S_FLOAT2FIX",
"FCVTZU_32S_FLOAT2INT",
"FCVTZU_64D_FLOAT2FIX",
"FCVTZU_64D_FLOAT2INT",
"FCVTZU_64H_FLOAT2FIX",
"FCVTZU_64H_FLOAT2INT",
"FCVTZU_64S_FLOAT2FIX",
"FCVTZU_64S_FLOAT2INT",
"FCVTZU_ASIMDMISC_R",
"FCVTZU_ASIMDMISCFP16_R",
"FCVTZU_ASIMDSHF_C",
"FCVTZU_ASISDMISC_R",
"FCVTZU_ASISDMISCFP16_R",
"FCVTZU_ASISDSHF_C",
"FCVT_DH_FLOATDP1",
"FCVT_DS_FLOATDP1",
"FCVT_HD_FLOATDP1",
"FCVT_HS_FLOATDP1",
"FCVT_SD_FLOATDP1",
"FCVT_SH_FLOATDP1",
"FDIV_D_FLOATDP2",
"FDIV_H_FLOATDP2",
"FDIV_S_FLOATDP2",
"FDIV_ASIMDSAME_ONLY",
"FDIV_ASIMDSAMEFP16_ONLY",
"FMADD_D_FLOATDP3",
"FMADD_H_FLOATDP3",
"FMADD_S_FLOATDP3",
"FMAXNMP_ASIMDSAME_ONLY",
"FMAXNMP_ASIMDSAMEFP16_ONLY",
"FMAXNMP_ASISDPAIR_ONLY_H",
"FMAXNMP_ASISDPAIR_ONLY_SD",
"FMAXNMV_ASIMDALL_ONLY_H",
"FMAXNMV_ASIMDALL_ONLY_SD",
"FMAXNM_D_FLOATDP2",
"FMAXNM_H_FLOATDP2",
"FMAXNM_S_FLOATDP2",
"FMAXNM_ASIMDSAME_ONLY",
"FMAXNM_ASIMDSAMEFP16_ONLY",
"FMAXP_ASIMDSAME_ONLY",
"FMAXP_ASIMDSAMEFP16_ONLY",
"FMAXP_ASISDPAIR_ONLY_H",
"FMAXP_ASISDPAIR_ONLY_SD",
"FMAXV_ASIMDALL_ONLY_H",
"FMAXV_ASIMDALL_ONLY_SD",
"FMAX_D_FLOATDP2",
"FMAX_H_FLOATDP2",
"FMAX_S_FLOATDP2",
"FMAX_ASIMDSAME_ONLY",
"FMAX_ASIMDSAMEFP16_ONLY",
"FMINNMP_ASIMDSAME_ONLY",
"FMINNMP_ASIMDSAMEFP16_ONLY",
"FMINNMP_ASISDPAIR_ONLY_H",
"FMINNMP_ASISDPAIR_ONLY_SD",
"FMINNMV_ASIMDALL_ONLY_H",
"FMINNMV_ASIMDALL_ONLY_SD",
"FMINNM_D_FLOATDP2",
"FMINNM_H_FLOATDP2",
"FMINNM_S_FLOATDP2",
"FMINNM_ASIMDSAME_ONLY",
"FMINNM_ASIMDSAMEFP16_ONLY",
"FMINP_ASIMDSAME_ONLY",
"FMINP_ASIMDSAMEFP16_ONLY",
"FMINP_ASISDPAIR_ONLY_H",
"FMINP_ASISDPAIR_ONLY_SD",
"FMINV_ASIMDALL_ONLY_H",
"FMINV_ASIMDALL_ONLY_SD",
"FMIN_D_FLOATDP2",
"FMIN_H_FLOATDP2",
"FMIN_S_FLOATDP2",
"FMIN_ASIMDSAME_ONLY",
"FMIN_ASIMDSAMEFP16_ONLY",
"FMLA_ASIMDELEM_RH_H",
"FMLA_ASIMDELEM_R_SD",
"FMLA_ASIMDSAME_ONLY",
"FMLA_ASIMDSAMEFP16_ONLY",
"FMLA_ASISDELEM_RH_H",
"FMLA_ASISDELEM_R_SD",
"FMLS_ASIMDELEM_RH_H",
"FMLS_ASIMDELEM_R_SD",
"FMLS_ASIMDSAME_ONLY",
"FMLS_ASIMDSAMEFP16_ONLY",
"FMLS_ASISDELEM_RH_H",
"FMLS_ASISDELEM_R_SD",
"FMOV_32H_FLOAT2INT",
"FMOV_32S_FLOAT2INT",
"FMOV_64D_FLOAT2INT",
"FMOV_64H_FLOAT2INT",
"FMOV_64VX_FLOAT2INT",
"FMOV_D64_FLOAT2INT",
"FMOV_D_FLOATDP1",
"FMOV_D_FLOATIMM",
"FMOV_H32_FLOAT2INT",
"FMOV_H64_FLOAT2INT",
"FMOV_H_FLOATDP1",
"FMOV_H_FLOATIMM",
"FMOV_S32_FLOAT2INT",
"FMOV_S_FLOATDP1",
"FMOV_S_FLOATIMM",
"FMOV_V64I_FLOAT2INT",
"FMOV_ASIMDIMM_D2_D",
"FMOV_ASIMDIMM_H_H",
"FMOV_ASIMDIMM_S_S",
"FMSUB_D_FLOATDP3",
"FMSUB_H_FLOATDP3",
"FMSUB_S_FLOATDP3",
"FMULX_ASIMDELEM_RH_H",
"FMULX_ASIMDELEM_R_SD",
"FMULX_ASIMDSAME_ONLY",
"FMULX_ASIMDSAMEFP16_ONLY",
"FMULX_ASISDELEM_RH_H",
"FMULX_ASISDELEM_R_SD",
"FMULX_ASISDSAME_ONLY",
"FMULX_ASISDSAMEFP16_ONLY",
"FMUL_D_FLOATDP2",
"FMUL_H_FLOATDP2",
"FMUL_S_FLOATDP2",
"FMUL_ASIMDELEM_RH_H",
"FMUL_ASIMDELEM_R_SD",
"FMUL_ASIMDSAME_ONLY",
"FMUL_ASIMDSAMEFP16_ONLY",
"FMUL_ASISDELEM_RH_H",
"FMUL_ASISDELEM_R_SD",
"FNEG_D_FLOATDP1",
"FNEG_H_FLOATDP1",
"FNEG_S_FLOATDP1",
"FNEG_ASIMDMISC_R",
"FNEG_ASIMDMISCFP16_R",
"FNMADD_D_FLOATDP3",
"FNMADD_H_FLOATDP3",
"FNMADD_S_FLOATDP3",
"FNMSUB_D_FLOATDP3",
"FNMSUB_H_FLOATDP3",
"FNMSUB_S_FLOATDP3",
"FNMUL_D_FLOATDP2",
"FNMUL_H_FLOATDP2",
"FNMUL_S_FLOATDP2",
"FRECPE_ASIMDMISC_R",
"FRECPE_ASIMDMISCFP16_R",
"FRECPE_ASISDMISC_R",
"FRECPE_ASISDMISCFP16_R",
"FRECPS_ASIMDSAME_ONLY",
"FRECPS_ASIMDSAMEFP16_ONLY",
"FRECPS_ASISDSAME_ONLY",
"FRECPS_ASISDSAMEFP16_ONLY",
"FRECPX_ASISDMISC_R",
"FRECPX_ASISDMISCFP16_R",
"FRINTA_D_FLOATDP1",
"FRINTA_H_FLOATDP1",
"FRINTA_S_FLOATDP1",
"FRINTA_ASIMDMISC_R",
"FRINTA_ASIMDMISCFP16_R",
"FRINTI_D_FLOATDP1",
"FRINTI_H_FLOATDP1",
"FRINTI_S_FLOATDP1",
"FRINTI_ASIMDMISC_R",
"FRINTI_ASIMDMISCFP16_R",
"FRINTM_D_FLOATDP1",
"FRINTM_H_FLOATDP1",
"FRINTM_S_FLOATDP1",
"FRINTM_ASIMDMISC_R",
"FRINTM_ASIMDMISCFP16_R",
"FRINTN_D_FLOATDP1",
"FRINTN_H_FLOATDP1",
"FRINTN_S_FLOATDP1",
"FRINTN_ASIMDMISC_R",
"FRINTN_ASIMDMISCFP16_R",
"FRINTP_D_FLOATDP1",
"FRINTP_H_FLOATDP1",
"FRINTP_S_FLOATDP1",
"FRINTP_ASIMDMISC_R",
"FRINTP_ASIMDMISCFP16_R",
"FRINTX_D_FLOATDP1",
"FRINTX_H_FLOATDP1",
"FRINTX_S_FLOATDP1",
"FRINTX_ASIMDMISC_R",
"FRINTX_ASIMDMISCFP16_R",
"FRINTZ_D_FLOATDP1",
"FRINTZ_H_FLOATDP1",
"FRINTZ_S_FLOATDP1",
"FRINTZ_ASIMDMISC_R",
"FRINTZ_ASIMDMISCFP16_R",
"FRSQRTE_ASIMDMISC_R",
"FRSQRTE_ASIMDMISCFP16_R",
"FRSQRTE_ASISDMISC_R",
"FRSQRTE_ASISDMISCFP16_R",
"FRSQRTS_ASIMDSAME_ONLY",
"FRSQRTS_ASIMDSAMEFP16_ONLY",
"FRSQRTS_ASISDSAME_ONLY",
"FRSQRTS_ASISDSAMEFP16_ONLY",
"FSQRT_D_FLOATDP1",
"FSQRT_H_FLOATDP1",
"FSQRT_S_FLOATDP1",
"FSQRT_ASIMDMISC_R",
"FSQRT_ASIMDMISCFP16_R",
"FSUB_D_FLOATDP2",
"FSUB_H_FLOATDP2",
"FSUB_S_FLOATDP2",
"FSUB_ASIMDSAME_ONLY",
"FSUB_ASIMDSAMEFP16_ONLY",
"HINT_1",
"HINT_2",
"HINT_3",
"HLT_EX_EXCEPTION",
"HVC_EX_EXCEPTION",
"IC_SYS_CR_SYSTEM",
"INS_ASIMDINS_IR_R",
"INS_ASIMDINS_IV_V",
"ISB_BI_SYSTEM",
"LD1R_ASISDLSO_R1",
"LD1R_ASISDLSOP_R1_I",
"LD1R_ASISDLSOP_RX1_R",
"LD1_ASISDLSE_R1_1V",
"LD1_ASISDLSE_R2_2V",
"LD1_ASISDLSE_R3_3V",
"LD1_ASISDLSE_R4_4V",
"LD1_ASISDLSEP_I1_I1",
"LD1_ASISDLSEP_I2_I2",
"LD1_ASISDLSEP_I3_I3",
"LD1_ASISDLSEP_I4_I4",
"LD1_ASISDLSEP_R1_R1",
"LD1_ASISDLSEP_R2_R2",
"LD1_ASISDLSEP_R3_R3",
"LD1_ASISDLSEP_R4_R4",
"LD1_ASISDLSO_B1_1B",
"LD1_ASISDLSO_D1_1D",
"LD1_ASISDLSO_H1_1H",
"LD1_ASISDLSO_S1_1S",
"LD1_ASISDLSOP_B1_I1B",
"LD1_ASISDLSOP_BX1_R1B",
"LD1_ASISDLSOP_D1_I1D",
"LD1_ASISDLSOP_DX1_R1D",
"LD1_ASISDLSOP_H1_I1H",
"LD1_ASISDLSOP_HX1_R1H",
"LD1_ASISDLSOP_S1_I1S",
"LD1_ASISDLSOP_SX1_R1S",
"LD2R_ASISDLSO_R2",
"LD2R_ASISDLSOP_R2_I",
"LD2R_ASISDLSOP_RX2_R",
"LD2_ASISDLSE_R2",
"LD2_ASISDLSEP_I2_I",
"LD2_ASISDLSEP_R2_R",
"LD2_ASISDLSO_B2_2B",
"LD2_ASISDLSO_D2_2D",
"LD2_ASISDLSO_H2_2H",
"LD2_ASISDLSO_S2_2S",
"LD2_ASISDLSOP_B2_I2B",
"LD2_ASISDLSOP_BX2_R2B",
"LD2_ASISDLSOP_D2_I2D",
"LD2_ASISDLSOP_DX2_R2D",
"LD2_ASISDLSOP_H2_I2H",
"LD2_ASISDLSOP_HX2_R2H",
"LD2_ASISDLSOP_S2_I2S",
"LD2_ASISDLSOP_SX2_R2S",
"LD3R_ASISDLSO_R3",
"LD3R_ASISDLSOP_R3_I",
"LD3R_ASISDLSOP_RX3_R",
"LD3_ASISDLSE_R3",
"LD3_ASISDLSEP_I3_I",
"LD3_ASISDLSEP_R3_R",
"LD3_ASISDLSO_B3_3B",
"LD3_ASISDLSO_D3_3D",
"LD3_ASISDLSO_H3_3H",
"LD3_ASISDLSO_S3_3S",
"LD3_ASISDLSOP_B3_I3B",
"LD3_ASISDLSOP_BX3_R3B",
"LD3_ASISDLSOP_D3_I3D",
"LD3_ASISDLSOP_DX3_R3D",
"LD3_ASISDLSOP_H3_I3H",
"LD3_ASISDLSOP_HX3_R3H",
"LD3_ASISDLSOP_S3_I3S",
"LD3_ASISDLSOP_SX3_R3S",
"LD4R_ASISDLSO_R4",
"LD4R_ASISDLSOP_R4_I",
"LD4R_ASISDLSOP_RX4_R",
"LD4_ASISDLSE_R4",
"LD4_ASISDLSEP_I4_I",
"LD4_ASISDLSEP_R4_R",
"LD4_ASISDLSO_B4_4B",
"LD4_ASISDLSO_D4_4D",
"LD4_ASISDLSO_H4_4H",
"LD4_ASISDLSO_S4_4S",
"LD4_ASISDLSOP_B4_I4B",
"LD4_ASISDLSOP_BX4_R4B",
"LD4_ASISDLSOP_D4_I4D",
"LD4_ASISDLSOP_DX4_R4D",
"LD4_ASISDLSOP_H4_I4H",
"LD4_ASISDLSOP_HX4_R4H",
"LD4_ASISDLSOP_S4_I4S",
"LD4_ASISDLSOP_SX4_R4S",
"LDADDAB_32_MEMOP",
"LDADDAH_32_MEMOP",
"LDADDALB_32_MEMOP",
"LDADDALH_32_MEMOP",
"LDADDAL_32_MEMOP",
"LDADDAL_64_MEMOP",
"LDADDA_32_MEMOP",
"LDADDA_64_MEMOP",
"LDADDB_32_MEMOP",
"LDADDH_32_MEMOP",
"LDADDLB_32_MEMOP",
"LDADDLH_32_MEMOP",
"LDADDL_32_MEMOP",
"LDADDL_64_MEMOP",
"LDADD_32_MEMOP",
"LDADD_64_MEMOP",
"LDARB_LR32_LDSTEXCL",
"LDARH_LR32_LDSTEXCL",
"LDAR_LR32_LDSTEXCL",
"LDAR_LR64_LDSTEXCL",
"LDAXP_LP32_LDSTEXCL",
"LDAXP_LP64_LDSTEXCL",
"LDAXRB_LR32_LDSTEXCL",
"LDAXRH_LR32_LDSTEXCL",
"LDAXR_LR32_LDSTEXCL",
"LDAXR_LR64_LDSTEXCL",
"LDCLRAB_32_MEMOP",
"LDCLRAH_32_MEMOP",
"LDCLRALB_32_MEMOP",
"LDCLRALH_32_MEMOP",
"LDCLRAL_32_MEMOP",
"LDCLRAL_64_MEMOP",
"LDCLRA_32_MEMOP",
"LDCLRA_64_MEMOP",
"LDCLRB_32_MEMOP",
"LDCLRH_32_MEMOP",
"LDCLRLB_32_MEMOP",
"LDCLRLH_32_MEMOP",
"LDCLRL_32_MEMOP",
"LDCLRL_64_MEMOP",
"LDCLR_32_MEMOP",
"LDCLR_64_MEMOP",
"LDEORAB_32_MEMOP",
"LDEORAH_32_MEMOP",
"LDEORALB_32_MEMOP",
"LDEORALH_32_MEMOP",
"LDEORAL_32_MEMOP",
"LDEORAL_64_MEMOP",
"LDEORA_32_MEMOP",
"LDEORA_64_MEMOP",
"LDEORB_32_MEMOP",
"LDEORH_32_MEMOP",
"LDEORLB_32_MEMOP",
"LDEORLH_32_MEMOP",
"LDEORL_32_MEMOP",
"LDEORL_64_MEMOP",
"LDEOR_32_MEMOP",
"LDEOR_64_MEMOP",
"LDLARB_LR32_LDSTEXCL",
"LDLARH_LR32_LDSTEXCL",
"LDLAR_LR32_LDSTEXCL",
"LDLAR_LR64_LDSTEXCL",
"LDNP_32_LDSTNAPAIR_OFFS",
"LDNP_64_LDSTNAPAIR_OFFS",
"LDNP_D_LDSTNAPAIR_OFFS",
"LDNP_Q_LDSTNAPAIR_OFFS",
"LDNP_S_LDSTNAPAIR_OFFS",
"LDPSW_64_LDSTPAIR_OFF",
"LDPSW_64_LDSTPAIR_POST",
"LDPSW_64_LDSTPAIR_PRE",
"LDP_32_LDSTPAIR_OFF",
"LDP_32_LDSTPAIR_POST",
"LDP_32_LDSTPAIR_PRE",
"LDP_64_LDSTPAIR_OFF",
"LDP_64_LDSTPAIR_POST",
"LDP_64_LDSTPAIR_PRE",
"LDP_D_LDSTPAIR_OFF",
"LDP_D_LDSTPAIR_POST",
"LDP_D_LDSTPAIR_PRE",
"LDP_Q_LDSTPAIR_OFF",
"LDP_Q_LDSTPAIR_POST",
"LDP_Q_LDSTPAIR_PRE",
"LDP_S_LDSTPAIR_OFF",
"LDP_S_LDSTPAIR_POST",
"LDP_S_LDSTPAIR_PRE",
"LDRB_32BL_LDST_REGOFF",
"LDRB_32B_LDST_REGOFF",
"LDRB_32_LDST_IMMPOST",
"LDRB_32_LDST_IMMPRE",
"LDRB_32_LDST_POS",
"LDRH_32_LDST_IMMPOST",
"LDRH_32_LDST_IMMPRE",
"LDRH_32_LDST_POS",
"LDRH_32_LDST_REGOFF",
"LDRSB_32BL_LDST_REGOFF",
"LDRSB_32B_LDST_REGOFF",
"LDRSB_32_LDST_IMMPOST",
"LDRSB_32_LDST_IMMPRE",
"LDRSB_32_LDST_POS",
"LDRSB_64BL_LDST_REGOFF",
"LDRSB_64B_LDST_REGOFF",
"LDRSB_64_LDST_IMMPOST",
"LDRSB_64_LDST_IMMPRE",
"LDRSB_64_LDST_POS",
"LDRSH_32_LDST_IMMPOST",
"LDRSH_32_LDST_IMMPRE",
"LDRSH_32_LDST_POS",
"LDRSH_32_LDST_REGOFF",
"LDRSH_64_LDST_IMMPOST",
"LDRSH_64_LDST_IMMPRE",
"LDRSH_64_LDST_POS",
"LDRSH_64_LDST_REGOFF",
"LDRSW_64_LDST_IMMPOST",
"LDRSW_64_LDST_IMMPRE",
"LDRSW_64_LDST_POS",
"LDRSW_64_LDST_REGOFF",
"LDRSW_64_LOADLIT",
"LDR_32_LDST_IMMPOST",
"LDR_32_LDST_IMMPRE",
"LDR_32_LDST_POS",
"LDR_32_LDST_REGOFF",
"LDR_32_LOADLIT",
"LDR_64_LDST_IMMPOST",
"LDR_64_LDST_IMMPRE",
"LDR_64_LDST_POS",
"LDR_64_LDST_REGOFF",
"LDR_64_LOADLIT",
"LDR_BL_LDST_REGOFF",
"LDR_B_LDST_IMMPOST",
"LDR_B_LDST_IMMPRE",
"LDR_B_LDST_POS",
"LDR_B_LDST_REGOFF",
"LDR_D_LDST_IMMPOST",
"LDR_D_LDST_IMMPRE",
"LDR_D_LDST_POS",
"LDR_D_LDST_REGOFF",
"LDR_D_LOADLIT",
"LDR_H_LDST_IMMPOST",
"LDR_H_LDST_IMMPRE",
"LDR_H_LDST_POS",
"LDR_H_LDST_REGOFF",
"LDR_Q_LDST_IMMPOST",
"LDR_Q_LDST_IMMPRE",
"LDR_Q_LDST_POS",
"LDR_Q_LDST_REGOFF",
"LDR_Q_LOADLIT",
"LDR_S_LDST_IMMPOST",
"LDR_S_LDST_IMMPRE",
"LDR_S_LDST_POS",
"LDR_S_LDST_REGOFF",
"LDR_S_LOADLIT",
"LDSETAB_32_MEMOP",
"LDSETAH_32_MEMOP",
"LDSETALB_32_MEMOP",
"LDSETALH_32_MEMOP",
"LDSETAL_32_MEMOP",
"LDSETAL_64_MEMOP",
"LDSETA_32_MEMOP",
"LDSETA_64_MEMOP",
"LDSETB_32_MEMOP",
"LDSETH_32_MEMOP",
"LDSETLB_32_MEMOP",
"LDSETLH_32_MEMOP",
"LDSETL_32_MEMOP",
"LDSETL_64_MEMOP",
"LDSET_32_MEMOP",
"LDSET_64_MEMOP",
"LDSMAXAB_32_MEMOP",
"LDSMAXAH_32_MEMOP",
"LDSMAXALB_32_MEMOP",
"LDSMAXALH_32_MEMOP",
"LDSMAXAL_32_MEMOP",
"LDSMAXAL_64_MEMOP",
"LDSMAXA_32_MEMOP",
"LDSMAXA_64_MEMOP",
"LDSMAXB_32_MEMOP",
"LDSMAXH_32_MEMOP",
"LDSMAXLB_32_MEMOP",
"LDSMAXLH_32_MEMOP",
"LDSMAXL_32_MEMOP",
"LDSMAXL_64_MEMOP",
"LDSMAX_32_MEMOP",
"LDSMAX_64_MEMOP",
"LDSMINAB_32_MEMOP",
"LDSMINAH_32_MEMOP",
"LDSMINALB_32_MEMOP",
"LDSMINALH_32_MEMOP",
"LDSMINAL_32_MEMOP",
"LDSMINAL_64_MEMOP",
"LDSMINA_32_MEMOP",
"LDSMINA_64_MEMOP",
"LDSMINB_32_MEMOP",
"LDSMINH_32_MEMOP",
"LDSMINLB_32_MEMOP",
"LDSMINLH_32_MEMOP",
"LDSMINL_32_MEMOP",
"LDSMINL_64_MEMOP",
"LDSMIN_32_MEMOP",
"LDSMIN_64_MEMOP",
"LDTRB_32_LDST_UNPRIV",
"LDTRH_32_LDST_UNPRIV",
"LDTRSB_32_LDST_UNPRIV",
"LDTRSB_64_LDST_UNPRIV",
"LDTRSH_32_LDST_UNPRIV",
"LDTRSH_64_LDST_UNPRIV",
"LDTRSW_64_LDST_UNPRIV",
"LDTR_32_LDST_UNPRIV",
"LDTR_64_LDST_UNPRIV",
"LDUMAXAB_32_MEMOP",
"LDUMAXAH_32_MEMOP",
"LDUMAXALB_32_MEMOP",
"LDUMAXALH_32_MEMOP",
"LDUMAXAL_32_MEMOP",
"LDUMAXAL_64_MEMOP",
"LDUMAXA_32_MEMOP",
"LDUMAXA_64_MEMOP",
"LDUMAXB_32_MEMOP",
"LDUMAXH_32_MEMOP",
"LDUMAXLB_32_MEMOP",
"LDUMAXLH_32_MEMOP",
"LDUMAXL_32_MEMOP",
"LDUMAXL_64_MEMOP",
"LDUMAX_32_MEMOP",
"LDUMAX_64_MEMOP",
"LDUMINAB_32_MEMOP",
"LDUMINAH_32_MEMOP",
"LDUMINALB_32_MEMOP",
"LDUMINALH_32_MEMOP",
"LDUMINAL_32_MEMOP",
"LDUMINAL_64_MEMOP",
"LDUMINA_32_MEMOP",
"LDUMINA_64_MEMOP",
"LDUMINB_32_MEMOP",
"LDUMINH_32_MEMOP",
"LDUMINLB_32_MEMOP",
"LDUMINLH_32_MEMOP",
"LDUMINL_32_MEMOP",
"LDUMINL_64_MEMOP",
"LDUMIN_32_MEMOP",
"LDUMIN_64_MEMOP",
"LDURB_32_LDST_UNSCALED",
"LDURH_32_LDST_UNSCALED",
"LDURSB_32_LDST_UNSCALED",
"LDURSB_64_LDST_UNSCALED",
"LDURSH_32_LDST_UNSCALED",
"LDURSH_64_LDST_UNSCALED",
"LDURSW_64_LDST_UNSCALED",
"LDUR_32_LDST_UNSCALED",
"LDUR_64_LDST_UNSCALED",
"LDUR_B_LDST_UNSCALED",
"LDUR_D_LDST_UNSCALED",
"LDUR_H_LDST_UNSCALED",
"LDUR_Q_LDST_UNSCALED",
"LDUR_S_LDST_UNSCALED",
"LDXP_LP32_LDSTEXCL",
"LDXP_LP64_LDSTEXCL",
"LDXRB_LR32_LDSTEXCL",
"LDXRH_LR32_LDSTEXCL",
"LDXR_LR32_LDSTEXCL",
"LDXR_LR64_LDSTEXCL",
"LSLV_32_DP_2SRC",
"LSLV_64_DP_2SRC",
"LSL_LSLV_32_DP_2SRC",
"LSL_LSLV_64_DP_2SRC",
"LSL_UBFM_32M_BITFIELD",
"LSL_UBFM_64M_BITFIELD",
"LSRV_32_DP_2SRC",
"LSRV_64_DP_2SRC",
"LSR_LSRV_32_DP_2SRC",
"LSR_LSRV_64_DP_2SRC",
"LSR_UBFM_32M_BITFIELD",
"LSR_UBFM_64M_BITFIELD",
"MADD_32A_DP_3SRC",
"MADD_64A_DP_3SRC",
"MLA_ASIMDELEM_R",
"MLA_ASIMDSAME_ONLY",
"MLS_ASIMDELEM_R",
"MLS_ASIMDSAME_ONLY",
"MNEG_MSUB_32A_DP_3SRC",
"MNEG_MSUB_64A_DP_3SRC",
"MOVI_ASIMDIMM_D2_D",
"MOVI_ASIMDIMM_D_DS",
"MOVI_ASIMDIMM_L_HL",
"MOVI_ASIMDIMM_L_SL",
"MOVI_ASIMDIMM_M_SM",
"MOVI_ASIMDIMM_N_B",
"MOVK_32_MOVEWIDE",
"MOVK_64_MOVEWIDE",
"MOVN_32_MOVEWIDE",
"MOVN_64_MOVEWIDE",
"MOVZ_32_MOVEWIDE",
"MOVZ_64_MOVEWIDE",
"MOV_ADD_32_ADDSUB_IMM",
"MOV_ADD_64_ADDSUB_IMM",
"MOV_DUP_ASISDONE_ONLY",
"MOV_INS_ASIMDINS_IR_R",
"MOV_INS_ASIMDINS_IV_V",
"MOV_MOVN_32_MOVEWIDE",
"MOV_MOVN_64_MOVEWIDE",
"MOV_MOVZ_32_MOVEWIDE",
"MOV_MOVZ_64_MOVEWIDE",
"MOV_ORR_32_LOG_IMM",
"MOV_ORR_32_LOG_SHIFT",
"MOV_ORR_64_LOG_IMM",
"MOV_ORR_64_LOG_SHIFT",
"MOV_ORR_ASIMDSAME_ONLY",
"MOV_UMOV_ASIMDINS_W_W",
"MOV_UMOV_ASIMDINS_X_X",
"MRS_RS_SYSTEM",
"MSR_SI_SYSTEM",
"MSR_SR_SYSTEM",
"MSUB_32A_DP_3SRC",
"MSUB_64A_DP_3SRC",
"MUL_MADD_32A_DP_3SRC",
"MUL_MADD_64A_DP_3SRC",
"MUL_ASIMDELEM_R",
"MUL_ASIMDSAME_ONLY",
"MVNI_ASIMDIMM_L_HL",
"MVNI_ASIMDIMM_L_SL",
"MVNI_ASIMDIMM_M_SM",
"MVN_NOT_ASIMDMISC_R",
"MVN_ORN_32_LOG_SHIFT",
"MVN_ORN_64_LOG_SHIFT",
"NEGS_SUBS_32_ADDSUB_SHIFT",
"NEGS_SUBS_64_ADDSUB_SHIFT",
"NEG_SUB_32_ADDSUB_SHIFT",
"NEG_SUB_64_ADDSUB_SHIFT",
"NEG_ASIMDMISC_R",
"NEG_ASISDMISC_R",
"NGCS_SBCS_32_ADDSUB_CARRY",
"NGCS_SBCS_64_ADDSUB_CARRY",
"NGC_SBC_32_ADDSUB_CARRY",
"NGC_SBC_64_ADDSUB_CARRY",
"NOP_HI_SYSTEM",
"NOT_ASIMDMISC_R",
"ORN_32_LOG_SHIFT",
"ORN_64_LOG_SHIFT",
"ORN_ASIMDSAME_ONLY",
"ORR_32_LOG_IMM",
"ORR_32_LOG_SHIFT",
"ORR_64_LOG_IMM",
"ORR_64_LOG_SHIFT",
"ORR_ASIMDIMM_L_HL",
"ORR_ASIMDIMM_L_SL",
"ORR_ASIMDSAME_ONLY",
"PMULL_ASIMDDIFF_L",
"PMUL_ASIMDSAME_ONLY",
"PRFM_P_LDST_POS",
"PRFM_P_LDST_REGOFF",
"PRFM_P_LOADLIT",
"PRFUM_P_LDST_UNSCALED",
"PSB_HC_SYSTEM",
"RADDHN_ASIMDDIFF_N",
"RBIT_32_DP_1SRC",
"RBIT_64_DP_1SRC",
"RBIT_ASIMDMISC_R",
"RET_64R_BRANCH_REG",
"REV16_32_DP_1SRC",
"REV16_64_DP_1SRC",
"REV16_ASIMDMISC_R",
"REV32_64_DP_1SRC",
"REV32_ASIMDMISC_R",
"REV64_REV_64_DP_1SRC",
"REV64_ASIMDMISC_R",
"REV_32_DP_1SRC",
"REV_64_DP_1SRC",
"RORV_32_DP_2SRC",
"RORV_64_DP_2SRC",
"ROR_EXTR_32_EXTRACT",
"ROR_EXTR_64_EXTRACT",
"ROR_RORV_32_DP_2SRC",
"ROR_RORV_64_DP_2SRC",
"RSHRN_ASIMDSHF_N",
"RSUBHN_ASIMDDIFF_N",
"SABAL_ASIMDDIFF_L",
"SABA_ASIMDSAME_ONLY",
"SABDL_ASIMDDIFF_L",
"SABD_ASIMDSAME_ONLY",
"SADALP_ASIMDMISC_P",
"SADDLP_ASIMDMISC_P",
"SADDLV_ASIMDALL_ONLY",
"SADDL_ASIMDDIFF_L",
"SADDW_ASIMDDIFF_W",
"SBCS_32_ADDSUB_CARRY",
"SBCS_64_ADDSUB_CARRY",
"SBC_32_ADDSUB_CARRY",
"SBC_64_ADDSUB_CARRY",
"SBFIZ_SBFM_32M_BITFIELD",
"SBFIZ_SBFM_64M_BITFIELD",
"SBFM_32M_BITFIELD",
"SBFM_64M_BITFIELD",
"SBFX_SBFM_32M_BITFIELD",
"SBFX_SBFM_64M_BITFIELD",
"SCVTF_D32_FLOAT2FIX",
"SCVTF_D32_FLOAT2INT",
"SCVTF_D64_FLOAT2FIX",
"SCVTF_D64_FLOAT2INT",
"SCVTF_H32_FLOAT2FIX",
"SCVTF_H32_FLOAT2INT",
"SCVTF_H64_FLOAT2FIX",
"SCVTF_H64_FLOAT2INT",
"SCVTF_S32_FLOAT2FIX",
"SCVTF_S32_FLOAT2INT",
"SCVTF_S64_FLOAT2FIX",
"SCVTF_S64_FLOAT2INT",
"SCVTF_ASIMDMISC_R",
"SCVTF_ASIMDMISCFP16_R",
"SCVTF_ASIMDSHF_C",
"SCVTF_ASISDMISC_R",
"SCVTF_ASISDMISCFP16_R",
"SCVTF_ASISDSHF_C",
"SDIV_32_DP_2SRC",
"SDIV_64_DP_2SRC",
"SEVL_HI_SYSTEM",
"SEV_HI_SYSTEM",
"SHA1C_QSV_CRYPTOSHA3",
"SHA1H_SS_CRYPTOSHA2",
"SHA1M_QSV_CRYPTOSHA3",
"SHA1P_QSV_CRYPTOSHA3",
"SHA1SU0_VVV_CRYPTOSHA3",
"SHA1SU1_VV_CRYPTOSHA2",
"SHA256H2_QQV_CRYPTOSHA3",
"SHA256H_QQV_CRYPTOSHA3",
"SHA256SU0_VV_CRYPTOSHA2",
"SHA256SU1_VVV_CRYPTOSHA3",
"SHADD_ASIMDSAME_ONLY",
"SHLL_ASIMDMISC_S",
"SHL_ASIMDSHF_R",
"SHL_ASISDSHF_R",
"SHRN_ASIMDSHF_N",
"SHSUB_ASIMDSAME_ONLY",
"SLI_ASIMDSHF_R",
"SLI_ASISDSHF_R",
"SMADDL_64WA_DP_3SRC",
"SMAXP_ASIMDSAME_ONLY",
"SMAXV_ASIMDALL_ONLY",
"SMAX_ASIMDSAME_ONLY",
"SMC_EX_EXCEPTION",
"SMINP_ASIMDSAME_ONLY",
"SMINV_ASIMDALL_ONLY",
"SMIN_ASIMDSAME_ONLY",
"SMLAL_ASIMDDIFF_L",
"SMLAL_ASIMDELEM_L",
"SMLSL_ASIMDDIFF_L",
"SMLSL_ASIMDELEM_L",
"SMNEGL_SMSUBL_64WA_DP_3SRC",
"SMOV_ASIMDINS_W_W",
"SMOV_ASIMDINS_X_X",
"SMSUBL_64WA_DP_3SRC",
"SMULH_64_DP_3SRC",
"SMULL_SMADDL_64WA_DP_3SRC",
"SMULL_ASIMDDIFF_L",
"SMULL_ASIMDELEM_L",
"SQABS_ASIMDMISC_R",
"SQABS_ASISDMISC_R",
"SQADD_ASIMDSAME_ONLY",
"SQADD_ASISDSAME_ONLY",
"SQDMLAL_ASIMDDIFF_L",
"SQDMLAL_ASIMDELEM_L",
"SQDMLAL_ASISDDIFF_ONLY",
"SQDMLAL_ASISDELEM_L",
"SQDMLSL_ASIMDDIFF_L",
"SQDMLSL_ASIMDELEM_L",
"SQDMLSL_ASISDDIFF_ONLY",
"SQDMLSL_ASISDELEM_L",
"SQDMULH_ASIMDELEM_R",
"SQDMULH_ASIMDSAME_ONLY",
"SQDMULH_ASISDELEM_R",
"SQDMULH_ASISDSAME_ONLY",
"SQDMULL_ASIMDDIFF_L",
"SQDMULL_ASIMDELEM_L",
"SQDMULL_ASISDDIFF_ONLY",
"SQDMULL_ASISDELEM_L",
"SQNEG_ASIMDMISC_R",
"SQNEG_ASISDMISC_R",
"SQRDMLAH_ASIMDELEM_R",
"SQRDMLAH_ASIMDSAME2_ONLY",
"SQRDMLAH_ASISDELEM_R",
"SQRDMLAH_ASISDSAME2_ONLY",
"SQRDMLSH_ASIMDELEM_R",
"SQRDMLSH_ASIMDSAME2_ONLY",
"SQRDMLSH_ASISDELEM_R",
"SQRDMLSH_ASISDSAME2_ONLY",
"SQRDMULH_ASIMDELEM_R",
"SQRDMULH_ASIMDSAME_ONLY",
"SQRDMULH_ASISDELEM_R",
"SQRDMULH_ASISDSAME_ONLY",
"SQRSHL_ASIMDSAME_ONLY",
"SQRSHL_ASISDSAME_ONLY",
"SQRSHRN_ASIMDSHF_N",
"SQRSHRN_ASISDSHF_N",
"SQRSHRUN_ASIMDSHF_N",
"SQRSHRUN_ASISDSHF_N",
"SQSHLU_ASIMDSHF_R",
"SQSHLU_ASISDSHF_R",
"SQSHL_ASIMDSAME_ONLY",
"SQSHL_ASIMDSHF_R",
"SQSHL_ASISDSAME_ONLY",
"SQSHL_ASISDSHF_R",
"SQSHRN_ASIMDSHF_N",
"SQSHRN_ASISDSHF_N",
"SQSHRUN_ASIMDSHF_N",
"SQSHRUN_ASISDSHF_N",
"SQSUB_ASIMDSAME_ONLY",
"SQSUB_ASISDSAME_ONLY",
"SQXTN_ASIMDMISC_N",
"SQXTN_ASISDMISC_N",
"SQXTUN_ASIMDMISC_N",
"SQXTUN_ASISDMISC_N",
"SRHADD_ASIMDSAME_ONLY",
"SRI_ASIMDSHF_R",
"SRI_ASISDSHF_R",
"SRSHL_ASIMDSAME_ONLY",
"SRSHL_ASISDSAME_ONLY",
"SRSHR_ASIMDSHF_R",
"SRSHR_ASISDSHF_R",
"SRSRA_ASIMDSHF_R",
"SRSRA_ASISDSHF_R",
"SSHLL_ASIMDSHF_L",
"SSHL_ASIMDSAME_ONLY",
"SSHL_ASISDSAME_ONLY",
"SSHR_ASIMDSHF_R",
"SSHR_ASISDSHF_R",
"SSRA_ASIMDSHF_R",
"SSRA_ASISDSHF_R",
"SSUBL_ASIMDDIFF_L",
"SSUBW_ASIMDDIFF_W",
"ST1_ASISDLSE_R1_1V",
"ST1_ASISDLSE_R2_2V",
"ST1_ASISDLSE_R3_3V",
"ST1_ASISDLSE_R4_4V",
"ST1_ASISDLSEP_I1_I1",
"ST1_ASISDLSEP_I2_I2",
"ST1_ASISDLSEP_I3_I3",
"ST1_ASISDLSEP_I4_I4",
"ST1_ASISDLSEP_R1_R1",
"ST1_ASISDLSEP_R2_R2",
"ST1_ASISDLSEP_R3_R3",
"ST1_ASISDLSEP_R4_R4",
"ST1_ASISDLSO_B1_1B",
"ST1_ASISDLSO_D1_1D",
"ST1_ASISDLSO_H1_1H",
"ST1_ASISDLSO_S1_1S",
"ST1_ASISDLSOP_B1_I1B",
"ST1_ASISDLSOP_BX1_R1B",
"ST1_ASISDLSOP_D1_I1D",
"ST1_ASISDLSOP_DX1_R1D",
"ST1_ASISDLSOP_H1_I1H",
"ST1_ASISDLSOP_HX1_R1H",
"ST1_ASISDLSOP_S1_I1S",
"ST1_ASISDLSOP_SX1_R1S",
"ST2_ASISDLSE_R2",
"ST2_ASISDLSEP_I2_I",
"ST2_ASISDLSEP_R2_R",
"ST2_ASISDLSO_B2_2B",
"ST2_ASISDLSO_D2_2D",
"ST2_ASISDLSO_H2_2H",
"ST2_ASISDLSO_S2_2S",
"ST2_ASISDLSOP_B2_I2B",
"ST2_ASISDLSOP_BX2_R2B",
"ST2_ASISDLSOP_D2_I2D",
"ST2_ASISDLSOP_DX2_R2D",
"ST2_ASISDLSOP_H2_I2H",
"ST2_ASISDLSOP_HX2_R2H",
"ST2_ASISDLSOP_S2_I2S",
"ST2_ASISDLSOP_SX2_R2S",
"ST3_ASISDLSE_R3",
"ST3_ASISDLSEP_I3_I",
"ST3_ASISDLSEP_R3_R",
"ST3_ASISDLSO_B3_3B",
"ST3_ASISDLSO_D3_3D",
"ST3_ASISDLSO_H3_3H",
"ST3_ASISDLSO_S3_3S",
"ST3_ASISDLSOP_B3_I3B",
"ST3_ASISDLSOP_BX3_R3B",
"ST3_ASISDLSOP_D3_I3D",
"ST3_ASISDLSOP_DX3_R3D",
"ST3_ASISDLSOP_H3_I3H",
"ST3_ASISDLSOP_HX3_R3H",
"ST3_ASISDLSOP_S3_I3S",
"ST3_ASISDLSOP_SX3_R3S",
"ST4_ASISDLSE_R4",
"ST4_ASISDLSEP_I4_I",
"ST4_ASISDLSEP_R4_R",
"ST4_ASISDLSO_B4_4B",
"ST4_ASISDLSO_D4_4D",
"ST4_ASISDLSO_H4_4H",
"ST4_ASISDLSO_S4_4S",
"ST4_ASISDLSOP_B4_I4B",
"ST4_ASISDLSOP_BX4_R4B",
"ST4_ASISDLSOP_D4_I4D",
"ST4_ASISDLSOP_DX4_R4D",
"ST4_ASISDLSOP_H4_I4H",
"ST4_ASISDLSOP_HX4_R4H",
"ST4_ASISDLSOP_S4_I4S",
"ST4_ASISDLSOP_SX4_R4S",
"STADDB_32S_MEMOP",
"STADDH_32S_MEMOP",
"STADDLB_32S_MEMOP",
"STADDLH_32S_MEMOP",
"STADDL_32S_MEMOP",
"STADDL_64S_MEMOP",
"STADD_32S_MEMOP",
"STADD_64S_MEMOP",
"STCLRB_32S_MEMOP",
"STCLRH_32S_MEMOP",
"STCLRLB_32S_MEMOP",
"STCLRLH_32S_MEMOP",
"STCLRL_32S_MEMOP",
"STCLRL_64S_MEMOP",
"STCLR_32S_MEMOP",
"STCLR_64S_MEMOP",
"STEORB_32S_MEMOP",
"STEORH_32S_MEMOP",
"STEORLB_32S_MEMOP",
"STEORLH_32S_MEMOP",
"STEORL_32S_MEMOP",
"STEORL_64S_MEMOP",
"STEOR_32S_MEMOP",
"STEOR_64S_MEMOP",
"STLLRB_SL32_LDSTEXCL",
"STLLRH_SL32_LDSTEXCL",
"STLLR_SL32_LDSTEXCL",
"STLLR_SL64_LDSTEXCL",
"STLRB_SL32_LDSTEXCL",
"STLRH_SL32_LDSTEXCL",
"STLR_SL32_LDSTEXCL",
"STLR_SL64_LDSTEXCL",
"STLXP_SP32_LDSTEXCL",
"STLXP_SP64_LDSTEXCL",
"STLXRB_SR32_LDSTEXCL",
"STLXRH_SR32_LDSTEXCL",
"STLXR_SR32_LDSTEXCL",
"STLXR_SR64_LDSTEXCL",
"STNP_32_LDSTNAPAIR_OFFS",
"STNP_64_LDSTNAPAIR_OFFS",
"STNP_D_LDSTNAPAIR_OFFS",
"STNP_Q_LDSTNAPAIR_OFFS",
"STNP_S_LDSTNAPAIR_OFFS",
"STP_32_LDSTPAIR_OFF",
"STP_32_LDSTPAIR_POST",
"STP_32_LDSTPAIR_PRE",
"STP_64_LDSTPAIR_OFF",
"STP_64_LDSTPAIR_POST",
"STP_64_LDSTPAIR_PRE",
"STP_D_LDSTPAIR_OFF",
"STP_D_LDSTPAIR_POST",
"STP_D_LDSTPAIR_PRE",
"STP_Q_LDSTPAIR_OFF",
"STP_Q_LDSTPAIR_POST",
"STP_Q_LDSTPAIR_PRE",
"STP_S_LDSTPAIR_OFF",
"STP_S_LDSTPAIR_POST",
"STP_S_LDSTPAIR_PRE",
"STRB_32BL_LDST_REGOFF",
"STRB_32B_LDST_REGOFF",
"STRB_32_LDST_IMMPOST",
"STRB_32_LDST_IMMPRE",
"STRB_32_LDST_POS",
"STRH_32_LDST_IMMPOST",
"STRH_32_LDST_IMMPRE",
"STRH_32_LDST_POS",
"STRH_32_LDST_REGOFF",
"STR_32_LDST_IMMPOST",
"STR_32_LDST_IMMPRE",
"STR_32_LDST_POS",
"STR_32_LDST_REGOFF",
"STR_64_LDST_IMMPOST",
"STR_64_LDST_IMMPRE",
"STR_64_LDST_POS",
"STR_64_LDST_REGOFF",
"STR_BL_LDST_REGOFF",
"STR_B_LDST_IMMPOST",
"STR_B_LDST_IMMPRE",
"STR_B_LDST_POS",
"STR_B_LDST_REGOFF",
"STR_D_LDST_IMMPOST",
"STR_D_LDST_IMMPRE",
"STR_D_LDST_POS",
"STR_D_LDST_REGOFF",
"STR_H_LDST_IMMPOST",
"STR_H_LDST_IMMPRE",
"STR_H_LDST_POS",
"STR_H_LDST_REGOFF",
"STR_Q_LDST_IMMPOST",
"STR_Q_LDST_IMMPRE",
"STR_Q_LDST_POS",
"STR_Q_LDST_REGOFF",
"STR_S_LDST_IMMPOST",
"STR_S_LDST_IMMPRE",
"STR_S_LDST_POS",
"STR_S_LDST_REGOFF",
"STSETB_32S_MEMOP",
"STSETH_32S_MEMOP",
"STSETLB_32S_MEMOP",
"STSETLH_32S_MEMOP",
"STSETL_32S_MEMOP",
"STSETL_64S_MEMOP",
"STSET_32S_MEMOP",
"STSET_64S_MEMOP",
"STSMAXB_32S_MEMOP",
"STSMAXH_32S_MEMOP",
"STSMAXLB_32S_MEMOP",
"STSMAXLH_32S_MEMOP",
"STSMAXL_32S_MEMOP",
"STSMAXL_64S_MEMOP",
"STSMAX_32S_MEMOP",
"STSMAX_64S_MEMOP",
"STSMINB_32S_MEMOP",
"STSMINH_32S_MEMOP",
"STSMINLB_32S_MEMOP",
"STSMINLH_32S_MEMOP",
"STSMINL_32S_MEMOP",
"STSMINL_64S_MEMOP",
"STSMIN_32S_MEMOP",
"STSMIN_64S_MEMOP",
"STTRB_32_LDST_UNPRIV",
"STTRH_32_LDST_UNPRIV",
"STTR_32_LDST_UNPRIV",
"STTR_64_LDST_UNPRIV",
"STUMAXB_32S_MEMOP",
"STUMAXH_32S_MEMOP",
"STUMAXLB_32S_MEMOP",
"STUMAXLH_32S_MEMOP",
"STUMAXL_32S_MEMOP",
"STUMAXL_64S_MEMOP",
"STUMAX_32S_MEMOP",
"STUMAX_64S_MEMOP",
"STUMINB_32S_MEMOP",
"STUMINH_32S_MEMOP",
"STUMINLB_32S_MEMOP",
"STUMINLH_32S_MEMOP",
"STUMINL_32S_MEMOP",
"STUMINL_64S_MEMOP",
"STUMIN_32S_MEMOP",
"STUMIN_64S_MEMOP",
"STURB_32_LDST_UNSCALED",
"STURH_32_LDST_UNSCALED",
"STUR_32_LDST_UNSCALED",
"STUR_64_LDST_UNSCALED",
"STUR_B_LDST_UNSCALED",
"STUR_D_LDST_UNSCALED",
"STUR_H_LDST_UNSCALED",
"STUR_Q_LDST_UNSCALED",
"STUR_S_LDST_UNSCALED",
"STXP_SP32_LDSTEXCL",
"STXP_SP64_LDSTEXCL",
"STXRB_SR32_LDSTEXCL",
"STXRH_SR32_LDSTEXCL",
"STXR_SR32_LDSTEXCL",
"STXR_SR64_LDSTEXCL",
"SUBHN_ASIMDDIFF_N",
"SUBS_32S_ADDSUB_EXT",
"SUBS_32S_ADDSUB_IMM",
"SUBS_32_ADDSUB_SHIFT",
"SUBS_64S_ADDSUB_EXT",
"SUBS_64S_ADDSUB_IMM",
"SUBS_64_ADDSUB_SHIFT",
"SUB_32_ADDSUB_EXT",
"SUB_32_ADDSUB_IMM",
"SUB_32_ADDSUB_SHIFT",
"SUB_64_ADDSUB_EXT",
"SUB_64_ADDSUB_IMM",
"SUB_64_ADDSUB_SHIFT",
"SUB_ASIMDSAME_ONLY",
"SUB_ASISDSAME_ONLY",
"SUQADD_ASIMDMISC_R",
"SUQADD_ASISDMISC_R",
"SVC_EX_EXCEPTION",
"SWPAB_32_MEMOP",
"SWPAH_32_MEMOP",
"SWPALB_32_MEMOP",
"SWPALH_32_MEMOP",
"SWPAL_32_MEMOP",
"SWPAL_64_MEMOP",
"SWPA_32_MEMOP",
"SWPA_64_MEMOP",
"SWPB_32_MEMOP",
"SWPH_32_MEMOP",
"SWPLB_32_MEMOP",
"SWPLH_32_MEMOP",
"SWPL_32_MEMOP",
"SWPL_64_MEMOP",
"SWP_32_MEMOP",
"SWP_64_MEMOP",
"SXTB_SBFM_32M_BITFIELD",
"SXTB_SBFM_64M_BITFIELD",
"SXTH_SBFM_32M_BITFIELD",
"SXTH_SBFM_64M_BITFIELD",
"SXTL_SSHLL_ASIMDSHF_L",
"SXTW_SBFM_64M_BITFIELD",
"SYSL_RC_SYSTEM",
"SYS_CR_SYSTEM",
"TBL_ASIMDTBL_L1_1",
"TBL_ASIMDTBL_L2_2",
"TBL_ASIMDTBL_L3_3",
"TBL_ASIMDTBL_L4_4",
"TBNZ_ONLY_TESTBRANCH",
"TBX_ASIMDTBL_L1_1",
"TBX_ASIMDTBL_L2_2",
"TBX_ASIMDTBL_L3_3",
"TBX_ASIMDTBL_L4_4",
"TBZ_ONLY_TESTBRANCH",
"TLBI_SYS_CR_SYSTEM",
"TRN1_ASIMDPERM_ONLY",
"TRN2_ASIMDPERM_ONLY",
"TST_ANDS_32S_LOG_IMM",
"TST_ANDS_32_LOG_SHIFT",
"TST_ANDS_64S_LOG_IMM",
"TST_ANDS_64_LOG_SHIFT",
"UABAL_ASIMDDIFF_L",
"UABA_ASIMDSAME_ONLY",
"UABDL_ASIMDDIFF_L",
"UABD_ASIMDSAME_ONLY",
"UADALP_ASIMDMISC_P",
"UADDLP_ASIMDMISC_P",
"UADDLV_ASIMDALL_ONLY",
"UADDL_ASIMDDIFF_L",
"UADDW_ASIMDDIFF_W",
"UBFIZ_UBFM_32M_BITFIELD",
"UBFIZ_UBFM_64M_BITFIELD",
"UBFM_32M_BITFIELD",
"UBFM_64M_BITFIELD",
"UBFX_UBFM_32M_BITFIELD",
"UBFX_UBFM_64M_BITFIELD",
"UCVTF_D32_FLOAT2FIX",
"UCVTF_D32_FLOAT2INT",
"UCVTF_D64_FLOAT2FIX",
"UCVTF_D64_FLOAT2INT",
"UCVTF_H32_FLOAT2FIX",
"UCVTF_H32_FLOAT2INT",
"UCVTF_H64_FLOAT2FIX",
"UCVTF_H64_FLOAT2INT",
"UCVTF_S32_FLOAT2FIX",
"UCVTF_S32_FLOAT2INT",
"UCVTF_S64_FLOAT2FIX",
"UCVTF_S64_FLOAT2INT",
"UCVTF_ASIMDMISC_R",
"UCVTF_ASIMDMISCFP16_R",
"UCVTF_ASIMDSHF_C",
"UCVTF_ASISDMISC_R",
"UCVTF_ASISDMISCFP16_R",
"UCVTF_ASISDSHF_C",
"UDIV_32_DP_2SRC",
"UDIV_64_DP_2SRC",
"UHADD_ASIMDSAME_ONLY",
"UHSUB_ASIMDSAME_ONLY",
"UMADDL_64WA_DP_3SRC",
"UMAXP_ASIMDSAME_ONLY",
"UMAXV_ASIMDALL_ONLY",
"UMAX_ASIMDSAME_ONLY",
"UMINP_ASIMDSAME_ONLY",
"UMINV_ASIMDALL_ONLY",
"UMIN_ASIMDSAME_ONLY",
"UMLAL_ASIMDDIFF_L",
"UMLAL_ASIMDELEM_L",
"UMLSL_ASIMDDIFF_L",
"UMLSL_ASIMDELEM_L",
"UMNEGL_UMSUBL_64WA_DP_3SRC",
"UMOV_ASIMDINS_W_W",
"UMOV_ASIMDINS_X_X",
"UMSUBL_64WA_DP_3SRC",
"UMULH_64_DP_3SRC",
"UMULL_UMADDL_64WA_DP_3SRC",
"UMULL_ASIMDDIFF_L",
"UMULL_ASIMDELEM_L",
"UQADD_ASIMDSAME_ONLY",
"UQADD_ASISDSAME_ONLY",
"UQRSHL_ASIMDSAME_ONLY",
"UQRSHL_ASISDSAME_ONLY",
"UQRSHRN_ASIMDSHF_N",
"UQRSHRN_ASISDSHF_N",
"UQSHL_ASIMDSAME_ONLY",
"UQSHL_ASIMDSHF_R",
"UQSHL_ASISDSAME_ONLY",
"UQSHL_ASISDSHF_R",
"UQSHRN_ASIMDSHF_N",
"UQSHRN_ASISDSHF_N",
"UQSUB_ASIMDSAME_ONLY",
"UQSUB_ASISDSAME_ONLY",
"UQXTN_ASIMDMISC_N",
"UQXTN_ASISDMISC_N",
"URECPE_ASIMDMISC_R",
"URHADD_ASIMDSAME_ONLY",
"URSHL_ASIMDSAME_ONLY",
"URSHL_ASISDSAME_ONLY",
"URSHR_ASIMDSHF_R",
"URSHR_ASISDSHF_R",
"URSQRTE_ASIMDMISC_R",
"URSRA_ASIMDSHF_R",
"URSRA_ASISDSHF_R",
"USHLL_ASIMDSHF_L",
"USHL_ASIMDSAME_ONLY",
"USHL_ASISDSAME_ONLY",
"USHR_ASIMDSHF_R",
"USHR_ASISDSHF_R",
"USQADD_ASIMDMISC_R",
"USQADD_ASISDMISC_R",
"USRA_ASIMDSHF_R",
"USRA_ASISDSHF_R",
"USUBL_ASIMDDIFF_L",
"USUBW_ASIMDDIFF_W",
"UXTB_UBFM_32M_BITFIELD",
"UXTH_UBFM_32M_BITFIELD",
"UXTL_USHLL_ASIMDSHF_L",
"UZP1_ASIMDPERM_ONLY",
"UZP2_ASIMDPERM_ONLY",
"WFE_HI_SYSTEM",
"WFI_HI_SYSTEM",
"XTN_ASIMDMISC_N",
"YIELD_HI_SYSTEM",
"ZIP1_ASIMDPERM_ONLY",
"ZIP2_ASIMDPERM_ONLY",
};
static bool TryExtractFRECPX_ASISDMISCFP16_R(InstData &inst, uint32_t bits);
static bool TryExtractFRECPX_ASISDMISC_R(InstData &inst, uint32_t bits);
static bool TryExtractLDP_32_LDSTPAIR_POST(InstData &inst, uint32_t bits);
static bool TryExtractLDP_64_LDSTPAIR_POST(InstData &inst, uint32_t bits);
static bool TryExtractLDP_32_LDSTPAIR_PRE(InstData &inst, uint32_t bits);
static bool TryExtractLDP_64_LDSTPAIR_PRE(InstData &inst, uint32_t bits);
static bool TryExtractLDP_32_LDSTPAIR_OFF(InstData &inst, uint32_t bits);
static bool TryExtractLDP_64_LDSTPAIR_OFF(InstData &inst, uint32_t bits);
static bool TryExtractSTSMAXH_32S_MEMOP(InstData &inst, uint32_t bits);
static bool TryExtractSTSMAXLH_32S_MEMOP(InstData &inst, uint32_t bits);
static bool TryExtractREV_32_DP_1SRC(InstData &inst, uint32_t bits);
static bool TryExtractREV_64_DP_1SRC(InstData &inst, uint32_t bits);
static bool TryExtractUBFX_UBFM_32M_BITFIELD(InstData &inst, uint32_t bits);
static bool TryExtractUBFX_UBFM_64M_BITFIELD(InstData &inst, uint32_t bits);
static bool TryExtractUMINV_ASIMDALL_ONLY(InstData &inst, uint32_t bits);
static bool TryExtractFADDP_ASIMDSAMEFP16_ONLY(InstData &inst, uint32_t bits);
static bool TryExtractFADDP_ASIMDSAME_ONLY(InstData &inst, uint32_t bits);
static bool TryExtractFABS_ASIMDMISCFP16_R(InstData &inst, uint32_t bits);
static bool TryExtractFABS_ASIMDMISC_R(InstData &inst, uint32_t bits);
static bool TryExtractMADD_32A_DP_3SRC(InstData &inst, uint32_t bits);
static bool TryExtractMADD_64A_DP_3SRC(InstData &inst, uint32_t bits);
static bool TryExtractSCVTF_ASISDSHF_C(InstData &inst, uint32_t bits);
static bool TryExtractSCVTF_ASIMDSHF_C(InstData &inst, uint32_t bits);
static bool TryExtractCLZ_ASIMDMISC_R(InstData &inst, uint32_t bits);
static bool TryExtractFCVT_SH_FLOATDP1(InstData &inst, uint32_t bits);
static bool TryExtractFCVT_DH_FLOATDP1(InstData &inst, uint32_t bits);
static bool TryExtractFCVT_HS_FLOATDP1(InstData &inst, uint32_t bits);
static bool TryExtractFCVT_DS_FLOATDP1(InstData &inst, uint32_t bits);
static bool TryExtractFCVT_HD_FLOATDP1(InstData &inst, uint32_t bits);
static bool TryExtractFCVT_SD_FLOATDP1(InstData &inst, uint32_t bits);
static bool TryExtractLDLARH_LR32_LDSTEXCL(InstData &inst, uint32_t bits);
static bool TryExtractLDUR_B_LDST_UNSCALED(InstData &inst, uint32_t bits);
static bool TryExtractLDUR_H_LDST_UNSCALED(InstData &inst, uint32_t bits);
static bool TryExtractLDUR_S_LDST_UNSCALED(InstData &inst, uint32_t bits);
static bool TryExtractLDUR_D_LDST_UNSCALED(InstData &inst, uint32_t bits);
static bool TryExtractLDUR_Q_LDST_UNSCALED(InstData &inst, uint32_t bits);
static bool TryExtractCLZ_32_DP_1SRC(InstData &inst, uint32_t bits);
static bool TryExtractCLZ_64_DP_1SRC(InstData &inst, uint32_t bits);
static bool TryExtractLSR_LSRV_32_DP_2SRC(InstData &inst, uint32_t bits);
static bool TryExtractLSR_LSRV_64_DP_2SRC(InstData &inst, uint32_t bits);
static bool TryExtractFCVTN_ASIMDMISC_N(InstData &inst, uint32_t bits);
static bool TryExtractCNEG_CSNEG_32_CONDSEL(InstData &inst, uint32_t bits);
static bool TryExtractCNEG_CSNEG_64_CONDSEL(InstData &inst, uint32_t bits);
static bool TryExtractLDRSH_32_LDST_IMMPOST(InstData &inst, uint32_t bits);
static bool TryExtractLDRSH_64_LDST_IMMPOST(InstData &inst, uint32_t bits);
static bool TryExtractLDRSH_32_LDST_IMMPRE(InstData &inst, uint32_t bits);
static bool TryExtractLDRSH_64_LDST_IMMPRE(InstData &inst, uint32_t bits);
static bool TryExtractLDRSH_32_LDST_POS(InstData &inst, uint32_t bits);
static bool TryExtractLDRSH_64_LDST_POS(InstData &inst, uint32_t bits);
static bool TryExtractABS_ASISDMISC_R(InstData &inst, uint32_t bits);
static bool TryExtractABS_ASIMDMISC_R(InstData &inst, uint32_t bits);
static bool TryExtractCMP_SUBS_32S_ADDSUB_EXT(InstData &inst, uint32_t bits);
static bool TryExtractCMP_SUBS_64S_ADDSUB_EXT(InstData &inst, uint32_t bits);
static bool TryExtractHINT_1(InstData &inst, uint32_t bits);
static bool TryExtractHINT_2(InstData &inst, uint32_t bits);
static bool TryExtractHINT_3(InstData &inst, uint32_t bits);
static bool TryExtractFMAX_ASIMDSAMEFP16_ONLY(InstData &inst, uint32_t bits);
static bool TryExtractFMAX_ASIMDSAME_ONLY(InstData &inst, uint32_t bits);
static bool TryExtractFMIN_H_FLOATDP2(InstData &inst, uint32_t bits);
static bool TryExtractFMIN_S_FLOATDP2(InstData &inst, uint32_t bits);
static bool TryExtractFMIN_D_FLOATDP2(InstData &inst, uint32_t bits);
static bool TryExtractUMLSL_ASIMDELEM_L(InstData &inst, uint32_t bits);
static bool TryExtractFMAXNM_ASIMDSAMEFP16_ONLY(InstData &inst, uint32_t bits);
static bool TryExtractFMAXNM_ASIMDSAME_ONLY(InstData &inst, uint32_t bits);
static bool TryExtractFCVTPS_32H_FLOAT2INT(InstData &inst, uint32_t bits);
static bool TryExtractFCVTPS_64H_FLOAT2INT(InstData &inst, uint32_t bits);
static bool TryExtractFCVTPS_32S_FLOAT2INT(InstData &inst, uint32_t bits);
static bool TryExtractFCVTPS_64S_FLOAT2INT(InstData &inst, uint32_t bits);
static bool TryExtractFCVTPS_32D_FLOAT2INT(InstData &inst, uint32_t bits);
static bool TryExtractFCVTPS_64D_FLOAT2INT(InstData &inst, uint32_t bits);
static bool TryExtractFMINNM_H_FLOATDP2(InstData &inst, uint32_t bits);
static bool TryExtractFMINNM_S_FLOATDP2(InstData &inst, uint32_t bits);
static bool TryExtractFMINNM_D_FLOATDP2(InstData &inst, uint32_t bits);
static bool TryExtractLDTRSW_64_LDST_UNPRIV(InstData &inst, uint32_t bits);
static bool TryExtractFSQRT_H_FLOATDP1(InstData &inst, uint32_t bits);
static bool TryExtractFSQRT_S_FLOATDP1(InstData &inst, uint32_t bits);
static bool TryExtractFSQRT_D_FLOATDP1(InstData &inst, uint32_t bits);
static bool TryExtractLDEORA_32_MEMOP(InstData &inst, uint32_t bits);
static bool TryExtractLDEORAL_32_MEMOP(InstData &inst, uint32_t bits);
static bool TryExtractLDEOR_32_MEMOP(InstData &inst, uint32_t bits);
static bool TryExtractLDEORL_32_MEMOP(InstData &inst, uint32_t bits);
static bool TryExtractLDEORA_64_MEMOP(InstData &inst, uint32_t bits);
static bool TryExtractLDEORAL_64_MEMOP(InstData &inst, uint32_t bits);
static bool TryExtractLDEOR_64_MEMOP(InstData &inst, uint32_t bits);
static bool TryExtractLDEORL_64_MEMOP(InstData &inst, uint32_t bits);
static bool TryExtractSHRN_ASIMDSHF_N(InstData &inst, uint32_t bits);
static bool TryExtractFRINTM_H_FLOATDP1(InstData &inst, uint32_t bits);
static bool TryExtractFRINTM_S_FLOATDP1(InstData &inst, uint32_t bits);
static bool TryExtractFRINTM_D_FLOATDP1(InstData &inst, uint32_t bits);
static bool TryExtractLDUMINAB_32_MEMOP(InstData &inst, uint32_t bits);
static bool TryExtractLDUMINALB_32_MEMOP(InstData &inst, uint32_t bits);
static bool TryExtractLDUMINB_32_MEMOP(InstData &inst, uint32_t bits);
static bool TryExtractLDUMINLB_32_MEMOP(InstData &inst, uint32_t bits);
static bool TryExtractSHA256SU0_VV_CRYPTOSHA2(InstData &inst, uint32_t bits);
static bool TryExtractFMINP_ASIMDSAMEFP16_ONLY(InstData &inst, uint32_t bits);
static bool TryExtractFMINP_ASIMDSAME_ONLY(InstData &inst, uint32_t bits);
static bool TryExtractBFM_32M_BITFIELD(InstData &inst, uint32_t bits);
static bool TryExtractBFM_64M_BITFIELD(InstData &inst, uint32_t bits);
static bool TryExtractLDR_B_LDST_REGOFF(InstData &inst, uint32_t bits);
static bool TryExtractLDR_BL_LDST_REGOFF(InstData &inst, uint32_t bits);
static bool TryExtractLDR_H_LDST_REGOFF(InstData &inst, uint32_t bits);
static bool TryExtractLDR_S_LDST_REGOFF(InstData &inst, uint32_t bits);
static bool TryExtractLDR_D_LDST_REGOFF(InstData &inst, uint32_t bits);
static bool TryExtractLDR_Q_LDST_REGOFF(InstData &inst, uint32_t bits);
static bool TryExtractSQRDMLSH_ASISDELEM_R(InstData &inst, uint32_t bits);
static bool TryExtractSQRDMLSH_ASIMDELEM_R(InstData &inst, uint32_t bits);
static bool TryExtractANDS_32S_LOG_IMM(InstData &inst, uint32_t bits);
static bool TryExtractANDS_64S_LOG_IMM(InstData &inst, uint32_t bits);
static bool TryExtractLDCLRA_32_MEMOP(InstData &inst, uint32_t bits);
static bool TryExtractLDCLRAL_32_MEMOP(InstData &inst, uint32_t bits);
static bool TryExtractLDCLR_32_MEMOP(InstData &inst, uint32_t bits);
static bool TryExtractLDCLRL_32_MEMOP(InstData &inst, uint32_t bits);
static bool TryExtractLDCLRA_64_MEMOP(InstData &inst, uint32_t bits);
static bool TryExtractLDCLRAL_64_MEMOP(InstData &inst, uint32_t bits);
static bool TryExtractLDCLR_64_MEMOP(InstData &inst, uint32_t bits);
static bool TryExtractLDCLRL_64_MEMOP(InstData &inst, uint32_t bits);
static bool TryExtractUABD_ASIMDSAME_ONLY(InstData &inst, uint32_t bits);
static bool TryExtractSTURB_32_LDST_UNSCALED(InstData &inst, uint32_t bits);
static bool TryExtractORR_ASIMDSAME_ONLY(InstData &inst, uint32_t bits);
static bool TryExtractFRINTA_ASIMDMISCFP16_R(InstData &inst, uint32_t bits);
static bool TryExtractFRINTA_ASIMDMISC_R(InstData &inst, uint32_t bits);
static bool TryExtractSUBS_32_ADDSUB_SHIFT(InstData &inst, uint32_t bits);
static bool TryExtractSUBS_64_ADDSUB_SHIFT(InstData &inst, uint32_t bits);
static bool TryExtractSTXP_SP32_LDSTEXCL(InstData &inst, uint32_t bits);
static bool TryExtractSTXP_SP64_LDSTEXCL(InstData &inst, uint32_t bits);
static bool TryExtractSBFX_SBFM_32M_BITFIELD(InstData &inst, uint32_t bits);
static bool TryExtractSBFX_SBFM_64M_BITFIELD(InstData &inst, uint32_t bits);
static bool TryExtractLDXP_LP32_LDSTEXCL(InstData &inst, uint32_t bits);
static bool TryExtractLDXP_LP64_LDSTEXCL(InstData &inst, uint32_t bits);
static bool TryExtractORR_32_LOG_IMM(InstData &inst, uint32_t bits);
static bool TryExtractORR_64_LOG_IMM(InstData &inst, uint32_t bits);
static bool TryExtractUCVTF_ASISDMISCFP16_R(InstData &inst, uint32_t bits);
static bool TryExtractUCVTF_ASISDMISC_R(InstData &inst, uint32_t bits);
static bool TryExtractUCVTF_ASIMDMISCFP16_R(InstData &inst, uint32_t bits);
static bool TryExtractUCVTF_ASIMDMISC_R(InstData &inst, uint32_t bits);
static bool TryExtractSQDMULH_ASISDSAME_ONLY(InstData &inst, uint32_t bits);
static bool TryExtractSQDMULH_ASIMDSAME_ONLY(InstData &inst, uint32_t bits);
static bool TryExtractFCVTL_ASIMDMISC_L(InstData &inst, uint32_t bits);
static bool TryExtractCCMN_32_CONDCMP_IMM(InstData &inst, uint32_t bits);
static bool TryExtractCCMN_64_CONDCMP_IMM(InstData &inst, uint32_t bits);
static bool TryExtractDMB_BO_SYSTEM(InstData &inst, uint32_t bits);
static bool TryExtractYIELD_HI_SYSTEM(InstData &inst, uint32_t bits);
static bool TryExtractUXTH_UBFM_32M_BITFIELD(InstData &inst, uint32_t bits);
static bool TryExtractSTADD_32S_MEMOP(InstData &inst, uint32_t bits);
static bool TryExtractSTADDL_32S_MEMOP(InstData &inst, uint32_t bits);
static bool TryExtractSTADD_64S_MEMOP(InstData &inst, uint32_t bits);
static bool TryExtractSTADDL_64S_MEMOP(InstData &inst, uint32_t bits);
static bool TryExtractUSRA_ASISDSHF_R(InstData &inst, uint32_t bits);
static bool TryExtractUSRA_ASIMDSHF_R(InstData &inst, uint32_t bits);
static bool TryExtractMOV_MOVZ_32_MOVEWIDE(InstData &inst, uint32_t bits);
static bool TryExtractMOV_MOVZ_64_MOVEWIDE(InstData &inst, uint32_t bits);
static bool TryExtractMLS_ASIMDSAME_ONLY(InstData &inst, uint32_t bits);
static bool TryExtractST1_ASISDLSE_R1_1V(InstData &inst, uint32_t bits);
static bool TryExtractST1_ASISDLSE_R2_2V(InstData &inst, uint32_t bits);
static bool TryExtractST1_ASISDLSE_R3_3V(InstData &inst, uint32_t bits);
static bool TryExtractST1_ASISDLSE_R4_4V(InstData &inst, uint32_t bits);
static bool TryExtractST1_ASISDLSEP_I1_I1(InstData &inst, uint32_t bits);
static bool TryExtractST1_ASISDLSEP_R1_R1(InstData &inst, uint32_t bits);
static bool TryExtractST1_ASISDLSEP_I2_I2(InstData &inst, uint32_t bits);
static bool TryExtractST1_ASISDLSEP_R2_R2(InstData &inst, uint32_t bits);
static bool TryExtractST1_ASISDLSEP_I3_I3(InstData &inst, uint32_t bits);
static bool TryExtractST1_ASISDLSEP_R3_R3(InstData &inst, uint32_t bits);
static bool TryExtractST1_ASISDLSEP_I4_I4(InstData &inst, uint32_t bits);
static bool TryExtractST1_ASISDLSEP_R4_R4(InstData &inst, uint32_t bits);
static bool TryExtractAESIMC_B_CRYPTOAES(InstData &inst, uint32_t bits);
static bool TryExtractUMULH_64_DP_3SRC(InstData &inst, uint32_t bits);
static bool TryExtractUADDW_ASIMDDIFF_W(InstData &inst, uint32_t bits);
static bool TryExtractSTRH_32_LDST_IMMPOST(InstData &inst, uint32_t bits);
static bool TryExtractSTRH_32_LDST_IMMPRE(InstData &inst, uint32_t bits);
static bool TryExtractSTRH_32_LDST_POS(InstData &inst, uint32_t bits);
static bool TryExtractSCVTF_H32_FLOAT2INT(InstData &inst, uint32_t bits);
static bool TryExtractSCVTF_S32_FLOAT2INT(InstData &inst, uint32_t bits);
static bool TryExtractSCVTF_D32_FLOAT2INT(InstData &inst, uint32_t bits);
static bool TryExtractSCVTF_H64_FLOAT2INT(InstData &inst, uint32_t bits);
static bool TryExtractSCVTF_S64_FLOAT2INT(InstData &inst, uint32_t bits);
static bool TryExtractSCVTF_D64_FLOAT2INT(InstData &inst, uint32_t bits);
static bool TryExtractSTUMAXB_32S_MEMOP(InstData &inst, uint32_t bits);
static bool TryExtractSTUMAXLB_32S_MEMOP(InstData &inst, uint32_t bits);
static bool TryExtractCMHI_ASISDSAME_ONLY(InstData &inst, uint32_t bits);
static bool TryExtractCMHI_ASIMDSAME_ONLY(InstData &inst, uint32_t bits);
static bool TryExtractSQDMLAL_ASISDDIFF_ONLY(InstData &inst, uint32_t bits);
static bool TryExtractSQDMLAL_ASIMDDIFF_L(InstData &inst, uint32_t bits);
static bool TryExtractCBNZ_32_COMPBRANCH(InstData &inst, uint32_t bits);
static bool TryExtractCBNZ_64_COMPBRANCH(InstData &inst, uint32_t bits);
static bool TryExtractSEVL_HI_SYSTEM(InstData &inst, uint32_t bits);
static bool TryExtractFRINTX_H_FLOATDP1(InstData &inst, uint32_t bits);
static bool TryExtractFRINTX_S_FLOATDP1(InstData &inst, uint32_t bits);
static bool TryExtractFRINTX_D_FLOATDP1(InstData &inst, uint32_t bits);
static bool TryExtractCMN_ADDS_32_ADDSUB_SHIFT(InstData &inst, uint32_t bits);
static bool TryExtractCMN_ADDS_64_ADDSUB_SHIFT(InstData &inst, uint32_t bits);
static bool TryExtractSMIN_ASIMDSAME_ONLY(InstData &inst, uint32_t bits);
static bool TryExtractLDUMAXAB_32_MEMOP(InstData &inst, uint32_t bits);
static bool TryExtractLDUMAXALB_32_MEMOP(InstData &inst, uint32_t bits);
static bool TryExtractLDUMAXB_32_MEMOP(InstData &inst, uint32_t bits);
static bool TryExtractLDUMAXLB_32_MEMOP(InstData &inst, uint32_t bits);
static bool TryExtractAESE_B_CRYPTOAES(InstData &inst, uint32_t bits);
static bool TryExtractSMAXP_ASIMDSAME_ONLY(InstData &inst, uint32_t bits);
static bool TryExtractSTXR_SR32_LDSTEXCL(InstData &inst, uint32_t bits);
static bool TryExtractSTXR_SR64_LDSTEXCL(InstData &inst, uint32_t bits);
static bool TryExtractSUB_32_ADDSUB_IMM(InstData &inst, uint32_t bits);
static bool TryExtractSUB_64_ADDSUB_IMM(InstData &inst, uint32_t bits);
static bool TryExtractCMLT_ASISDMISC_Z(InstData &inst, uint32_t bits);
static bool TryExtractCMLT_ASIMDMISC_Z(InstData &inst, uint32_t bits);
static bool TryExtractFCMEQ_ASISDSAMEFP16_ONLY(InstData &inst, uint32_t bits);
static bool TryExtractFCMEQ_ASISDSAME_ONLY(InstData &inst, uint32_t bits);
static bool TryExtractFCMEQ_ASIMDSAMEFP16_ONLY(InstData &inst, uint32_t bits);
static bool TryExtractFCMEQ_ASIMDSAME_ONLY(InstData &inst, uint32_t bits);
static bool TryExtractCLREX_BN_SYSTEM(InstData &inst, uint32_t bits);
static bool TryExtractFSUB_ASIMDSAMEFP16_ONLY(InstData &inst, uint32_t bits);
static bool TryExtractFSUB_ASIMDSAME_ONLY(InstData &inst, uint32_t bits);
static bool TryExtractSHLL_ASIMDMISC_S(InstData &inst, uint32_t bits);
static bool TryExtractSQADD_ASISDSAME_ONLY(InstData &inst, uint32_t bits);
static bool TryExtractSQADD_ASIMDSAME_ONLY(InstData &inst, uint32_t bits);
static bool TryExtractBIC_ASIMDSAME_ONLY(InstData &inst, uint32_t bits);
static bool TryExtractSUB_ASISDSAME_ONLY(InstData &inst, uint32_t bits);
static bool TryExtractSUB_ASIMDSAME_ONLY(InstData &inst, uint32_t bits);
static bool TryExtractSWPA_32_MEMOP(InstData &inst, uint32_t bits);
static bool TryExtractSWPAL_32_MEMOP(InstData &inst, uint32_t bits);
static bool TryExtractSWP_32_MEMOP(InstData &inst, uint32_t bits);
static bool TryExtractSWPL_32_MEMOP(InstData &inst, uint32_t bits);
static bool TryExtractSWPA_64_MEMOP(InstData &inst, uint32_t bits);
static bool TryExtractSWPAL_64_MEMOP(InstData &inst, uint32_t bits);
static bool TryExtractSWP_64_MEMOP(InstData &inst, uint32_t bits);
static bool TryExtractSWPL_64_MEMOP(InstData &inst, uint32_t bits);
static bool TryExtractSMC_EX_EXCEPTION(InstData &inst, uint32_t bits);
static bool TryExtractLDUR_32_LDST_UNSCALED(InstData &inst, uint32_t bits);
static bool TryExtractLDUR_64_LDST_UNSCALED(InstData &inst, uint32_t bits);
static bool TryExtractCMGE_ASISDMISC_Z(InstData &inst, uint32_t bits);
static bool TryExtractCMGE_ASIMDMISC_Z(InstData &inst, uint32_t bits);
static bool TryExtractUCVTF_ASISDSHF_C(InstData &inst, uint32_t bits);
static bool TryExtractUCVTF_ASIMDSHF_C(InstData &inst, uint32_t bits);
static bool TryExtractSTLLR_SL32_LDSTEXCL(InstData &inst, uint32_t bits);
static bool TryExtractSTLLR_SL64_LDSTEXCL(InstData &inst, uint32_t bits);
static bool TryExtractSSUBL_ASIMDDIFF_L(InstData &inst, uint32_t bits);
static bool TryExtractSMLSL_ASIMDDIFF_L(InstData &inst, uint32_t bits);
static bool TryExtractMOV_ADD_32_ADDSUB_IMM(InstData &inst, uint32_t bits);
static bool TryExtractMOV_ADD_64_ADDSUB_IMM(InstData &inst, uint32_t bits);
static bool TryExtractSTTRB_32_LDST_UNPRIV(InstData &inst, uint32_t bits);
static bool TryExtractBIC_32_LOG_SHIFT(InstData &inst, uint32_t bits);
static bool TryExtractBIC_64_LOG_SHIFT(InstData &inst, uint32_t bits);
static bool TryExtractTST_ANDS_32S_LOG_IMM(InstData &inst, uint32_t bits);
static bool TryExtractTST_ANDS_64S_LOG_IMM(InstData &inst, uint32_t bits);
static bool TryExtractAND_ASIMDSAME_ONLY(InstData &inst, uint32_t bits);
static bool TryExtractSTLXP_SP32_LDSTEXCL(InstData &inst, uint32_t bits);
static bool TryExtractSTLXP_SP64_LDSTEXCL(InstData &inst, uint32_t bits);
static bool TryExtractSQRSHL_ASISDSAME_ONLY(InstData &inst, uint32_t bits);
static bool TryExtractSQRSHL_ASIMDSAME_ONLY(InstData &inst, uint32_t bits);
static bool TryExtractUABAL_ASIMDDIFF_L(InstData &inst, uint32_t bits);
static bool TryExtractMVNI_ASIMDIMM_L_HL(InstData &inst, uint32_t bits);
static bool TryExtractMVNI_ASIMDIMM_L_SL(InstData &inst, uint32_t bits);
static bool TryExtractMVNI_ASIMDIMM_M_SM(InstData &inst, uint32_t bits);
static bool TryExtractMOV_INS_ASIMDINS_IV_V(InstData &inst, uint32_t bits);
static bool TryExtractSRSHR_ASISDSHF_R(InstData &inst, uint32_t bits);
static bool TryExtractSRSHR_ASIMDSHF_R(InstData &inst, uint32_t bits);
static bool TryExtractLSL_UBFM_32M_BITFIELD(InstData &inst, uint32_t bits);
static bool TryExtractLSL_UBFM_64M_BITFIELD(InstData &inst, uint32_t bits);
static bool TryExtractCLS_32_DP_1SRC(InstData &inst, uint32_t bits);
static bool TryExtractCLS_64_DP_1SRC(InstData &inst, uint32_t bits);
static bool TryExtractSEV_HI_SYSTEM(InstData &inst, uint32_t bits);
static bool TryExtractUMIN_ASIMDSAME_ONLY(InstData &inst, uint32_t bits);
static bool TryExtractFMULX_ASISDSAMEFP16_ONLY(InstData &inst, uint32_t bits);
static bool TryExtractFMULX_ASISDSAME_ONLY(InstData &inst, uint32_t bits);
static bool TryExtractFMULX_ASIMDSAMEFP16_ONLY(InstData &inst, uint32_t bits);
static bool TryExtractFMULX_ASIMDSAME_ONLY(InstData &inst, uint32_t bits);
static bool TryExtractADDS_32S_ADDSUB_IMM(InstData &inst, uint32_t bits);
static bool TryExtractADDS_64S_ADDSUB_IMM(InstData &inst, uint32_t bits);
static bool TryExtractUQSHL_ASISDSAME_ONLY(InstData &inst, uint32_t bits);
static bool TryExtractUQSHL_ASIMDSAME_ONLY(InstData &inst, uint32_t bits);
static bool TryExtractSTEORB_32S_MEMOP(InstData &inst, uint32_t bits);
static bool TryExtractSTEORLB_32S_MEMOP(InstData &inst, uint32_t bits);
static bool TryExtractLDPSW_64_LDSTPAIR_POST(InstData &inst, uint32_t bits);
static bool TryExtractLDPSW_64_LDSTPAIR_PRE(InstData &inst, uint32_t bits);
static bool TryExtractLDPSW_64_LDSTPAIR_OFF(InstData &inst, uint32_t bits);
static bool TryExtractSTUMAXH_32S_MEMOP(InstData &inst, uint32_t bits);
static bool TryExtractSTUMAXLH_32S_MEMOP(InstData &inst, uint32_t bits);
static bool TryExtractSMOV_ASIMDINS_W_W(InstData &inst, uint32_t bits);
static bool TryExtractSMOV_ASIMDINS_X_X(InstData &inst, uint32_t bits);
static bool TryExtractUABA_ASIMDSAME_ONLY(InstData &inst, uint32_t bits);
static bool TryExtractSTSMINB_32S_MEMOP(InstData &inst, uint32_t bits);
static bool TryExtractSTSMINLB_32S_MEMOP(InstData &inst, uint32_t bits);
static bool TryExtractFCMGE_ASISDMISCFP16_FZ(InstData &inst, uint32_t bits);
static bool TryExtractFCMGE_ASISDMISC_FZ(InstData &inst, uint32_t bits);
static bool TryExtractFCMGE_ASIMDMISCFP16_FZ(InstData &inst, uint32_t bits);
static bool TryExtractFCMGE_ASIMDMISC_FZ(InstData &inst, uint32_t bits);
static bool TryExtractSTLLRB_SL32_LDSTEXCL(InstData &inst, uint32_t bits);
static bool TryExtractFRINTZ_ASIMDMISCFP16_R(InstData &inst, uint32_t bits);
static bool TryExtractFRINTZ_ASIMDMISC_R(InstData &inst, uint32_t bits);
static bool TryExtractSTXRH_SR32_LDSTEXCL(InstData &inst, uint32_t bits);
static bool TryExtractSTEORH_32S_MEMOP(InstData &inst, uint32_t bits);
static bool TryExtractSTEORLH_32S_MEMOP(InstData &inst, uint32_t bits);
static bool TryExtractFMINNMP_ASIMDSAMEFP16_ONLY(InstData &inst, uint32_t bits);
static bool TryExtractFMINNMP_ASIMDSAME_ONLY(InstData &inst, uint32_t bits);
static bool TryExtractLDLAR_LR32_LDSTEXCL(InstData &inst, uint32_t bits);
static bool TryExtractLDLAR_LR64_LDSTEXCL(InstData &inst, uint32_t bits);
static bool TryExtractADD_32_ADDSUB_SHIFT(InstData &inst, uint32_t bits);
static bool TryExtractADD_64_ADDSUB_SHIFT(InstData &inst, uint32_t bits);
static bool TryExtractSSHLL_ASIMDSHF_L(InstData &inst, uint32_t bits);
static bool TryExtractRORV_32_DP_2SRC(InstData &inst, uint32_t bits);
static bool TryExtractRORV_64_DP_2SRC(InstData &inst, uint32_t bits);
static bool TryExtractSTCLRB_32S_MEMOP(InstData &inst, uint32_t bits);
static bool TryExtractSTCLRLB_32S_MEMOP(InstData &inst, uint32_t bits);
static bool TryExtractLDARH_LR32_LDSTEXCL(InstData &inst, uint32_t bits);
static bool TryExtractSTSMAX_32S_MEMOP(InstData &inst, uint32_t bits);
static bool TryExtractSTSMAXL_32S_MEMOP(InstData &inst, uint32_t bits);
static bool TryExtractSTSMAX_64S_MEMOP(InstData &inst, uint32_t bits);
static bool TryExtractSTSMAXL_64S_MEMOP(InstData &inst, uint32_t bits);
static bool TryExtractBLR_64_BRANCH_REG(InstData &inst, uint32_t bits);
static bool TryExtractCMN_ADDS_32S_ADDSUB_IMM(InstData &inst, uint32_t bits);
static bool TryExtractCMN_ADDS_64S_ADDSUB_IMM(InstData &inst, uint32_t bits);
static bool TryExtractSQDMULL_ASISDELEM_L(InstData &inst, uint32_t bits);
static bool TryExtractSQDMULL_ASIMDELEM_L(InstData &inst, uint32_t bits);
static bool TryExtractCSET_CSINC_32_CONDSEL(InstData &inst, uint32_t bits);
static bool TryExtractCSET_CSINC_64_CONDSEL(InstData &inst, uint32_t bits);
static bool TryExtractLD1_ASISDLSO_B1_1B(InstData &inst, uint32_t bits);
static bool TryExtractLD1_ASISDLSO_H1_1H(InstData &inst, uint32_t bits);
static bool TryExtractLD1_ASISDLSO_S1_1S(InstData &inst, uint32_t bits);
static bool TryExtractLD1_ASISDLSO_D1_1D(InstData &inst, uint32_t bits);
static bool TryExtractLD1_ASISDLSOP_B1_I1B(InstData &inst, uint32_t bits);
static bool TryExtractLD1_ASISDLSOP_BX1_R1B(InstData &inst, uint32_t bits);
static bool TryExtractLD1_ASISDLSOP_H1_I1H(InstData &inst, uint32_t bits);
static bool TryExtractLD1_ASISDLSOP_HX1_R1H(InstData &inst, uint32_t bits);
static bool TryExtractLD1_ASISDLSOP_S1_I1S(InstData &inst, uint32_t bits);
static bool TryExtractLD1_ASISDLSOP_SX1_R1S(InstData &inst, uint32_t bits);
static bool TryExtractLD1_ASISDLSOP_D1_I1D(InstData &inst, uint32_t bits);
static bool TryExtractLD1_ASISDLSOP_DX1_R1D(InstData &inst, uint32_t bits);
static bool TryExtractCCMN_32_CONDCMP_REG(InstData &inst, uint32_t bits);
static bool TryExtractCCMN_64_CONDCMP_REG(InstData &inst, uint32_t bits);
static bool TryExtractSTNP_S_LDSTNAPAIR_OFFS(InstData &inst, uint32_t bits);
static bool TryExtractSTNP_D_LDSTNAPAIR_OFFS(InstData &inst, uint32_t bits);
static bool TryExtractSTNP_Q_LDSTNAPAIR_OFFS(InstData &inst, uint32_t bits);
static bool TryExtractFSUB_H_FLOATDP2(InstData &inst, uint32_t bits);
static bool TryExtractFSUB_S_FLOATDP2(InstData &inst, uint32_t bits);
static bool TryExtractFSUB_D_FLOATDP2(InstData &inst, uint32_t bits);
static bool TryExtractCSNEG_32_CONDSEL(InstData &inst, uint32_t bits);
static bool TryExtractCSNEG_64_CONDSEL(InstData &inst, uint32_t bits);
static bool TryExtractASR_ASRV_32_DP_2SRC(InstData &inst, uint32_t bits);
static bool TryExtractASR_ASRV_64_DP_2SRC(InstData &inst, uint32_t bits);
static bool TryExtractUMULL_UMADDL_64WA_DP_3SRC(InstData &inst, uint32_t bits);
static bool TryExtractFCMGT_ASISDSAMEFP16_ONLY(InstData &inst, uint32_t bits);
static bool TryExtractFCMGT_ASISDSAME_ONLY(InstData &inst, uint32_t bits);
static bool TryExtractFCMGT_ASIMDSAMEFP16_ONLY(InstData &inst, uint32_t bits);
static bool TryExtractFCMGT_ASIMDSAME_ONLY(InstData &inst, uint32_t bits);
static bool TryExtractUSUBW_ASIMDDIFF_W(InstData &inst, uint32_t bits);
static bool TryExtractREV32_64_DP_1SRC(InstData &inst, uint32_t bits);
static bool TryExtractFSQRT_ASIMDMISCFP16_R(InstData &inst, uint32_t bits);
static bool TryExtractFSQRT_ASIMDMISC_R(InstData &inst, uint32_t bits);
static bool TryExtractLSL_LSLV_32_DP_2SRC(InstData &inst, uint32_t bits);
static bool TryExtractLSL_LSLV_64_DP_2SRC(InstData &inst, uint32_t bits);
static bool TryExtractEXTR_32_EXTRACT(InstData &inst, uint32_t bits);
static bool TryExtractEXTR_64_EXTRACT(InstData &inst, uint32_t bits);
static bool TryExtractFCVTAU_ASISDMISCFP16_R(InstData &inst, uint32_t bits);
static bool TryExtractFCVTAU_ASISDMISC_R(InstData &inst, uint32_t bits);
static bool TryExtractFCVTAU_ASIMDMISCFP16_R(InstData &inst, uint32_t bits);
static bool TryExtractFCVTAU_ASIMDMISC_R(InstData &inst, uint32_t bits);
static bool TryExtractBFXIL_BFM_32M_BITFIELD(InstData &inst, uint32_t bits);
static bool TryExtractBFXIL_BFM_64M_BITFIELD(InstData &inst, uint32_t bits);
static bool TryExtractZIP1_ASIMDPERM_ONLY(InstData &inst, uint32_t bits);
static bool TryExtractLDSETAH_32_MEMOP(InstData &inst, uint32_t bits);
static bool TryExtractLDSETALH_32_MEMOP(InstData &inst, uint32_t bits);
static bool TryExtractLDSETH_32_MEMOP(InstData &inst, uint32_t bits);
static bool TryExtractLDSETLH_32_MEMOP(InstData &inst, uint32_t bits);
static bool TryExtractLDR_32_LDST_REGOFF(InstData &inst, uint32_t bits);
static bool TryExtractLDR_64_LDST_REGOFF(InstData &inst, uint32_t bits);
static bool TryExtractLDADDAH_32_MEMOP(InstData &inst, uint32_t bits);
static bool TryExtractLDADDALH_32_MEMOP(InstData &inst, uint32_t bits);
static bool TryExtractLDADDH_32_MEMOP(InstData &inst, uint32_t bits);
static bool TryExtractLDADDLH_32_MEMOP(InstData &inst, uint32_t bits);
static bool TryExtractANDS_32_LOG_SHIFT(InstData &inst, uint32_t bits);
static bool TryExtractANDS_64_LOG_SHIFT(InstData &inst, uint32_t bits);
static bool TryExtractLD3_ASISDLSE_R3(InstData &inst, uint32_t bits);
static bool TryExtractLD3_ASISDLSEP_I3_I(InstData &inst, uint32_t bits);
static bool TryExtractLD3_ASISDLSEP_R3_R(InstData &inst, uint32_t bits);
static bool TryExtractFMUL_H_FLOATDP2(InstData &inst, uint32_t bits);
static bool TryExtractFMUL_S_FLOATDP2(InstData &inst, uint32_t bits);
static bool TryExtractFMUL_D_FLOATDP2(InstData &inst, uint32_t bits);
static bool TryExtractLDAXR_LR32_LDSTEXCL(InstData &inst, uint32_t bits);
static bool TryExtractLDAXR_LR64_LDSTEXCL(InstData &inst, uint32_t bits);
static bool TryExtractLDRB_32B_LDST_REGOFF(InstData &inst, uint32_t bits);
static bool TryExtractLDRB_32BL_LDST_REGOFF(InstData &inst, uint32_t bits);
static bool TryExtractUADALP_ASIMDMISC_P(InstData &inst, uint32_t bits);
static bool TryExtractFRINTX_ASIMDMISCFP16_R(InstData &inst, uint32_t bits);
static bool TryExtractFRINTX_ASIMDMISC_R(InstData &inst, uint32_t bits);
static bool TryExtractHLT_EX_EXCEPTION(InstData &inst, uint32_t bits);
static bool TryExtractSABA_ASIMDSAME_ONLY(InstData &inst, uint32_t bits);
static bool TryExtractFMAX_H_FLOATDP2(InstData &inst, uint32_t bits);
static bool TryExtractFMAX_S_FLOATDP2(InstData &inst, uint32_t bits);
static bool TryExtractFMAX_D_FLOATDP2(InstData &inst, uint32_t bits);
static bool TryExtractAESD_B_CRYPTOAES(InstData &inst, uint32_t bits);
static bool TryExtractAESMC_B_CRYPTOAES(InstData &inst, uint32_t bits);
static bool TryExtractLD2_ASISDLSO_B2_2B(InstData &inst, uint32_t bits);
static bool TryExtractLD2_ASISDLSO_H2_2H(InstData &inst, uint32_t bits);
static bool TryExtractLD2_ASISDLSO_S2_2S(InstData &inst, uint32_t bits);
static bool TryExtractLD2_ASISDLSO_D2_2D(InstData &inst, uint32_t bits);
static bool TryExtractLD2_ASISDLSOP_B2_I2B(InstData &inst, uint32_t bits);
static bool TryExtractLD2_ASISDLSOP_BX2_R2B(InstData &inst, uint32_t bits);
static bool TryExtractLD2_ASISDLSOP_H2_I2H(InstData &inst, uint32_t bits);
static bool TryExtractLD2_ASISDLSOP_HX2_R2H(InstData &inst, uint32_t bits);
static bool TryExtractLD2_ASISDLSOP_S2_I2S(InstData &inst, uint32_t bits);
static bool TryExtractLD2_ASISDLSOP_SX2_R2S(InstData &inst, uint32_t bits);
static bool TryExtractLD2_ASISDLSOP_D2_I2D(InstData &inst, uint32_t bits);
static bool TryExtractLD2_ASISDLSOP_DX2_R2D(InstData &inst, uint32_t bits);
static bool TryExtractBR_64_BRANCH_REG(InstData &inst, uint32_t bits);
static bool TryExtractFCVTZU_ASISDMISCFP16_R(InstData &inst, uint32_t bits);
static bool TryExtractFCVTZU_ASISDMISC_R(InstData &inst, uint32_t bits);
static bool TryExtractFCVTZU_ASIMDMISCFP16_R(InstData &inst, uint32_t bits);
static bool TryExtractFCVTZU_ASIMDMISC_R(InstData &inst, uint32_t bits);
static bool TryExtractMVN_ORN_32_LOG_SHIFT(InstData &inst, uint32_t bits);
static bool TryExtractMVN_ORN_64_LOG_SHIFT(InstData &inst, uint32_t bits);
static bool TryExtractSTEOR_32S_MEMOP(InstData &inst, uint32_t bits);
static bool TryExtractSTEORL_32S_MEMOP(InstData &inst, uint32_t bits);
static bool TryExtractSTEOR_64S_MEMOP(InstData &inst, uint32_t bits);
static bool TryExtractSTEORL_64S_MEMOP(InstData &inst, uint32_t bits);
static bool TryExtractTBX_ASIMDTBL_L2_2(InstData &inst, uint32_t bits);
static bool TryExtractTBX_ASIMDTBL_L3_3(InstData &inst, uint32_t bits);
static bool TryExtractTBX_ASIMDTBL_L4_4(InstData &inst, uint32_t bits);
static bool TryExtractTBX_ASIMDTBL_L1_1(InstData &inst, uint32_t bits);
static bool TryExtractUMLAL_ASIMDELEM_L(InstData &inst, uint32_t bits);
static bool TryExtractUMINP_ASIMDSAME_ONLY(InstData &inst, uint32_t bits);
static bool TryExtractCMLE_ASISDMISC_Z(InstData &inst, uint32_t bits);
static bool TryExtractCMLE_ASIMDMISC_Z(InstData &inst, uint32_t bits);
static bool TryExtractEOR_ASIMDSAME_ONLY(InstData &inst, uint32_t bits);
static bool TryExtractCMEQ_ASISDMISC_Z(InstData &inst, uint32_t bits);
static bool TryExtractCMEQ_ASIMDMISC_Z(InstData &inst, uint32_t bits);
static bool TryExtractLDUMAXAH_32_MEMOP(InstData &inst, uint32_t bits);
static bool TryExtractLDUMAXALH_32_MEMOP(InstData &inst, uint32_t bits);
static bool TryExtractLDUMAXH_32_MEMOP(InstData &inst, uint32_t bits);
static bool TryExtractLDUMAXLH_32_MEMOP(InstData &inst, uint32_t bits);
static bool TryExtractST3_ASISDLSO_B3_3B(InstData &inst, uint32_t bits);
static bool TryExtractST3_ASISDLSO_H3_3H(InstData &inst, uint32_t bits);
static bool TryExtractST3_ASISDLSO_S3_3S(InstData &inst, uint32_t bits);
static bool TryExtractST3_ASISDLSO_D3_3D(InstData &inst, uint32_t bits);
static bool TryExtractST3_ASISDLSOP_B3_I3B(InstData &inst, uint32_t bits);
static bool TryExtractST3_ASISDLSOP_BX3_R3B(InstData &inst, uint32_t bits);
static bool TryExtractST3_ASISDLSOP_H3_I3H(InstData &inst, uint32_t bits);
static bool TryExtractST3_ASISDLSOP_HX3_R3H(InstData &inst, uint32_t bits);
static bool TryExtractST3_ASISDLSOP_S3_I3S(InstData &inst, uint32_t bits);
static bool TryExtractST3_ASISDLSOP_SX3_R3S(InstData &inst, uint32_t bits);
static bool TryExtractST3_ASISDLSOP_D3_I3D(InstData &inst, uint32_t bits);
static bool TryExtractST3_ASISDLSOP_DX3_R3D(InstData &inst, uint32_t bits);
static bool TryExtractASR_SBFM_32M_BITFIELD(InstData &inst, uint32_t bits);
static bool TryExtractASR_SBFM_64M_BITFIELD(InstData &inst, uint32_t bits);
static bool TryExtractLDRSW_64_LOADLIT(InstData &inst, uint32_t bits);
static bool TryExtractLDADDA_32_MEMOP(InstData &inst, uint32_t bits);
static bool TryExtractLDADDAL_32_MEMOP(InstData &inst, uint32_t bits);
static bool TryExtractLDADD_32_MEMOP(InstData &inst, uint32_t bits);
static bool TryExtractLDADDL_32_MEMOP(InstData &inst, uint32_t bits);
static bool TryExtractLDADDA_64_MEMOP(InstData &inst, uint32_t bits);
static bool TryExtractLDADDAL_64_MEMOP(InstData &inst, uint32_t bits);
static bool TryExtractLDADD_64_MEMOP(InstData &inst, uint32_t bits);
static bool TryExtractLDADDL_64_MEMOP(InstData &inst, uint32_t bits);
static bool TryExtractFCVTZS_ASISDSHF_C(InstData &inst, uint32_t bits);
static bool TryExtractFCVTZS_ASIMDSHF_C(InstData &inst, uint32_t bits);
static bool TryExtractLSR_UBFM_32M_BITFIELD(InstData &inst, uint32_t bits);
static bool TryExtractLSR_UBFM_64M_BITFIELD(InstData &inst, uint32_t bits);
static bool TryExtractST2_ASISDLSO_B2_2B(InstData &inst, uint32_t bits);
static bool TryExtractST2_ASISDLSO_H2_2H(InstData &inst, uint32_t bits);
static bool TryExtractST2_ASISDLSO_S2_2S(InstData &inst, uint32_t bits);
static bool TryExtractST2_ASISDLSO_D2_2D(InstData &inst, uint32_t bits);
static bool TryExtractST2_ASISDLSOP_B2_I2B(InstData &inst, uint32_t bits);
static bool TryExtractST2_ASISDLSOP_BX2_R2B(InstData &inst, uint32_t bits);
static bool TryExtractST2_ASISDLSOP_H2_I2H(InstData &inst, uint32_t bits);
static bool TryExtractST2_ASISDLSOP_HX2_R2H(InstData &inst, uint32_t bits);
static bool TryExtractST2_ASISDLSOP_S2_I2S(InstData &inst, uint32_t bits);
static bool TryExtractST2_ASISDLSOP_SX2_R2S(InstData &inst, uint32_t bits);
static bool TryExtractST2_ASISDLSOP_D2_I2D(InstData &inst, uint32_t bits);
static bool TryExtractST2_ASISDLSOP_DX2_R2D(InstData &inst, uint32_t bits);
static bool TryExtractRADDHN_ASIMDDIFF_N(InstData &inst, uint32_t bits);
static bool TryExtractSTUR_32_LDST_UNSCALED(InstData &inst, uint32_t bits);
static bool TryExtractSTUR_64_LDST_UNSCALED(InstData &inst, uint32_t bits);
static bool TryExtractCLS_ASIMDMISC_R(InstData &inst, uint32_t bits);
static bool TryExtractSADDL_ASIMDDIFF_L(InstData &inst, uint32_t bits);
static bool TryExtractADDP_ASISDPAIR_ONLY(InstData &inst, uint32_t bits);
static bool TryExtractCMP_SUBS_32_ADDSUB_SHIFT(InstData &inst, uint32_t bits);
static bool TryExtractCMP_SUBS_64_ADDSUB_SHIFT(InstData &inst, uint32_t bits);
static bool TryExtractSTR_B_LDST_IMMPOST(InstData &inst, uint32_t bits);
static bool TryExtractSTR_H_LDST_IMMPOST(InstData &inst, uint32_t bits);
static bool TryExtractSTR_S_LDST_IMMPOST(InstData &inst, uint32_t bits);
static bool TryExtractSTR_D_LDST_IMMPOST(InstData &inst, uint32_t bits);
static bool TryExtractSTR_Q_LDST_IMMPOST(InstData &inst, uint32_t bits);
static bool TryExtractSTR_B_LDST_IMMPRE(InstData &inst, uint32_t bits);
static bool TryExtractSTR_H_LDST_IMMPRE(InstData &inst, uint32_t bits);
static bool TryExtractSTR_S_LDST_IMMPRE(InstData &inst, uint32_t bits);
static bool TryExtractSTR_D_LDST_IMMPRE(InstData &inst, uint32_t bits);
static bool TryExtractSTR_Q_LDST_IMMPRE(InstData &inst, uint32_t bits);
static bool TryExtractSTR_B_LDST_POS(InstData &inst, uint32_t bits);
static bool TryExtractSTR_H_LDST_POS(InstData &inst, uint32_t bits);
static bool TryExtractSTR_S_LDST_POS(InstData &inst, uint32_t bits);
static bool TryExtractSTR_D_LDST_POS(InstData &inst, uint32_t bits);
static bool TryExtractSTR_Q_LDST_POS(InstData &inst, uint32_t bits);
static bool TryExtractLDSETAB_32_MEMOP(InstData &inst, uint32_t bits);
static bool TryExtractLDSETALB_32_MEMOP(InstData &inst, uint32_t bits);
static bool TryExtractLDSETB_32_MEMOP(InstData &inst, uint32_t bits);
static bool TryExtractLDSETLB_32_MEMOP(InstData &inst, uint32_t bits);
static bool TryExtractMOV_ORR_32_LOG_SHIFT(InstData &inst, uint32_t bits);
static bool TryExtractMOV_ORR_64_LOG_SHIFT(InstData &inst, uint32_t bits);
static bool TryExtractFRINTP_H_FLOATDP1(InstData &inst, uint32_t bits);
static bool TryExtractFRINTP_S_FLOATDP1(InstData &inst, uint32_t bits);
static bool TryExtractFRINTP_D_FLOATDP1(InstData &inst, uint32_t bits);
static bool TryExtractCASA_C32_LDSTEXCL(InstData &inst, uint32_t bits);
static bool TryExtractCASAL_C32_LDSTEXCL(InstData &inst, uint32_t bits);
static bool TryExtractCAS_C32_LDSTEXCL(InstData &inst, uint32_t bits);
static bool TryExtractCASL_C32_LDSTEXCL(InstData &inst, uint32_t bits);
static bool TryExtractCASA_C64_LDSTEXCL(InstData &inst, uint32_t bits);
static bool TryExtractCASAL_C64_LDSTEXCL(InstData &inst, uint32_t bits);
static bool TryExtractCAS_C64_LDSTEXCL(InstData &inst, uint32_t bits);
static bool TryExtractCASL_C64_LDSTEXCL(InstData &inst, uint32_t bits);
static bool TryExtractWFE_HI_SYSTEM(InstData &inst, uint32_t bits);
static bool TryExtractLDUMINA_32_MEMOP(InstData &inst, uint32_t bits);
static bool TryExtractLDUMINAL_32_MEMOP(InstData &inst, uint32_t bits);
static bool TryExtractLDUMIN_32_MEMOP(InstData &inst, uint32_t bits);
static bool TryExtractLDUMINL_32_MEMOP(InstData &inst, uint32_t bits);
static bool TryExtractLDUMINA_64_MEMOP(InstData &inst, uint32_t bits);
static bool TryExtractLDUMINAL_64_MEMOP(InstData &inst, uint32_t bits);
static bool TryExtractLDUMIN_64_MEMOP(InstData &inst, uint32_t bits);
static bool TryExtractLDUMINL_64_MEMOP(InstData &inst, uint32_t bits);
static bool TryExtractSTXRB_SR32_LDSTEXCL(InstData &inst, uint32_t bits);
static bool TryExtractSTLXRH_SR32_LDSTEXCL(InstData &inst, uint32_t bits);
static bool TryExtractSTLLRH_SL32_LDSTEXCL(InstData &inst, uint32_t bits);
static bool TryExtractLDUMINAH_32_MEMOP(InstData &inst, uint32_t bits);
static bool TryExtractLDUMINALH_32_MEMOP(InstData &inst, uint32_t bits);
static bool TryExtractLDUMINH_32_MEMOP(InstData &inst, uint32_t bits);
static bool TryExtractLDUMINLH_32_MEMOP(InstData &inst, uint32_t bits);
static bool TryExtractLSLV_32_DP_2SRC(InstData &inst, uint32_t bits);
static bool TryExtractLSLV_64_DP_2SRC(InstData &inst, uint32_t bits);
static bool TryExtractINS_ASIMDINS_IR_R(InstData &inst, uint32_t bits);
static bool TryExtractCMGT_ASISDMISC_Z(InstData &inst, uint32_t bits);
static bool TryExtractCMGT_ASIMDMISC_Z(InstData &inst, uint32_t bits);
static bool TryExtractSMLAL_ASIMDELEM_L(InstData &inst, uint32_t bits);
static bool TryExtractSTCLR_32S_MEMOP(InstData &inst, uint32_t bits);
static bool TryExtractSTCLRL_32S_MEMOP(InstData &inst, uint32_t bits);
static bool TryExtractSTCLR_64S_MEMOP(InstData &inst, uint32_t bits);
static bool TryExtractSTCLRL_64S_MEMOP(InstData &inst, uint32_t bits);
static bool TryExtractBIT_ASIMDSAME_ONLY(InstData &inst, uint32_t bits);
static bool TryExtractCMEQ_ASISDSAME_ONLY(InstData &inst, uint32_t bits);
static bool TryExtractCMEQ_ASIMDSAME_ONLY(InstData &inst, uint32_t bits);
static bool TryExtractCRC32CB_32C_DP_2SRC(InstData &inst, uint32_t bits);
static bool TryExtractCRC32CH_32C_DP_2SRC(InstData &inst, uint32_t bits);
static bool TryExtractCRC32CW_32C_DP_2SRC(InstData &inst, uint32_t bits);
static bool TryExtractCRC32CX_64C_DP_2SRC(InstData &inst, uint32_t bits);
static bool TryExtractSTRH_32_LDST_REGOFF(InstData &inst, uint32_t bits);
static bool TryExtractBRK_EX_EXCEPTION(InstData &inst, uint32_t bits);
static bool TryExtractUADDLP_ASIMDMISC_P(InstData &inst, uint32_t bits);
static bool TryExtractUMAXV_ASIMDALL_ONLY(InstData &inst, uint32_t bits);
static bool TryExtractLDEORAH_32_MEMOP(InstData &inst, uint32_t bits);
static bool TryExtractLDEORALH_32_MEMOP(InstData &inst, uint32_t bits);
static bool TryExtractLDEORH_32_MEMOP(InstData &inst, uint32_t bits);
static bool TryExtractLDEORLH_32_MEMOP(InstData &inst, uint32_t bits);
static bool TryExtractSMAXV_ASIMDALL_ONLY(InstData &inst, uint32_t bits);
static bool TryExtractXTN_ASIMDMISC_N(InstData &inst, uint32_t bits);
static bool TryExtractSTRB_32_LDST_IMMPOST(InstData &inst, uint32_t bits);
static bool TryExtractSTRB_32_LDST_IMMPRE(InstData &inst, uint32_t bits);
static bool TryExtractSTRB_32_LDST_POS(InstData &inst, uint32_t bits);
static bool TryExtractUSQADD_ASISDMISC_R(InstData &inst, uint32_t bits);
static bool TryExtractUSQADD_ASIMDMISC_R(InstData &inst, uint32_t bits);
static bool TryExtractFCVTZS_32H_FLOAT2FIX(InstData &inst, uint32_t bits);
static bool TryExtractFCVTZS_64H_FLOAT2FIX(InstData &inst, uint32_t bits);
static bool TryExtractFCVTZS_32S_FLOAT2FIX(InstData &inst, uint32_t bits);
static bool TryExtractFCVTZS_64S_FLOAT2FIX(InstData &inst, uint32_t bits);
static bool TryExtractFCVTZS_32D_FLOAT2FIX(InstData &inst, uint32_t bits);
static bool TryExtractFCVTZS_64D_FLOAT2FIX(InstData &inst, uint32_t bits);
static bool TryExtractUQADD_ASISDSAME_ONLY(InstData &inst, uint32_t bits);
static bool TryExtractUQADD_ASIMDSAME_ONLY(InstData &inst, uint32_t bits);
static bool TryExtractLDR_32_LOADLIT(InstData &inst, uint32_t bits);
static bool TryExtractLDR_64_LOADLIT(InstData &inst, uint32_t bits);
static bool TryExtractFNMSUB_H_FLOATDP3(InstData &inst, uint32_t bits);
static bool TryExtractFNMSUB_S_FLOATDP3(InstData &inst, uint32_t bits);
static bool TryExtractFNMSUB_D_FLOATDP3(InstData &inst, uint32_t bits);
static bool TryExtractADDP_ASIMDSAME_ONLY(InstData &inst, uint32_t bits);
static bool TryExtractSHA1M_QSV_CRYPTOSHA3(InstData &inst, uint32_t bits);
static bool TryExtractLDAXP_LP32_LDSTEXCL(InstData &inst, uint32_t bits);
static bool TryExtractLDAXP_LP64_LDSTEXCL(InstData &inst, uint32_t bits);
static bool TryExtractCASPA_CP32_LDSTEXCL(InstData &inst, uint32_t bits);
static bool TryExtractCASPAL_CP32_LDSTEXCL(InstData &inst, uint32_t bits);
static bool TryExtractCASP_CP32_LDSTEXCL(InstData &inst, uint32_t bits);
static bool TryExtractCASPL_CP32_LDSTEXCL(InstData &inst, uint32_t bits);
static bool TryExtractCASPA_CP64_LDSTEXCL(InstData &inst, uint32_t bits);
static bool TryExtractCASPAL_CP64_LDSTEXCL(InstData &inst, uint32_t bits);
static bool TryExtractCASP_CP64_LDSTEXCL(InstData &inst, uint32_t bits);
static bool TryExtractCASPL_CP64_LDSTEXCL(InstData &inst, uint32_t bits);
static bool TryExtractFCVTZU_32H_FLOAT2FIX(InstData &inst, uint32_t bits);
static bool TryExtractFCVTZU_64H_FLOAT2FIX(InstData &inst, uint32_t bits);
static bool TryExtractFCVTZU_32S_FLOAT2FIX(InstData &inst, uint32_t bits);
static bool TryExtractFCVTZU_64S_FLOAT2FIX(InstData &inst, uint32_t bits);
static bool TryExtractFCVTZU_32D_FLOAT2FIX(InstData &inst, uint32_t bits);
static bool TryExtractFCVTZU_64D_FLOAT2FIX(InstData &inst, uint32_t bits);
static bool TryExtractSHA1P_QSV_CRYPTOSHA3(InstData &inst, uint32_t bits);
static bool TryExtractSADDLV_ASIMDALL_ONLY(InstData &inst, uint32_t bits);
static bool TryExtractTBL_ASIMDTBL_L2_2(InstData &inst, uint32_t bits);
static bool TryExtractTBL_ASIMDTBL_L3_3(InstData &inst, uint32_t bits);
static bool TryExtractTBL_ASIMDTBL_L4_4(InstData &inst, uint32_t bits);
static bool TryExtractTBL_ASIMDTBL_L1_1(InstData &inst, uint32_t bits);
static bool TryExtractADD_32_ADDSUB_EXT(InstData &inst, uint32_t bits);
static bool TryExtractADD_64_ADDSUB_EXT(InstData &inst, uint32_t bits);
static bool TryExtractFMAXNMP_ASISDPAIR_ONLY_H(InstData &inst, uint32_t bits);
static bool TryExtractFMAXNMP_ASISDPAIR_ONLY_SD(InstData &inst, uint32_t bits);
static bool TryExtractBICS_32_LOG_SHIFT(InstData &inst, uint32_t bits);
static bool TryExtractBICS_64_LOG_SHIFT(InstData &inst, uint32_t bits);
static bool TryExtractFNMUL_H_FLOATDP2(InstData &inst, uint32_t bits);
static bool TryExtractFNMUL_S_FLOATDP2(InstData &inst, uint32_t bits);
static bool TryExtractFNMUL_D_FLOATDP2(InstData &inst, uint32_t bits);
static bool TryExtractSQSUB_ASISDSAME_ONLY(InstData &inst, uint32_t bits);
static bool TryExtractSQSUB_ASIMDSAME_ONLY(InstData &inst, uint32_t bits);
static bool TryExtractSQXTN_ASISDMISC_N(InstData &inst, uint32_t bits);
static bool TryExtractSQXTN_ASIMDMISC_N(InstData &inst, uint32_t bits);
static bool TryExtractMOV_ORR_ASIMDSAME_ONLY(InstData &inst, uint32_t bits);
static bool TryExtractREV64_REV_64_DP_1SRC(InstData &inst, uint32_t bits);
static bool TryExtractSTLXRB_SR32_LDSTEXCL(InstData &inst, uint32_t bits);
static bool TryExtractSTTRH_32_LDST_UNPRIV(InstData &inst, uint32_t bits);
static bool TryExtractSMINP_ASIMDSAME_ONLY(InstData &inst, uint32_t bits);
static bool TryExtractSHA256SU1_VVV_CRYPTOSHA3(InstData &inst, uint32_t bits);
static bool TryExtractFMSUB_H_FLOATDP3(InstData &inst, uint32_t bits);
static bool TryExtractFMSUB_S_FLOATDP3(InstData &inst, uint32_t bits);
static bool TryExtractFMSUB_D_FLOATDP3(InstData &inst, uint32_t bits);
static bool TryExtractNGCS_SBCS_32_ADDSUB_CARRY(InstData &inst, uint32_t bits);
static bool TryExtractNGCS_SBCS_64_ADDSUB_CARRY(InstData &inst, uint32_t bits);
static bool TryExtractSTR_32_LDST_IMMPOST(InstData &inst, uint32_t bits);
static bool TryExtractSTR_64_LDST_IMMPOST(InstData &inst, uint32_t bits);
static bool TryExtractSTR_32_LDST_IMMPRE(InstData &inst, uint32_t bits);
static bool TryExtractSTR_64_LDST_IMMPRE(InstData &inst, uint32_t bits);
static bool TryExtractSTR_32_LDST_POS(InstData &inst, uint32_t bits);
static bool TryExtractSTR_64_LDST_POS(InstData &inst, uint32_t bits);
static bool TryExtractINS_ASIMDINS_IV_V(InstData &inst, uint32_t bits);
static bool TryExtractDCPS2_DC_EXCEPTION(InstData &inst, uint32_t bits);
static bool TryExtractTST_ANDS_32_LOG_SHIFT(InstData &inst, uint32_t bits);
static bool TryExtractTST_ANDS_64_LOG_SHIFT(InstData &inst, uint32_t bits);
static bool TryExtractDCPS1_DC_EXCEPTION(InstData &inst, uint32_t bits);
static bool TryExtractFMLA_ASISDELEM_RH_H(InstData &inst, uint32_t bits);
static bool TryExtractFMLA_ASISDELEM_R_SD(InstData &inst, uint32_t bits);
static bool TryExtractFMLA_ASIMDELEM_RH_H(InstData &inst, uint32_t bits);
static bool TryExtractFMLA_ASIMDELEM_R_SD(InstData &inst, uint32_t bits);
static bool TryExtractSCVTF_ASISDMISCFP16_R(InstData &inst, uint32_t bits);
static bool TryExtractSCVTF_ASISDMISC_R(InstData &inst, uint32_t bits);
static bool TryExtractSCVTF_ASIMDMISCFP16_R(InstData &inst, uint32_t bits);
static bool TryExtractSCVTF_ASIMDMISC_R(InstData &inst, uint32_t bits);
static bool TryExtractUMULL_ASIMDDIFF_L(InstData &inst, uint32_t bits);
static bool TryExtractFMUL_ASIMDSAMEFP16_ONLY(InstData &inst, uint32_t bits);
static bool TryExtractFMUL_ASIMDSAME_ONLY(InstData &inst, uint32_t bits);
static bool TryExtractFMLA_ASIMDSAMEFP16_ONLY(InstData &inst, uint32_t bits);
static bool TryExtractFMLA_ASIMDSAME_ONLY(InstData &inst, uint32_t bits);
static bool TryExtractSDIV_32_DP_2SRC(InstData &inst, uint32_t bits);
static bool TryExtractSDIV_64_DP_2SRC(InstData &inst, uint32_t bits);
static bool TryExtractADD_32_ADDSUB_IMM(InstData &inst, uint32_t bits);
static bool TryExtractADD_64_ADDSUB_IMM(InstData &inst, uint32_t bits);
static bool TryExtractRBIT_32_DP_1SRC(InstData &inst, uint32_t bits);
static bool TryExtractRBIT_64_DP_1SRC(InstData &inst, uint32_t bits);
static bool TryExtractSMNEGL_SMSUBL_64WA_DP_3SRC(InstData &inst, uint32_t bits);
static bool TryExtractMOV_DUP_ASISDONE_ONLY(InstData &inst, uint32_t bits);
static bool TryExtractSMULL_SMADDL_64WA_DP_3SRC(InstData &inst, uint32_t bits);
static bool TryExtractZIP2_ASIMDPERM_ONLY(InstData &inst, uint32_t bits);
static bool TryExtractLDAXRB_LR32_LDSTEXCL(InstData &inst, uint32_t bits);
static bool TryExtractMNEG_MSUB_32A_DP_3SRC(InstData &inst, uint32_t bits);
static bool TryExtractMNEG_MSUB_64A_DP_3SRC(InstData &inst, uint32_t bits);
static bool TryExtractHVC_EX_EXCEPTION(InstData &inst, uint32_t bits);
static bool TryExtractDCPS3_DC_EXCEPTION(InstData &inst, uint32_t bits);
static bool TryExtractFCVTNU_ASISDMISCFP16_R(InstData &inst, uint32_t bits);
static bool TryExtractFCVTNU_ASISDMISC_R(InstData &inst, uint32_t bits);
static bool TryExtractFCVTNU_ASIMDMISCFP16_R(InstData &inst, uint32_t bits);
static bool TryExtractFCVTNU_ASIMDMISC_R(InstData &inst, uint32_t bits);
static bool TryExtractSTUMINB_32S_MEMOP(InstData &inst, uint32_t bits);
static bool TryExtractSTUMINLB_32S_MEMOP(InstData &inst, uint32_t bits);
static bool TryExtractTBNZ_ONLY_TESTBRANCH(InstData &inst, uint32_t bits);
static bool TryExtractSTCLRH_32S_MEMOP(InstData &inst, uint32_t bits);
static bool TryExtractSTCLRLH_32S_MEMOP(InstData &inst, uint32_t bits);
static bool TryExtractBL_ONLY_BRANCH_IMM(InstData &inst, uint32_t bits);
static bool TryExtractFCVTMU_ASISDMISCFP16_R(InstData &inst, uint32_t bits);
static bool TryExtractFCVTMU_ASISDMISC_R(InstData &inst, uint32_t bits);
static bool TryExtractFCVTMU_ASIMDMISCFP16_R(InstData &inst, uint32_t bits);
static bool TryExtractFCVTMU_ASIMDMISC_R(InstData &inst, uint32_t bits);
static bool TryExtractFMAXNMP_ASIMDSAMEFP16_ONLY(InstData &inst, uint32_t bits);
static bool TryExtractFMAXNMP_ASIMDSAME_ONLY(InstData &inst, uint32_t bits);
static bool TryExtractFMOV_32H_FLOAT2INT(InstData &inst, uint32_t bits);
static bool TryExtractFMOV_64H_FLOAT2INT(InstData &inst, uint32_t bits);
static bool TryExtractFMOV_H32_FLOAT2INT(InstData &inst, uint32_t bits);
static bool TryExtractFMOV_S32_FLOAT2INT(InstData &inst, uint32_t bits);
static bool TryExtractFMOV_32S_FLOAT2INT(InstData &inst, uint32_t bits);
static bool TryExtractFMOV_H64_FLOAT2INT(InstData &inst, uint32_t bits);
static bool TryExtractFMOV_D64_FLOAT2INT(InstData &inst, uint32_t bits);
static bool TryExtractFMOV_V64I_FLOAT2INT(InstData &inst, uint32_t bits);
static bool TryExtractFMOV_64D_FLOAT2INT(InstData &inst, uint32_t bits);
static bool TryExtractFMOV_64VX_FLOAT2INT(InstData &inst, uint32_t bits);
static bool TryExtractLDCLRAH_32_MEMOP(InstData &inst, uint32_t bits);
static bool TryExtractLDCLRALH_32_MEMOP(InstData &inst, uint32_t bits);
static bool TryExtractLDCLRH_32_MEMOP(InstData &inst, uint32_t bits);
static bool TryExtractLDCLRLH_32_MEMOP(InstData &inst, uint32_t bits);
static bool TryExtractSABAL_ASIMDDIFF_L(InstData &inst, uint32_t bits);
static bool TryExtractLDSETA_32_MEMOP(InstData &inst, uint32_t bits);
static bool TryExtractLDSETAL_32_MEMOP(InstData &inst, uint32_t bits);
static bool TryExtractLDSET_32_MEMOP(InstData &inst, uint32_t bits);
static bool TryExtractLDSETL_32_MEMOP(InstData &inst, uint32_t bits);
static bool TryExtractLDSETA_64_MEMOP(InstData &inst, uint32_t bits);
static bool TryExtractLDSETAL_64_MEMOP(InstData &inst, uint32_t bits);
static bool TryExtractLDSET_64_MEMOP(InstData &inst, uint32_t bits);
static bool TryExtractLDSETL_64_MEMOP(InstData &inst, uint32_t bits);
static bool TryExtractFRECPS_ASISDSAMEFP16_ONLY(InstData &inst, uint32_t bits);
static bool TryExtractFRECPS_ASISDSAME_ONLY(InstData &inst, uint32_t bits);
static bool TryExtractFRECPS_ASIMDSAMEFP16_ONLY(InstData &inst, uint32_t bits);
static bool TryExtractFRECPS_ASIMDSAME_ONLY(InstData &inst, uint32_t bits);
static bool TryExtractSMLAL_ASIMDDIFF_L(InstData &inst, uint32_t bits);
static bool TryExtractLDSMINAH_32_MEMOP(InstData &inst, uint32_t bits);
static bool TryExtractLDSMINALH_32_MEMOP(InstData &inst, uint32_t bits);
static bool TryExtractLDSMINH_32_MEMOP(InstData &inst, uint32_t bits);
static bool TryExtractLDSMINLH_32_MEMOP(InstData &inst, uint32_t bits);
static bool TryExtractFRINTI_H_FLOATDP1(InstData &inst, uint32_t bits);
static bool TryExtractFRINTI_S_FLOATDP1(InstData &inst, uint32_t bits);
static bool TryExtractFRINTI_D_FLOATDP1(InstData &inst, uint32_t bits);
static bool TryExtractSMULH_64_DP_3SRC(InstData &inst, uint32_t bits);
static bool TryExtractFMADD_H_FLOATDP3(InstData &inst, uint32_t bits);
static bool TryExtractFMADD_S_FLOATDP3(InstData &inst, uint32_t bits);
static bool TryExtractFMADD_D_FLOATDP3(InstData &inst, uint32_t bits);
static bool TryExtractCCMP_32_CONDCMP_REG(InstData &inst, uint32_t bits);
static bool TryExtractCCMP_64_CONDCMP_REG(InstData &inst, uint32_t bits);
static bool TryExtractSRSHL_ASISDSAME_ONLY(InstData &inst, uint32_t bits);
static bool TryExtractSRSHL_ASIMDSAME_ONLY(InstData &inst, uint32_t bits);
static bool TryExtractFADD_H_FLOATDP2(InstData &inst, uint32_t bits);
static bool TryExtractFADD_S_FLOATDP2(InstData &inst, uint32_t bits);
static bool TryExtractFADD_D_FLOATDP2(InstData &inst, uint32_t bits);
static bool TryExtractFMULX_ASISDELEM_RH_H(InstData &inst, uint32_t bits);
static bool TryExtractFMULX_ASISDELEM_R_SD(InstData &inst, uint32_t bits);
static bool TryExtractFMULX_ASIMDELEM_RH_H(InstData &inst, uint32_t bits);
static bool TryExtractFMULX_ASIMDELEM_R_SD(InstData &inst, uint32_t bits);
static bool TryExtractBIC_ASIMDIMM_L_HL(InstData &inst, uint32_t bits);
static bool TryExtractBIC_ASIMDIMM_L_SL(InstData &inst, uint32_t bits);
static bool TryExtractDC_SYS_CR_SYSTEM(InstData &inst, uint32_t bits);
static bool TryExtractPRFM_P_LDST_REGOFF(InstData &inst, uint32_t bits);
static bool TryExtractSTUMINH_32S_MEMOP(InstData &inst, uint32_t bits);
static bool TryExtractSTUMINLH_32S_MEMOP(InstData &inst, uint32_t bits);
static bool TryExtractORR_ASIMDIMM_L_HL(InstData &inst, uint32_t bits);
static bool TryExtractORR_ASIMDIMM_L_SL(InstData &inst, uint32_t bits);
static bool TryExtractFCVTAU_32H_FLOAT2INT(InstData &inst, uint32_t bits);
static bool TryExtractFCVTAU_64H_FLOAT2INT(InstData &inst, uint32_t bits);
static bool TryExtractFCVTAU_32S_FLOAT2INT(InstData &inst, uint32_t bits);
static bool TryExtractFCVTAU_64S_FLOAT2INT(InstData &inst, uint32_t bits);
static bool TryExtractFCVTAU_32D_FLOAT2INT(InstData &inst, uint32_t bits);
static bool TryExtractFCVTAU_64D_FLOAT2INT(InstData &inst, uint32_t bits);
static bool TryExtractLDXR_LR32_LDSTEXCL(InstData &inst, uint32_t bits);
static bool TryExtractLDXR_LR64_LDSTEXCL(InstData &inst, uint32_t bits);
static bool TryExtractTLBI_SYS_CR_SYSTEM(InstData &inst, uint32_t bits);
static bool TryExtractSVC_EX_EXCEPTION(InstData &inst, uint32_t bits);
static bool TryExtractFCMPE_H_FLOATCMP(InstData &inst, uint32_t bits);
static bool TryExtractFCMPE_HZ_FLOATCMP(InstData &inst, uint32_t bits);
static bool TryExtractFCMPE_S_FLOATCMP(InstData &inst, uint32_t bits);
static bool TryExtractFCMPE_SZ_FLOATCMP(InstData &inst, uint32_t bits);
static bool TryExtractFCMPE_D_FLOATCMP(InstData &inst, uint32_t bits);
static bool TryExtractFCMPE_DZ_FLOATCMP(InstData &inst, uint32_t bits);
static bool TryExtractFRSQRTS_ASISDSAMEFP16_ONLY(InstData &inst, uint32_t bits);
static bool TryExtractFRSQRTS_ASISDSAME_ONLY(InstData &inst, uint32_t bits);
static bool TryExtractFRSQRTS_ASIMDSAMEFP16_ONLY(InstData &inst, uint32_t bits);
static bool TryExtractFRSQRTS_ASIMDSAME_ONLY(InstData &inst, uint32_t bits);
static bool TryExtractFRINTN_H_FLOATDP1(InstData &inst, uint32_t bits);
static bool TryExtractFRINTN_S_FLOATDP1(InstData &inst, uint32_t bits);
static bool TryExtractFRINTN_D_FLOATDP1(InstData &inst, uint32_t bits);
static bool TryExtractFMOV_H_FLOATIMM(InstData &inst, uint32_t bits);
static bool TryExtractFMOV_S_FLOATIMM(InstData &inst, uint32_t bits);
static bool TryExtractFMOV_D_FLOATIMM(InstData &inst, uint32_t bits);
static bool TryExtractEOR_32_LOG_IMM(InstData &inst, uint32_t bits);
static bool TryExtractEOR_64_LOG_IMM(InstData &inst, uint32_t bits);
static bool TryExtractMRS_RS_SYSTEM(InstData &inst, uint32_t bits);
static bool TryExtractESB_HI_SYSTEM(InstData &inst, uint32_t bits);
static bool TryExtractFCMLT_ASISDMISCFP16_FZ(InstData &inst, uint32_t bits);
static bool TryExtractFCMLT_ASISDMISC_FZ(InstData &inst, uint32_t bits);
static bool TryExtractFCMLT_ASIMDMISCFP16_FZ(InstData &inst, uint32_t bits);
static bool TryExtractFCMLT_ASIMDMISC_FZ(InstData &inst, uint32_t bits);
static bool TryExtractSQRDMULH_ASISDSAME_ONLY(InstData &inst, uint32_t bits);
static bool TryExtractSQRDMULH_ASIMDSAME_ONLY(InstData &inst, uint32_t bits);
static bool TryExtractSWPAH_32_MEMOP(InstData &inst, uint32_t bits);
static bool TryExtractSWPALH_32_MEMOP(InstData &inst, uint32_t bits);
static bool TryExtractSWPH_32_MEMOP(InstData &inst, uint32_t bits);
static bool TryExtractSWPLH_32_MEMOP(InstData &inst, uint32_t bits);
static bool TryExtractDUP_ASISDONE_ONLY(InstData &inst, uint32_t bits);
static bool TryExtractDUP_ASIMDINS_DV_V(InstData &inst, uint32_t bits);
static bool TryExtractSTLRH_SL32_LDSTEXCL(InstData &inst, uint32_t bits);
static bool TryExtractLDUMAXA_32_MEMOP(InstData &inst, uint32_t bits);
static bool TryExtractLDUMAXAL_32_MEMOP(InstData &inst, uint32_t bits);
static bool TryExtractLDUMAX_32_MEMOP(InstData &inst, uint32_t bits);
static bool TryExtractLDUMAXL_32_MEMOP(InstData &inst, uint32_t bits);
static bool TryExtractLDUMAXA_64_MEMOP(InstData &inst, uint32_t bits);
static bool TryExtractLDUMAXAL_64_MEMOP(InstData &inst, uint32_t bits);
static bool TryExtractLDUMAX_64_MEMOP(InstData &inst, uint32_t bits);
static bool TryExtractLDUMAXL_64_MEMOP(InstData &inst, uint32_t bits);
static bool TryExtractSQNEG_ASISDMISC_R(InstData &inst, uint32_t bits);
static bool TryExtractSQNEG_ASIMDMISC_R(InstData &inst, uint32_t bits);
static bool TryExtractUHADD_ASIMDSAME_ONLY(InstData &inst, uint32_t bits);
static bool TryExtractCMP_SUBS_32S_ADDSUB_IMM(InstData &inst, uint32_t bits);
static bool TryExtractCMP_SUBS_64S_ADDSUB_IMM(InstData &inst, uint32_t bits);
static bool TryExtractCASAH_C32_LDSTEXCL(InstData &inst, uint32_t bits);
static bool TryExtractCASALH_C32_LDSTEXCL(InstData &inst, uint32_t bits);
static bool TryExtractCASH_C32_LDSTEXCL(InstData &inst, uint32_t bits);
static bool TryExtractCASLH_C32_LDSTEXCL(InstData &inst, uint32_t bits);
static bool TryExtractADCS_32_ADDSUB_CARRY(InstData &inst, uint32_t bits);
static bool TryExtractADCS_64_ADDSUB_CARRY(InstData &inst, uint32_t bits);
static bool TryExtractFRINTZ_H_FLOATDP1(InstData &inst, uint32_t bits);
static bool TryExtractFRINTZ_S_FLOATDP1(InstData &inst, uint32_t bits);
static bool TryExtractFRINTZ_D_FLOATDP1(InstData &inst, uint32_t bits);
static bool TryExtractSCVTF_H32_FLOAT2FIX(InstData &inst, uint32_t bits);
static bool TryExtractSCVTF_S32_FLOAT2FIX(InstData &inst, uint32_t bits);
static bool TryExtractSCVTF_D32_FLOAT2FIX(InstData &inst, uint32_t bits);
static bool TryExtractSCVTF_H64_FLOAT2FIX(InstData &inst, uint32_t bits);
static bool TryExtractSCVTF_S64_FLOAT2FIX(InstData &inst, uint32_t bits);
static bool TryExtractSCVTF_D64_FLOAT2FIX(InstData &inst, uint32_t bits);
static bool TryExtractCSETM_CSINV_32_CONDSEL(InstData &inst, uint32_t bits);
static bool TryExtractCSETM_CSINV_64_CONDSEL(InstData &inst, uint32_t bits);
static bool TryExtractSQDMLAL_ASISDELEM_L(InstData &inst, uint32_t bits);
static bool TryExtractSQDMLAL_ASIMDELEM_L(InstData &inst, uint32_t bits);
static bool TryExtractSHL_ASISDSHF_R(InstData &inst, uint32_t bits);
static bool TryExtractSHL_ASIMDSHF_R(InstData &inst, uint32_t bits);
static bool TryExtractLD2_ASISDLSE_R2(InstData &inst, uint32_t bits);
static bool TryExtractLD2_ASISDLSEP_I2_I(InstData &inst, uint32_t bits);
static bool TryExtractLD2_ASISDLSEP_R2_R(InstData &inst, uint32_t bits);
static bool TryExtractSBFM_32M_BITFIELD(InstData &inst, uint32_t bits);
static bool TryExtractSBFM_64M_BITFIELD(InstData &inst, uint32_t bits);
static bool TryExtractFMAXV_ASIMDALL_ONLY_H(InstData &inst, uint32_t bits);
static bool TryExtractFMAXV_ASIMDALL_ONLY_SD(InstData &inst, uint32_t bits);
static bool TryExtractSTADDB_32S_MEMOP(InstData &inst, uint32_t bits);
static bool TryExtractSTADDLB_32S_MEMOP(InstData &inst, uint32_t bits);
static bool TryExtractSTUMAX_32S_MEMOP(InstData &inst, uint32_t bits);
static bool TryExtractSTUMAXL_32S_MEMOP(InstData &inst, uint32_t bits);
static bool TryExtractSTUMAX_64S_MEMOP(InstData &inst, uint32_t bits);
static bool TryExtractSTUMAXL_64S_MEMOP(InstData &inst, uint32_t bits);
static bool TryExtractSQDMULH_ASISDELEM_R(InstData &inst, uint32_t bits);
static bool TryExtractSQDMULH_ASIMDELEM_R(InstData &inst, uint32_t bits);
static bool TryExtractFRSQRTE_ASISDMISCFP16_R(InstData &inst, uint32_t bits);
static bool TryExtractFRSQRTE_ASISDMISC_R(InstData &inst, uint32_t bits);
static bool TryExtractFRSQRTE_ASIMDMISCFP16_R(InstData &inst, uint32_t bits);
static bool TryExtractFRSQRTE_ASIMDMISC_R(InstData &inst, uint32_t bits);
static bool TryExtractADD_ASISDSAME_ONLY(InstData &inst, uint32_t bits);
static bool TryExtractADD_ASIMDSAME_ONLY(InstData &inst, uint32_t bits);
static bool TryExtractSABDL_ASIMDDIFF_L(InstData &inst, uint32_t bits);
static bool TryExtractROR_RORV_32_DP_2SRC(InstData &inst, uint32_t bits);
static bool TryExtractROR_RORV_64_DP_2SRC(InstData &inst, uint32_t bits);
static bool TryExtractUCVTF_H32_FLOAT2INT(InstData &inst, uint32_t bits);
static bool TryExtractUCVTF_S32_FLOAT2INT(InstData &inst, uint32_t bits);
static bool TryExtractUCVTF_D32_FLOAT2INT(InstData &inst, uint32_t bits);
static bool TryExtractUCVTF_H64_FLOAT2INT(InstData &inst, uint32_t bits);
static bool TryExtractUCVTF_S64_FLOAT2INT(InstData &inst, uint32_t bits);
static bool TryExtractUCVTF_D64_FLOAT2INT(InstData &inst, uint32_t bits);
static bool TryExtractUCVTF_H32_FLOAT2FIX(InstData &inst, uint32_t bits);
static bool TryExtractUCVTF_S32_FLOAT2FIX(InstData &inst, uint32_t bits);
static bool TryExtractUCVTF_D32_FLOAT2FIX(InstData &inst, uint32_t bits);
static bool TryExtractUCVTF_H64_FLOAT2FIX(InstData &inst, uint32_t bits);
static bool TryExtractUCVTF_S64_FLOAT2FIX(InstData &inst, uint32_t bits);
static bool TryExtractUCVTF_D64_FLOAT2FIX(InstData &inst, uint32_t bits);
static bool TryExtractMOVI_ASIMDIMM_N_B(InstData &inst, uint32_t bits);
static bool TryExtractMOVI_ASIMDIMM_L_HL(InstData &inst, uint32_t bits);
static bool TryExtractMOVI_ASIMDIMM_L_SL(InstData &inst, uint32_t bits);
static bool TryExtractMOVI_ASIMDIMM_M_SM(InstData &inst, uint32_t bits);
static bool TryExtractMOVI_ASIMDIMM_D_DS(InstData &inst, uint32_t bits);
static bool TryExtractMOVI_ASIMDIMM_D2_D(InstData &inst, uint32_t bits);
static bool TryExtractREV16_32_DP_1SRC(InstData &inst, uint32_t bits);
static bool TryExtractREV16_64_DP_1SRC(InstData &inst, uint32_t bits);
static bool TryExtractSQRDMLAH_ASISDELEM_R(InstData &inst, uint32_t bits);
static bool TryExtractSQRDMLAH_ASIMDELEM_R(InstData &inst, uint32_t bits);
static bool TryExtractFMAXP_ASISDPAIR_ONLY_H(InstData &inst, uint32_t bits);
static bool TryExtractFMAXP_ASISDPAIR_ONLY_SD(InstData &inst, uint32_t bits);
static bool TryExtractBIF_ASIMDSAME_ONLY(InstData &inst, uint32_t bits);
static bool TryExtractFCMLE_ASISDMISCFP16_FZ(InstData &inst, uint32_t bits);
static bool TryExtractFCMLE_ASISDMISC_FZ(InstData &inst, uint32_t bits);
static bool TryExtractFCMLE_ASIMDMISCFP16_FZ(InstData &inst, uint32_t bits);
static bool TryExtractFCMLE_ASIMDMISC_FZ(InstData &inst, uint32_t bits);
static bool TryExtractDRPS_64E_BRANCH_REG(InstData &inst, uint32_t bits);
static bool TryExtractSLI_ASISDSHF_R(InstData &inst, uint32_t bits);
static bool TryExtractSLI_ASIMDSHF_R(InstData &inst, uint32_t bits);
static bool TryExtractLDAXRH_LR32_LDSTEXCL(InstData &inst, uint32_t bits);
static bool TryExtractBFI_BFM_32M_BITFIELD(InstData &inst, uint32_t bits);
static bool TryExtractBFI_BFM_64M_BITFIELD(InstData &inst, uint32_t bits);
static bool TryExtractLDADDAB_32_MEMOP(InstData &inst, uint32_t bits);
static bool TryExtractLDADDALB_32_MEMOP(InstData &inst, uint32_t bits);
static bool TryExtractLDADDB_32_MEMOP(InstData &inst, uint32_t bits);
static bool TryExtractLDADDLB_32_MEMOP(InstData &inst, uint32_t bits);
static bool TryExtractLDRH_32_LDST_IMMPOST(InstData &inst, uint32_t bits);
static bool TryExtractLDRH_32_LDST_IMMPRE(InstData &inst, uint32_t bits);
static bool TryExtractLDRH_32_LDST_POS(InstData &inst, uint32_t bits);
static bool TryExtractSXTB_SBFM_32M_BITFIELD(InstData &inst, uint32_t bits);
static bool TryExtractSXTB_SBFM_64M_BITFIELD(InstData &inst, uint32_t bits);
static bool TryExtractERET_64E_BRANCH_REG(InstData &inst, uint32_t bits);
static bool TryExtractSTUMIN_32S_MEMOP(InstData &inst, uint32_t bits);
static bool TryExtractSTUMINL_32S_MEMOP(InstData &inst, uint32_t bits);
static bool TryExtractSTUMIN_64S_MEMOP(InstData &inst, uint32_t bits);
static bool TryExtractSTUMINL_64S_MEMOP(InstData &inst, uint32_t bits);
static bool TryExtractSHA1SU1_VV_CRYPTOSHA2(InstData &inst, uint32_t bits);
static bool TryExtractLD1_ASISDLSE_R1_1V(InstData &inst, uint32_t bits);
static bool TryExtractLD1_ASISDLSE_R2_2V(InstData &inst, uint32_t bits);
static bool TryExtractLD1_ASISDLSE_R3_3V(InstData &inst, uint32_t bits);
static bool TryExtractLD1_ASISDLSE_R4_4V(InstData &inst, uint32_t bits);
static bool TryExtractLD1_ASISDLSEP_I1_I1(InstData &inst, uint32_t bits);
static bool TryExtractLD1_ASISDLSEP_R1_R1(InstData &inst, uint32_t bits);
static bool TryExtractLD1_ASISDLSEP_I2_I2(InstData &inst, uint32_t bits);
static bool TryExtractLD1_ASISDLSEP_R2_R2(InstData &inst, uint32_t bits);
static bool TryExtractLD1_ASISDLSEP_I3_I3(InstData &inst, uint32_t bits);
static bool TryExtractLD1_ASISDLSEP_R3_R3(InstData &inst, uint32_t bits);
static bool TryExtractLD1_ASISDLSEP_I4_I4(InstData &inst, uint32_t bits);
static bool TryExtractLD1_ASISDLSEP_R4_R4(InstData &inst, uint32_t bits);
static bool TryExtractSHA1H_SS_CRYPTOSHA2(InstData &inst, uint32_t bits);
static bool TryExtractFRINTM_ASIMDMISCFP16_R(InstData &inst, uint32_t bits);
static bool TryExtractFRINTM_ASIMDMISC_R(InstData &inst, uint32_t bits);
static bool TryExtractSTURH_32_LDST_UNSCALED(InstData &inst, uint32_t bits);
static bool TryExtractSQSHLU_ASISDSHF_R(InstData &inst, uint32_t bits);
static bool TryExtractSQSHLU_ASIMDSHF_R(InstData &inst, uint32_t bits);
static bool TryExtractUMULL_ASIMDELEM_L(InstData &inst, uint32_t bits);
static bool TryExtractNOT_ASIMDMISC_R(InstData &inst, uint32_t bits);
static bool TryExtractLDR_B_LDST_IMMPOST(InstData &inst, uint32_t bits);
static bool TryExtractLDR_H_LDST_IMMPOST(InstData &inst, uint32_t bits);
static bool TryExtractLDR_S_LDST_IMMPOST(InstData &inst, uint32_t bits);
static bool TryExtractLDR_D_LDST_IMMPOST(InstData &inst, uint32_t bits);
static bool TryExtractLDR_Q_LDST_IMMPOST(InstData &inst, uint32_t bits);
static bool TryExtractLDR_B_LDST_IMMPRE(InstData &inst, uint32_t bits);
static bool TryExtractLDR_H_LDST_IMMPRE(InstData &inst, uint32_t bits);
static bool TryExtractLDR_S_LDST_IMMPRE(InstData &inst, uint32_t bits);
static bool TryExtractLDR_D_LDST_IMMPRE(InstData &inst, uint32_t bits);
static bool TryExtractLDR_Q_LDST_IMMPRE(InstData &inst, uint32_t bits);
static bool TryExtractLDR_B_LDST_POS(InstData &inst, uint32_t bits);
static bool TryExtractLDR_H_LDST_POS(InstData &inst, uint32_t bits);
static bool TryExtractLDR_S_LDST_POS(InstData &inst, uint32_t bits);
static bool TryExtractLDR_D_LDST_POS(InstData &inst, uint32_t bits);
static bool TryExtractLDR_Q_LDST_POS(InstData &inst, uint32_t bits);
static bool TryExtractSWPAB_32_MEMOP(InstData &inst, uint32_t bits);
static bool TryExtractSWPALB_32_MEMOP(InstData &inst, uint32_t bits);
static bool TryExtractSWPB_32_MEMOP(InstData &inst, uint32_t bits);
static bool TryExtractSWPLB_32_MEMOP(InstData &inst, uint32_t bits);
static bool TryExtractFMOV_ASIMDIMM_H_H(InstData &inst, uint32_t bits);
static bool TryExtractFMOV_ASIMDIMM_S_S(InstData &inst, uint32_t bits);
static bool TryExtractFMOV_ASIMDIMM_D2_D(InstData &inst, uint32_t bits);
static bool TryExtractFMIN_ASIMDSAMEFP16_ONLY(InstData &inst, uint32_t bits);
static bool TryExtractFMIN_ASIMDSAME_ONLY(InstData &inst, uint32_t bits);
static bool TryExtractSQXTUN_ASISDMISC_N(InstData &inst, uint32_t bits);
static bool TryExtractSQXTUN_ASIMDMISC_N(InstData &inst, uint32_t bits);
static bool TryExtractLDEORAB_32_MEMOP(InstData &inst, uint32_t bits);
static bool TryExtractLDEORALB_32_MEMOP(InstData &inst, uint32_t bits);
static bool TryExtractLDEORB_32_MEMOP(InstData &inst, uint32_t bits);
static bool TryExtractLDEORLB_32_MEMOP(InstData &inst, uint32_t bits);
static bool TryExtractFCVTPS_ASISDMISCFP16_R(InstData &inst, uint32_t bits);
static bool TryExtractFCVTPS_ASISDMISC_R(InstData &inst, uint32_t bits);
static bool TryExtractFCVTPS_ASIMDMISCFP16_R(InstData &inst, uint32_t bits);
static bool TryExtractFCVTPS_ASIMDMISC_R(InstData &inst, uint32_t bits);
static bool TryExtractLDR_S_LOADLIT(InstData &inst, uint32_t bits);
static bool TryExtractLDR_D_LOADLIT(InstData &inst, uint32_t bits);
static bool TryExtractLDR_Q_LOADLIT(InstData &inst, uint32_t bits);
static bool TryExtractFRINTP_ASIMDMISCFP16_R(InstData &inst, uint32_t bits);
static bool TryExtractFRINTP_ASIMDMISC_R(InstData &inst, uint32_t bits);
static bool TryExtractLDLARB_LR32_LDSTEXCL(InstData &inst, uint32_t bits);
static bool TryExtractFNEG_ASIMDMISCFP16_R(InstData &inst, uint32_t bits);
static bool TryExtractFNEG_ASIMDMISC_R(InstData &inst, uint32_t bits);
static bool TryExtractADDHN_ASIMDDIFF_N(InstData &inst, uint32_t bits);
static bool TryExtractLDNP_32_LDSTNAPAIR_OFFS(InstData &inst, uint32_t bits);
static bool TryExtractLDNP_64_LDSTNAPAIR_OFFS(InstData &inst, uint32_t bits);
static bool TryExtractSQRSHRN_ASISDSHF_N(InstData &inst, uint32_t bits);
static bool TryExtractSQRSHRN_ASIMDSHF_N(InstData &inst, uint32_t bits);
static bool TryExtractCMGT_ASISDSAME_ONLY(InstData &inst, uint32_t bits);
static bool TryExtractCMGT_ASIMDSAME_ONLY(InstData &inst, uint32_t bits);
static bool TryExtractST4_ASISDLSE_R4(InstData &inst, uint32_t bits);
static bool TryExtractST4_ASISDLSEP_I4_I(InstData &inst, uint32_t bits);
static bool TryExtractST4_ASISDLSEP_R4_R(InstData &inst, uint32_t bits);
static bool TryExtractASRV_32_DP_2SRC(InstData &inst, uint32_t bits);
static bool TryExtractASRV_64_DP_2SRC(InstData &inst, uint32_t bits);
static bool TryExtractUHSUB_ASIMDSAME_ONLY(InstData &inst, uint32_t bits);
static bool TryExtractCMHS_ASISDSAME_ONLY(InstData &inst, uint32_t bits);
static bool TryExtractCMHS_ASIMDSAME_ONLY(InstData &inst, uint32_t bits);
static bool TryExtractMOVZ_32_MOVEWIDE(InstData &inst, uint32_t bits);
static bool TryExtractMOVZ_64_MOVEWIDE(InstData &inst, uint32_t bits);
static bool TryExtractSADDW_ASIMDDIFF_W(InstData &inst, uint32_t bits);
static bool TryExtractSADDLP_ASIMDMISC_P(InstData &inst, uint32_t bits);
static bool TryExtractUMNEGL_UMSUBL_64WA_DP_3SRC(InstData &inst, uint32_t bits);
static bool TryExtractST2_ASISDLSE_R2(InstData &inst, uint32_t bits);
static bool TryExtractST2_ASISDLSEP_I2_I(InstData &inst, uint32_t bits);
static bool TryExtractST2_ASISDLSEP_R2_R(InstData &inst, uint32_t bits);
static bool TryExtractUXTL_USHLL_ASIMDSHF_L(InstData &inst, uint32_t bits);
static bool TryExtractLDSMINA_32_MEMOP(InstData &inst, uint32_t bits);
static bool TryExtractLDSMINAL_32_MEMOP(InstData &inst, uint32_t bits);
static bool TryExtractLDSMIN_32_MEMOP(InstData &inst, uint32_t bits);
static bool TryExtractLDSMINL_32_MEMOP(InstData &inst, uint32_t bits);
static bool TryExtractLDSMINA_64_MEMOP(InstData &inst, uint32_t bits);
static bool TryExtractLDSMINAL_64_MEMOP(InstData &inst, uint32_t bits);
static bool TryExtractLDSMIN_64_MEMOP(InstData &inst, uint32_t bits);
static bool TryExtractLDSMINL_64_MEMOP(InstData &inst, uint32_t bits);
static bool TryExtractPSB_HC_SYSTEM(InstData &inst, uint32_t bits);
static bool TryExtractFMUL_ASISDELEM_RH_H(InstData &inst, uint32_t bits);
static bool TryExtractFMUL_ASISDELEM_R_SD(InstData &inst, uint32_t bits);
static bool TryExtractFMUL_ASIMDELEM_RH_H(InstData &inst, uint32_t bits);
static bool TryExtractFMUL_ASIMDELEM_R_SD(InstData &inst, uint32_t bits);
static bool TryExtractSHADD_ASIMDSAME_ONLY(InstData &inst, uint32_t bits);
static bool TryExtractFMINP_ASISDPAIR_ONLY_H(InstData &inst, uint32_t bits);
static bool TryExtractFMINP_ASISDPAIR_ONLY_SD(InstData &inst, uint32_t bits);
static bool TryExtractREV64_ASIMDMISC_R(InstData &inst, uint32_t bits);
static bool TryExtractSSUBW_ASIMDDIFF_W(InstData &inst, uint32_t bits);
static bool TryExtractMOV_UMOV_ASIMDINS_W_W(InstData &inst, uint32_t bits);
static bool TryExtractMOV_UMOV_ASIMDINS_X_X(InstData &inst, uint32_t bits);
static bool TryExtractMLS_ASIMDELEM_R(InstData &inst, uint32_t bits);
static bool TryExtractSQDMLSL_ASISDELEM_L(InstData &inst, uint32_t bits);
static bool TryExtractSQDMLSL_ASIMDELEM_L(InstData &inst, uint32_t bits);
static bool TryExtractCINC_CSINC_32_CONDSEL(InstData &inst, uint32_t bits);
static bool TryExtractCINC_CSINC_64_CONDSEL(InstData &inst, uint32_t bits);
static bool TryExtractCSINV_32_CONDSEL(InstData &inst, uint32_t bits);
static bool TryExtractCSINV_64_CONDSEL(InstData &inst, uint32_t bits);
static bool TryExtractFCVTZU_ASISDSHF_C(InstData &inst, uint32_t bits);
static bool TryExtractFCVTZU_ASIMDSHF_C(InstData &inst, uint32_t bits);
static bool TryExtractSSHL_ASISDSAME_ONLY(InstData &inst, uint32_t bits);
static bool TryExtractSSHL_ASIMDSAME_ONLY(InstData &inst, uint32_t bits);
static bool TryExtractUXTB_UBFM_32M_BITFIELD(InstData &inst, uint32_t bits);
static bool TryExtractSSRA_ASISDSHF_R(InstData &inst, uint32_t bits);
static bool TryExtractSSRA_ASIMDSHF_R(InstData &inst, uint32_t bits);
static bool TryExtractLDRSW_64_LDST_REGOFF(InstData &inst, uint32_t bits);
static bool TryExtractSQSHL_ASISDSAME_ONLY(InstData &inst, uint32_t bits);
static bool TryExtractSQSHL_ASIMDSAME_ONLY(InstData &inst, uint32_t bits);
static bool TryExtractADDV_ASIMDALL_ONLY(InstData &inst, uint32_t bits);
static bool TryExtractPMUL_ASIMDSAME_ONLY(InstData &inst, uint32_t bits);
static bool TryExtractSMLSL_ASIMDELEM_L(InstData &inst, uint32_t bits);
static bool TryExtractNEG_SUB_32_ADDSUB_SHIFT(InstData &inst, uint32_t bits);
static bool TryExtractNEG_SUB_64_ADDSUB_SHIFT(InstData &inst, uint32_t bits);
static bool TryExtractFCMP_H_FLOATCMP(InstData &inst, uint32_t bits);
static bool TryExtractFCMP_HZ_FLOATCMP(InstData &inst, uint32_t bits);
static bool TryExtractFCMP_S_FLOATCMP(InstData &inst, uint32_t bits);
static bool TryExtractFCMP_SZ_FLOATCMP(InstData &inst, uint32_t bits);
static bool TryExtractFCMP_D_FLOATCMP(InstData &inst, uint32_t bits);
static bool TryExtractFCMP_DZ_FLOATCMP(InstData &inst, uint32_t bits);
static bool TryExtractORR_32_LOG_SHIFT(InstData &inst, uint32_t bits);
static bool TryExtractORR_64_LOG_SHIFT(InstData &inst, uint32_t bits);
static bool TryExtractSHA1SU0_VVV_CRYPTOSHA3(InstData &inst, uint32_t bits);
static bool TryExtractSTSET_32S_MEMOP(InstData &inst, uint32_t bits);
static bool TryExtractSTSETL_32S_MEMOP(InstData &inst, uint32_t bits);
static bool TryExtractSTSET_64S_MEMOP(InstData &inst, uint32_t bits);
static bool TryExtractSTSETL_64S_MEMOP(InstData &inst, uint32_t bits);
static bool TryExtractMLA_ASIMDSAME_ONLY(InstData &inst, uint32_t bits);
static bool TryExtractADDS_32_ADDSUB_SHIFT(InstData &inst, uint32_t bits);
static bool TryExtractADDS_64_ADDSUB_SHIFT(InstData &inst, uint32_t bits);
static bool TryExtractLD3R_ASISDLSO_R3(InstData &inst, uint32_t bits);
static bool TryExtractLD3R_ASISDLSOP_R3_I(InstData &inst, uint32_t bits);
static bool TryExtractLD3R_ASISDLSOP_RX3_R(InstData &inst, uint32_t bits);
static bool TryExtractPRFM_P_LOADLIT(InstData &inst, uint32_t bits);
static bool TryExtractCASAB_C32_LDSTEXCL(InstData &inst, uint32_t bits);
static bool TryExtractCASALB_C32_LDSTEXCL(InstData &inst, uint32_t bits);
static bool TryExtractCASB_C32_LDSTEXCL(InstData &inst, uint32_t bits);
static bool TryExtractCASLB_C32_LDSTEXCL(InstData &inst, uint32_t bits);
static bool TryExtractNEGS_SUBS_32_ADDSUB_SHIFT(InstData &inst, uint32_t bits);
static bool TryExtractNEGS_SUBS_64_ADDSUB_SHIFT(InstData &inst, uint32_t bits);
static bool TryExtractLDSMAXAH_32_MEMOP(InstData &inst, uint32_t bits);
static bool TryExtractLDSMAXALH_32_MEMOP(InstData &inst, uint32_t bits);
static bool TryExtractLDSMAXH_32_MEMOP(InstData &inst, uint32_t bits);
static bool TryExtractLDSMAXLH_32_MEMOP(InstData &inst, uint32_t bits);
static bool TryExtractMSUB_32A_DP_3SRC(InstData &inst, uint32_t bits);
static bool TryExtractMSUB_64A_DP_3SRC(InstData &inst, uint32_t bits);
static bool TryExtractLD4_ASISDLSE_R4(InstData &inst, uint32_t bits);
static bool TryExtractLD4_ASISDLSEP_I4_I(InstData &inst, uint32_t bits);
static bool TryExtractLD4_ASISDLSEP_R4_R(InstData &inst, uint32_t bits);
static bool TryExtractUQXTN_ASISDMISC_N(InstData &inst, uint32_t bits);
static bool TryExtractUQXTN_ASIMDMISC_N(InstData &inst, uint32_t bits);
static bool TryExtractTBZ_ONLY_TESTBRANCH(InstData &inst, uint32_t bits);
static bool TryExtractFMINNMV_ASIMDALL_ONLY_H(InstData &inst, uint32_t bits);
static bool TryExtractFMINNMV_ASIMDALL_ONLY_SD(InstData &inst, uint32_t bits);
static bool TryExtractFCVTZS_ASISDMISCFP16_R(InstData &inst, uint32_t bits);
static bool TryExtractFCVTZS_ASISDMISC_R(InstData &inst, uint32_t bits);
static bool TryExtractFCVTZS_ASIMDMISCFP16_R(InstData &inst, uint32_t bits);
static bool TryExtractFCVTZS_ASIMDMISC_R(InstData &inst, uint32_t bits);
static bool TryExtractFMAXNM_H_FLOATDP2(InstData &inst, uint32_t bits);
static bool TryExtractFMAXNM_S_FLOATDP2(InstData &inst, uint32_t bits);
static bool TryExtractFMAXNM_D_FLOATDP2(InstData &inst, uint32_t bits);
static bool TryExtractLDR_32_LDST_IMMPOST(InstData &inst, uint32_t bits);
static bool TryExtractLDR_64_LDST_IMMPOST(InstData &inst, uint32_t bits);
static bool TryExtractLDR_32_LDST_IMMPRE(InstData &inst, uint32_t bits);
static bool TryExtractLDR_64_LDST_IMMPRE(InstData &inst, uint32_t bits);
static bool TryExtractLDR_32_LDST_POS(InstData &inst, uint32_t bits);
static bool TryExtractLDR_64_LDST_POS(InstData &inst, uint32_t bits);
static bool TryExtractCNT_ASIMDMISC_R(InstData &inst, uint32_t bits);
static bool TryExtractSQSHL_ASISDSHF_R(InstData &inst, uint32_t bits);
static bool TryExtractSQSHL_ASIMDSHF_R(InstData &inst, uint32_t bits);
static bool TryExtractLDTR_32_LDST_UNPRIV(InstData &inst, uint32_t bits);
static bool TryExtractLDTR_64_LDST_UNPRIV(InstData &inst, uint32_t bits);
static bool TryExtractCCMP_32_CONDCMP_IMM(InstData &inst, uint32_t bits);
static bool TryExtractCCMP_64_CONDCMP_IMM(InstData &inst, uint32_t bits);
static bool TryExtractUZP2_ASIMDPERM_ONLY(InstData &inst, uint32_t bits);
static bool TryExtractLDURB_32_LDST_UNSCALED(InstData &inst, uint32_t bits);
static bool TryExtractSQRDMLSH_ASISDSAME2_ONLY(InstData &inst, uint32_t bits);
static bool TryExtractSQRDMLSH_ASIMDSAME2_ONLY(InstData &inst, uint32_t bits);
static bool TryExtractMOV_INS_ASIMDINS_IR_R(InstData &inst, uint32_t bits);
static bool TryExtractLDTRSB_32_LDST_UNPRIV(InstData &inst, uint32_t bits);
static bool TryExtractLDTRSB_64_LDST_UNPRIV(InstData &inst, uint32_t bits);
static bool TryExtractSMINV_ASIMDALL_ONLY(InstData &inst, uint32_t bits);
static bool TryExtractURHADD_ASIMDSAME_ONLY(InstData &inst, uint32_t bits);
static bool TryExtractAND_32_LOG_IMM(InstData &inst, uint32_t bits);
static bool TryExtractAND_64_LOG_IMM(InstData &inst, uint32_t bits);
static bool TryExtractSABD_ASIMDSAME_ONLY(InstData &inst, uint32_t bits);
static bool TryExtractFCMGE_ASISDSAMEFP16_ONLY(InstData &inst, uint32_t bits);
static bool TryExtractFCMGE_ASISDSAME_ONLY(InstData &inst, uint32_t bits);
static bool TryExtractFCMGE_ASIMDSAMEFP16_ONLY(InstData &inst, uint32_t bits);
static bool TryExtractFCMGE_ASIMDSAME_ONLY(InstData &inst, uint32_t bits);
static bool TryExtractMVN_NOT_ASIMDMISC_R(InstData &inst, uint32_t bits);
static bool TryExtractSTSMIN_32S_MEMOP(InstData &inst, uint32_t bits);
static bool TryExtractSTSMINL_32S_MEMOP(InstData &inst, uint32_t bits);
static bool TryExtractSTSMIN_64S_MEMOP(InstData &inst, uint32_t bits);
static bool TryExtractSTSMINL_64S_MEMOP(InstData &inst, uint32_t bits);
static bool TryExtractTRN1_ASIMDPERM_ONLY(InstData &inst, uint32_t bits);
static bool TryExtractSBCS_32_ADDSUB_CARRY(InstData &inst, uint32_t bits);
static bool TryExtractSBCS_64_ADDSUB_CARRY(InstData &inst, uint32_t bits);
static bool TryExtractSMULL_ASIMDDIFF_L(InstData &inst, uint32_t bits);
static bool TryExtractLSRV_32_DP_2SRC(InstData &inst, uint32_t bits);
static bool TryExtractLSRV_64_DP_2SRC(InstData &inst, uint32_t bits);
static bool TryExtractURSQRTE_ASIMDMISC_R(InstData &inst, uint32_t bits);
static bool TryExtractFCCMPE_H_FLOATCCMP(InstData &inst, uint32_t bits);
static bool TryExtractFCCMPE_S_FLOATCCMP(InstData &inst, uint32_t bits);
static bool TryExtractFCCMPE_D_FLOATCCMP(InstData &inst, uint32_t bits);
static bool TryExtractFMAXP_ASIMDSAMEFP16_ONLY(InstData &inst, uint32_t bits);
static bool TryExtractFMAXP_ASIMDSAME_ONLY(InstData &inst, uint32_t bits);
static bool TryExtractMUL_MADD_32A_DP_3SRC(InstData &inst, uint32_t bits);
static bool TryExtractMUL_MADD_64A_DP_3SRC(InstData &inst, uint32_t bits);
static bool TryExtractSTTR_32_LDST_UNPRIV(InstData &inst, uint32_t bits);
static bool TryExtractSTTR_64_LDST_UNPRIV(InstData &inst, uint32_t bits);
static bool TryExtractFCMGT_ASISDMISCFP16_FZ(InstData &inst, uint32_t bits);
static bool TryExtractFCMGT_ASISDMISC_FZ(InstData &inst, uint32_t bits);
static bool TryExtractFCMGT_ASIMDMISCFP16_FZ(InstData &inst, uint32_t bits);
static bool TryExtractFCMGT_ASIMDMISC_FZ(InstData &inst, uint32_t bits);
static bool TryExtractBSL_ASIMDSAME_ONLY(InstData &inst, uint32_t bits);
static bool TryExtractUQSUB_ASISDSAME_ONLY(InstData &inst, uint32_t bits);
static bool TryExtractUQSUB_ASIMDSAME_ONLY(InstData &inst, uint32_t bits);
static bool TryExtractWFI_HI_SYSTEM(InstData &inst, uint32_t bits);
static bool TryExtractLDXRH_LR32_LDSTEXCL(InstData &inst, uint32_t bits);
static bool TryExtractFMAXNMV_ASIMDALL_ONLY_H(InstData &inst, uint32_t bits);
static bool TryExtractFMAXNMV_ASIMDALL_ONLY_SD(InstData &inst, uint32_t bits);
static bool TryExtractSTLXR_SR32_LDSTEXCL(InstData &inst, uint32_t bits);
static bool TryExtractSTLXR_SR64_LDSTEXCL(InstData &inst, uint32_t bits);
static bool TryExtractSTLRB_SL32_LDSTEXCL(InstData &inst, uint32_t bits);
static bool TryExtractST3_ASISDLSE_R3(InstData &inst, uint32_t bits);
static bool TryExtractST3_ASISDLSEP_I3_I(InstData &inst, uint32_t bits);
static bool TryExtractST3_ASISDLSEP_R3_R(InstData &inst, uint32_t bits);
static bool TryExtractSQRDMULH_ASISDELEM_R(InstData &inst, uint32_t bits);
static bool TryExtractSQRDMULH_ASIMDELEM_R(InstData &inst, uint32_t bits);
static bool TryExtractSXTW_SBFM_64M_BITFIELD(InstData &inst, uint32_t bits);
static bool TryExtractUSHR_ASISDSHF_R(InstData &inst, uint32_t bits);
static bool TryExtractUSHR_ASIMDSHF_R(InstData &inst, uint32_t bits);
static bool TryExtractB_ONLY_BRANCH_IMM(InstData &inst, uint32_t bits);
static bool TryExtractFCMEQ_ASISDMISCFP16_FZ(InstData &inst, uint32_t bits);
static bool TryExtractFCMEQ_ASISDMISC_FZ(InstData &inst, uint32_t bits);
static bool TryExtractFCMEQ_ASIMDMISCFP16_FZ(InstData &inst, uint32_t bits);
static bool TryExtractFCMEQ_ASIMDMISC_FZ(InstData &inst, uint32_t bits);
static bool TryExtractFACGE_ASISDSAMEFP16_ONLY(InstData &inst, uint32_t bits);
static bool TryExtractFACGE_ASISDSAME_ONLY(InstData &inst, uint32_t bits);
static bool TryExtractFACGE_ASIMDSAMEFP16_ONLY(InstData &inst, uint32_t bits);
static bool TryExtractFACGE_ASIMDSAME_ONLY(InstData &inst, uint32_t bits);
static bool TryExtractCSEL_32_CONDSEL(InstData &inst, uint32_t bits);
static bool TryExtractCSEL_64_CONDSEL(InstData &inst, uint32_t bits);
static bool TryExtractFCVTAS_32H_FLOAT2INT(InstData &inst, uint32_t bits);
static bool TryExtractFCVTAS_64H_FLOAT2INT(InstData &inst, uint32_t bits);
static bool TryExtractFCVTAS_32S_FLOAT2INT(InstData &inst, uint32_t bits);
static bool TryExtractFCVTAS_64S_FLOAT2INT(InstData &inst, uint32_t bits);
static bool TryExtractFCVTAS_32D_FLOAT2INT(InstData &inst, uint32_t bits);
static bool TryExtractFCVTAS_64D_FLOAT2INT(InstData &inst, uint32_t bits);
static bool TryExtractLDURSH_32_LDST_UNSCALED(InstData &inst, uint32_t bits);
static bool TryExtractLDURSH_64_LDST_UNSCALED(InstData &inst, uint32_t bits);
static bool TryExtractLDURSW_64_LDST_UNSCALED(InstData &inst, uint32_t bits);
static bool TryExtractMOVN_32_MOVEWIDE(InstData &inst, uint32_t bits);
static bool TryExtractMOVN_64_MOVEWIDE(InstData &inst, uint32_t bits);
static bool TryExtractSXTL_SSHLL_ASIMDSHF_L(InstData &inst, uint32_t bits);
static bool TryExtractST1_ASISDLSO_B1_1B(InstData &inst, uint32_t bits);
static bool TryExtractST1_ASISDLSO_H1_1H(InstData &inst, uint32_t bits);
static bool TryExtractST1_ASISDLSO_S1_1S(InstData &inst, uint32_t bits);
static bool TryExtractST1_ASISDLSO_D1_1D(InstData &inst, uint32_t bits);
static bool TryExtractST1_ASISDLSOP_B1_I1B(InstData &inst, uint32_t bits);
static bool TryExtractST1_ASISDLSOP_BX1_R1B(InstData &inst, uint32_t bits);
static bool TryExtractST1_ASISDLSOP_H1_I1H(InstData &inst, uint32_t bits);
static bool TryExtractST1_ASISDLSOP_HX1_R1H(InstData &inst, uint32_t bits);
static bool TryExtractST1_ASISDLSOP_S1_I1S(InstData &inst, uint32_t bits);
static bool TryExtractST1_ASISDLSOP_SX1_R1S(InstData &inst, uint32_t bits);
static bool TryExtractST1_ASISDLSOP_D1_I1D(InstData &inst, uint32_t bits);
static bool TryExtractST1_ASISDLSOP_DX1_R1D(InstData &inst, uint32_t bits);
static bool TryExtractUZP1_ASIMDPERM_ONLY(InstData &inst, uint32_t bits);
static bool TryExtractSTUR_B_LDST_UNSCALED(InstData &inst, uint32_t bits);
static bool TryExtractSTUR_H_LDST_UNSCALED(InstData &inst, uint32_t bits);
static bool TryExtractSTUR_S_LDST_UNSCALED(InstData &inst, uint32_t bits);
static bool TryExtractSTUR_D_LDST_UNSCALED(InstData &inst, uint32_t bits);
static bool TryExtractSTUR_Q_LDST_UNSCALED(InstData &inst, uint32_t bits);
static bool TryExtractMLA_ASIMDELEM_R(InstData &inst, uint32_t bits);
static bool TryExtractFCVTPU_32H_FLOAT2INT(InstData &inst, uint32_t bits);
static bool TryExtractFCVTPU_64H_FLOAT2INT(InstData &inst, uint32_t bits);
static bool TryExtractFCVTPU_32S_FLOAT2INT(InstData &inst, uint32_t bits);
static bool TryExtractFCVTPU_64S_FLOAT2INT(InstData &inst, uint32_t bits);
static bool TryExtractFCVTPU_32D_FLOAT2INT(InstData &inst, uint32_t bits);
static bool TryExtractFCVTPU_64D_FLOAT2INT(InstData &inst, uint32_t bits);
static bool TryExtractSTSETH_32S_MEMOP(InstData &inst, uint32_t bits);
static bool TryExtractSTSETLH_32S_MEMOP(InstData &inst, uint32_t bits);
static bool TryExtractFMINV_ASIMDALL_ONLY_H(InstData &inst, uint32_t bits);
static bool TryExtractFMINV_ASIMDALL_ONLY_SD(InstData &inst, uint32_t bits);
static bool TryExtractMOV_ORR_32_LOG_IMM(InstData &inst, uint32_t bits);
static bool TryExtractMOV_ORR_64_LOG_IMM(InstData &inst, uint32_t bits);
static bool TryExtractDSB_BO_SYSTEM(InstData &inst, uint32_t bits);
static bool TryExtractFCVTMS_32H_FLOAT2INT(InstData &inst, uint32_t bits);
static bool TryExtractFCVTMS_64H_FLOAT2INT(InstData &inst, uint32_t bits);
static bool TryExtractFCVTMS_32S_FLOAT2INT(InstData &inst, uint32_t bits);
static bool TryExtractFCVTMS_64S_FLOAT2INT(InstData &inst, uint32_t bits);
static bool TryExtractFCVTMS_32D_FLOAT2INT(InstData &inst, uint32_t bits);
static bool TryExtractFCVTMS_64D_FLOAT2INT(InstData &inst, uint32_t bits);
static bool TryExtractSTSMINH_32S_MEMOP(InstData &inst, uint32_t bits);
static bool TryExtractSTSMINLH_32S_MEMOP(InstData &inst, uint32_t bits);
static bool TryExtractST4_ASISDLSO_B4_4B(InstData &inst, uint32_t bits);
static bool TryExtractST4_ASISDLSO_H4_4H(InstData &inst, uint32_t bits);
static bool TryExtractST4_ASISDLSO_S4_4S(InstData &inst, uint32_t bits);
static bool TryExtractST4_ASISDLSO_D4_4D(InstData &inst, uint32_t bits);
static bool TryExtractST4_ASISDLSOP_B4_I4B(InstData &inst, uint32_t bits);
static bool TryExtractST4_ASISDLSOP_BX4_R4B(InstData &inst, uint32_t bits);
static bool TryExtractST4_ASISDLSOP_H4_I4H(InstData &inst, uint32_t bits);
static bool TryExtractST4_ASISDLSOP_HX4_R4H(InstData &inst, uint32_t bits);
static bool TryExtractST4_ASISDLSOP_S4_I4S(InstData &inst, uint32_t bits);
static bool TryExtractST4_ASISDLSOP_SX4_R4S(InstData &inst, uint32_t bits);
static bool TryExtractST4_ASISDLSOP_D4_I4D(InstData &inst, uint32_t bits);
static bool TryExtractST4_ASISDLSOP_DX4_R4D(InstData &inst, uint32_t bits);
static bool TryExtractLDNP_S_LDSTNAPAIR_OFFS(InstData &inst, uint32_t bits);
static bool TryExtractLDNP_D_LDSTNAPAIR_OFFS(InstData &inst, uint32_t bits);
static bool TryExtractLDNP_Q_LDSTNAPAIR_OFFS(InstData &inst, uint32_t bits);
static bool TryExtractADDS_32S_ADDSUB_EXT(InstData &inst, uint32_t bits);
static bool TryExtractADDS_64S_ADDSUB_EXT(InstData &inst, uint32_t bits);
static bool TryExtractCBZ_32_COMPBRANCH(InstData &inst, uint32_t bits);
static bool TryExtractCBZ_64_COMPBRANCH(InstData &inst, uint32_t bits);
static bool TryExtractURSHL_ASISDSAME_ONLY(InstData &inst, uint32_t bits);
static bool TryExtractURSHL_ASIMDSAME_ONLY(InstData &inst, uint32_t bits);
static bool TryExtractSQRSHRUN_ASISDSHF_N(InstData &inst, uint32_t bits);
static bool TryExtractSQRSHRUN_ASIMDSHF_N(InstData &inst, uint32_t bits);
static bool TryExtractROR_EXTR_32_EXTRACT(InstData &inst, uint32_t bits);
static bool TryExtractROR_EXTR_64_EXTRACT(InstData &inst, uint32_t bits);
static bool TryExtractFRINTI_ASIMDMISCFP16_R(InstData &inst, uint32_t bits);
static bool TryExtractFRINTI_ASIMDMISC_R(InstData &inst, uint32_t bits);
static bool TryExtractLDXRB_LR32_LDSTEXCL(InstData &inst, uint32_t bits);
static bool TryExtractSTP_S_LDSTPAIR_POST(InstData &inst, uint32_t bits);
static bool TryExtractSTP_D_LDSTPAIR_POST(InstData &inst, uint32_t bits);
static bool TryExtractSTP_Q_LDSTPAIR_POST(InstData &inst, uint32_t bits);
static bool TryExtractSTP_S_LDSTPAIR_PRE(InstData &inst, uint32_t bits);
static bool TryExtractSTP_D_LDSTPAIR_PRE(InstData &inst, uint32_t bits);
static bool TryExtractSTP_Q_LDSTPAIR_PRE(InstData &inst, uint32_t bits);
static bool TryExtractSTP_S_LDSTPAIR_OFF(InstData &inst, uint32_t bits);
static bool TryExtractSTP_D_LDSTPAIR_OFF(InstData &inst, uint32_t bits);
static bool TryExtractSTP_Q_LDSTPAIR_OFF(InstData &inst, uint32_t bits);
static bool TryExtractADR_ONLY_PCRELADDR(InstData &inst, uint32_t bits);
static bool TryExtractLDSMINAB_32_MEMOP(InstData &inst, uint32_t bits);
static bool TryExtractLDSMINALB_32_MEMOP(InstData &inst, uint32_t bits);
static bool TryExtractLDSMINB_32_MEMOP(InstData &inst, uint32_t bits);
static bool TryExtractLDSMINLB_32_MEMOP(InstData &inst, uint32_t bits);
static bool TryExtractUBFIZ_UBFM_32M_BITFIELD(InstData &inst, uint32_t bits);
static bool TryExtractUBFIZ_UBFM_64M_BITFIELD(InstData &inst, uint32_t bits);
static bool TryExtractLD4_ASISDLSO_B4_4B(InstData &inst, uint32_t bits);
static bool TryExtractLD4_ASISDLSO_H4_4H(InstData &inst, uint32_t bits);
static bool TryExtractLD4_ASISDLSO_S4_4S(InstData &inst, uint32_t bits);
static bool TryExtractLD4_ASISDLSO_D4_4D(InstData &inst, uint32_t bits);
static bool TryExtractLD4_ASISDLSOP_B4_I4B(InstData &inst, uint32_t bits);
static bool TryExtractLD4_ASISDLSOP_BX4_R4B(InstData &inst, uint32_t bits);
static bool TryExtractLD4_ASISDLSOP_H4_I4H(InstData &inst, uint32_t bits);
static bool TryExtractLD4_ASISDLSOP_HX4_R4H(InstData &inst, uint32_t bits);
static bool TryExtractLD4_ASISDLSOP_S4_I4S(InstData &inst, uint32_t bits);
static bool TryExtractLD4_ASISDLSOP_SX4_R4S(InstData &inst, uint32_t bits);
static bool TryExtractLD4_ASISDLSOP_D4_I4D(InstData &inst, uint32_t bits);
static bool TryExtractLD4_ASISDLSOP_DX4_R4D(InstData &inst, uint32_t bits);
static bool TryExtractSTRB_32B_LDST_REGOFF(InstData &inst, uint32_t bits);
static bool TryExtractSTRB_32BL_LDST_REGOFF(InstData &inst, uint32_t bits);
static bool TryExtractUMAX_ASIMDSAME_ONLY(InstData &inst, uint32_t bits);
static bool TryExtractCRC32B_32C_DP_2SRC(InstData &inst, uint32_t bits);
static bool TryExtractCRC32H_32C_DP_2SRC(InstData &inst, uint32_t bits);
static bool TryExtractCRC32W_32C_DP_2SRC(InstData &inst, uint32_t bits);
static bool TryExtractCRC32X_64C_DP_2SRC(InstData &inst, uint32_t bits);
static bool TryExtractURSHR_ASISDSHF_R(InstData &inst, uint32_t bits);
static bool TryExtractURSHR_ASIMDSHF_R(InstData &inst, uint32_t bits);
static bool TryExtractPRFM_P_LDST_POS(InstData &inst, uint32_t bits);
static bool TryExtractSUBS_32S_ADDSUB_IMM(InstData &inst, uint32_t bits);
static bool TryExtractSUBS_64S_ADDSUB_IMM(InstData &inst, uint32_t bits);
static bool TryExtractSUBS_32S_ADDSUB_EXT(InstData &inst, uint32_t bits);
static bool TryExtractSUBS_64S_ADDSUB_EXT(InstData &inst, uint32_t bits);
static bool TryExtractSYSL_RC_SYSTEM(InstData &inst, uint32_t bits);
static bool TryExtractSMSUBL_64WA_DP_3SRC(InstData &inst, uint32_t bits);
static bool TryExtractURSRA_ASISDSHF_R(InstData &inst, uint32_t bits);
static bool TryExtractURSRA_ASIMDSHF_R(InstData &inst, uint32_t bits);
static bool TryExtractLDURH_32_LDST_UNSCALED(InstData &inst, uint32_t bits);
static bool TryExtractSUB_32_ADDSUB_SHIFT(InstData &inst, uint32_t bits);
static bool TryExtractSUB_64_ADDSUB_SHIFT(InstData &inst, uint32_t bits);
static bool TryExtractSRI_ASISDSHF_R(InstData &inst, uint32_t bits);
static bool TryExtractSRI_ASIMDSHF_R(InstData &inst, uint32_t bits);
static bool TryExtractUMAXP_ASIMDSAME_ONLY(InstData &inst, uint32_t bits);
static bool TryExtractIC_SYS_CR_SYSTEM(InstData &inst, uint32_t bits);
static bool TryExtractLDTRSH_32_LDST_UNPRIV(InstData &inst, uint32_t bits);
static bool TryExtractLDTRSH_64_LDST_UNPRIV(InstData &inst, uint32_t bits);
static bool TryExtractSADALP_ASIMDMISC_P(InstData &inst, uint32_t bits);
static bool TryExtractLDTRH_32_LDST_UNPRIV(InstData &inst, uint32_t bits);
static bool TryExtractSMAX_ASIMDSAME_ONLY(InstData &inst, uint32_t bits);
static bool TryExtractFCVTPU_ASISDMISCFP16_R(InstData &inst, uint32_t bits);
static bool TryExtractFCVTPU_ASISDMISC_R(InstData &inst, uint32_t bits);
static bool TryExtractFCVTPU_ASIMDMISCFP16_R(InstData &inst, uint32_t bits);
static bool TryExtractFCVTPU_ASIMDMISC_R(InstData &inst, uint32_t bits);
static bool TryExtractRET_64R_BRANCH_REG(InstData &inst, uint32_t bits);
static bool TryExtractUQRSHL_ASISDSAME_ONLY(InstData &inst, uint32_t bits);
static bool TryExtractUQRSHL_ASIMDSAME_ONLY(InstData &inst, uint32_t bits);
static bool TryExtractLDRB_32_LDST_IMMPOST(InstData &inst, uint32_t bits);
static bool TryExtractLDRB_32_LDST_IMMPRE(InstData &inst, uint32_t bits);
static bool TryExtractLDRB_32_LDST_POS(InstData &inst, uint32_t bits);
static bool TryExtractFCVTXN_ASISDMISC_N(InstData &inst, uint32_t bits);
static bool TryExtractFCVTXN_ASIMDMISC_N(InstData &inst, uint32_t bits);
static bool TryExtractMSR_SI_SYSTEM(InstData &inst, uint32_t bits);
static bool TryExtractUABDL_ASIMDDIFF_L(InstData &inst, uint32_t bits);
static bool TryExtractMSR_SR_SYSTEM(InstData &inst, uint32_t bits);
static bool TryExtractLDRH_32_LDST_REGOFF(InstData &inst, uint32_t bits);
static bool TryExtractUQSHL_ASISDSHF_R(InstData &inst, uint32_t bits);
static bool TryExtractUQSHL_ASIMDSHF_R(InstData &inst, uint32_t bits);
static bool TryExtractFMINNMP_ASISDPAIR_ONLY_H(InstData &inst, uint32_t bits);
static bool TryExtractFMINNMP_ASISDPAIR_ONLY_SD(InstData &inst, uint32_t bits);
static bool TryExtractUMADDL_64WA_DP_3SRC(InstData &inst, uint32_t bits);
static bool TryExtractFMOV_H_FLOATDP1(InstData &inst, uint32_t bits);
static bool TryExtractFMOV_S_FLOATDP1(InstData &inst, uint32_t bits);
static bool TryExtractFMOV_D_FLOATDP1(InstData &inst, uint32_t bits);
static bool TryExtractSRHADD_ASIMDSAME_ONLY(InstData &inst, uint32_t bits);
static bool TryExtractNGC_SBC_32_ADDSUB_CARRY(InstData &inst, uint32_t bits);
static bool TryExtractNGC_SBC_64_ADDSUB_CARRY(InstData &inst, uint32_t bits);
static bool TryExtractSBFIZ_SBFM_32M_BITFIELD(InstData &inst, uint32_t bits);
static bool TryExtractSBFIZ_SBFM_64M_BITFIELD(InstData &inst, uint32_t bits);
static bool TryExtractUMSUBL_64WA_DP_3SRC(InstData &inst, uint32_t bits);
static bool TryExtractFCVTMU_32H_FLOAT2INT(InstData &inst, uint32_t bits);
static bool TryExtractFCVTMU_64H_FLOAT2INT(InstData &inst, uint32_t bits);
static bool TryExtractFCVTMU_32S_FLOAT2INT(InstData &inst, uint32_t bits);
static bool TryExtractFCVTMU_64S_FLOAT2INT(InstData &inst, uint32_t bits);
static bool TryExtractFCVTMU_32D_FLOAT2INT(InstData &inst, uint32_t bits);
static bool TryExtractFCVTMU_64D_FLOAT2INT(InstData &inst, uint32_t bits);
static bool TryExtractLDP_S_LDSTPAIR_POST(InstData &inst, uint32_t bits);
static bool TryExtractLDP_D_LDSTPAIR_POST(InstData &inst, uint32_t bits);
static bool TryExtractLDP_Q_LDSTPAIR_POST(InstData &inst, uint32_t bits);
static bool TryExtractLDP_S_LDSTPAIR_PRE(InstData &inst, uint32_t bits);
static bool TryExtractLDP_D_LDSTPAIR_PRE(InstData &inst, uint32_t bits);
static bool TryExtractLDP_Q_LDSTPAIR_PRE(InstData &inst, uint32_t bits);
static bool TryExtractLDP_S_LDSTPAIR_OFF(InstData &inst, uint32_t bits);
static bool TryExtractLDP_D_LDSTPAIR_OFF(InstData &inst, uint32_t bits);
static bool TryExtractLDP_Q_LDSTPAIR_OFF(InstData &inst, uint32_t bits);
static bool TryExtractSBC_32_ADDSUB_CARRY(InstData &inst, uint32_t bits);
static bool TryExtractSBC_64_ADDSUB_CARRY(InstData &inst, uint32_t bits);
static bool TryExtractFCVTZU_32H_FLOAT2INT(InstData &inst, uint32_t bits);
static bool TryExtractFCVTZU_64H_FLOAT2INT(InstData &inst, uint32_t bits);
static bool TryExtractFCVTZU_32S_FLOAT2INT(InstData &inst, uint32_t bits);
static bool TryExtractFCVTZU_64S_FLOAT2INT(InstData &inst, uint32_t bits);
static bool TryExtractFCVTZU_32D_FLOAT2INT(InstData &inst, uint32_t bits);
static bool TryExtractFCVTZU_64D_FLOAT2INT(InstData &inst, uint32_t bits);
static bool TryExtractCINV_CSINV_32_CONDSEL(InstData &inst, uint32_t bits);
static bool TryExtractCINV_CSINV_64_CONDSEL(InstData &inst, uint32_t bits);
static bool TryExtractSTR_32_LDST_REGOFF(InstData &inst, uint32_t bits);
static bool TryExtractSTR_64_LDST_REGOFF(InstData &inst, uint32_t bits);
static bool TryExtractFDIV_H_FLOATDP2(InstData &inst, uint32_t bits);
static bool TryExtractFDIV_S_FLOATDP2(InstData &inst, uint32_t bits);
static bool TryExtractFDIV_D_FLOATDP2(InstData &inst, uint32_t bits);
static bool TryExtractURECPE_ASIMDMISC_R(InstData &inst, uint32_t bits);
static bool TryExtractISB_BI_SYSTEM(InstData &inst, uint32_t bits);
static bool TryExtractRSUBHN_ASIMDDIFF_N(InstData &inst, uint32_t bits);
static bool TryExtractSMULL_ASIMDELEM_L(InstData &inst, uint32_t bits);
static bool TryExtractSUQADD_ASISDMISC_R(InstData &inst, uint32_t bits);
static bool TryExtractSUQADD_ASIMDMISC_R(InstData &inst, uint32_t bits);
static bool TryExtractLDRSH_32_LDST_REGOFF(InstData &inst, uint32_t bits);
static bool TryExtractLDRSH_64_LDST_REGOFF(InstData &inst, uint32_t bits);
static bool TryExtractADRP_ONLY_PCRELADDR(InstData &inst, uint32_t bits);
static bool TryExtractDUP_ASIMDINS_DR_R(InstData &inst, uint32_t bits);
static bool TryExtractFABS_H_FLOATDP1(InstData &inst, uint32_t bits);
static bool TryExtractFABS_S_FLOATDP1(InstData &inst, uint32_t bits);
static bool TryExtractFABS_D_FLOATDP1(InstData &inst, uint32_t bits);
static bool TryExtractREV32_ASIMDMISC_R(InstData &inst, uint32_t bits);
static bool TryExtractAT_SYS_CR_SYSTEM(InstData &inst, uint32_t bits);
static bool TryExtractUQRSHRN_ASISDSHF_N(InstData &inst, uint32_t bits);
static bool TryExtractUQRSHRN_ASIMDSHF_N(InstData &inst, uint32_t bits);
static bool TryExtractUBFM_32M_BITFIELD(InstData &inst, uint32_t bits);
static bool TryExtractUBFM_64M_BITFIELD(InstData &inst, uint32_t bits);
static bool TryExtractSTNP_32_LDSTNAPAIR_OFFS(InstData &inst, uint32_t bits);
static bool TryExtractSTNP_64_LDSTNAPAIR_OFFS(InstData &inst, uint32_t bits);
static bool TryExtractLDARB_LR32_LDSTEXCL(InstData &inst, uint32_t bits);
static bool TryExtractSRSRA_ASISDSHF_R(InstData &inst, uint32_t bits);
static bool TryExtractSRSRA_ASIMDSHF_R(InstData &inst, uint32_t bits);
static bool TryExtractCMGE_ASISDSAME_ONLY(InstData &inst, uint32_t bits);
static bool TryExtractCMGE_ASIMDSAME_ONLY(InstData &inst, uint32_t bits);
static bool TryExtractFADD_ASIMDSAMEFP16_ONLY(InstData &inst, uint32_t bits);
static bool TryExtractFADD_ASIMDSAME_ONLY(InstData &inst, uint32_t bits);
static bool TryExtractSQRDMLAH_ASISDSAME2_ONLY(InstData &inst, uint32_t bits);
static bool TryExtractSQRDMLAH_ASIMDSAME2_ONLY(InstData &inst, uint32_t bits);
static bool TryExtractORN_ASIMDSAME_ONLY(InstData &inst, uint32_t bits);
static bool TryExtractSTSETB_32S_MEMOP(InstData &inst, uint32_t bits);
static bool TryExtractSTSETLB_32S_MEMOP(InstData &inst, uint32_t bits);
static bool TryExtractADC_32_ADDSUB_CARRY(InstData &inst, uint32_t bits);
static bool TryExtractADC_64_ADDSUB_CARRY(InstData &inst, uint32_t bits);
static bool TryExtractBFC_BFM_32M_BITFIELD(InstData &inst, uint32_t bits);
static bool TryExtractBFC_BFM_64M_BITFIELD(InstData &inst, uint32_t bits);
static bool TryExtractLD2R_ASISDLSO_R2(InstData &inst, uint32_t bits);
static bool TryExtractLD2R_ASISDLSOP_R2_I(InstData &inst, uint32_t bits);
static bool TryExtractLD2R_ASISDLSOP_RX2_R(InstData &inst, uint32_t bits);
static bool TryExtractCSINC_32_CONDSEL(InstData &inst, uint32_t bits);
static bool TryExtractCSINC_64_CONDSEL(InstData &inst, uint32_t bits);
static bool TryExtractFMLS_ASISDELEM_RH_H(InstData &inst, uint32_t bits);
static bool TryExtractFMLS_ASISDELEM_R_SD(InstData &inst, uint32_t bits);
static bool TryExtractFMLS_ASIMDELEM_RH_H(InstData &inst, uint32_t bits);
static bool TryExtractFMLS_ASIMDELEM_R_SD(InstData &inst, uint32_t bits);
static bool TryExtractSHA256H2_QQV_CRYPTOSHA3(InstData &inst, uint32_t bits);
static bool TryExtractRBIT_ASIMDMISC_R(InstData &inst, uint32_t bits);
static bool TryExtractRSHRN_ASIMDSHF_N(InstData &inst, uint32_t bits);
static bool TryExtractUMOV_ASIMDINS_W_W(InstData &inst, uint32_t bits);
static bool TryExtractUMOV_ASIMDINS_X_X(InstData &inst, uint32_t bits);
static bool TryExtractFCVTZS_32H_FLOAT2INT(InstData &inst, uint32_t bits);
static bool TryExtractFCVTZS_64H_FLOAT2INT(InstData &inst, uint32_t bits);
static bool TryExtractFCVTZS_32S_FLOAT2INT(InstData &inst, uint32_t bits);
static bool TryExtractFCVTZS_64S_FLOAT2INT(InstData &inst, uint32_t bits);
static bool TryExtractFCVTZS_32D_FLOAT2INT(InstData &inst, uint32_t bits);
static bool TryExtractFCVTZS_64D_FLOAT2INT(InstData &inst, uint32_t bits);
static bool TryExtractNOP_HI_SYSTEM(InstData &inst, uint32_t bits);
static bool TryExtractFCVTMS_ASISDMISCFP16_R(InstData &inst, uint32_t bits);
static bool TryExtractFCVTMS_ASISDMISC_R(InstData &inst, uint32_t bits);
static bool TryExtractFCVTMS_ASIMDMISCFP16_R(InstData &inst, uint32_t bits);
static bool TryExtractFCVTMS_ASIMDMISC_R(InstData &inst, uint32_t bits);
static bool TryExtractFRINTA_H_FLOATDP1(InstData &inst, uint32_t bits);
static bool TryExtractFRINTA_S_FLOATDP1(InstData &inst, uint32_t bits);
static bool TryExtractFRINTA_D_FLOATDP1(InstData &inst, uint32_t bits);
static bool TryExtractFCSEL_H_FLOATSEL(InstData &inst, uint32_t bits);
static bool TryExtractFCSEL_S_FLOATSEL(InstData &inst, uint32_t bits);
static bool TryExtractFCSEL_D_FLOATSEL(InstData &inst, uint32_t bits);
static bool TryExtractSUBHN_ASIMDDIFF_N(InstData &inst, uint32_t bits);
static bool TryExtractLDRSB_32_LDST_IMMPOST(InstData &inst, uint32_t bits);
static bool TryExtractLDRSB_64_LDST_IMMPOST(InstData &inst, uint32_t bits);
static bool TryExtractLDRSB_32_LDST_IMMPRE(InstData &inst, uint32_t bits);
static bool TryExtractLDRSB_64_LDST_IMMPRE(InstData &inst, uint32_t bits);
static bool TryExtractLDRSB_32_LDST_POS(InstData &inst, uint32_t bits);
static bool TryExtractLDRSB_64_LDST_POS(InstData &inst, uint32_t bits);
static bool TryExtractFACGT_ASISDSAMEFP16_ONLY(InstData &inst, uint32_t bits);
static bool TryExtractFACGT_ASISDSAME_ONLY(InstData &inst, uint32_t bits);
static bool TryExtractFACGT_ASIMDSAMEFP16_ONLY(InstData &inst, uint32_t bits);
static bool TryExtractFACGT_ASIMDSAME_ONLY(InstData &inst, uint32_t bits);
static bool TryExtractNEG_ASISDMISC_R(InstData &inst, uint32_t bits);
static bool TryExtractNEG_ASIMDMISC_R(InstData &inst, uint32_t bits);
static bool TryExtractUMLAL_ASIMDDIFF_L(InstData &inst, uint32_t bits);
static bool TryExtractREV16_ASIMDMISC_R(InstData &inst, uint32_t bits);
static bool TryExtractPMULL_ASIMDDIFF_L(InstData &inst, uint32_t bits);
static bool TryExtractFMLS_ASIMDSAMEFP16_ONLY(InstData &inst, uint32_t bits);
static bool TryExtractFMLS_ASIMDSAME_ONLY(InstData &inst, uint32_t bits);
static bool TryExtractEOR_32_LOG_SHIFT(InstData &inst, uint32_t bits);
static bool TryExtractEOR_64_LOG_SHIFT(InstData &inst, uint32_t bits);
static bool TryExtractLDSMAXA_32_MEMOP(InstData &inst, uint32_t bits);
static bool TryExtractLDSMAXAL_32_MEMOP(InstData &inst, uint32_t bits);
static bool TryExtractLDSMAX_32_MEMOP(InstData &inst, uint32_t bits);
static bool TryExtractLDSMAXL_32_MEMOP(InstData &inst, uint32_t bits);
static bool TryExtractLDSMAXA_64_MEMOP(InstData &inst, uint32_t bits);
static bool TryExtractLDSMAXAL_64_MEMOP(InstData &inst, uint32_t bits);
static bool TryExtractLDSMAX_64_MEMOP(InstData &inst, uint32_t bits);
static bool TryExtractLDSMAXL_64_MEMOP(InstData &inst, uint32_t bits);
static bool TryExtractSYS_CR_SYSTEM(InstData &inst, uint32_t bits);
static bool TryExtractSQABS_ASISDMISC_R(InstData &inst, uint32_t bits);
static bool TryExtractSQABS_ASIMDMISC_R(InstData &inst, uint32_t bits);
static bool TryExtractLDAR_LR32_LDSTEXCL(InstData &inst, uint32_t bits);
static bool TryExtractLDAR_LR64_LDSTEXCL(InstData &inst, uint32_t bits);
static bool TryExtractSTADDH_32S_MEMOP(InstData &inst, uint32_t bits);
static bool TryExtractSTADDLH_32S_MEMOP(InstData &inst, uint32_t bits);
static bool TryExtractLDRSW_64_LDST_IMMPOST(InstData &inst, uint32_t bits);
static bool TryExtractLDRSW_64_LDST_IMMPRE(InstData &inst, uint32_t bits);
static bool TryExtractLDRSW_64_LDST_POS(InstData &inst, uint32_t bits);
static bool TryExtractFCVTAS_ASISDMISCFP16_R(InstData &inst, uint32_t bits);
static bool TryExtractFCVTAS_ASISDMISC_R(InstData &inst, uint32_t bits);
static bool TryExtractFCVTAS_ASIMDMISCFP16_R(InstData &inst, uint32_t bits);
static bool TryExtractFCVTAS_ASIMDMISC_R(InstData &inst, uint32_t bits);
static bool TryExtractUQSHRN_ASISDSHF_N(InstData &inst, uint32_t bits);
static bool TryExtractUQSHRN_ASIMDSHF_N(InstData &inst, uint32_t bits);
static bool TryExtractEXT_ASIMDEXT_ONLY(InstData &inst, uint32_t bits);
static bool TryExtractUSHL_ASISDSAME_ONLY(InstData &inst, uint32_t bits);
static bool TryExtractUSHL_ASIMDSAME_ONLY(InstData &inst, uint32_t bits);
static bool TryExtractFADDP_ASISDPAIR_ONLY_H(InstData &inst, uint32_t bits);
static bool TryExtractFADDP_ASISDPAIR_ONLY_SD(InstData &inst, uint32_t bits);
static bool TryExtractSSHR_ASISDSHF_R(InstData &inst, uint32_t bits);
static bool TryExtractSSHR_ASIMDSHF_R(InstData &inst, uint32_t bits);
static bool TryExtractSHSUB_ASIMDSAME_ONLY(InstData &inst, uint32_t bits);
static bool TryExtractCMN_ADDS_32S_ADDSUB_EXT(InstData &inst, uint32_t bits);
static bool TryExtractCMN_ADDS_64S_ADDSUB_EXT(InstData &inst, uint32_t bits);
static bool TryExtractFMINNM_ASIMDSAMEFP16_ONLY(InstData &inst, uint32_t bits);
static bool TryExtractFMINNM_ASIMDSAME_ONLY(InstData &inst, uint32_t bits);
static bool TryExtractUMLSL_ASIMDDIFF_L(InstData &inst, uint32_t bits);
static bool TryExtractUSHLL_ASIMDSHF_L(InstData &inst, uint32_t bits);
static bool TryExtractSTLR_SL32_LDSTEXCL(InstData &inst, uint32_t bits);
static bool TryExtractSTLR_SL64_LDSTEXCL(InstData &inst, uint32_t bits);
static bool TryExtractEON_32_LOG_SHIFT(InstData &inst, uint32_t bits);
static bool TryExtractEON_64_LOG_SHIFT(InstData &inst, uint32_t bits);
static bool TryExtractSTSMAXB_32S_MEMOP(InstData &inst, uint32_t bits);
static bool TryExtractSTSMAXLB_32S_MEMOP(InstData &inst, uint32_t bits);
static bool TryExtractFCVTNS_32H_FLOAT2INT(InstData &inst, uint32_t bits);
static bool TryExtractFCVTNS_64H_FLOAT2INT(InstData &inst, uint32_t bits);
static bool TryExtractFCVTNS_32S_FLOAT2INT(InstData &inst, uint32_t bits);
static bool TryExtractFCVTNS_64S_FLOAT2INT(InstData &inst, uint32_t bits);
static bool TryExtractFCVTNS_32D_FLOAT2INT(InstData &inst, uint32_t bits);
static bool TryExtractFCVTNS_64D_FLOAT2INT(InstData &inst, uint32_t bits);
static bool TryExtractSQSHRN_ASISDSHF_N(InstData &inst, uint32_t bits);
static bool TryExtractSQSHRN_ASIMDSHF_N(InstData &inst, uint32_t bits);
static bool TryExtractLDTRB_32_LDST_UNPRIV(InstData &inst, uint32_t bits);
static bool TryExtractLDRSB_32B_LDST_REGOFF(InstData &inst, uint32_t bits);
static bool TryExtractLDRSB_32BL_LDST_REGOFF(InstData &inst, uint32_t bits);
static bool TryExtractLDRSB_64B_LDST_REGOFF(InstData &inst, uint32_t bits);
static bool TryExtractLDRSB_64BL_LDST_REGOFF(InstData &inst, uint32_t bits);
static bool TryExtractSXTH_SBFM_32M_BITFIELD(InstData &inst, uint32_t bits);
static bool TryExtractSXTH_SBFM_64M_BITFIELD(InstData &inst, uint32_t bits);
static bool TryExtractLDURSB_32_LDST_UNSCALED(InstData &inst, uint32_t bits);
static bool TryExtractLDURSB_64_LDST_UNSCALED(InstData &inst, uint32_t bits);
static bool TryExtractSHA256H_QQV_CRYPTOSHA3(InstData &inst, uint32_t bits);
static bool TryExtractLD4R_ASISDLSO_R4(InstData &inst, uint32_t bits);
static bool TryExtractLD4R_ASISDLSOP_R4_I(InstData &inst, uint32_t bits);
static bool TryExtractLD4R_ASISDLSOP_RX4_R(InstData &inst, uint32_t bits);
static bool TryExtractFCVTNS_ASISDMISCFP16_R(InstData &inst, uint32_t bits);
static bool TryExtractFCVTNS_ASISDMISC_R(InstData &inst, uint32_t bits);
static bool TryExtractFCVTNS_ASIMDMISCFP16_R(InstData &inst, uint32_t bits);
static bool TryExtractFCVTNS_ASIMDMISC_R(InstData &inst, uint32_t bits);
static bool TryExtractFDIV_ASIMDSAMEFP16_ONLY(InstData &inst, uint32_t bits);
static bool TryExtractFDIV_ASIMDSAME_ONLY(InstData &inst, uint32_t bits);
static bool TryExtractFRECPE_ASISDMISCFP16_R(InstData &inst, uint32_t bits);
static bool TryExtractFRECPE_ASISDMISC_R(InstData &inst, uint32_t bits);
static bool TryExtractFRECPE_ASIMDMISCFP16_R(InstData &inst, uint32_t bits);
static bool TryExtractFRECPE_ASIMDMISC_R(InstData &inst, uint32_t bits);
static bool TryExtractLD1R_ASISDLSO_R1(InstData &inst, uint32_t bits);
static bool TryExtractLD1R_ASISDLSOP_R1_I(InstData &inst, uint32_t bits);
static bool TryExtractLD1R_ASISDLSOP_RX1_R(InstData &inst, uint32_t bits);
static bool TryExtractMUL_ASIMDELEM_R(InstData &inst, uint32_t bits);
static bool TryExtractUADDLV_ASIMDALL_ONLY(InstData &inst, uint32_t bits);
static bool TryExtractFNEG_H_FLOATDP1(InstData &inst, uint32_t bits);
static bool TryExtractFNEG_S_FLOATDP1(InstData &inst, uint32_t bits);
static bool TryExtractFNEG_D_FLOATDP1(InstData &inst, uint32_t bits);
static bool TryExtractUSUBL_ASIMDDIFF_L(InstData &inst, uint32_t bits);
static bool TryExtractSHA1C_QSV_CRYPTOSHA3(InstData &inst, uint32_t bits);
static bool TryExtractSQDMLSL_ASISDDIFF_ONLY(InstData &inst, uint32_t bits);
static bool TryExtractSQDMLSL_ASIMDDIFF_L(InstData &inst, uint32_t bits);
static bool TryExtractPRFUM_P_LDST_UNSCALED(InstData &inst, uint32_t bits);
static bool TryExtractLDSMAXAB_32_MEMOP(InstData &inst, uint32_t bits);
static bool TryExtractLDSMAXALB_32_MEMOP(InstData &inst, uint32_t bits);
static bool TryExtractLDSMAXB_32_MEMOP(InstData &inst, uint32_t bits);
static bool TryExtractLDSMAXLB_32_MEMOP(InstData &inst, uint32_t bits);
static bool TryExtractFABD_ASISDSAMEFP16_ONLY(InstData &inst, uint32_t bits);
static bool TryExtractFABD_ASISDSAME_ONLY(InstData &inst, uint32_t bits);
static bool TryExtractFABD_ASIMDSAMEFP16_ONLY(InstData &inst, uint32_t bits);
static bool TryExtractFABD_ASIMDSAME_ONLY(InstData &inst, uint32_t bits);
static bool TryExtractB_ONLY_CONDBRANCH(InstData &inst, uint32_t bits);
static bool TryExtractFCVTNU_32H_FLOAT2INT(InstData &inst, uint32_t bits);
static bool TryExtractFCVTNU_64H_FLOAT2INT(InstData &inst, uint32_t bits);
static bool TryExtractFCVTNU_32S_FLOAT2INT(InstData &inst, uint32_t bits);
static bool TryExtractFCVTNU_64S_FLOAT2INT(InstData &inst, uint32_t bits);
static bool TryExtractFCVTNU_32D_FLOAT2INT(InstData &inst, uint32_t bits);
static bool TryExtractFCVTNU_64D_FLOAT2INT(InstData &inst, uint32_t bits);
static bool TryExtractMUL_ASIMDSAME_ONLY(InstData &inst, uint32_t bits);
static bool TryExtractUDIV_32_DP_2SRC(InstData &inst, uint32_t bits);
static bool TryExtractUDIV_64_DP_2SRC(InstData &inst, uint32_t bits);
static bool TryExtractCMTST_ASISDSAME_ONLY(InstData &inst, uint32_t bits);
static bool TryExtractCMTST_ASIMDSAME_ONLY(InstData &inst, uint32_t bits);
static bool TryExtractUADDL_ASIMDDIFF_L(InstData &inst, uint32_t bits);
static bool TryExtractMOV_MOVN_32_MOVEWIDE(InstData &inst, uint32_t bits);
static bool TryExtractMOV_MOVN_64_MOVEWIDE(InstData &inst, uint32_t bits);
static bool TryExtractTRN2_ASIMDPERM_ONLY(InstData &inst, uint32_t bits);
static bool TryExtractMOVK_32_MOVEWIDE(InstData &inst, uint32_t bits);
static bool TryExtractMOVK_64_MOVEWIDE(InstData &inst, uint32_t bits);
static bool TryExtractSMADDL_64WA_DP_3SRC(InstData &inst, uint32_t bits);
static bool TryExtractAND_32_LOG_SHIFT(InstData &inst, uint32_t bits);
static bool TryExtractAND_64_LOG_SHIFT(InstData &inst, uint32_t bits);
static bool TryExtractSQSHRUN_ASISDSHF_N(InstData &inst, uint32_t bits);
static bool TryExtractSQSHRUN_ASIMDSHF_N(InstData &inst, uint32_t bits);
static bool TryExtractSQDMULL_ASISDDIFF_ONLY(InstData &inst, uint32_t bits);
static bool TryExtractSQDMULL_ASIMDDIFF_L(InstData &inst, uint32_t bits);
static bool TryExtractFNMADD_H_FLOATDP3(InstData &inst, uint32_t bits);
static bool TryExtractFNMADD_S_FLOATDP3(InstData &inst, uint32_t bits);
static bool TryExtractFNMADD_D_FLOATDP3(InstData &inst, uint32_t bits);
static bool TryExtractFCCMP_H_FLOATCCMP(InstData &inst, uint32_t bits);
static bool TryExtractFCCMP_S_FLOATCCMP(InstData &inst, uint32_t bits);
static bool TryExtractFCCMP_D_FLOATCCMP(InstData &inst, uint32_t bits);
static bool TryExtractLD3_ASISDLSO_B3_3B(InstData &inst, uint32_t bits);
static bool TryExtractLD3_ASISDLSO_H3_3H(InstData &inst, uint32_t bits);
static bool TryExtractLD3_ASISDLSO_S3_3S(InstData &inst, uint32_t bits);
static bool TryExtractLD3_ASISDLSO_D3_3D(InstData &inst, uint32_t bits);
static bool TryExtractLD3_ASISDLSOP_B3_I3B(InstData &inst, uint32_t bits);
static bool TryExtractLD3_ASISDLSOP_BX3_R3B(InstData &inst, uint32_t bits);
static bool TryExtractLD3_ASISDLSOP_H3_I3H(InstData &inst, uint32_t bits);
static bool TryExtractLD3_ASISDLSOP_HX3_R3H(InstData &inst, uint32_t bits);
static bool TryExtractLD3_ASISDLSOP_S3_I3S(InstData &inst, uint32_t bits);
static bool TryExtractLD3_ASISDLSOP_SX3_R3S(InstData &inst, uint32_t bits);
static bool TryExtractLD3_ASISDLSOP_D3_I3D(InstData &inst, uint32_t bits);
static bool TryExtractLD3_ASISDLSOP_DX3_R3D(InstData &inst, uint32_t bits);
static bool TryExtractFRINTN_ASIMDMISCFP16_R(InstData &inst, uint32_t bits);
static bool TryExtractFRINTN_ASIMDMISC_R(InstData &inst, uint32_t bits);
static bool TryExtractSUB_32_ADDSUB_EXT(InstData &inst, uint32_t bits);
static bool TryExtractSUB_64_ADDSUB_EXT(InstData &inst, uint32_t bits);
static bool TryExtractSTR_B_LDST_REGOFF(InstData &inst, uint32_t bits);
static bool TryExtractSTR_BL_LDST_REGOFF(InstData &inst, uint32_t bits);
static bool TryExtractSTR_H_LDST_REGOFF(InstData &inst, uint32_t bits);
static bool TryExtractSTR_S_LDST_REGOFF(InstData &inst, uint32_t bits);
static bool TryExtractSTR_D_LDST_REGOFF(InstData &inst, uint32_t bits);
static bool TryExtractSTR_Q_LDST_REGOFF(InstData &inst, uint32_t bits);
static bool TryExtractSTP_32_LDSTPAIR_POST(InstData &inst, uint32_t bits);
static bool TryExtractSTP_64_LDSTPAIR_POST(InstData &inst, uint32_t bits);
static bool TryExtractSTP_32_LDSTPAIR_PRE(InstData &inst, uint32_t bits);
static bool TryExtractSTP_64_LDSTPAIR_PRE(InstData &inst, uint32_t bits);
static bool TryExtractSTP_32_LDSTPAIR_OFF(InstData &inst, uint32_t bits);
static bool TryExtractSTP_64_LDSTPAIR_OFF(InstData &inst, uint32_t bits);
static bool TryExtractORN_32_LOG_SHIFT(InstData &inst, uint32_t bits);
static bool TryExtractORN_64_LOG_SHIFT(InstData &inst, uint32_t bits);
static bool TryExtractLDCLRAB_32_MEMOP(InstData &inst, uint32_t bits);
static bool TryExtractLDCLRALB_32_MEMOP(InstData &inst, uint32_t bits);
static bool TryExtractLDCLRB_32_MEMOP(InstData &inst, uint32_t bits);
static bool TryExtractLDCLRLB_32_MEMOP(InstData &inst, uint32_t bits);
static bool TryExtractFRECPX_ASISDMISCFP16_R(InstData &inst, uint32_t bits) {
// bits
// & 11111111111111111111110000000000
// --------------------------------
// 01011110111110011111100000000000
if ((bits & 0xfffffc00U) != 0x5ef9f800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t opcode : 5;
uint32_t _17 : 1; // 0
uint32_t _18 : 1; // 0
uint32_t _19 : 1; // 1
uint32_t _20 : 1; // 1
uint32_t _21 : 1; // 1
uint32_t _22 : 1; // 1
uint32_t a : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t U : 1;
uint32_t _30 : 1; // 1
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.a = static_cast<uint8_t>(enc.a);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.U = static_cast<uint8_t>(enc.U);
inst.iform = InstForm::FRECPX_ASISDMISCFP16_R;
inst.iclass = InstName::FRECPX;
return true;
}
static bool TryExtractFRECPX_ASISDMISC_R(InstData &inst, uint32_t bits) {
// bits
// & 11111111101111111111110000000000
// --------------------------------
// 01011110101000011111100000000000
if ((bits & 0xffbffc00U) != 0x5ea1f800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t opcode : 5;
uint32_t _17 : 1; // 0
uint32_t _18 : 1; // 0
uint32_t _19 : 1; // 0
uint32_t _20 : 1; // 0
uint32_t _21 : 1; // 1
uint32_t sz : 1;
uint32_t _23 : 1; // 1
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t U : 1;
uint32_t _30 : 1; // 1
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.sz = static_cast<uint8_t>(enc.sz);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.U = static_cast<uint8_t>(enc.U);
inst.iform = InstForm::FRECPX_ASISDMISC_R;
inst.iclass = InstName::FRECPX;
return true;
}
static bool TryExtractLDP_32_LDSTPAIR_POST(InstData &inst, uint32_t bits) {
// bits
// & 11111111110000000000000000000000
// --------------------------------
// 00101000110000000000000000000000
if ((bits & 0xffc00000U) != 0x28c00000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t Rt2 : 5;
uint32_t imm7 : 7;
uint32_t L : 1;
uint32_t _23 : 1; // 1
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 1
uint32_t opc : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rt2 = static_cast<uint8_t>(enc.Rt2);
inst.L = static_cast<uint8_t>(enc.L);
inst.V = static_cast<uint8_t>(enc.V);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.imm7.uimm = static_cast<uint64_t>(enc.imm7);
inst.iform = InstForm::LDP_32_LDSTPAIR_POST;
inst.iclass = InstName::LDP;
return true;
}
static bool TryExtractLDP_64_LDSTPAIR_POST(InstData &inst, uint32_t bits) {
// bits
// & 11111111110000000000000000000000
// --------------------------------
// 10101000110000000000000000000000
if ((bits & 0xffc00000U) != 0xa8c00000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t Rt2 : 5;
uint32_t imm7 : 7;
uint32_t L : 1;
uint32_t _23 : 1; // 1
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 1
uint32_t opc : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rt2 = static_cast<uint8_t>(enc.Rt2);
inst.L = static_cast<uint8_t>(enc.L);
inst.V = static_cast<uint8_t>(enc.V);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.imm7.uimm = static_cast<uint64_t>(enc.imm7);
inst.iform = InstForm::LDP_64_LDSTPAIR_POST;
inst.iclass = InstName::LDP;
return true;
}
static bool TryExtractLDP_32_LDSTPAIR_PRE(InstData &inst, uint32_t bits) {
// bits
// & 11111111110000000000000000000000
// --------------------------------
// 00101001110000000000000000000000
if ((bits & 0xffc00000U) != 0x29c00000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t Rt2 : 5;
uint32_t imm7 : 7;
uint32_t L : 1;
uint32_t _23 : 1; // 1
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 1
uint32_t opc : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rt2 = static_cast<uint8_t>(enc.Rt2);
inst.L = static_cast<uint8_t>(enc.L);
inst.V = static_cast<uint8_t>(enc.V);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.imm7.uimm = static_cast<uint64_t>(enc.imm7);
inst.iform = InstForm::LDP_32_LDSTPAIR_PRE;
inst.iclass = InstName::LDP;
return true;
}
static bool TryExtractLDP_64_LDSTPAIR_PRE(InstData &inst, uint32_t bits) {
// bits
// & 11111111110000000000000000000000
// --------------------------------
// 10101001110000000000000000000000
if ((bits & 0xffc00000U) != 0xa9c00000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t Rt2 : 5;
uint32_t imm7 : 7;
uint32_t L : 1;
uint32_t _23 : 1; // 1
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 1
uint32_t opc : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rt2 = static_cast<uint8_t>(enc.Rt2);
inst.L = static_cast<uint8_t>(enc.L);
inst.V = static_cast<uint8_t>(enc.V);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.imm7.uimm = static_cast<uint64_t>(enc.imm7);
inst.iform = InstForm::LDP_64_LDSTPAIR_PRE;
inst.iclass = InstName::LDP;
return true;
}
static bool TryExtractLDP_32_LDSTPAIR_OFF(InstData &inst, uint32_t bits) {
// bits
// & 11111111110000000000000000000000
// --------------------------------
// 00101001010000000000000000000000
if ((bits & 0xffc00000U) != 0x29400000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t Rt2 : 5;
uint32_t imm7 : 7;
uint32_t L : 1;
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 1
uint32_t opc : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rt2 = static_cast<uint8_t>(enc.Rt2);
inst.L = static_cast<uint8_t>(enc.L);
inst.V = static_cast<uint8_t>(enc.V);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.imm7.uimm = static_cast<uint64_t>(enc.imm7);
inst.iform = InstForm::LDP_32_LDSTPAIR_OFF;
inst.iclass = InstName::LDP;
return true;
}
static bool TryExtractLDP_64_LDSTPAIR_OFF(InstData &inst, uint32_t bits) {
// bits
// & 11111111110000000000000000000000
// --------------------------------
// 10101001010000000000000000000000
if ((bits & 0xffc00000U) != 0xa9400000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t Rt2 : 5;
uint32_t imm7 : 7;
uint32_t L : 1;
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 1
uint32_t opc : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rt2 = static_cast<uint8_t>(enc.Rt2);
inst.L = static_cast<uint8_t>(enc.L);
inst.V = static_cast<uint8_t>(enc.V);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.imm7.uimm = static_cast<uint64_t>(enc.imm7);
inst.iform = InstForm::LDP_64_LDSTPAIR_OFF;
inst.iclass = InstName::LDP;
return true;
}
static bool TryExtractSTSMAXH_32S_MEMOP(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000011111
// --------------------------------
// 01111000001000000100000000011111
if ((bits & 0xffe0fc1fU) != 0x7820401fU) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t opc : 3;
uint32_t o3 : 1;
uint32_t Rs : 5;
uint32_t _21 : 1; // 1
uint32_t R : 1;
uint32_t A : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.A = static_cast<uint8_t>(enc.A);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.V = static_cast<uint8_t>(enc.V);
inst.R = static_cast<uint8_t>(enc.R);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o3 = static_cast<uint8_t>(enc.o3);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::STSMAXH_32S_MEMOP;
inst.iclass = InstName::STSMAXH;
return true;
}
static bool TryExtractSTSMAXLH_32S_MEMOP(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000011111
// --------------------------------
// 01111000011000000100000000011111
if ((bits & 0xffe0fc1fU) != 0x7860401fU) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t opc : 3;
uint32_t o3 : 1;
uint32_t Rs : 5;
uint32_t _21 : 1; // 1
uint32_t R : 1;
uint32_t A : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.A = static_cast<uint8_t>(enc.A);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.V = static_cast<uint8_t>(enc.V);
inst.R = static_cast<uint8_t>(enc.R);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o3 = static_cast<uint8_t>(enc.o3);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::STSMAXLH_32S_MEMOP;
inst.iclass = InstName::STSMAXLH;
return true;
}
static bool TryExtractREV_32_DP_1SRC(InstData &inst, uint32_t bits) {
// bits
// & 11111111111111111111110000000000
// --------------------------------
// 01011010110000000000100000000000
if ((bits & 0xfffffc00U) != 0x5ac00800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t opc : 2;
uint32_t opcode : 4;
uint32_t opcode2 : 5;
uint32_t _21 : 1; // 0
uint32_t _22 : 1; // 1
uint32_t _23 : 1; // 1
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t _30 : 1; // 1
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.opcode2 = static_cast<uint8_t>(enc.opcode2);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.sf = static_cast<uint8_t>(enc.sf);
inst.iform = InstForm::REV_32_DP_1SRC;
inst.iclass = InstName::REV;
return true;
}
static bool TryExtractREV_64_DP_1SRC(InstData &inst, uint32_t bits) {
if (false && TryExtractREV64_REV_64_DP_1SRC(inst, bits))
return true;
// bits
// & 11111111111111111111110000000000
// --------------------------------
// 11011010110000000000110000000000
if ((bits & 0xfffffc00U) != 0xdac00c00U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t opc : 2;
uint32_t opcode : 4;
uint32_t opcode2 : 5;
uint32_t _21 : 1; // 0
uint32_t _22 : 1; // 1
uint32_t _23 : 1; // 1
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t _30 : 1; // 1
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.opcode2 = static_cast<uint8_t>(enc.opcode2);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.sf = static_cast<uint8_t>(enc.sf);
inst.iform = InstForm::REV_64_DP_1SRC;
inst.iclass = InstName::REV;
return true;
}
static bool TryExtractUBFX_UBFM_32M_BITFIELD(InstData &inst, uint32_t bits) {
// bits
// & 11111111110000000000000000000000
// --------------------------------
// 01010011000000000000000000000000
if ((bits & 0xffc00000U) != 0x53000000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t imms : 6;
uint32_t immr : 6;
uint32_t N : 1;
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 0
uint32_t _28 : 1; // 1
uint32_t opc : 2;
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.sf = static_cast<uint8_t>(enc.sf);
inst.N = static_cast<uint8_t>(enc.N);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.immr.uimm = static_cast<uint64_t>(enc.immr);
inst.imms.uimm = static_cast<uint64_t>(enc.imms);
inst.iform = InstForm::UBFX_UBFM_32M_BITFIELD;
inst.iclass = InstName::UBFM;
return true;
}
static bool TryExtractUBFX_UBFM_64M_BITFIELD(InstData &inst, uint32_t bits) {
// bits
// & 11111111110000000000000000000000
// --------------------------------
// 11010011010000000000000000000000
if ((bits & 0xffc00000U) != 0xd3400000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t imms : 6;
uint32_t immr : 6;
uint32_t N : 1;
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 0
uint32_t _28 : 1; // 1
uint32_t opc : 2;
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.sf = static_cast<uint8_t>(enc.sf);
inst.N = static_cast<uint8_t>(enc.N);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.immr.uimm = static_cast<uint64_t>(enc.immr);
inst.imms.uimm = static_cast<uint64_t>(enc.imms);
inst.iform = InstForm::UBFX_UBFM_64M_BITFIELD;
inst.iclass = InstName::UBFM;
return true;
}
static bool TryExtractUMINV_ASIMDALL_ONLY(InstData &inst, uint32_t bits) {
// bits
// & 10111111001111111111110000000000
// --------------------------------
// 00101110001100011010100000000000
if ((bits & 0xbf3ffc00U) != 0x2e31a800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t _12 : 1; // 0
uint32_t _13 : 1; // 1
uint32_t _14 : 1; // 0
uint32_t _15 : 1; // 1
uint32_t op : 1;
uint32_t _17 : 1; // 0
uint32_t _18 : 1; // 0
uint32_t _19 : 1; // 0
uint32_t _20 : 1; // 1
uint32_t _21 : 1; // 1
uint32_t size : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.op = static_cast<uint8_t>(enc.op);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::UMINV_ASIMDALL_ONLY;
inst.iclass = InstName::UMINV;
return true;
}
static bool TryExtractFADDP_ASIMDSAMEFP16_ONLY(InstData &inst, uint32_t bits) {
// bits
// & 10111111111000001111110000000000
// --------------------------------
// 00101110010000000001010000000000
if ((bits & 0xbfe0fc00U) != 0x2e401400U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t opcode : 3;
uint32_t _14 : 1; // 0
uint32_t _15 : 1; // 0
uint32_t Rm : 5;
uint32_t _21 : 1; // 0
uint32_t _22 : 1; // 1
uint32_t a : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.a = static_cast<uint8_t>(enc.a);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.U = static_cast<uint8_t>(enc.U);
inst.iform = InstForm::FADDP_ASIMDSAMEFP16_ONLY;
inst.iclass = InstName::FADDP;
return true;
}
static bool TryExtractFADDP_ASIMDSAME_ONLY(InstData &inst, uint32_t bits) {
// bits
// & 10111111101000001111110000000000
// --------------------------------
// 00101110001000001101010000000000
if ((bits & 0xbfa0fc00U) != 0x2e20d400U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t opcode : 5;
uint32_t Rm : 5;
uint32_t _21 : 1; // 1
uint32_t sz : 1;
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.sz = static_cast<uint8_t>(enc.sz);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.U = static_cast<uint8_t>(enc.U);
inst.iform = InstForm::FADDP_ASIMDSAME_ONLY;
inst.iclass = InstName::FADDP;
return true;
}
static bool TryExtractFABS_ASIMDMISCFP16_R(InstData &inst, uint32_t bits) {
// bits
// & 10111111111111111111110000000000
// --------------------------------
// 00001110111110001111100000000000
if ((bits & 0xbffffc00U) != 0xef8f800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t opcode : 5;
uint32_t _17 : 1; // 0
uint32_t _18 : 1; // 0
uint32_t _19 : 1; // 1
uint32_t _20 : 1; // 1
uint32_t _21 : 1; // 1
uint32_t _22 : 1; // 1
uint32_t a : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.a = static_cast<uint8_t>(enc.a);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.iform = InstForm::FABS_ASIMDMISCFP16_R;
inst.iclass = InstName::FABS;
return true;
}
static bool TryExtractFABS_ASIMDMISC_R(InstData &inst, uint32_t bits) {
// bits
// & 10111111101111111111110000000000
// --------------------------------
// 00001110101000001111100000000000
if ((bits & 0xbfbffc00U) != 0xea0f800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t opcode : 5;
uint32_t _17 : 1; // 0
uint32_t _18 : 1; // 0
uint32_t _19 : 1; // 0
uint32_t _20 : 1; // 0
uint32_t _21 : 1; // 1
uint32_t sz : 1;
uint32_t _23 : 1; // 1
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.sz = static_cast<uint8_t>(enc.sz);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.U = static_cast<uint8_t>(enc.U);
inst.iform = InstForm::FABS_ASIMDMISC_R;
inst.iclass = InstName::FABS;
return true;
}
static bool TryExtractMADD_32A_DP_3SRC(InstData &inst, uint32_t bits) {
if (false && TryExtractMUL_MADD_32A_DP_3SRC(inst, bits))
return true;
// bits
// & 11111111111000001000000000000000
// --------------------------------
// 00011011000000000000000000000000
if ((bits & 0xffe08000U) != 0x1b000000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t Ra : 5;
uint32_t o0 : 1;
uint32_t Rm : 5;
uint32_t op31 : 3;
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t op54 : 2;
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.Ra = static_cast<uint8_t>(enc.Ra);
inst.op54 = static_cast<uint8_t>(enc.op54);
inst.op31 = static_cast<uint8_t>(enc.op31);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.sf = static_cast<uint8_t>(enc.sf);
inst.o0 = static_cast<uint8_t>(enc.o0);
inst.iform = InstForm::MADD_32A_DP_3SRC;
inst.iclass = InstName::MADD;
return true;
}
static bool TryExtractMADD_64A_DP_3SRC(InstData &inst, uint32_t bits) {
if (false && TryExtractMUL_MADD_64A_DP_3SRC(inst, bits))
return true;
// bits
// & 11111111111000001000000000000000
// --------------------------------
// 10011011000000000000000000000000
if ((bits & 0xffe08000U) != 0x9b000000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t Ra : 5;
uint32_t o0 : 1;
uint32_t Rm : 5;
uint32_t op31 : 3;
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t op54 : 2;
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.Ra = static_cast<uint8_t>(enc.Ra);
inst.op54 = static_cast<uint8_t>(enc.op54);
inst.op31 = static_cast<uint8_t>(enc.op31);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.sf = static_cast<uint8_t>(enc.sf);
inst.o0 = static_cast<uint8_t>(enc.o0);
inst.iform = InstForm::MADD_64A_DP_3SRC;
inst.iclass = InstName::MADD;
return true;
}
static bool TryExtractSCVTF_ASISDSHF_C(InstData &inst, uint32_t bits) {
// bits
// & 11111111100000001111110000000000
// --------------------------------
// 01011111000000001110010000000000
if ((bits & 0xff80fc00U) != 0x5f00e400U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t opcode : 5;
uint32_t immb : 3;
uint32_t immh : 4;
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t U : 1;
uint32_t _30 : 1; // 1
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.immh.uimm = static_cast<uint64_t>(enc.immh);
if (!(inst.immh.uimm != 0x0))
return false;
inst.immb.uimm = static_cast<uint64_t>(enc.immb);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.iform = InstForm::SCVTF_ASISDSHF_C;
inst.iclass = InstName::SCVTF;
return true;
}
static bool TryExtractSCVTF_ASIMDSHF_C(InstData &inst, uint32_t bits) {
// bits
// & 10111111100000001111110000000000
// --------------------------------
// 00001111000000001110010000000000
if ((bits & 0xbf80fc00U) != 0xf00e400U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t opcode : 5;
uint32_t immb : 3;
uint32_t immh : 4;
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.immh.uimm = static_cast<uint64_t>(enc.immh);
if (!(inst.immh.uimm != 0x0))
return false;
inst.immb.uimm = static_cast<uint64_t>(enc.immb);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.iform = InstForm::SCVTF_ASIMDSHF_C;
inst.iclass = InstName::SCVTF;
return true;
}
static bool TryExtractCLZ_ASIMDMISC_R(InstData &inst, uint32_t bits) {
// bits
// & 10111111001111111111110000000000
// --------------------------------
// 00101110001000000100100000000000
if ((bits & 0xbf3ffc00U) != 0x2e204800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t opcode : 5;
uint32_t _17 : 1; // 0
uint32_t _18 : 1; // 0
uint32_t _19 : 1; // 0
uint32_t _20 : 1; // 0
uint32_t _21 : 1; // 1
uint32_t size : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.U = static_cast<uint8_t>(enc.U);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::CLZ_ASIMDMISC_R;
inst.iclass = InstName::CLZ;
return true;
}
static bool TryExtractFCVT_SH_FLOATDP1(InstData &inst, uint32_t bits) {
// bits
// & 11111111111111111111110000000000
// --------------------------------
// 00011110111000100100000000000000
if ((bits & 0xfffffc00U) != 0x1ee24000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t _12 : 1; // 0
uint32_t _13 : 1; // 0
uint32_t _14 : 1; // 1
uint32_t opc : 2;
uint32_t _17 : 1; // 1
uint32_t _18 : 1; // 0
uint32_t _19 : 1; // 0
uint32_t _20 : 1; // 0
uint32_t _21 : 1; // 1
uint32_t type : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t _30 : 1; // 0
uint32_t M : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.M = static_cast<uint8_t>(enc.M);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.type = static_cast<uint8_t>(enc.type);
inst.iform = InstForm::FCVT_SH_FLOATDP1;
inst.iclass = InstName::FCVT;
return true;
}
static bool TryExtractFCVT_DH_FLOATDP1(InstData &inst, uint32_t bits) {
// bits
// & 11111111111111111111110000000000
// --------------------------------
// 00011110111000101100000000000000
if ((bits & 0xfffffc00U) != 0x1ee2c000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t _12 : 1; // 0
uint32_t _13 : 1; // 0
uint32_t _14 : 1; // 1
uint32_t opc : 2;
uint32_t _17 : 1; // 1
uint32_t _18 : 1; // 0
uint32_t _19 : 1; // 0
uint32_t _20 : 1; // 0
uint32_t _21 : 1; // 1
uint32_t type : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t _30 : 1; // 0
uint32_t M : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.M = static_cast<uint8_t>(enc.M);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.type = static_cast<uint8_t>(enc.type);
inst.iform = InstForm::FCVT_DH_FLOATDP1;
inst.iclass = InstName::FCVT;
return true;
}
static bool TryExtractFCVT_HS_FLOATDP1(InstData &inst, uint32_t bits) {
// bits
// & 11111111111111111111110000000000
// --------------------------------
// 00011110001000111100000000000000
if ((bits & 0xfffffc00U) != 0x1e23c000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t _12 : 1; // 0
uint32_t _13 : 1; // 0
uint32_t _14 : 1; // 1
uint32_t opc : 2;
uint32_t _17 : 1; // 1
uint32_t _18 : 1; // 0
uint32_t _19 : 1; // 0
uint32_t _20 : 1; // 0
uint32_t _21 : 1; // 1
uint32_t type : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t _30 : 1; // 0
uint32_t M : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.M = static_cast<uint8_t>(enc.M);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.type = static_cast<uint8_t>(enc.type);
inst.iform = InstForm::FCVT_HS_FLOATDP1;
inst.iclass = InstName::FCVT;
return true;
}
static bool TryExtractFCVT_DS_FLOATDP1(InstData &inst, uint32_t bits) {
// bits
// & 11111111111111111111110000000000
// --------------------------------
// 00011110001000101100000000000000
if ((bits & 0xfffffc00U) != 0x1e22c000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t _12 : 1; // 0
uint32_t _13 : 1; // 0
uint32_t _14 : 1; // 1
uint32_t opc : 2;
uint32_t _17 : 1; // 1
uint32_t _18 : 1; // 0
uint32_t _19 : 1; // 0
uint32_t _20 : 1; // 0
uint32_t _21 : 1; // 1
uint32_t type : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t _30 : 1; // 0
uint32_t M : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.M = static_cast<uint8_t>(enc.M);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.type = static_cast<uint8_t>(enc.type);
inst.iform = InstForm::FCVT_DS_FLOATDP1;
inst.iclass = InstName::FCVT;
return true;
}
static bool TryExtractFCVT_HD_FLOATDP1(InstData &inst, uint32_t bits) {
// bits
// & 11111111111111111111110000000000
// --------------------------------
// 00011110011000111100000000000000
if ((bits & 0xfffffc00U) != 0x1e63c000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t _12 : 1; // 0
uint32_t _13 : 1; // 0
uint32_t _14 : 1; // 1
uint32_t opc : 2;
uint32_t _17 : 1; // 1
uint32_t _18 : 1; // 0
uint32_t _19 : 1; // 0
uint32_t _20 : 1; // 0
uint32_t _21 : 1; // 1
uint32_t type : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t _30 : 1; // 0
uint32_t M : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.M = static_cast<uint8_t>(enc.M);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.type = static_cast<uint8_t>(enc.type);
inst.iform = InstForm::FCVT_HD_FLOATDP1;
inst.iclass = InstName::FCVT;
return true;
}
static bool TryExtractFCVT_SD_FLOATDP1(InstData &inst, uint32_t bits) {
// bits
// & 11111111111111111111110000000000
// --------------------------------
// 00011110011000100100000000000000
if ((bits & 0xfffffc00U) != 0x1e624000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t _12 : 1; // 0
uint32_t _13 : 1; // 0
uint32_t _14 : 1; // 1
uint32_t opc : 2;
uint32_t _17 : 1; // 1
uint32_t _18 : 1; // 0
uint32_t _19 : 1; // 0
uint32_t _20 : 1; // 0
uint32_t _21 : 1; // 1
uint32_t type : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t _30 : 1; // 0
uint32_t M : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.M = static_cast<uint8_t>(enc.M);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.type = static_cast<uint8_t>(enc.type);
inst.iform = InstForm::FCVT_SD_FLOATDP1;
inst.iclass = InstName::FCVT;
return true;
}
static bool TryExtractLDLARH_LR32_LDSTEXCL(InstData &inst, uint32_t bits) {
// bits
// & 11111111111111111111110000000000
// --------------------------------
// 01001000110111110111110000000000
if ((bits & 0xfffffc00U) != 0x48df7c00U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t Rt2 : 5;
uint32_t o0 : 1;
uint32_t Rs : 5;
uint32_t o1 : 1;
uint32_t L : 1;
uint32_t o2 : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 0
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.L = static_cast<uint8_t>(enc.L);
inst.Rt2 = static_cast<uint8_t>(enc.Rt2);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.o2 = static_cast<uint8_t>(enc.o2);
inst.o1 = static_cast<uint8_t>(enc.o1);
inst.o0 = static_cast<uint8_t>(enc.o0);
inst.iform = InstForm::LDLARH_LR32_LDSTEXCL;
inst.iclass = InstName::LDLARH;
return true;
}
static bool TryExtractLDUR_B_LDST_UNSCALED(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000000000110000000000
// --------------------------------
// 00111100010000000000000000000000
if ((bits & 0xffe00c00U) != 0x3c400000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t imm9 : 9;
uint32_t _21 : 1; // 0
uint32_t opc : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.imm9.uimm = static_cast<uint64_t>(enc.imm9);
inst.V = static_cast<uint8_t>(enc.V);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LDUR_B_LDST_UNSCALED;
inst.iclass = InstName::LDUR;
return true;
}
static bool TryExtractLDUR_H_LDST_UNSCALED(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000000000110000000000
// --------------------------------
// 01111100010000000000000000000000
if ((bits & 0xffe00c00U) != 0x7c400000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t imm9 : 9;
uint32_t _21 : 1; // 0
uint32_t opc : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.imm9.uimm = static_cast<uint64_t>(enc.imm9);
inst.V = static_cast<uint8_t>(enc.V);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LDUR_H_LDST_UNSCALED;
inst.iclass = InstName::LDUR;
return true;
}
static bool TryExtractLDUR_S_LDST_UNSCALED(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000000000110000000000
// --------------------------------
// 10111100010000000000000000000000
if ((bits & 0xffe00c00U) != 0xbc400000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t imm9 : 9;
uint32_t _21 : 1; // 0
uint32_t opc : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.imm9.uimm = static_cast<uint64_t>(enc.imm9);
inst.V = static_cast<uint8_t>(enc.V);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LDUR_S_LDST_UNSCALED;
inst.iclass = InstName::LDUR;
return true;
}
static bool TryExtractLDUR_D_LDST_UNSCALED(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000000000110000000000
// --------------------------------
// 11111100010000000000000000000000
if ((bits & 0xffe00c00U) != 0xfc400000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t imm9 : 9;
uint32_t _21 : 1; // 0
uint32_t opc : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.imm9.uimm = static_cast<uint64_t>(enc.imm9);
inst.V = static_cast<uint8_t>(enc.V);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LDUR_D_LDST_UNSCALED;
inst.iclass = InstName::LDUR;
return true;
}
static bool TryExtractLDUR_Q_LDST_UNSCALED(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000000000110000000000
// --------------------------------
// 00111100110000000000000000000000
if ((bits & 0xffe00c00U) != 0x3cc00000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t imm9 : 9;
uint32_t _21 : 1; // 0
uint32_t opc : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.imm9.uimm = static_cast<uint64_t>(enc.imm9);
inst.V = static_cast<uint8_t>(enc.V);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LDUR_Q_LDST_UNSCALED;
inst.iclass = InstName::LDUR;
return true;
}
static bool TryExtractCLZ_32_DP_1SRC(InstData &inst, uint32_t bits) {
// bits
// & 11111111111111111111110000000000
// --------------------------------
// 01011010110000000001000000000000
if ((bits & 0xfffffc00U) != 0x5ac01000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t op : 1;
uint32_t opcode : 5;
uint32_t opcode2 : 5;
uint32_t _21 : 1; // 0
uint32_t _22 : 1; // 1
uint32_t _23 : 1; // 1
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t _30 : 1; // 1
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.opcode2 = static_cast<uint8_t>(enc.opcode2);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.sf = static_cast<uint8_t>(enc.sf);
inst.op = static_cast<uint8_t>(enc.op);
inst.iform = InstForm::CLZ_32_DP_1SRC;
inst.iclass = InstName::CLZ;
return true;
}
static bool TryExtractCLZ_64_DP_1SRC(InstData &inst, uint32_t bits) {
// bits
// & 11111111111111111111110000000000
// --------------------------------
// 11011010110000000001000000000000
if ((bits & 0xfffffc00U) != 0xdac01000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t op : 1;
uint32_t opcode : 5;
uint32_t opcode2 : 5;
uint32_t _21 : 1; // 0
uint32_t _22 : 1; // 1
uint32_t _23 : 1; // 1
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t _30 : 1; // 1
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.opcode2 = static_cast<uint8_t>(enc.opcode2);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.sf = static_cast<uint8_t>(enc.sf);
inst.op = static_cast<uint8_t>(enc.op);
inst.iform = InstForm::CLZ_64_DP_1SRC;
inst.iclass = InstName::CLZ;
return true;
}
static bool TryExtractLSR_LSRV_32_DP_2SRC(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 00011010110000000010010000000000
if ((bits & 0xffe0fc00U) != 0x1ac02400U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t op2 : 2;
uint32_t opcode2 : 4;
uint32_t Rm : 5;
uint32_t _21 : 1; // 0
uint32_t _22 : 1; // 1
uint32_t _23 : 1; // 1
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t op : 1;
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.opcode2 = static_cast<uint8_t>(enc.opcode2);
inst.op2 = static_cast<uint8_t>(enc.op2);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.sf = static_cast<uint8_t>(enc.sf);
inst.op = static_cast<uint8_t>(enc.op);
inst.iform = InstForm::LSR_LSRV_32_DP_2SRC;
inst.iclass = InstName::LSRV;
return true;
}
static bool TryExtractLSR_LSRV_64_DP_2SRC(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 10011010110000000010010000000000
if ((bits & 0xffe0fc00U) != 0x9ac02400U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t op2 : 2;
uint32_t opcode2 : 4;
uint32_t Rm : 5;
uint32_t _21 : 1; // 0
uint32_t _22 : 1; // 1
uint32_t _23 : 1; // 1
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t op : 1;
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.opcode2 = static_cast<uint8_t>(enc.opcode2);
inst.op2 = static_cast<uint8_t>(enc.op2);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.sf = static_cast<uint8_t>(enc.sf);
inst.op = static_cast<uint8_t>(enc.op);
inst.iform = InstForm::LSR_LSRV_64_DP_2SRC;
inst.iclass = InstName::LSRV;
return true;
}
static bool TryExtractFCVTN_ASIMDMISC_N(InstData &inst, uint32_t bits) {
// bits
// & 10111111101111111111110000000000
// --------------------------------
// 00001110001000010110100000000000
if ((bits & 0xbfbffc00U) != 0xe216800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t opcode : 5;
uint32_t _17 : 1; // 0
uint32_t _18 : 1; // 0
uint32_t _19 : 1; // 0
uint32_t _20 : 1; // 0
uint32_t _21 : 1; // 1
uint32_t sz : 1;
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.sz = static_cast<uint8_t>(enc.sz);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.U = static_cast<uint8_t>(enc.U);
inst.iform = InstForm::FCVTN_ASIMDMISC_N;
inst.iclass = InstName::FCVTN;
return true;
}
static bool TryExtractCNEG_CSNEG_32_CONDSEL(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000000000110000000000
// --------------------------------
// 01011010100000000000010000000000
if ((bits & 0xffe00c00U) != 0x5a800400U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t o2 : 1;
uint32_t _11 : 1; // 0
uint32_t cond : 4;
uint32_t Rm : 5;
uint32_t _21 : 1; // 0
uint32_t _22 : 1; // 0
uint32_t _23 : 1; // 1
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t op : 1;
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.sf = static_cast<uint8_t>(enc.sf);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.cond = static_cast<uint8_t>(enc.cond);
if (!(inst.cond != 0xe))
return false;
if (!(inst.cond != 0xf))
return false;
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o2 = static_cast<uint8_t>(enc.o2);
inst.op = static_cast<uint8_t>(enc.op);
inst.iform = InstForm::CNEG_CSNEG_32_CONDSEL;
inst.iclass = InstName::CSNEG;
return true;
}
static bool TryExtractCNEG_CSNEG_64_CONDSEL(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000000000110000000000
// --------------------------------
// 11011010100000000000010000000000
if ((bits & 0xffe00c00U) != 0xda800400U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t o2 : 1;
uint32_t _11 : 1; // 0
uint32_t cond : 4;
uint32_t Rm : 5;
uint32_t _21 : 1; // 0
uint32_t _22 : 1; // 0
uint32_t _23 : 1; // 1
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t op : 1;
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.sf = static_cast<uint8_t>(enc.sf);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.cond = static_cast<uint8_t>(enc.cond);
if (!(inst.cond != 0xe))
return false;
if (!(inst.cond != 0xf))
return false;
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o2 = static_cast<uint8_t>(enc.o2);
inst.op = static_cast<uint8_t>(enc.op);
inst.iform = InstForm::CNEG_CSNEG_64_CONDSEL;
inst.iclass = InstName::CSNEG;
return true;
}
static bool TryExtractLDRSH_32_LDST_IMMPOST(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000000000110000000000
// --------------------------------
// 01111000110000000000010000000000
if ((bits & 0xffe00c00U) != 0x78c00400U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t _11 : 1; // 0
uint32_t imm9 : 9;
uint32_t _21 : 1; // 0
uint32_t opc : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.imm9.uimm = static_cast<uint64_t>(enc.imm9);
inst.V = static_cast<uint8_t>(enc.V);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LDRSH_32_LDST_IMMPOST;
inst.iclass = InstName::LDRSH;
return true;
}
static bool TryExtractLDRSH_64_LDST_IMMPOST(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000000000110000000000
// --------------------------------
// 01111000100000000000010000000000
if ((bits & 0xffe00c00U) != 0x78800400U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t _11 : 1; // 0
uint32_t imm9 : 9;
uint32_t _21 : 1; // 0
uint32_t opc : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.imm9.uimm = static_cast<uint64_t>(enc.imm9);
inst.V = static_cast<uint8_t>(enc.V);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LDRSH_64_LDST_IMMPOST;
inst.iclass = InstName::LDRSH;
return true;
}
static bool TryExtractLDRSH_32_LDST_IMMPRE(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000000000110000000000
// --------------------------------
// 01111000110000000000110000000000
if ((bits & 0xffe00c00U) != 0x78c00c00U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t _11 : 1; // 1
uint32_t imm9 : 9;
uint32_t _21 : 1; // 0
uint32_t opc : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.imm9.uimm = static_cast<uint64_t>(enc.imm9);
inst.V = static_cast<uint8_t>(enc.V);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LDRSH_32_LDST_IMMPRE;
inst.iclass = InstName::LDRSH;
return true;
}
static bool TryExtractLDRSH_64_LDST_IMMPRE(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000000000110000000000
// --------------------------------
// 01111000100000000000110000000000
if ((bits & 0xffe00c00U) != 0x78800c00U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t _11 : 1; // 1
uint32_t imm9 : 9;
uint32_t _21 : 1; // 0
uint32_t opc : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.imm9.uimm = static_cast<uint64_t>(enc.imm9);
inst.V = static_cast<uint8_t>(enc.V);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LDRSH_64_LDST_IMMPRE;
inst.iclass = InstName::LDRSH;
return true;
}
static bool TryExtractLDRSH_32_LDST_POS(InstData &inst, uint32_t bits) {
// bits
// & 11111111110000000000000000000000
// --------------------------------
// 01111001110000000000000000000000
if ((bits & 0xffc00000U) != 0x79c00000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t imm12 : 12;
uint32_t opc : 2;
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.imm12.uimm = static_cast<uint64_t>(enc.imm12);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.V = static_cast<uint8_t>(enc.V);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LDRSH_32_LDST_POS;
inst.iclass = InstName::LDRSH;
return true;
}
static bool TryExtractLDRSH_64_LDST_POS(InstData &inst, uint32_t bits) {
// bits
// & 11111111110000000000000000000000
// --------------------------------
// 01111001100000000000000000000000
if ((bits & 0xffc00000U) != 0x79800000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t imm12 : 12;
uint32_t opc : 2;
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.imm12.uimm = static_cast<uint64_t>(enc.imm12);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.V = static_cast<uint8_t>(enc.V);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LDRSH_64_LDST_POS;
inst.iclass = InstName::LDRSH;
return true;
}
static bool TryExtractABS_ASISDMISC_R(InstData &inst, uint32_t bits) {
// bits
// & 11111111001111111111110000000000
// --------------------------------
// 01011110001000001011100000000000
if ((bits & 0xff3ffc00U) != 0x5e20b800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t opcode : 5;
uint32_t _17 : 1; // 0
uint32_t _18 : 1; // 0
uint32_t _19 : 1; // 0
uint32_t _20 : 1; // 0
uint32_t _21 : 1; // 1
uint32_t size : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t U : 1;
uint32_t _30 : 1; // 1
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::ABS_ASISDMISC_R;
inst.iclass = InstName::ABS;
return true;
}
static bool TryExtractABS_ASIMDMISC_R(InstData &inst, uint32_t bits) {
// bits
// & 10111111001111111111110000000000
// --------------------------------
// 00001110001000001011100000000000
if ((bits & 0xbf3ffc00U) != 0xe20b800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t opcode : 5;
uint32_t _17 : 1; // 0
uint32_t _18 : 1; // 0
uint32_t _19 : 1; // 0
uint32_t _20 : 1; // 0
uint32_t _21 : 1; // 1
uint32_t size : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.U = static_cast<uint8_t>(enc.U);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::ABS_ASIMDMISC_R;
inst.iclass = InstName::ABS;
return true;
}
static bool TryExtractCMP_SUBS_32S_ADDSUB_EXT(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000000000000000011111
// --------------------------------
// 01101011001000000000000000011111
if ((bits & 0xffe0001fU) != 0x6b20001fU) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t imm3 : 3;
uint32_t option : 3;
uint32_t Rm : 5;
uint32_t _21 : 1; // 1
uint32_t opt : 2;
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t S : 1;
uint32_t op : 1;
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.opt = static_cast<uint8_t>(enc.opt);
inst.option = static_cast<uint8_t>(enc.option);
inst.sf = static_cast<uint8_t>(enc.sf);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.imm3.uimm = static_cast<uint64_t>(enc.imm3);
inst.op = static_cast<uint8_t>(enc.op);
inst.iform = InstForm::CMP_SUBS_32S_ADDSUB_EXT;
inst.iclass = InstName::SUBS;
return true;
}
static bool TryExtractCMP_SUBS_64S_ADDSUB_EXT(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000000000000000011111
// --------------------------------
// 11101011001000000000000000011111
if ((bits & 0xffe0001fU) != 0xeb20001fU) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t imm3 : 3;
uint32_t option : 3;
uint32_t Rm : 5;
uint32_t _21 : 1; // 1
uint32_t opt : 2;
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t S : 1;
uint32_t op : 1;
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.opt = static_cast<uint8_t>(enc.opt);
inst.option = static_cast<uint8_t>(enc.option);
inst.sf = static_cast<uint8_t>(enc.sf);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.imm3.uimm = static_cast<uint64_t>(enc.imm3);
inst.op = static_cast<uint8_t>(enc.op);
inst.iform = InstForm::CMP_SUBS_64S_ADDSUB_EXT;
inst.iclass = InstName::SUBS;
return true;
}
static bool TryExtractHINT_1(InstData &inst, uint32_t bits) {
// bits
// & 11111111111111111111111111011111
// --------------------------------
// 11010101000000110010000011011111
if ((bits & 0xffffffdfU) != 0xd50320dfU) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t op2 : 3;
uint32_t CRm : 4;
uint32_t CRn : 4;
uint32_t op1 : 3;
uint32_t op0 : 2;
uint32_t L : 1;
uint32_t _22 : 1; // 0
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 0
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 0
uint32_t _30 : 1; // 1
uint32_t _31 : 1; // 1
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.op0 = static_cast<uint8_t>(enc.op0);
inst.op1 = static_cast<uint8_t>(enc.op1);
inst.op2 = static_cast<uint8_t>(enc.op2);
inst.L = static_cast<uint8_t>(enc.L);
inst.CRn = static_cast<uint8_t>(enc.CRn);
inst.CRm = static_cast<uint8_t>(enc.CRm);
inst.iform = InstForm::HINT_1;
inst.iclass = InstName::HINT;
return true;
}
static bool TryExtractHINT_2(InstData &inst, uint32_t bits) {
// bits
// & 11111111111111111111000000011111
// --------------------------------
// 11010101000000110010000000011111
if ((bits & 0xfffff01fU) != 0xd503201fU) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t op2 : 3;
uint32_t CRm : 4;
uint32_t CRn : 4;
uint32_t op1 : 3;
uint32_t op0 : 2;
uint32_t L : 1;
uint32_t _22 : 1; // 0
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 0
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 0
uint32_t _30 : 1; // 1
uint32_t _31 : 1; // 1
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.op0 = static_cast<uint8_t>(enc.op0);
inst.op1 = static_cast<uint8_t>(enc.op1);
inst.op2 = static_cast<uint8_t>(enc.op2);
inst.L = static_cast<uint8_t>(enc.L);
inst.CRn = static_cast<uint8_t>(enc.CRn);
inst.CRm = static_cast<uint8_t>(enc.CRm);
inst.iform = InstForm::HINT_2;
inst.iclass = InstName::HINT;
return true;
}
static bool TryExtractHINT_3(InstData &inst, uint32_t bits) {
// bits
// & 11111111111111111111111100011111
// --------------------------------
// 11010101000000110010001000011111
if ((bits & 0xffffff1fU) != 0xd503221fU) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t op2 : 3;
uint32_t CRm : 4;
uint32_t CRn : 4;
uint32_t op1 : 3;
uint32_t op0 : 2;
uint32_t L : 1;
uint32_t _22 : 1; // 0
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 0
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 0
uint32_t _30 : 1; // 1
uint32_t _31 : 1; // 1
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.op0 = static_cast<uint8_t>(enc.op0);
inst.op1 = static_cast<uint8_t>(enc.op1);
inst.op2 = static_cast<uint8_t>(enc.op2);
inst.L = static_cast<uint8_t>(enc.L);
inst.CRn = static_cast<uint8_t>(enc.CRn);
inst.CRm = static_cast<uint8_t>(enc.CRm);
inst.iform = InstForm::HINT_3;
inst.iclass = InstName::HINT;
return true;
}
static bool TryExtractFMAX_ASIMDSAMEFP16_ONLY(InstData &inst, uint32_t bits) {
// bits
// & 10111111111000001111110000000000
// --------------------------------
// 00001110010000000011010000000000
if ((bits & 0xbfe0fc00U) != 0xe403400U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t opcode : 3;
uint32_t _14 : 1; // 0
uint32_t _15 : 1; // 0
uint32_t Rm : 5;
uint32_t _21 : 1; // 0
uint32_t _22 : 1; // 1
uint32_t o1 : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.U = static_cast<uint8_t>(enc.U);
inst.o1 = static_cast<uint8_t>(enc.o1);
inst.iform = InstForm::FMAX_ASIMDSAMEFP16_ONLY;
inst.iclass = InstName::FMAX;
return true;
}
static bool TryExtractFMAX_ASIMDSAME_ONLY(InstData &inst, uint32_t bits) {
// bits
// & 10111111101000001111110000000000
// --------------------------------
// 00001110001000001111010000000000
if ((bits & 0xbfa0fc00U) != 0xe20f400U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t opcode : 5;
uint32_t Rm : 5;
uint32_t _21 : 1; // 1
uint32_t sz : 1;
uint32_t o1 : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.sz = static_cast<uint8_t>(enc.sz);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.U = static_cast<uint8_t>(enc.U);
inst.o1 = static_cast<uint8_t>(enc.o1);
inst.iform = InstForm::FMAX_ASIMDSAME_ONLY;
inst.iclass = InstName::FMAX;
return true;
}
static bool TryExtractFMIN_H_FLOATDP2(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 00011110111000000101100000000000
if ((bits & 0xffe0fc00U) != 0x1ee05800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t op : 2;
uint32_t _14 : 1; // 1
uint32_t _15 : 1; // 0
uint32_t Rm : 5;
uint32_t _21 : 1; // 1
uint32_t type : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t _30 : 1; // 0
uint32_t M : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.M = static_cast<uint8_t>(enc.M);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.type = static_cast<uint8_t>(enc.type);
inst.op = static_cast<uint8_t>(enc.op);
inst.iform = InstForm::FMIN_H_FLOATDP2;
inst.iclass = InstName::FMIN;
return true;
}
static bool TryExtractFMIN_S_FLOATDP2(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 00011110001000000101100000000000
if ((bits & 0xffe0fc00U) != 0x1e205800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t op : 2;
uint32_t _14 : 1; // 1
uint32_t _15 : 1; // 0
uint32_t Rm : 5;
uint32_t _21 : 1; // 1
uint32_t type : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t _30 : 1; // 0
uint32_t M : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.M = static_cast<uint8_t>(enc.M);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.type = static_cast<uint8_t>(enc.type);
inst.op = static_cast<uint8_t>(enc.op);
inst.iform = InstForm::FMIN_S_FLOATDP2;
inst.iclass = InstName::FMIN;
return true;
}
static bool TryExtractFMIN_D_FLOATDP2(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 00011110011000000101100000000000
if ((bits & 0xffe0fc00U) != 0x1e605800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t op : 2;
uint32_t _14 : 1; // 1
uint32_t _15 : 1; // 0
uint32_t Rm : 5;
uint32_t _21 : 1; // 1
uint32_t type : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t _30 : 1; // 0
uint32_t M : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.M = static_cast<uint8_t>(enc.M);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.type = static_cast<uint8_t>(enc.type);
inst.op = static_cast<uint8_t>(enc.op);
inst.iform = InstForm::FMIN_D_FLOATDP2;
inst.iclass = InstName::FMIN;
return true;
}
static bool TryExtractUMLSL_ASIMDELEM_L(InstData &inst, uint32_t bits) {
// bits
// & 10111111000000001111010000000000
// --------------------------------
// 00101111000000000110000000000000
if ((bits & 0xbf00f400U) != 0x2f006000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t H : 1;
uint32_t _12 : 1; // 0
uint32_t _13 : 1; // 1
uint32_t o2 : 1;
uint32_t _15 : 1; // 0
uint32_t Rm : 4;
uint32_t M : 1;
uint32_t L : 1;
uint32_t size : 2;
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Q = static_cast<uint8_t>(enc.Q);
inst.H = static_cast<uint8_t>(enc.H);
inst.M = static_cast<uint8_t>(enc.M);
inst.L = static_cast<uint8_t>(enc.L);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o2 = static_cast<uint8_t>(enc.o2);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::UMLSL_ASIMDELEM_L;
inst.iclass = InstName::UMLSL;
return true;
}
static bool TryExtractFMAXNM_ASIMDSAMEFP16_ONLY(InstData &inst, uint32_t bits) {
// bits
// & 10111111111000001111110000000000
// --------------------------------
// 00001110010000000000010000000000
if ((bits & 0xbfe0fc00U) != 0xe400400U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t Op3 : 3;
uint32_t _14 : 1; // 0
uint32_t _15 : 1; // 0
uint32_t Rm : 5;
uint32_t _21 : 1; // 0
uint32_t _22 : 1; // 1
uint32_t a : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.a = static_cast<uint8_t>(enc.a);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Op3 = static_cast<uint8_t>(enc.Op3);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.iform = InstForm::FMAXNM_ASIMDSAMEFP16_ONLY;
inst.iclass = InstName::FMAXNM;
return true;
}
static bool TryExtractFMAXNM_ASIMDSAME_ONLY(InstData &inst, uint32_t bits) {
// bits
// & 10111111101000001111110000000000
// --------------------------------
// 00001110001000001100010000000000
if ((bits & 0xbfa0fc00U) != 0xe20c400U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t opcode : 5;
uint32_t Rm : 5;
uint32_t _21 : 1; // 1
uint32_t sz : 1;
uint32_t o1 : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.sz = static_cast<uint8_t>(enc.sz);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.U = static_cast<uint8_t>(enc.U);
inst.o1 = static_cast<uint8_t>(enc.o1);
inst.iform = InstForm::FMAXNM_ASIMDSAME_ONLY;
inst.iclass = InstName::FMAXNM;
return true;
}
static bool TryExtractFCVTPS_32H_FLOAT2INT(InstData &inst, uint32_t bits) {
// bits
// & 11111111111111111111110000000000
// --------------------------------
// 00011110111010000000000000000000
if ((bits & 0xfffffc00U) != 0x1ee80000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t _12 : 1; // 0
uint32_t _13 : 1; // 0
uint32_t _14 : 1; // 0
uint32_t _15 : 1; // 0
uint32_t opcode : 3;
uint32_t rmode : 2;
uint32_t _21 : 1; // 1
uint32_t type : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t _30 : 1; // 0
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.sf = static_cast<uint8_t>(enc.sf);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.type = static_cast<uint8_t>(enc.type);
inst.rmode = static_cast<uint8_t>(enc.rmode);
inst.iform = InstForm::FCVTPS_32H_FLOAT2INT;
inst.iclass = InstName::FCVTPS;
return true;
}
static bool TryExtractFCVTPS_64H_FLOAT2INT(InstData &inst, uint32_t bits) {
// bits
// & 11111111111111111111110000000000
// --------------------------------
// 10011110111010000000000000000000
if ((bits & 0xfffffc00U) != 0x9ee80000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t _12 : 1; // 0
uint32_t _13 : 1; // 0
uint32_t _14 : 1; // 0
uint32_t _15 : 1; // 0
uint32_t opcode : 3;
uint32_t rmode : 2;
uint32_t _21 : 1; // 1
uint32_t type : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t _30 : 1; // 0
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.sf = static_cast<uint8_t>(enc.sf);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.type = static_cast<uint8_t>(enc.type);
inst.rmode = static_cast<uint8_t>(enc.rmode);
inst.iform = InstForm::FCVTPS_64H_FLOAT2INT;
inst.iclass = InstName::FCVTPS;
return true;
}
static bool TryExtractFCVTPS_32S_FLOAT2INT(InstData &inst, uint32_t bits) {
// bits
// & 11111111111111111111110000000000
// --------------------------------
// 00011110001010000000000000000000
if ((bits & 0xfffffc00U) != 0x1e280000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t _12 : 1; // 0
uint32_t _13 : 1; // 0
uint32_t _14 : 1; // 0
uint32_t _15 : 1; // 0
uint32_t opcode : 3;
uint32_t rmode : 2;
uint32_t _21 : 1; // 1
uint32_t type : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t _30 : 1; // 0
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.sf = static_cast<uint8_t>(enc.sf);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.type = static_cast<uint8_t>(enc.type);
inst.rmode = static_cast<uint8_t>(enc.rmode);
inst.iform = InstForm::FCVTPS_32S_FLOAT2INT;
inst.iclass = InstName::FCVTPS;
return true;
}
static bool TryExtractFCVTPS_64S_FLOAT2INT(InstData &inst, uint32_t bits) {
// bits
// & 11111111111111111111110000000000
// --------------------------------
// 10011110001010000000000000000000
if ((bits & 0xfffffc00U) != 0x9e280000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t _12 : 1; // 0
uint32_t _13 : 1; // 0
uint32_t _14 : 1; // 0
uint32_t _15 : 1; // 0
uint32_t opcode : 3;
uint32_t rmode : 2;
uint32_t _21 : 1; // 1
uint32_t type : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t _30 : 1; // 0
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.sf = static_cast<uint8_t>(enc.sf);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.type = static_cast<uint8_t>(enc.type);
inst.rmode = static_cast<uint8_t>(enc.rmode);
inst.iform = InstForm::FCVTPS_64S_FLOAT2INT;
inst.iclass = InstName::FCVTPS;
return true;
}
static bool TryExtractFCVTPS_32D_FLOAT2INT(InstData &inst, uint32_t bits) {
// bits
// & 11111111111111111111110000000000
// --------------------------------
// 00011110011010000000000000000000
if ((bits & 0xfffffc00U) != 0x1e680000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t _12 : 1; // 0
uint32_t _13 : 1; // 0
uint32_t _14 : 1; // 0
uint32_t _15 : 1; // 0
uint32_t opcode : 3;
uint32_t rmode : 2;
uint32_t _21 : 1; // 1
uint32_t type : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t _30 : 1; // 0
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.sf = static_cast<uint8_t>(enc.sf);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.type = static_cast<uint8_t>(enc.type);
inst.rmode = static_cast<uint8_t>(enc.rmode);
inst.iform = InstForm::FCVTPS_32D_FLOAT2INT;
inst.iclass = InstName::FCVTPS;
return true;
}
static bool TryExtractFCVTPS_64D_FLOAT2INT(InstData &inst, uint32_t bits) {
// bits
// & 11111111111111111111110000000000
// --------------------------------
// 10011110011010000000000000000000
if ((bits & 0xfffffc00U) != 0x9e680000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t _12 : 1; // 0
uint32_t _13 : 1; // 0
uint32_t _14 : 1; // 0
uint32_t _15 : 1; // 0
uint32_t opcode : 3;
uint32_t rmode : 2;
uint32_t _21 : 1; // 1
uint32_t type : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t _30 : 1; // 0
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.sf = static_cast<uint8_t>(enc.sf);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.type = static_cast<uint8_t>(enc.type);
inst.rmode = static_cast<uint8_t>(enc.rmode);
inst.iform = InstForm::FCVTPS_64D_FLOAT2INT;
inst.iclass = InstName::FCVTPS;
return true;
}
static bool TryExtractFMINNM_H_FLOATDP2(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 00011110111000000111100000000000
if ((bits & 0xffe0fc00U) != 0x1ee07800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t op : 2;
uint32_t _14 : 1; // 1
uint32_t _15 : 1; // 0
uint32_t Rm : 5;
uint32_t _21 : 1; // 1
uint32_t type : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t _30 : 1; // 0
uint32_t M : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.M = static_cast<uint8_t>(enc.M);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.type = static_cast<uint8_t>(enc.type);
inst.op = static_cast<uint8_t>(enc.op);
inst.iform = InstForm::FMINNM_H_FLOATDP2;
inst.iclass = InstName::FMINNM;
return true;
}
static bool TryExtractFMINNM_S_FLOATDP2(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 00011110001000000111100000000000
if ((bits & 0xffe0fc00U) != 0x1e207800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t op : 2;
uint32_t _14 : 1; // 1
uint32_t _15 : 1; // 0
uint32_t Rm : 5;
uint32_t _21 : 1; // 1
uint32_t type : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t _30 : 1; // 0
uint32_t M : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.M = static_cast<uint8_t>(enc.M);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.type = static_cast<uint8_t>(enc.type);
inst.op = static_cast<uint8_t>(enc.op);
inst.iform = InstForm::FMINNM_S_FLOATDP2;
inst.iclass = InstName::FMINNM;
return true;
}
static bool TryExtractFMINNM_D_FLOATDP2(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 00011110011000000111100000000000
if ((bits & 0xffe0fc00U) != 0x1e607800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t op : 2;
uint32_t _14 : 1; // 1
uint32_t _15 : 1; // 0
uint32_t Rm : 5;
uint32_t _21 : 1; // 1
uint32_t type : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t _30 : 1; // 0
uint32_t M : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.M = static_cast<uint8_t>(enc.M);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.type = static_cast<uint8_t>(enc.type);
inst.op = static_cast<uint8_t>(enc.op);
inst.iform = InstForm::FMINNM_D_FLOATDP2;
inst.iclass = InstName::FMINNM;
return true;
}
static bool TryExtractLDTRSW_64_LDST_UNPRIV(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000000000110000000000
// --------------------------------
// 10111000100000000000100000000000
if ((bits & 0xffe00c00U) != 0xb8800800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t imm9 : 9;
uint32_t _21 : 1; // 0
uint32_t opc : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.imm9.uimm = static_cast<uint64_t>(enc.imm9);
inst.V = static_cast<uint8_t>(enc.V);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LDTRSW_64_LDST_UNPRIV;
inst.iclass = InstName::LDTRSW;
return true;
}
static bool TryExtractFSQRT_H_FLOATDP1(InstData &inst, uint32_t bits) {
// bits
// & 11111111111111111111110000000000
// --------------------------------
// 00011110111000011100000000000000
if ((bits & 0xfffffc00U) != 0x1ee1c000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t _12 : 1; // 0
uint32_t _13 : 1; // 0
uint32_t _14 : 1; // 1
uint32_t opc : 2;
uint32_t _17 : 1; // 0
uint32_t _18 : 1; // 0
uint32_t _19 : 1; // 0
uint32_t _20 : 1; // 0
uint32_t _21 : 1; // 1
uint32_t type : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t _30 : 1; // 0
uint32_t M : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.M = static_cast<uint8_t>(enc.M);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.type = static_cast<uint8_t>(enc.type);
inst.iform = InstForm::FSQRT_H_FLOATDP1;
inst.iclass = InstName::FSQRT;
return true;
}
static bool TryExtractFSQRT_S_FLOATDP1(InstData &inst, uint32_t bits) {
// bits
// & 11111111111111111111110000000000
// --------------------------------
// 00011110001000011100000000000000
if ((bits & 0xfffffc00U) != 0x1e21c000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t _12 : 1; // 0
uint32_t _13 : 1; // 0
uint32_t _14 : 1; // 1
uint32_t opc : 2;
uint32_t _17 : 1; // 0
uint32_t _18 : 1; // 0
uint32_t _19 : 1; // 0
uint32_t _20 : 1; // 0
uint32_t _21 : 1; // 1
uint32_t type : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t _30 : 1; // 0
uint32_t M : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.M = static_cast<uint8_t>(enc.M);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.type = static_cast<uint8_t>(enc.type);
inst.iform = InstForm::FSQRT_S_FLOATDP1;
inst.iclass = InstName::FSQRT;
return true;
}
static bool TryExtractFSQRT_D_FLOATDP1(InstData &inst, uint32_t bits) {
// bits
// & 11111111111111111111110000000000
// --------------------------------
// 00011110011000011100000000000000
if ((bits & 0xfffffc00U) != 0x1e61c000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t _12 : 1; // 0
uint32_t _13 : 1; // 0
uint32_t _14 : 1; // 1
uint32_t opc : 2;
uint32_t _17 : 1; // 0
uint32_t _18 : 1; // 0
uint32_t _19 : 1; // 0
uint32_t _20 : 1; // 0
uint32_t _21 : 1; // 1
uint32_t type : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t _30 : 1; // 0
uint32_t M : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.M = static_cast<uint8_t>(enc.M);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.type = static_cast<uint8_t>(enc.type);
inst.iform = InstForm::FSQRT_D_FLOATDP1;
inst.iclass = InstName::FSQRT;
return true;
}
static bool TryExtractLDEORA_32_MEMOP(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 10111000101000000010000000000000
if ((bits & 0xffe0fc00U) != 0xb8a02000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t opc : 3;
uint32_t o3 : 1;
uint32_t Rs : 5;
uint32_t _21 : 1; // 1
uint32_t R : 1;
uint32_t A : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.A = static_cast<uint8_t>(enc.A);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.V = static_cast<uint8_t>(enc.V);
inst.R = static_cast<uint8_t>(enc.R);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o3 = static_cast<uint8_t>(enc.o3);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LDEORA_32_MEMOP;
inst.iclass = InstName::LDEORA;
return true;
}
static bool TryExtractLDEORAL_32_MEMOP(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 10111000111000000010000000000000
if ((bits & 0xffe0fc00U) != 0xb8e02000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t opc : 3;
uint32_t o3 : 1;
uint32_t Rs : 5;
uint32_t _21 : 1; // 1
uint32_t R : 1;
uint32_t A : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.A = static_cast<uint8_t>(enc.A);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.V = static_cast<uint8_t>(enc.V);
inst.R = static_cast<uint8_t>(enc.R);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o3 = static_cast<uint8_t>(enc.o3);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LDEORAL_32_MEMOP;
inst.iclass = InstName::LDEORAL;
return true;
}
static bool TryExtractLDEOR_32_MEMOP(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 10111000001000000010000000000000
if ((bits & 0xffe0fc00U) != 0xb8202000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t opc : 3;
uint32_t o3 : 1;
uint32_t Rs : 5;
uint32_t _21 : 1; // 1
uint32_t R : 1;
uint32_t A : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.A = static_cast<uint8_t>(enc.A);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.V = static_cast<uint8_t>(enc.V);
inst.R = static_cast<uint8_t>(enc.R);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o3 = static_cast<uint8_t>(enc.o3);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LDEOR_32_MEMOP;
inst.iclass = InstName::LDEOR;
return true;
}
static bool TryExtractLDEORL_32_MEMOP(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 10111000011000000010000000000000
if ((bits & 0xffe0fc00U) != 0xb8602000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t opc : 3;
uint32_t o3 : 1;
uint32_t Rs : 5;
uint32_t _21 : 1; // 1
uint32_t R : 1;
uint32_t A : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.A = static_cast<uint8_t>(enc.A);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.V = static_cast<uint8_t>(enc.V);
inst.R = static_cast<uint8_t>(enc.R);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o3 = static_cast<uint8_t>(enc.o3);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LDEORL_32_MEMOP;
inst.iclass = InstName::LDEORL;
return true;
}
static bool TryExtractLDEORA_64_MEMOP(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 11111000101000000010000000000000
if ((bits & 0xffe0fc00U) != 0xf8a02000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t opc : 3;
uint32_t o3 : 1;
uint32_t Rs : 5;
uint32_t _21 : 1; // 1
uint32_t R : 1;
uint32_t A : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.A = static_cast<uint8_t>(enc.A);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.V = static_cast<uint8_t>(enc.V);
inst.R = static_cast<uint8_t>(enc.R);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o3 = static_cast<uint8_t>(enc.o3);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LDEORA_64_MEMOP;
inst.iclass = InstName::LDEORA;
return true;
}
static bool TryExtractLDEORAL_64_MEMOP(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 11111000111000000010000000000000
if ((bits & 0xffe0fc00U) != 0xf8e02000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t opc : 3;
uint32_t o3 : 1;
uint32_t Rs : 5;
uint32_t _21 : 1; // 1
uint32_t R : 1;
uint32_t A : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.A = static_cast<uint8_t>(enc.A);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.V = static_cast<uint8_t>(enc.V);
inst.R = static_cast<uint8_t>(enc.R);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o3 = static_cast<uint8_t>(enc.o3);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LDEORAL_64_MEMOP;
inst.iclass = InstName::LDEORAL;
return true;
}
static bool TryExtractLDEOR_64_MEMOP(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 11111000001000000010000000000000
if ((bits & 0xffe0fc00U) != 0xf8202000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t opc : 3;
uint32_t o3 : 1;
uint32_t Rs : 5;
uint32_t _21 : 1; // 1
uint32_t R : 1;
uint32_t A : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.A = static_cast<uint8_t>(enc.A);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.V = static_cast<uint8_t>(enc.V);
inst.R = static_cast<uint8_t>(enc.R);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o3 = static_cast<uint8_t>(enc.o3);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LDEOR_64_MEMOP;
inst.iclass = InstName::LDEOR;
return true;
}
static bool TryExtractLDEORL_64_MEMOP(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 11111000011000000010000000000000
if ((bits & 0xffe0fc00U) != 0xf8602000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t opc : 3;
uint32_t o3 : 1;
uint32_t Rs : 5;
uint32_t _21 : 1; // 1
uint32_t R : 1;
uint32_t A : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.A = static_cast<uint8_t>(enc.A);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.V = static_cast<uint8_t>(enc.V);
inst.R = static_cast<uint8_t>(enc.R);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o3 = static_cast<uint8_t>(enc.o3);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LDEORL_64_MEMOP;
inst.iclass = InstName::LDEORL;
return true;
}
static bool TryExtractSHRN_ASIMDSHF_N(InstData &inst, uint32_t bits) {
// bits
// & 10111111100000001111110000000000
// --------------------------------
// 00001111000000001000010000000000
if ((bits & 0xbf80fc00U) != 0xf008400U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t op : 1;
uint32_t _12 : 1; // 0
uint32_t _13 : 1; // 0
uint32_t _14 : 1; // 0
uint32_t _15 : 1; // 1
uint32_t immb : 3;
uint32_t immh : 4;
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.immh.uimm = static_cast<uint64_t>(enc.immh);
if (!(inst.immh.uimm != 0x0))
return false;
inst.immb.uimm = static_cast<uint64_t>(enc.immb);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.op = static_cast<uint8_t>(enc.op);
inst.iform = InstForm::SHRN_ASIMDSHF_N;
inst.iclass = InstName::SHRN;
return true;
}
static bool TryExtractFRINTM_H_FLOATDP1(InstData &inst, uint32_t bits) {
// bits
// & 11111111111111111111110000000000
// --------------------------------
// 00011110111001010100000000000000
if ((bits & 0xfffffc00U) != 0x1ee54000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t _12 : 1; // 0
uint32_t _13 : 1; // 0
uint32_t _14 : 1; // 1
uint32_t rmode : 3;
uint32_t _18 : 1; // 1
uint32_t _19 : 1; // 0
uint32_t _20 : 1; // 0
uint32_t _21 : 1; // 1
uint32_t type : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t _30 : 1; // 0
uint32_t M : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.M = static_cast<uint8_t>(enc.M);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.type = static_cast<uint8_t>(enc.type);
inst.rmode = static_cast<uint8_t>(enc.rmode);
inst.iform = InstForm::FRINTM_H_FLOATDP1;
inst.iclass = InstName::FRINTM;
return true;
}
static bool TryExtractFRINTM_S_FLOATDP1(InstData &inst, uint32_t bits) {
// bits
// & 11111111111111111111110000000000
// --------------------------------
// 00011110001001010100000000000000
if ((bits & 0xfffffc00U) != 0x1e254000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t _12 : 1; // 0
uint32_t _13 : 1; // 0
uint32_t _14 : 1; // 1
uint32_t rmode : 3;
uint32_t _18 : 1; // 1
uint32_t _19 : 1; // 0
uint32_t _20 : 1; // 0
uint32_t _21 : 1; // 1
uint32_t type : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t _30 : 1; // 0
uint32_t M : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.M = static_cast<uint8_t>(enc.M);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.type = static_cast<uint8_t>(enc.type);
inst.rmode = static_cast<uint8_t>(enc.rmode);
inst.iform = InstForm::FRINTM_S_FLOATDP1;
inst.iclass = InstName::FRINTM;
return true;
}
static bool TryExtractFRINTM_D_FLOATDP1(InstData &inst, uint32_t bits) {
// bits
// & 11111111111111111111110000000000
// --------------------------------
// 00011110011001010100000000000000
if ((bits & 0xfffffc00U) != 0x1e654000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t _12 : 1; // 0
uint32_t _13 : 1; // 0
uint32_t _14 : 1; // 1
uint32_t rmode : 3;
uint32_t _18 : 1; // 1
uint32_t _19 : 1; // 0
uint32_t _20 : 1; // 0
uint32_t _21 : 1; // 1
uint32_t type : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t _30 : 1; // 0
uint32_t M : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.M = static_cast<uint8_t>(enc.M);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.type = static_cast<uint8_t>(enc.type);
inst.rmode = static_cast<uint8_t>(enc.rmode);
inst.iform = InstForm::FRINTM_D_FLOATDP1;
inst.iclass = InstName::FRINTM;
return true;
}
static bool TryExtractLDUMINAB_32_MEMOP(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 00111000101000000111000000000000
if ((bits & 0xffe0fc00U) != 0x38a07000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t opc : 3;
uint32_t o3 : 1;
uint32_t Rs : 5;
uint32_t _21 : 1; // 1
uint32_t R : 1;
uint32_t A : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.A = static_cast<uint8_t>(enc.A);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.V = static_cast<uint8_t>(enc.V);
inst.R = static_cast<uint8_t>(enc.R);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o3 = static_cast<uint8_t>(enc.o3);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LDUMINAB_32_MEMOP;
inst.iclass = InstName::LDUMINAB;
return true;
}
static bool TryExtractLDUMINALB_32_MEMOP(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 00111000111000000111000000000000
if ((bits & 0xffe0fc00U) != 0x38e07000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t opc : 3;
uint32_t o3 : 1;
uint32_t Rs : 5;
uint32_t _21 : 1; // 1
uint32_t R : 1;
uint32_t A : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.A = static_cast<uint8_t>(enc.A);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.V = static_cast<uint8_t>(enc.V);
inst.R = static_cast<uint8_t>(enc.R);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o3 = static_cast<uint8_t>(enc.o3);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LDUMINALB_32_MEMOP;
inst.iclass = InstName::LDUMINALB;
return true;
}
static bool TryExtractLDUMINB_32_MEMOP(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 00111000001000000111000000000000
if ((bits & 0xffe0fc00U) != 0x38207000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t opc : 3;
uint32_t o3 : 1;
uint32_t Rs : 5;
uint32_t _21 : 1; // 1
uint32_t R : 1;
uint32_t A : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.A = static_cast<uint8_t>(enc.A);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.V = static_cast<uint8_t>(enc.V);
inst.R = static_cast<uint8_t>(enc.R);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o3 = static_cast<uint8_t>(enc.o3);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LDUMINB_32_MEMOP;
inst.iclass = InstName::LDUMINB;
return true;
}
static bool TryExtractLDUMINLB_32_MEMOP(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 00111000011000000111000000000000
if ((bits & 0xffe0fc00U) != 0x38607000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t opc : 3;
uint32_t o3 : 1;
uint32_t Rs : 5;
uint32_t _21 : 1; // 1
uint32_t R : 1;
uint32_t A : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.A = static_cast<uint8_t>(enc.A);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.V = static_cast<uint8_t>(enc.V);
inst.R = static_cast<uint8_t>(enc.R);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o3 = static_cast<uint8_t>(enc.o3);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LDUMINLB_32_MEMOP;
inst.iclass = InstName::LDUMINLB;
return true;
}
static bool TryExtractSHA256SU0_VV_CRYPTOSHA2(InstData &inst, uint32_t bits) {
// bits
// & 11111111111111111111110000000000
// --------------------------------
// 01011110001010000010100000000000
if ((bits & 0xfffffc00U) != 0x5e282800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t opcode : 5;
uint32_t _17 : 1; // 0
uint32_t _18 : 1; // 0
uint32_t _19 : 1; // 1
uint32_t _20 : 1; // 0
uint32_t _21 : 1; // 1
uint32_t size : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 0
uint32_t _30 : 1; // 1
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::SHA256SU0_VV_CRYPTOSHA2;
inst.iclass = InstName::SHA256SU0;
return true;
}
static bool TryExtractFMINP_ASIMDSAMEFP16_ONLY(InstData &inst, uint32_t bits) {
// bits
// & 10111111111000001111110000000000
// --------------------------------
// 00101110110000000011010000000000
if ((bits & 0xbfe0fc00U) != 0x2ec03400U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t opcode : 3;
uint32_t _14 : 1; // 0
uint32_t _15 : 1; // 0
uint32_t Rm : 5;
uint32_t _21 : 1; // 0
uint32_t _22 : 1; // 1
uint32_t o1 : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.U = static_cast<uint8_t>(enc.U);
inst.o1 = static_cast<uint8_t>(enc.o1);
inst.iform = InstForm::FMINP_ASIMDSAMEFP16_ONLY;
inst.iclass = InstName::FMINP;
return true;
}
static bool TryExtractFMINP_ASIMDSAME_ONLY(InstData &inst, uint32_t bits) {
// bits
// & 10111111101000001111110000000000
// --------------------------------
// 00101110101000001111010000000000
if ((bits & 0xbfa0fc00U) != 0x2ea0f400U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t opcode : 5;
uint32_t Rm : 5;
uint32_t _21 : 1; // 1
uint32_t sz : 1;
uint32_t o1 : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.sz = static_cast<uint8_t>(enc.sz);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.U = static_cast<uint8_t>(enc.U);
inst.o1 = static_cast<uint8_t>(enc.o1);
inst.iform = InstForm::FMINP_ASIMDSAME_ONLY;
inst.iclass = InstName::FMINP;
return true;
}
static bool TryExtractBFM_32M_BITFIELD(InstData &inst, uint32_t bits) {
if (false && TryExtractBFC_BFM_32M_BITFIELD(inst, bits))
return true;
if (false && TryExtractBFXIL_BFM_32M_BITFIELD(inst, bits))
return true;
if (false && TryExtractBFI_BFM_32M_BITFIELD(inst, bits))
return true;
// bits
// & 11111111110000000000000000000000
// --------------------------------
// 00110011000000000000000000000000
if ((bits & 0xffc00000U) != 0x33000000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t imms : 6;
uint32_t immr : 6;
uint32_t N : 1;
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 0
uint32_t _28 : 1; // 1
uint32_t opc : 2;
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.sf = static_cast<uint8_t>(enc.sf);
inst.N = static_cast<uint8_t>(enc.N);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.immr.uimm = static_cast<uint64_t>(enc.immr);
inst.imms.uimm = static_cast<uint64_t>(enc.imms);
inst.iform = InstForm::BFM_32M_BITFIELD;
inst.iclass = InstName::BFM;
return true;
}
static bool TryExtractBFM_64M_BITFIELD(InstData &inst, uint32_t bits) {
if (false && TryExtractBFC_BFM_64M_BITFIELD(inst, bits))
return true;
if (false && TryExtractBFXIL_BFM_64M_BITFIELD(inst, bits))
return true;
if (false && TryExtractBFI_BFM_64M_BITFIELD(inst, bits))
return true;
// bits
// & 11111111110000000000000000000000
// --------------------------------
// 10110011010000000000000000000000
if ((bits & 0xffc00000U) != 0xb3400000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t imms : 6;
uint32_t immr : 6;
uint32_t N : 1;
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 0
uint32_t _28 : 1; // 1
uint32_t opc : 2;
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.sf = static_cast<uint8_t>(enc.sf);
inst.N = static_cast<uint8_t>(enc.N);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.immr.uimm = static_cast<uint64_t>(enc.immr);
inst.imms.uimm = static_cast<uint64_t>(enc.imms);
inst.iform = InstForm::BFM_64M_BITFIELD;
inst.iclass = InstName::BFM;
return true;
}
static bool TryExtractLDR_B_LDST_REGOFF(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000000000110000000000
// --------------------------------
// 00111100011000000000100000000000
if ((bits & 0xffe00c00U) != 0x3c600800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t S : 1;
uint32_t option : 3;
uint32_t Rm : 5;
uint32_t _21 : 1; // 1
uint32_t opc : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.option = static_cast<uint8_t>(enc.option);
inst.V = static_cast<uint8_t>(enc.V);
inst.S = static_cast<uint8_t>(enc.S);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LDR_B_LDST_REGOFF;
inst.iclass = InstName::LDR;
return true;
}
static bool TryExtractLDR_BL_LDST_REGOFF(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001110110000000000
// --------------------------------
// 00111100011000000110100000000000
if ((bits & 0xffe0ec00U) != 0x3c606800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t S : 1;
uint32_t option : 3;
uint32_t Rm : 5;
uint32_t _21 : 1; // 1
uint32_t opc : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.option = static_cast<uint8_t>(enc.option);
inst.V = static_cast<uint8_t>(enc.V);
inst.S = static_cast<uint8_t>(enc.S);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LDR_BL_LDST_REGOFF;
inst.iclass = InstName::LDR;
return true;
}
static bool TryExtractLDR_H_LDST_REGOFF(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000000000110000000000
// --------------------------------
// 01111100011000000000100000000000
if ((bits & 0xffe00c00U) != 0x7c600800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t S : 1;
uint32_t option : 3;
uint32_t Rm : 5;
uint32_t _21 : 1; // 1
uint32_t opc : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.option = static_cast<uint8_t>(enc.option);
inst.V = static_cast<uint8_t>(enc.V);
inst.S = static_cast<uint8_t>(enc.S);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LDR_H_LDST_REGOFF;
inst.iclass = InstName::LDR;
return true;
}
static bool TryExtractLDR_S_LDST_REGOFF(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000000000110000000000
// --------------------------------
// 10111100011000000000100000000000
if ((bits & 0xffe00c00U) != 0xbc600800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t S : 1;
uint32_t option : 3;
uint32_t Rm : 5;
uint32_t _21 : 1; // 1
uint32_t opc : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.option = static_cast<uint8_t>(enc.option);
inst.V = static_cast<uint8_t>(enc.V);
inst.S = static_cast<uint8_t>(enc.S);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LDR_S_LDST_REGOFF;
inst.iclass = InstName::LDR;
return true;
}
static bool TryExtractLDR_D_LDST_REGOFF(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000000000110000000000
// --------------------------------
// 11111100011000000000100000000000
if ((bits & 0xffe00c00U) != 0xfc600800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t S : 1;
uint32_t option : 3;
uint32_t Rm : 5;
uint32_t _21 : 1; // 1
uint32_t opc : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.option = static_cast<uint8_t>(enc.option);
inst.V = static_cast<uint8_t>(enc.V);
inst.S = static_cast<uint8_t>(enc.S);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LDR_D_LDST_REGOFF;
inst.iclass = InstName::LDR;
return true;
}
static bool TryExtractLDR_Q_LDST_REGOFF(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000000000110000000000
// --------------------------------
// 00111100111000000000100000000000
if ((bits & 0xffe00c00U) != 0x3ce00800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t S : 1;
uint32_t option : 3;
uint32_t Rm : 5;
uint32_t _21 : 1; // 1
uint32_t opc : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.option = static_cast<uint8_t>(enc.option);
inst.V = static_cast<uint8_t>(enc.V);
inst.S = static_cast<uint8_t>(enc.S);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LDR_Q_LDST_REGOFF;
inst.iclass = InstName::LDR;
return true;
}
static bool TryExtractSQRDMLSH_ASISDELEM_R(InstData &inst, uint32_t bits) {
// bits
// & 11111111000000001111010000000000
// --------------------------------
// 01111111000000001111000000000000
if ((bits & 0xff00f400U) != 0x7f00f000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t H : 1;
uint32_t _12 : 1; // 1
uint32_t S : 1;
uint32_t _14 : 1; // 1
uint32_t _15 : 1; // 1
uint32_t Rm : 4;
uint32_t M : 1;
uint32_t L : 1;
uint32_t size : 2;
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t U : 1;
uint32_t _30 : 1; // 1
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.H = static_cast<uint8_t>(enc.H);
inst.M = static_cast<uint8_t>(enc.M);
inst.L = static_cast<uint8_t>(enc.L);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::SQRDMLSH_ASISDELEM_R;
inst.iclass = InstName::SQRDMLSH;
return true;
}
static bool TryExtractSQRDMLSH_ASIMDELEM_R(InstData &inst, uint32_t bits) {
// bits
// & 10111111000000001111010000000000
// --------------------------------
// 00101111000000001111000000000000
if ((bits & 0xbf00f400U) != 0x2f00f000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t H : 1;
uint32_t _12 : 1; // 1
uint32_t S : 1;
uint32_t _14 : 1; // 1
uint32_t _15 : 1; // 1
uint32_t Rm : 4;
uint32_t M : 1;
uint32_t L : 1;
uint32_t size : 2;
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Q = static_cast<uint8_t>(enc.Q);
inst.H = static_cast<uint8_t>(enc.H);
inst.M = static_cast<uint8_t>(enc.M);
inst.L = static_cast<uint8_t>(enc.L);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::SQRDMLSH_ASIMDELEM_R;
inst.iclass = InstName::SQRDMLSH;
return true;
}
static bool TryExtractANDS_32S_LOG_IMM(InstData &inst, uint32_t bits) {
if (false && TryExtractTST_ANDS_32S_LOG_IMM(inst, bits))
return true;
// bits
// & 11111111110000000000000000000000
// --------------------------------
// 01110010000000000000000000000000
if ((bits & 0xffc00000U) != 0x72000000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t imms : 6;
uint32_t immr : 6;
uint32_t N : 1;
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 0
uint32_t _28 : 1; // 1
uint32_t opc : 2;
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.sf = static_cast<uint8_t>(enc.sf);
inst.N = static_cast<uint8_t>(enc.N);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.immr.uimm = static_cast<uint64_t>(enc.immr);
inst.imms.uimm = static_cast<uint64_t>(enc.imms);
inst.iform = InstForm::ANDS_32S_LOG_IMM;
inst.iclass = InstName::ANDS;
return true;
}
static bool TryExtractANDS_64S_LOG_IMM(InstData &inst, uint32_t bits) {
if (false && TryExtractTST_ANDS_64S_LOG_IMM(inst, bits))
return true;
// bits
// & 11111111100000000000000000000000
// --------------------------------
// 11110010000000000000000000000000
if ((bits & 0xff800000U) != 0xf2000000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t imms : 6;
uint32_t immr : 6;
uint32_t N : 1;
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 0
uint32_t _28 : 1; // 1
uint32_t opc : 2;
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.sf = static_cast<uint8_t>(enc.sf);
inst.N = static_cast<uint8_t>(enc.N);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.immr.uimm = static_cast<uint64_t>(enc.immr);
inst.imms.uimm = static_cast<uint64_t>(enc.imms);
inst.iform = InstForm::ANDS_64S_LOG_IMM;
inst.iclass = InstName::ANDS;
return true;
}
static bool TryExtractLDCLRA_32_MEMOP(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 10111000101000000001000000000000
if ((bits & 0xffe0fc00U) != 0xb8a01000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t opc : 3;
uint32_t o3 : 1;
uint32_t Rs : 5;
uint32_t _21 : 1; // 1
uint32_t R : 1;
uint32_t A : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.A = static_cast<uint8_t>(enc.A);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.V = static_cast<uint8_t>(enc.V);
inst.R = static_cast<uint8_t>(enc.R);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o3 = static_cast<uint8_t>(enc.o3);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LDCLRA_32_MEMOP;
inst.iclass = InstName::LDCLRA;
return true;
}
static bool TryExtractLDCLRAL_32_MEMOP(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 10111000111000000001000000000000
if ((bits & 0xffe0fc00U) != 0xb8e01000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t opc : 3;
uint32_t o3 : 1;
uint32_t Rs : 5;
uint32_t _21 : 1; // 1
uint32_t R : 1;
uint32_t A : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.A = static_cast<uint8_t>(enc.A);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.V = static_cast<uint8_t>(enc.V);
inst.R = static_cast<uint8_t>(enc.R);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o3 = static_cast<uint8_t>(enc.o3);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LDCLRAL_32_MEMOP;
inst.iclass = InstName::LDCLRAL;
return true;
}
static bool TryExtractLDCLR_32_MEMOP(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 10111000001000000001000000000000
if ((bits & 0xffe0fc00U) != 0xb8201000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t opc : 3;
uint32_t o3 : 1;
uint32_t Rs : 5;
uint32_t _21 : 1; // 1
uint32_t R : 1;
uint32_t A : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.A = static_cast<uint8_t>(enc.A);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.V = static_cast<uint8_t>(enc.V);
inst.R = static_cast<uint8_t>(enc.R);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o3 = static_cast<uint8_t>(enc.o3);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LDCLR_32_MEMOP;
inst.iclass = InstName::LDCLR;
return true;
}
static bool TryExtractLDCLRL_32_MEMOP(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 10111000011000000001000000000000
if ((bits & 0xffe0fc00U) != 0xb8601000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t opc : 3;
uint32_t o3 : 1;
uint32_t Rs : 5;
uint32_t _21 : 1; // 1
uint32_t R : 1;
uint32_t A : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.A = static_cast<uint8_t>(enc.A);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.V = static_cast<uint8_t>(enc.V);
inst.R = static_cast<uint8_t>(enc.R);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o3 = static_cast<uint8_t>(enc.o3);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LDCLRL_32_MEMOP;
inst.iclass = InstName::LDCLRL;
return true;
}
static bool TryExtractLDCLRA_64_MEMOP(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 11111000101000000001000000000000
if ((bits & 0xffe0fc00U) != 0xf8a01000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t opc : 3;
uint32_t o3 : 1;
uint32_t Rs : 5;
uint32_t _21 : 1; // 1
uint32_t R : 1;
uint32_t A : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.A = static_cast<uint8_t>(enc.A);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.V = static_cast<uint8_t>(enc.V);
inst.R = static_cast<uint8_t>(enc.R);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o3 = static_cast<uint8_t>(enc.o3);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LDCLRA_64_MEMOP;
inst.iclass = InstName::LDCLRA;
return true;
}
static bool TryExtractLDCLRAL_64_MEMOP(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 11111000111000000001000000000000
if ((bits & 0xffe0fc00U) != 0xf8e01000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t opc : 3;
uint32_t o3 : 1;
uint32_t Rs : 5;
uint32_t _21 : 1; // 1
uint32_t R : 1;
uint32_t A : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.A = static_cast<uint8_t>(enc.A);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.V = static_cast<uint8_t>(enc.V);
inst.R = static_cast<uint8_t>(enc.R);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o3 = static_cast<uint8_t>(enc.o3);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LDCLRAL_64_MEMOP;
inst.iclass = InstName::LDCLRAL;
return true;
}
static bool TryExtractLDCLR_64_MEMOP(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 11111000001000000001000000000000
if ((bits & 0xffe0fc00U) != 0xf8201000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t opc : 3;
uint32_t o3 : 1;
uint32_t Rs : 5;
uint32_t _21 : 1; // 1
uint32_t R : 1;
uint32_t A : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.A = static_cast<uint8_t>(enc.A);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.V = static_cast<uint8_t>(enc.V);
inst.R = static_cast<uint8_t>(enc.R);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o3 = static_cast<uint8_t>(enc.o3);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LDCLR_64_MEMOP;
inst.iclass = InstName::LDCLR;
return true;
}
static bool TryExtractLDCLRL_64_MEMOP(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 11111000011000000001000000000000
if ((bits & 0xffe0fc00U) != 0xf8601000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t opc : 3;
uint32_t o3 : 1;
uint32_t Rs : 5;
uint32_t _21 : 1; // 1
uint32_t R : 1;
uint32_t A : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.A = static_cast<uint8_t>(enc.A);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.V = static_cast<uint8_t>(enc.V);
inst.R = static_cast<uint8_t>(enc.R);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o3 = static_cast<uint8_t>(enc.o3);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LDCLRL_64_MEMOP;
inst.iclass = InstName::LDCLRL;
return true;
}
static bool TryExtractUABD_ASIMDSAME_ONLY(InstData &inst, uint32_t bits) {
// bits
// & 10111111001000001111110000000000
// --------------------------------
// 00101110001000000111010000000000
if ((bits & 0xbf20fc00U) != 0x2e207400U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t ac : 1;
uint32_t _12 : 1; // 1
uint32_t _13 : 1; // 1
uint32_t _14 : 1; // 1
uint32_t _15 : 1; // 0
uint32_t Rm : 5;
uint32_t _21 : 1; // 1
uint32_t size : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Q = static_cast<uint8_t>(enc.Q);
inst.ac = static_cast<uint8_t>(enc.ac);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::UABD_ASIMDSAME_ONLY;
inst.iclass = InstName::UABD;
return true;
}
static bool TryExtractSTURB_32_LDST_UNSCALED(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000000000110000000000
// --------------------------------
// 00111000000000000000000000000000
if ((bits & 0xffe00c00U) != 0x38000000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t imm9 : 9;
uint32_t _21 : 1; // 0
uint32_t opc : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.imm9.uimm = static_cast<uint64_t>(enc.imm9);
inst.V = static_cast<uint8_t>(enc.V);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::STURB_32_LDST_UNSCALED;
inst.iclass = InstName::STURB;
return true;
}
static bool TryExtractORR_ASIMDSAME_ONLY(InstData &inst, uint32_t bits) {
if (false && TryExtractMOV_ORR_ASIMDSAME_ONLY(inst, bits))
return true;
// bits
// & 10111111111000001111110000000000
// --------------------------------
// 00001110101000000001110000000000
if ((bits & 0xbfe0fc00U) != 0xea01c00U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t opcode : 5;
uint32_t Rm : 5;
uint32_t _21 : 1; // 1
uint32_t size : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.U = static_cast<uint8_t>(enc.U);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::ORR_ASIMDSAME_ONLY;
inst.iclass = InstName::ORR;
return true;
}
static bool TryExtractFRINTA_ASIMDMISCFP16_R(InstData &inst, uint32_t bits) {
// bits
// & 10111111111111111111110000000000
// --------------------------------
// 00101110011110011000100000000000
if ((bits & 0xbffffc00U) != 0x2e798800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t o1 : 1;
uint32_t _13 : 1; // 0
uint32_t _14 : 1; // 0
uint32_t _15 : 1; // 1
uint32_t _16 : 1; // 1
uint32_t _17 : 1; // 0
uint32_t _18 : 1; // 0
uint32_t _19 : 1; // 1
uint32_t _20 : 1; // 1
uint32_t _21 : 1; // 1
uint32_t _22 : 1; // 1
uint32_t o2 : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o2 = static_cast<uint8_t>(enc.o2);
inst.o1 = static_cast<uint8_t>(enc.o1);
inst.iform = InstForm::FRINTA_ASIMDMISCFP16_R;
inst.iclass = InstName::FRINTA;
return true;
}
static bool TryExtractFRINTA_ASIMDMISC_R(InstData &inst, uint32_t bits) {
// bits
// & 10111111101111111111110000000000
// --------------------------------
// 00101110001000011000100000000000
if ((bits & 0xbfbffc00U) != 0x2e218800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t o1 : 1;
uint32_t _13 : 1; // 0
uint32_t _14 : 1; // 0
uint32_t _15 : 1; // 1
uint32_t _16 : 1; // 1
uint32_t _17 : 1; // 0
uint32_t _18 : 1; // 0
uint32_t _19 : 1; // 0
uint32_t _20 : 1; // 0
uint32_t _21 : 1; // 1
uint32_t sz : 1;
uint32_t o2 : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.sz = static_cast<uint8_t>(enc.sz);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o2 = static_cast<uint8_t>(enc.o2);
inst.o1 = static_cast<uint8_t>(enc.o1);
inst.iform = InstForm::FRINTA_ASIMDMISC_R;
inst.iclass = InstName::FRINTA;
return true;
}
static bool TryExtractSUBS_32_ADDSUB_SHIFT(InstData &inst, uint32_t bits) {
if (false && TryExtractCMP_SUBS_32_ADDSUB_SHIFT(inst, bits))
return true;
if (false && TryExtractNEGS_SUBS_32_ADDSUB_SHIFT(inst, bits))
return true;
// bits
// & 11111111001000000000000000000000
// --------------------------------
// 01101011000000000000000000000000
if ((bits & 0xff200000U) != 0x6b000000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t imm6 : 6;
uint32_t Rm : 5;
uint32_t _21 : 1; // 0
uint32_t shift : 2;
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t S : 1;
uint32_t op : 1;
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.shift = static_cast<uint8_t>(enc.shift);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.op = static_cast<uint8_t>(enc.op);
inst.sf = static_cast<uint8_t>(enc.sf);
inst.imm6.uimm = static_cast<uint64_t>(enc.imm6);
inst.iform = InstForm::SUBS_32_ADDSUB_SHIFT;
inst.iclass = InstName::SUBS;
return true;
}
static bool TryExtractSUBS_64_ADDSUB_SHIFT(InstData &inst, uint32_t bits) {
if (false && TryExtractNEGS_SUBS_64_ADDSUB_SHIFT(inst, bits))
return true;
if (false && TryExtractCMP_SUBS_64_ADDSUB_SHIFT(inst, bits))
return true;
// bits
// & 11111111001000000000000000000000
// --------------------------------
// 11101011000000000000000000000000
if ((bits & 0xff200000U) != 0xeb000000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t imm6 : 6;
uint32_t Rm : 5;
uint32_t _21 : 1; // 0
uint32_t shift : 2;
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t S : 1;
uint32_t op : 1;
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.shift = static_cast<uint8_t>(enc.shift);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.op = static_cast<uint8_t>(enc.op);
inst.sf = static_cast<uint8_t>(enc.sf);
inst.imm6.uimm = static_cast<uint64_t>(enc.imm6);
inst.iform = InstForm::SUBS_64_ADDSUB_SHIFT;
inst.iclass = InstName::SUBS;
return true;
}
static bool TryExtractSTXP_SP32_LDSTEXCL(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001000000000000000
// --------------------------------
// 10001000001000000000000000000000
if ((bits & 0xffe08000U) != 0x88200000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t Rt2 : 5;
uint32_t o0 : 1;
uint32_t Rs : 5;
uint32_t o1 : 1;
uint32_t L : 1;
uint32_t o2 : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 0
uint32_t sz : 1;
uint32_t _31 : 1; // 1
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.sz = static_cast<uint8_t>(enc.sz);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.L = static_cast<uint8_t>(enc.L);
inst.Rt2 = static_cast<uint8_t>(enc.Rt2);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o2 = static_cast<uint8_t>(enc.o2);
inst.o1 = static_cast<uint8_t>(enc.o1);
inst.o0 = static_cast<uint8_t>(enc.o0);
inst.iform = InstForm::STXP_SP32_LDSTEXCL;
inst.iclass = InstName::STXP;
return true;
}
static bool TryExtractSTXP_SP64_LDSTEXCL(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001000000000000000
// --------------------------------
// 11001000001000000000000000000000
if ((bits & 0xffe08000U) != 0xc8200000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t Rt2 : 5;
uint32_t o0 : 1;
uint32_t Rs : 5;
uint32_t o1 : 1;
uint32_t L : 1;
uint32_t o2 : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 0
uint32_t sz : 1;
uint32_t _31 : 1; // 1
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.sz = static_cast<uint8_t>(enc.sz);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.L = static_cast<uint8_t>(enc.L);
inst.Rt2 = static_cast<uint8_t>(enc.Rt2);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o2 = static_cast<uint8_t>(enc.o2);
inst.o1 = static_cast<uint8_t>(enc.o1);
inst.o0 = static_cast<uint8_t>(enc.o0);
inst.iform = InstForm::STXP_SP64_LDSTEXCL;
inst.iclass = InstName::STXP;
return true;
}
static bool TryExtractSBFX_SBFM_32M_BITFIELD(InstData &inst, uint32_t bits) {
// bits
// & 11111111110000000000000000000000
// --------------------------------
// 00010011000000000000000000000000
if ((bits & 0xffc00000U) != 0x13000000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t imms : 6;
uint32_t immr : 6;
uint32_t N : 1;
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 0
uint32_t _28 : 1; // 1
uint32_t opc : 2;
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.sf = static_cast<uint8_t>(enc.sf);
inst.N = static_cast<uint8_t>(enc.N);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.immr.uimm = static_cast<uint64_t>(enc.immr);
inst.imms.uimm = static_cast<uint64_t>(enc.imms);
inst.iform = InstForm::SBFX_SBFM_32M_BITFIELD;
inst.iclass = InstName::SBFM;
return true;
}
static bool TryExtractSBFX_SBFM_64M_BITFIELD(InstData &inst, uint32_t bits) {
// bits
// & 11111111110000000000000000000000
// --------------------------------
// 10010011010000000000000000000000
if ((bits & 0xffc00000U) != 0x93400000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t imms : 6;
uint32_t immr : 6;
uint32_t N : 1;
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 0
uint32_t _28 : 1; // 1
uint32_t opc : 2;
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.sf = static_cast<uint8_t>(enc.sf);
inst.N = static_cast<uint8_t>(enc.N);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.immr.uimm = static_cast<uint64_t>(enc.immr);
inst.imms.uimm = static_cast<uint64_t>(enc.imms);
inst.iform = InstForm::SBFX_SBFM_64M_BITFIELD;
inst.iclass = InstName::SBFM;
return true;
}
static bool TryExtractLDXP_LP32_LDSTEXCL(InstData &inst, uint32_t bits) {
// bits
// & 11111111111111111000000000000000
// --------------------------------
// 10001000011111110000000000000000
if ((bits & 0xffff8000U) != 0x887f0000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t Rt2 : 5;
uint32_t o0 : 1;
uint32_t Rs : 5;
uint32_t o1 : 1;
uint32_t L : 1;
uint32_t o2 : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 0
uint32_t sz : 1;
uint32_t _31 : 1; // 1
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.sz = static_cast<uint8_t>(enc.sz);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.L = static_cast<uint8_t>(enc.L);
inst.Rt2 = static_cast<uint8_t>(enc.Rt2);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o2 = static_cast<uint8_t>(enc.o2);
inst.o1 = static_cast<uint8_t>(enc.o1);
inst.o0 = static_cast<uint8_t>(enc.o0);
inst.iform = InstForm::LDXP_LP32_LDSTEXCL;
inst.iclass = InstName::LDXP;
return true;
}
static bool TryExtractLDXP_LP64_LDSTEXCL(InstData &inst, uint32_t bits) {
// bits
// & 11111111111111111000000000000000
// --------------------------------
// 11001000011111110000000000000000
if ((bits & 0xffff8000U) != 0xc87f0000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t Rt2 : 5;
uint32_t o0 : 1;
uint32_t Rs : 5;
uint32_t o1 : 1;
uint32_t L : 1;
uint32_t o2 : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 0
uint32_t sz : 1;
uint32_t _31 : 1; // 1
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.sz = static_cast<uint8_t>(enc.sz);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.L = static_cast<uint8_t>(enc.L);
inst.Rt2 = static_cast<uint8_t>(enc.Rt2);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o2 = static_cast<uint8_t>(enc.o2);
inst.o1 = static_cast<uint8_t>(enc.o1);
inst.o0 = static_cast<uint8_t>(enc.o0);
inst.iform = InstForm::LDXP_LP64_LDSTEXCL;
inst.iclass = InstName::LDXP;
return true;
}
static bool TryExtractORR_32_LOG_IMM(InstData &inst, uint32_t bits) {
if (false && TryExtractMOV_ORR_32_LOG_IMM(inst, bits))
return true;
// bits
// & 11111111110000000000000000000000
// --------------------------------
// 00110010000000000000000000000000
if ((bits & 0xffc00000U) != 0x32000000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t imms : 6;
uint32_t immr : 6;
uint32_t N : 1;
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 0
uint32_t _28 : 1; // 1
uint32_t opc : 2;
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.sf = static_cast<uint8_t>(enc.sf);
inst.N = static_cast<uint8_t>(enc.N);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.immr.uimm = static_cast<uint64_t>(enc.immr);
inst.imms.uimm = static_cast<uint64_t>(enc.imms);
inst.iform = InstForm::ORR_32_LOG_IMM;
inst.iclass = InstName::ORR;
return true;
}
static bool TryExtractORR_64_LOG_IMM(InstData &inst, uint32_t bits) {
if (false && TryExtractMOV_ORR_64_LOG_IMM(inst, bits))
return true;
// bits
// & 11111111100000000000000000000000
// --------------------------------
// 10110010000000000000000000000000
if ((bits & 0xff800000U) != 0xb2000000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t imms : 6;
uint32_t immr : 6;
uint32_t N : 1;
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 0
uint32_t _28 : 1; // 1
uint32_t opc : 2;
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.sf = static_cast<uint8_t>(enc.sf);
inst.N = static_cast<uint8_t>(enc.N);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.immr.uimm = static_cast<uint64_t>(enc.immr);
inst.imms.uimm = static_cast<uint64_t>(enc.imms);
inst.iform = InstForm::ORR_64_LOG_IMM;
inst.iclass = InstName::ORR;
return true;
}
static bool TryExtractUCVTF_ASISDMISCFP16_R(InstData &inst, uint32_t bits) {
// bits
// & 11111111111111111111110000000000
// --------------------------------
// 01111110011110011101100000000000
if ((bits & 0xfffffc00U) != 0x7e79d800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t opcode : 5;
uint32_t _17 : 1; // 0
uint32_t _18 : 1; // 0
uint32_t _19 : 1; // 1
uint32_t _20 : 1; // 1
uint32_t _21 : 1; // 1
uint32_t _22 : 1; // 1
uint32_t a : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t U : 1;
uint32_t _30 : 1; // 1
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.a = static_cast<uint8_t>(enc.a);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.U = static_cast<uint8_t>(enc.U);
inst.iform = InstForm::UCVTF_ASISDMISCFP16_R;
inst.iclass = InstName::UCVTF;
return true;
}
static bool TryExtractUCVTF_ASISDMISC_R(InstData &inst, uint32_t bits) {
// bits
// & 11111111101111111111110000000000
// --------------------------------
// 01111110001000011101100000000000
if ((bits & 0xffbffc00U) != 0x7e21d800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t opcode : 5;
uint32_t _17 : 1; // 0
uint32_t _18 : 1; // 0
uint32_t _19 : 1; // 0
uint32_t _20 : 1; // 0
uint32_t _21 : 1; // 1
uint32_t sz : 1;
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t U : 1;
uint32_t _30 : 1; // 1
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.sz = static_cast<uint8_t>(enc.sz);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.U = static_cast<uint8_t>(enc.U);
inst.iform = InstForm::UCVTF_ASISDMISC_R;
inst.iclass = InstName::UCVTF;
return true;
}
static bool TryExtractUCVTF_ASIMDMISCFP16_R(InstData &inst, uint32_t bits) {
// bits
// & 10111111111111111111110000000000
// --------------------------------
// 00101110011110011101100000000000
if ((bits & 0xbffffc00U) != 0x2e79d800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t opcode : 5;
uint32_t _17 : 1; // 0
uint32_t _18 : 1; // 0
uint32_t _19 : 1; // 1
uint32_t _20 : 1; // 1
uint32_t _21 : 1; // 1
uint32_t _22 : 1; // 1
uint32_t a : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.a = static_cast<uint8_t>(enc.a);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.iform = InstForm::UCVTF_ASIMDMISCFP16_R;
inst.iclass = InstName::UCVTF;
return true;
}
static bool TryExtractUCVTF_ASIMDMISC_R(InstData &inst, uint32_t bits) {
// bits
// & 10111111101111111111110000000000
// --------------------------------
// 00101110001000011101100000000000
if ((bits & 0xbfbffc00U) != 0x2e21d800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t opcode : 5;
uint32_t _17 : 1; // 0
uint32_t _18 : 1; // 0
uint32_t _19 : 1; // 0
uint32_t _20 : 1; // 0
uint32_t _21 : 1; // 1
uint32_t sz : 1;
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.sz = static_cast<uint8_t>(enc.sz);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.U = static_cast<uint8_t>(enc.U);
inst.iform = InstForm::UCVTF_ASIMDMISC_R;
inst.iclass = InstName::UCVTF;
return true;
}
static bool TryExtractSQDMULH_ASISDSAME_ONLY(InstData &inst, uint32_t bits) {
// bits
// & 11111111001000001111110000000000
// --------------------------------
// 01011110001000001011010000000000
if ((bits & 0xff20fc00U) != 0x5e20b400U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t opcode : 5;
uint32_t Rm : 5;
uint32_t _21 : 1; // 1
uint32_t size : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t U : 1;
uint32_t _30 : 1; // 1
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.U = static_cast<uint8_t>(enc.U);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::SQDMULH_ASISDSAME_ONLY;
inst.iclass = InstName::SQDMULH;
return true;
}
static bool TryExtractSQDMULH_ASIMDSAME_ONLY(InstData &inst, uint32_t bits) {
// bits
// & 10111111001000001111110000000000
// --------------------------------
// 00001110001000001011010000000000
if ((bits & 0xbf20fc00U) != 0xe20b400U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t opcode : 5;
uint32_t Rm : 5;
uint32_t _21 : 1; // 1
uint32_t size : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.U = static_cast<uint8_t>(enc.U);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::SQDMULH_ASIMDSAME_ONLY;
inst.iclass = InstName::SQDMULH;
return true;
}
static bool TryExtractFCVTL_ASIMDMISC_L(InstData &inst, uint32_t bits) {
// bits
// & 10111111101111111111110000000000
// --------------------------------
// 00001110001000010111100000000000
if ((bits & 0xbfbffc00U) != 0xe217800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t opcode : 5;
uint32_t _17 : 1; // 0
uint32_t _18 : 1; // 0
uint32_t _19 : 1; // 0
uint32_t _20 : 1; // 0
uint32_t _21 : 1; // 1
uint32_t sz : 1;
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.sz = static_cast<uint8_t>(enc.sz);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.U = static_cast<uint8_t>(enc.U);
inst.iform = InstForm::FCVTL_ASIMDMISC_L;
inst.iclass = InstName::FCVTL;
return true;
}
static bool TryExtractCCMN_32_CONDCMP_IMM(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000000000110000010000
// --------------------------------
// 00111010010000000000100000000000
if ((bits & 0xffe00c10U) != 0x3a400800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t nzcv : 4;
uint32_t o3 : 1;
uint32_t Rn : 5;
uint32_t o2 : 1;
uint32_t _11 : 1; // 1
uint32_t cond : 4;
uint32_t imm5 : 5;
uint32_t _21 : 1; // 0
uint32_t _22 : 1; // 1
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t op : 1;
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.imm5.uimm = static_cast<uint64_t>(enc.imm5);
inst.nzcv = static_cast<uint8_t>(enc.nzcv);
inst.sf = static_cast<uint8_t>(enc.sf);
inst.S = static_cast<uint8_t>(enc.S);
inst.cond = static_cast<uint8_t>(enc.cond);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o3 = static_cast<uint8_t>(enc.o3);
inst.o2 = static_cast<uint8_t>(enc.o2);
inst.op = static_cast<uint8_t>(enc.op);
inst.iform = InstForm::CCMN_32_CONDCMP_IMM;
inst.iclass = InstName::CCMN;
return true;
}
static bool TryExtractCCMN_64_CONDCMP_IMM(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000000000110000010000
// --------------------------------
// 10111010010000000000100000000000
if ((bits & 0xffe00c10U) != 0xba400800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t nzcv : 4;
uint32_t o3 : 1;
uint32_t Rn : 5;
uint32_t o2 : 1;
uint32_t _11 : 1; // 1
uint32_t cond : 4;
uint32_t imm5 : 5;
uint32_t _21 : 1; // 0
uint32_t _22 : 1; // 1
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t op : 1;
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.imm5.uimm = static_cast<uint64_t>(enc.imm5);
inst.nzcv = static_cast<uint8_t>(enc.nzcv);
inst.sf = static_cast<uint8_t>(enc.sf);
inst.S = static_cast<uint8_t>(enc.S);
inst.cond = static_cast<uint8_t>(enc.cond);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o3 = static_cast<uint8_t>(enc.o3);
inst.o2 = static_cast<uint8_t>(enc.o2);
inst.op = static_cast<uint8_t>(enc.op);
inst.iform = InstForm::CCMN_64_CONDCMP_IMM;
inst.iclass = InstName::CCMN;
return true;
}
static bool TryExtractDMB_BO_SYSTEM(InstData &inst, uint32_t bits) {
// bits
// & 11111111111111111111000011111111
// --------------------------------
// 11010101000000110011000010111111
if ((bits & 0xfffff0ffU) != 0xd50330bfU) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t opc : 2;
uint32_t _7 : 1; // 1
uint32_t CRm : 4;
uint32_t CRn : 4;
uint32_t op1 : 3;
uint32_t op0 : 2;
uint32_t L : 1;
uint32_t _22 : 1; // 0
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 0
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 0
uint32_t _30 : 1; // 1
uint32_t _31 : 1; // 1
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.op0 = static_cast<uint8_t>(enc.op0);
inst.op1 = static_cast<uint8_t>(enc.op1);
inst.L = static_cast<uint8_t>(enc.L);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.CRn = static_cast<uint8_t>(enc.CRn);
inst.CRm = static_cast<uint8_t>(enc.CRm);
inst.iform = InstForm::DMB_BO_SYSTEM;
inst.iclass = InstName::DMB;
return true;
}
static bool TryExtractYIELD_HI_SYSTEM(InstData &inst, uint32_t bits) {
// bits
// & 11111111111111111111111111111111
// --------------------------------
// 11010101000000110010000000111111
if ((bits & 0xffffffffU) != 0xd503203fU) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t op2 : 3;
uint32_t CRm : 4;
uint32_t CRn : 4;
uint32_t op1 : 3;
uint32_t op0 : 2;
uint32_t L : 1;
uint32_t _22 : 1; // 0
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 0
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 0
uint32_t _30 : 1; // 1
uint32_t _31 : 1; // 1
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.op0 = static_cast<uint8_t>(enc.op0);
inst.op1 = static_cast<uint8_t>(enc.op1);
inst.op2 = static_cast<uint8_t>(enc.op2);
inst.L = static_cast<uint8_t>(enc.L);
inst.CRn = static_cast<uint8_t>(enc.CRn);
inst.CRm = static_cast<uint8_t>(enc.CRm);
inst.iform = InstForm::YIELD_HI_SYSTEM;
inst.iclass = InstName::YIELD;
return true;
}
static bool TryExtractUXTH_UBFM_32M_BITFIELD(InstData &inst, uint32_t bits) {
// bits
// & 11111111111111111111110000000000
// --------------------------------
// 01010011000000000011110000000000
if ((bits & 0xfffffc00U) != 0x53003c00U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t imms : 6;
uint32_t immr : 6;
uint32_t N : 1;
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 0
uint32_t _28 : 1; // 1
uint32_t opc : 2;
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.sf = static_cast<uint8_t>(enc.sf);
inst.N = static_cast<uint8_t>(enc.N);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.immr.uimm = static_cast<uint64_t>(enc.immr);
inst.imms.uimm = static_cast<uint64_t>(enc.imms);
inst.iform = InstForm::UXTH_UBFM_32M_BITFIELD;
inst.iclass = InstName::UBFM;
return true;
}
static bool TryExtractSTADD_32S_MEMOP(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000011111
// --------------------------------
// 10111000001000000000000000011111
if ((bits & 0xffe0fc1fU) != 0xb820001fU) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t opc : 3;
uint32_t o3 : 1;
uint32_t Rs : 5;
uint32_t _21 : 1; // 1
uint32_t R : 1;
uint32_t A : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.A = static_cast<uint8_t>(enc.A);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.V = static_cast<uint8_t>(enc.V);
inst.R = static_cast<uint8_t>(enc.R);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o3 = static_cast<uint8_t>(enc.o3);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::STADD_32S_MEMOP;
inst.iclass = InstName::STADD;
return true;
}
static bool TryExtractSTADDL_32S_MEMOP(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000011111
// --------------------------------
// 10111000011000000000000000011111
if ((bits & 0xffe0fc1fU) != 0xb860001fU) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t opc : 3;
uint32_t o3 : 1;
uint32_t Rs : 5;
uint32_t _21 : 1; // 1
uint32_t R : 1;
uint32_t A : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.A = static_cast<uint8_t>(enc.A);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.V = static_cast<uint8_t>(enc.V);
inst.R = static_cast<uint8_t>(enc.R);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o3 = static_cast<uint8_t>(enc.o3);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::STADDL_32S_MEMOP;
inst.iclass = InstName::STADDL;
return true;
}
static bool TryExtractSTADD_64S_MEMOP(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000011111
// --------------------------------
// 11111000001000000000000000011111
if ((bits & 0xffe0fc1fU) != 0xf820001fU) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t opc : 3;
uint32_t o3 : 1;
uint32_t Rs : 5;
uint32_t _21 : 1; // 1
uint32_t R : 1;
uint32_t A : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.A = static_cast<uint8_t>(enc.A);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.V = static_cast<uint8_t>(enc.V);
inst.R = static_cast<uint8_t>(enc.R);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o3 = static_cast<uint8_t>(enc.o3);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::STADD_64S_MEMOP;
inst.iclass = InstName::STADD;
return true;
}
static bool TryExtractSTADDL_64S_MEMOP(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000011111
// --------------------------------
// 11111000011000000000000000011111
if ((bits & 0xffe0fc1fU) != 0xf860001fU) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t opc : 3;
uint32_t o3 : 1;
uint32_t Rs : 5;
uint32_t _21 : 1; // 1
uint32_t R : 1;
uint32_t A : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.A = static_cast<uint8_t>(enc.A);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.V = static_cast<uint8_t>(enc.V);
inst.R = static_cast<uint8_t>(enc.R);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o3 = static_cast<uint8_t>(enc.o3);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::STADDL_64S_MEMOP;
inst.iclass = InstName::STADDL;
return true;
}
static bool TryExtractUSRA_ASISDSHF_R(InstData &inst, uint32_t bits) {
// bits
// & 11111111100000001111110000000000
// --------------------------------
// 01111111000000000001010000000000
if ((bits & 0xff80fc00U) != 0x7f001400U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t _11 : 1; // 0
uint32_t o0 : 1;
uint32_t o1 : 1;
uint32_t _14 : 1; // 0
uint32_t _15 : 1; // 0
uint32_t immb : 3;
uint32_t immh : 4;
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t U : 1;
uint32_t _30 : 1; // 1
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.immh.uimm = static_cast<uint64_t>(enc.immh);
if (!(inst.immh.uimm != 0x0))
return false;
inst.immb.uimm = static_cast<uint64_t>(enc.immb);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o1 = static_cast<uint8_t>(enc.o1);
inst.o0 = static_cast<uint8_t>(enc.o0);
inst.iform = InstForm::USRA_ASISDSHF_R;
inst.iclass = InstName::USRA;
return true;
}
static bool TryExtractUSRA_ASIMDSHF_R(InstData &inst, uint32_t bits) {
// bits
// & 10111111100000001111110000000000
// --------------------------------
// 00101111000000000001010000000000
if ((bits & 0xbf80fc00U) != 0x2f001400U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t _11 : 1; // 0
uint32_t o0 : 1;
uint32_t o1 : 1;
uint32_t _14 : 1; // 0
uint32_t _15 : 1; // 0
uint32_t immb : 3;
uint32_t immh : 4;
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.immh.uimm = static_cast<uint64_t>(enc.immh);
if (!(inst.immh.uimm != 0x0))
return false;
inst.immb.uimm = static_cast<uint64_t>(enc.immb);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o1 = static_cast<uint8_t>(enc.o1);
inst.o0 = static_cast<uint8_t>(enc.o0);
inst.iform = InstForm::USRA_ASIMDSHF_R;
inst.iclass = InstName::USRA;
return true;
}
static bool TryExtractMOV_MOVZ_32_MOVEWIDE(InstData &inst, uint32_t bits) {
// bits
// & 11111111100000000000000000000000
// --------------------------------
// 01010010100000000000000000000000
if ((bits & 0xff800000U) != 0x52800000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t imm16 : 16;
uint32_t hw : 2;
uint32_t _23 : 1; // 1
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 0
uint32_t _28 : 1; // 1
uint32_t opc : 2;
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.sf = static_cast<uint8_t>(enc.sf);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.hw = static_cast<uint8_t>(enc.hw);
inst.imm16.uimm = static_cast<uint64_t>(enc.imm16);
inst.iform = InstForm::MOV_MOVZ_32_MOVEWIDE;
inst.iclass = InstName::MOVZ;
return true;
}
static bool TryExtractMOV_MOVZ_64_MOVEWIDE(InstData &inst, uint32_t bits) {
// bits
// & 11111111100000000000000000000000
// --------------------------------
// 11010010100000000000000000000000
if ((bits & 0xff800000U) != 0xd2800000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t imm16 : 16;
uint32_t hw : 2;
uint32_t _23 : 1; // 1
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 0
uint32_t _28 : 1; // 1
uint32_t opc : 2;
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.sf = static_cast<uint8_t>(enc.sf);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.hw = static_cast<uint8_t>(enc.hw);
inst.imm16.uimm = static_cast<uint64_t>(enc.imm16);
inst.iform = InstForm::MOV_MOVZ_64_MOVEWIDE;
inst.iclass = InstName::MOVZ;
return true;
}
static bool TryExtractMLS_ASIMDSAME_ONLY(InstData &inst, uint32_t bits) {
// bits
// & 10111111001000001111110000000000
// --------------------------------
// 00101110001000001001010000000000
if ((bits & 0xbf20fc00U) != 0x2e209400U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t opcode : 5;
uint32_t Rm : 5;
uint32_t _21 : 1; // 1
uint32_t size : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.U = static_cast<uint8_t>(enc.U);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::MLS_ASIMDSAME_ONLY;
inst.iclass = InstName::MLS;
return true;
}
static bool TryExtractST1_ASISDLSE_R1_1V(InstData &inst, uint32_t bits) {
// bits
// & 10111111111111111111000000000000
// --------------------------------
// 00001100000000000111000000000000
if ((bits & 0xbffff000U) != 0xc007000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t size : 2;
uint32_t opcode : 4;
uint32_t _16 : 1; // 0
uint32_t _17 : 1; // 0
uint32_t _18 : 1; // 0
uint32_t _19 : 1; // 0
uint32_t _20 : 1; // 0
uint32_t _21 : 1; // 0
uint32_t L : 1;
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 0
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.L = static_cast<uint8_t>(enc.L);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::ST1_ASISDLSE_R1_1V;
inst.iclass = InstName::ST1;
return true;
}
static bool TryExtractST1_ASISDLSE_R2_2V(InstData &inst, uint32_t bits) {
// bits
// & 10111111111111111111000000000000
// --------------------------------
// 00001100000000001010000000000000
if ((bits & 0xbffff000U) != 0xc00a000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t size : 2;
uint32_t opcode : 4;
uint32_t _16 : 1; // 0
uint32_t _17 : 1; // 0
uint32_t _18 : 1; // 0
uint32_t _19 : 1; // 0
uint32_t _20 : 1; // 0
uint32_t _21 : 1; // 0
uint32_t L : 1;
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 0
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.L = static_cast<uint8_t>(enc.L);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::ST1_ASISDLSE_R2_2V;
inst.iclass = InstName::ST1;
return true;
}
static bool TryExtractST1_ASISDLSE_R3_3V(InstData &inst, uint32_t bits) {
// bits
// & 10111111111111111111000000000000
// --------------------------------
// 00001100000000000110000000000000
if ((bits & 0xbffff000U) != 0xc006000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t size : 2;
uint32_t opcode : 4;
uint32_t _16 : 1; // 0
uint32_t _17 : 1; // 0
uint32_t _18 : 1; // 0
uint32_t _19 : 1; // 0
uint32_t _20 : 1; // 0
uint32_t _21 : 1; // 0
uint32_t L : 1;
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 0
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.L = static_cast<uint8_t>(enc.L);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::ST1_ASISDLSE_R3_3V;
inst.iclass = InstName::ST1;
return true;
}
static bool TryExtractST1_ASISDLSE_R4_4V(InstData &inst, uint32_t bits) {
// bits
// & 10111111111111111111000000000000
// --------------------------------
// 00001100000000000010000000000000
if ((bits & 0xbffff000U) != 0xc002000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t size : 2;
uint32_t opcode : 4;
uint32_t _16 : 1; // 0
uint32_t _17 : 1; // 0
uint32_t _18 : 1; // 0
uint32_t _19 : 1; // 0
uint32_t _20 : 1; // 0
uint32_t _21 : 1; // 0
uint32_t L : 1;
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 0
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.L = static_cast<uint8_t>(enc.L);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::ST1_ASISDLSE_R4_4V;
inst.iclass = InstName::ST1;
return true;
}
static bool TryExtractST1_ASISDLSEP_I1_I1(InstData &inst, uint32_t bits) {
// bits
// & 10111111111111111111000000000000
// --------------------------------
// 00001100100111110111000000000000
if ((bits & 0xbffff000U) != 0xc9f7000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t size : 2;
uint32_t opcode : 4;
uint32_t Rm : 5;
uint32_t _21 : 1; // 0
uint32_t L : 1;
uint32_t _23 : 1; // 1
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 0
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.L = static_cast<uint8_t>(enc.L);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::ST1_ASISDLSEP_I1_I1;
inst.iclass = InstName::ST1;
return true;
}
static bool TryExtractST1_ASISDLSEP_R1_R1(InstData &inst, uint32_t bits) {
// bits
// & 10111111111000001111000000000000
// --------------------------------
// 00001100100000000111000000000000
if ((bits & 0xbfe0f000U) != 0xc807000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t size : 2;
uint32_t opcode : 4;
uint32_t Rm : 5;
uint32_t _21 : 1; // 0
uint32_t L : 1;
uint32_t _23 : 1; // 1
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 0
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.L = static_cast<uint8_t>(enc.L);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::ST1_ASISDLSEP_R1_R1;
inst.iclass = InstName::ST1;
return true;
}
static bool TryExtractST1_ASISDLSEP_I2_I2(InstData &inst, uint32_t bits) {
// bits
// & 10111111111111111111000000000000
// --------------------------------
// 00001100100111111010000000000000
if ((bits & 0xbffff000U) != 0xc9fa000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t size : 2;
uint32_t opcode : 4;
uint32_t Rm : 5;
uint32_t _21 : 1; // 0
uint32_t L : 1;
uint32_t _23 : 1; // 1
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 0
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.L = static_cast<uint8_t>(enc.L);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::ST1_ASISDLSEP_I2_I2;
inst.iclass = InstName::ST1;
return true;
}
static bool TryExtractST1_ASISDLSEP_R2_R2(InstData &inst, uint32_t bits) {
// bits
// & 10111111111000001111000000000000
// --------------------------------
// 00001100100000001010000000000000
if ((bits & 0xbfe0f000U) != 0xc80a000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t size : 2;
uint32_t opcode : 4;
uint32_t Rm : 5;
uint32_t _21 : 1; // 0
uint32_t L : 1;
uint32_t _23 : 1; // 1
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 0
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.L = static_cast<uint8_t>(enc.L);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::ST1_ASISDLSEP_R2_R2;
inst.iclass = InstName::ST1;
return true;
}
static bool TryExtractST1_ASISDLSEP_I3_I3(InstData &inst, uint32_t bits) {
// bits
// & 10111111111111111111000000000000
// --------------------------------
// 00001100100111110110000000000000
if ((bits & 0xbffff000U) != 0xc9f6000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t size : 2;
uint32_t opcode : 4;
uint32_t Rm : 5;
uint32_t _21 : 1; // 0
uint32_t L : 1;
uint32_t _23 : 1; // 1
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 0
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.L = static_cast<uint8_t>(enc.L);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::ST1_ASISDLSEP_I3_I3;
inst.iclass = InstName::ST1;
return true;
}
static bool TryExtractST1_ASISDLSEP_R3_R3(InstData &inst, uint32_t bits) {
// bits
// & 10111111111000001111000000000000
// --------------------------------
// 00001100100000000110000000000000
if ((bits & 0xbfe0f000U) != 0xc806000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t size : 2;
uint32_t opcode : 4;
uint32_t Rm : 5;
uint32_t _21 : 1; // 0
uint32_t L : 1;
uint32_t _23 : 1; // 1
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 0
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.L = static_cast<uint8_t>(enc.L);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::ST1_ASISDLSEP_R3_R3;
inst.iclass = InstName::ST1;
return true;
}
static bool TryExtractST1_ASISDLSEP_I4_I4(InstData &inst, uint32_t bits) {
// bits
// & 10111111111111111111000000000000
// --------------------------------
// 00001100100111110010000000000000
if ((bits & 0xbffff000U) != 0xc9f2000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t size : 2;
uint32_t opcode : 4;
uint32_t Rm : 5;
uint32_t _21 : 1; // 0
uint32_t L : 1;
uint32_t _23 : 1; // 1
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 0
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.L = static_cast<uint8_t>(enc.L);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::ST1_ASISDLSEP_I4_I4;
inst.iclass = InstName::ST1;
return true;
}
static bool TryExtractST1_ASISDLSEP_R4_R4(InstData &inst, uint32_t bits) {
// bits
// & 10111111111000001111000000000000
// --------------------------------
// 00001100100000000010000000000000
if ((bits & 0xbfe0f000U) != 0xc802000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t size : 2;
uint32_t opcode : 4;
uint32_t Rm : 5;
uint32_t _21 : 1; // 0
uint32_t L : 1;
uint32_t _23 : 1; // 1
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 0
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.L = static_cast<uint8_t>(enc.L);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::ST1_ASISDLSEP_R4_R4;
inst.iclass = InstName::ST1;
return true;
}
static bool TryExtractAESIMC_B_CRYPTOAES(InstData &inst, uint32_t bits) {
// bits
// & 11111111111111111111110000000000
// --------------------------------
// 01001110001010000111100000000000
if ((bits & 0xfffffc00U) != 0x4e287800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t D : 1;
uint32_t _13 : 1; // 1
uint32_t _14 : 1; // 1
uint32_t _15 : 1; // 0
uint32_t _16 : 1; // 0
uint32_t _17 : 1; // 0
uint32_t _18 : 1; // 0
uint32_t _19 : 1; // 1
uint32_t _20 : 1; // 0
uint32_t _21 : 1; // 1
uint32_t size : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 0
uint32_t _30 : 1; // 1
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.D = static_cast<uint8_t>(enc.D);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::AESIMC_B_CRYPTOAES;
inst.iclass = InstName::AESIMC;
return true;
}
static bool TryExtractUMULH_64_DP_3SRC(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 10011011110000000111110000000000
if ((bits & 0xffe0fc00U) != 0x9bc07c00U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t Ra : 5;
uint32_t o0 : 1;
uint32_t Rm : 5;
uint32_t _21 : 1; // 0
uint32_t _22 : 1; // 1
uint32_t U : 1;
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t op54 : 2;
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.U = static_cast<uint8_t>(enc.U);
inst.Ra = static_cast<uint8_t>(enc.Ra);
inst.op54 = static_cast<uint8_t>(enc.op54);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.sf = static_cast<uint8_t>(enc.sf);
inst.o0 = static_cast<uint8_t>(enc.o0);
inst.iform = InstForm::UMULH_64_DP_3SRC;
inst.iclass = InstName::UMULH;
return true;
}
static bool TryExtractUADDW_ASIMDDIFF_W(InstData &inst, uint32_t bits) {
// bits
// & 10111111001000001111110000000000
// --------------------------------
// 00101110001000000001000000000000
if ((bits & 0xbf20fc00U) != 0x2e201000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t _12 : 1; // 1
uint32_t o1 : 1;
uint32_t _14 : 1; // 0
uint32_t _15 : 1; // 0
uint32_t Rm : 5;
uint32_t _21 : 1; // 1
uint32_t size : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o1 = static_cast<uint8_t>(enc.o1);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::UADDW_ASIMDDIFF_W;
inst.iclass = InstName::UADDW;
return true;
}
static bool TryExtractSTRH_32_LDST_IMMPOST(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000000000110000000000
// --------------------------------
// 01111000000000000000010000000000
if ((bits & 0xffe00c00U) != 0x78000400U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t _11 : 1; // 0
uint32_t imm9 : 9;
uint32_t _21 : 1; // 0
uint32_t opc : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.imm9.uimm = static_cast<uint64_t>(enc.imm9);
inst.V = static_cast<uint8_t>(enc.V);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::STRH_32_LDST_IMMPOST;
inst.iclass = InstName::STRH;
return true;
}
static bool TryExtractSTRH_32_LDST_IMMPRE(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000000000110000000000
// --------------------------------
// 01111000000000000000110000000000
if ((bits & 0xffe00c00U) != 0x78000c00U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t _11 : 1; // 1
uint32_t imm9 : 9;
uint32_t _21 : 1; // 0
uint32_t opc : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.imm9.uimm = static_cast<uint64_t>(enc.imm9);
inst.V = static_cast<uint8_t>(enc.V);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::STRH_32_LDST_IMMPRE;
inst.iclass = InstName::STRH;
return true;
}
static bool TryExtractSTRH_32_LDST_POS(InstData &inst, uint32_t bits) {
// bits
// & 11111111110000000000000000000000
// --------------------------------
// 01111001000000000000000000000000
if ((bits & 0xffc00000U) != 0x79000000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t imm12 : 12;
uint32_t opc : 2;
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.imm12.uimm = static_cast<uint64_t>(enc.imm12);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.V = static_cast<uint8_t>(enc.V);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::STRH_32_LDST_POS;
inst.iclass = InstName::STRH;
return true;
}
static bool TryExtractSCVTF_H32_FLOAT2INT(InstData &inst, uint32_t bits) {
// bits
// & 11111111111111111111110000000000
// --------------------------------
// 00011110111000100000000000000000
if ((bits & 0xfffffc00U) != 0x1ee20000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t _12 : 1; // 0
uint32_t _13 : 1; // 0
uint32_t _14 : 1; // 0
uint32_t _15 : 1; // 0
uint32_t opcode : 3;
uint32_t rmode : 2;
uint32_t _21 : 1; // 1
uint32_t type : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t _30 : 1; // 0
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.sf = static_cast<uint8_t>(enc.sf);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.type = static_cast<uint8_t>(enc.type);
inst.rmode = static_cast<uint8_t>(enc.rmode);
inst.iform = InstForm::SCVTF_H32_FLOAT2INT;
inst.iclass = InstName::SCVTF;
return true;
}
static bool TryExtractSCVTF_S32_FLOAT2INT(InstData &inst, uint32_t bits) {
// bits
// & 11111111111111111111110000000000
// --------------------------------
// 00011110001000100000000000000000
if ((bits & 0xfffffc00U) != 0x1e220000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t _12 : 1; // 0
uint32_t _13 : 1; // 0
uint32_t _14 : 1; // 0
uint32_t _15 : 1; // 0
uint32_t opcode : 3;
uint32_t rmode : 2;
uint32_t _21 : 1; // 1
uint32_t type : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t _30 : 1; // 0
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.sf = static_cast<uint8_t>(enc.sf);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.type = static_cast<uint8_t>(enc.type);
inst.rmode = static_cast<uint8_t>(enc.rmode);
inst.iform = InstForm::SCVTF_S32_FLOAT2INT;
inst.iclass = InstName::SCVTF;
return true;
}
static bool TryExtractSCVTF_D32_FLOAT2INT(InstData &inst, uint32_t bits) {
// bits
// & 11111111111111111111110000000000
// --------------------------------
// 00011110011000100000000000000000
if ((bits & 0xfffffc00U) != 0x1e620000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t _12 : 1; // 0
uint32_t _13 : 1; // 0
uint32_t _14 : 1; // 0
uint32_t _15 : 1; // 0
uint32_t opcode : 3;
uint32_t rmode : 2;
uint32_t _21 : 1; // 1
uint32_t type : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t _30 : 1; // 0
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.sf = static_cast<uint8_t>(enc.sf);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.type = static_cast<uint8_t>(enc.type);
inst.rmode = static_cast<uint8_t>(enc.rmode);
inst.iform = InstForm::SCVTF_D32_FLOAT2INT;
inst.iclass = InstName::SCVTF;
return true;
}
static bool TryExtractSCVTF_H64_FLOAT2INT(InstData &inst, uint32_t bits) {
// bits
// & 11111111111111111111110000000000
// --------------------------------
// 10011110111000100000000000000000
if ((bits & 0xfffffc00U) != 0x9ee20000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t _12 : 1; // 0
uint32_t _13 : 1; // 0
uint32_t _14 : 1; // 0
uint32_t _15 : 1; // 0
uint32_t opcode : 3;
uint32_t rmode : 2;
uint32_t _21 : 1; // 1
uint32_t type : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t _30 : 1; // 0
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.sf = static_cast<uint8_t>(enc.sf);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.type = static_cast<uint8_t>(enc.type);
inst.rmode = static_cast<uint8_t>(enc.rmode);
inst.iform = InstForm::SCVTF_H64_FLOAT2INT;
inst.iclass = InstName::SCVTF;
return true;
}
static bool TryExtractSCVTF_S64_FLOAT2INT(InstData &inst, uint32_t bits) {
// bits
// & 11111111111111111111110000000000
// --------------------------------
// 10011110001000100000000000000000
if ((bits & 0xfffffc00U) != 0x9e220000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t _12 : 1; // 0
uint32_t _13 : 1; // 0
uint32_t _14 : 1; // 0
uint32_t _15 : 1; // 0
uint32_t opcode : 3;
uint32_t rmode : 2;
uint32_t _21 : 1; // 1
uint32_t type : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t _30 : 1; // 0
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.sf = static_cast<uint8_t>(enc.sf);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.type = static_cast<uint8_t>(enc.type);
inst.rmode = static_cast<uint8_t>(enc.rmode);
inst.iform = InstForm::SCVTF_S64_FLOAT2INT;
inst.iclass = InstName::SCVTF;
return true;
}
static bool TryExtractSCVTF_D64_FLOAT2INT(InstData &inst, uint32_t bits) {
// bits
// & 11111111111111111111110000000000
// --------------------------------
// 10011110011000100000000000000000
if ((bits & 0xfffffc00U) != 0x9e620000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t _12 : 1; // 0
uint32_t _13 : 1; // 0
uint32_t _14 : 1; // 0
uint32_t _15 : 1; // 0
uint32_t opcode : 3;
uint32_t rmode : 2;
uint32_t _21 : 1; // 1
uint32_t type : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t _30 : 1; // 0
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.sf = static_cast<uint8_t>(enc.sf);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.type = static_cast<uint8_t>(enc.type);
inst.rmode = static_cast<uint8_t>(enc.rmode);
inst.iform = InstForm::SCVTF_D64_FLOAT2INT;
inst.iclass = InstName::SCVTF;
return true;
}
static bool TryExtractSTUMAXB_32S_MEMOP(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000011111
// --------------------------------
// 00111000001000000110000000011111
if ((bits & 0xffe0fc1fU) != 0x3820601fU) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t opc : 3;
uint32_t o3 : 1;
uint32_t Rs : 5;
uint32_t _21 : 1; // 1
uint32_t R : 1;
uint32_t A : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.A = static_cast<uint8_t>(enc.A);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.V = static_cast<uint8_t>(enc.V);
inst.R = static_cast<uint8_t>(enc.R);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o3 = static_cast<uint8_t>(enc.o3);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::STUMAXB_32S_MEMOP;
inst.iclass = InstName::STUMAXB;
return true;
}
static bool TryExtractSTUMAXLB_32S_MEMOP(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000011111
// --------------------------------
// 00111000011000000110000000011111
if ((bits & 0xffe0fc1fU) != 0x3860601fU) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t opc : 3;
uint32_t o3 : 1;
uint32_t Rs : 5;
uint32_t _21 : 1; // 1
uint32_t R : 1;
uint32_t A : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.A = static_cast<uint8_t>(enc.A);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.V = static_cast<uint8_t>(enc.V);
inst.R = static_cast<uint8_t>(enc.R);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o3 = static_cast<uint8_t>(enc.o3);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::STUMAXLB_32S_MEMOP;
inst.iclass = InstName::STUMAXLB;
return true;
}
static bool TryExtractCMHI_ASISDSAME_ONLY(InstData &inst, uint32_t bits) {
// bits
// & 11111111001000001111110000000000
// --------------------------------
// 01111110001000000011010000000000
if ((bits & 0xff20fc00U) != 0x7e203400U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t eq : 1;
uint32_t _12 : 1; // 1
uint32_t _13 : 1; // 1
uint32_t _14 : 1; // 0
uint32_t _15 : 1; // 0
uint32_t Rm : 5;
uint32_t _21 : 1; // 1
uint32_t size : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t U : 1;
uint32_t _30 : 1; // 1
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.eq = static_cast<uint8_t>(enc.eq);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::CMHI_ASISDSAME_ONLY;
inst.iclass = InstName::CMHI;
return true;
}
static bool TryExtractCMHI_ASIMDSAME_ONLY(InstData &inst, uint32_t bits) {
// bits
// & 10111111001000001111110000000000
// --------------------------------
// 00101110001000000011010000000000
if ((bits & 0xbf20fc00U) != 0x2e203400U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t eq : 1;
uint32_t _12 : 1; // 1
uint32_t _13 : 1; // 1
uint32_t _14 : 1; // 0
uint32_t _15 : 1; // 0
uint32_t Rm : 5;
uint32_t _21 : 1; // 1
uint32_t size : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.eq = static_cast<uint8_t>(enc.eq);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::CMHI_ASIMDSAME_ONLY;
inst.iclass = InstName::CMHI;
return true;
}
static bool TryExtractSQDMLAL_ASISDDIFF_ONLY(InstData &inst, uint32_t bits) {
// bits
// & 11111111001000001111110000000000
// --------------------------------
// 01011110001000001001000000000000
if ((bits & 0xff20fc00U) != 0x5e209000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t _12 : 1; // 1
uint32_t o1 : 1;
uint32_t _14 : 1; // 0
uint32_t _15 : 1; // 1
uint32_t Rm : 5;
uint32_t _21 : 1; // 1
uint32_t size : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t U : 1;
uint32_t _30 : 1; // 1
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o1 = static_cast<uint8_t>(enc.o1);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::SQDMLAL_ASISDDIFF_ONLY;
inst.iclass = InstName::SQDMLAL;
return true;
}
static bool TryExtractSQDMLAL_ASIMDDIFF_L(InstData &inst, uint32_t bits) {
// bits
// & 10111111001000001111110000000000
// --------------------------------
// 00001110001000001001000000000000
if ((bits & 0xbf20fc00U) != 0xe209000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t _12 : 1; // 1
uint32_t o1 : 1;
uint32_t _14 : 1; // 0
uint32_t _15 : 1; // 1
uint32_t Rm : 5;
uint32_t _21 : 1; // 1
uint32_t size : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o1 = static_cast<uint8_t>(enc.o1);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::SQDMLAL_ASIMDDIFF_L;
inst.iclass = InstName::SQDMLAL;
return true;
}
static bool TryExtractCBNZ_32_COMPBRANCH(InstData &inst, uint32_t bits) {
// bits
// & 11111111000000000000000000000000
// --------------------------------
// 00110101000000000000000000000000
if ((bits & 0xff000000U) != 0x35000000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t imm19 : 19;
uint32_t op : 1;
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 0
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t _30 : 1; // 0
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.imm19.uimm = static_cast<uint64_t>(enc.imm19);
inst.sf = static_cast<uint8_t>(enc.sf);
inst.op = static_cast<uint8_t>(enc.op);
inst.iform = InstForm::CBNZ_32_COMPBRANCH;
inst.iclass = InstName::CBNZ;
return true;
}
static bool TryExtractCBNZ_64_COMPBRANCH(InstData &inst, uint32_t bits) {
// bits
// & 11111111000000000000000000000000
// --------------------------------
// 10110101000000000000000000000000
if ((bits & 0xff000000U) != 0xb5000000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t imm19 : 19;
uint32_t op : 1;
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 0
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t _30 : 1; // 0
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.imm19.uimm = static_cast<uint64_t>(enc.imm19);
inst.sf = static_cast<uint8_t>(enc.sf);
inst.op = static_cast<uint8_t>(enc.op);
inst.iform = InstForm::CBNZ_64_COMPBRANCH;
inst.iclass = InstName::CBNZ;
return true;
}
static bool TryExtractSEVL_HI_SYSTEM(InstData &inst, uint32_t bits) {
// bits
// & 11111111111111111111111111111111
// --------------------------------
// 11010101000000110010000010111111
if ((bits & 0xffffffffU) != 0xd50320bfU) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t op2 : 3;
uint32_t CRm : 4;
uint32_t CRn : 4;
uint32_t op1 : 3;
uint32_t op0 : 2;
uint32_t L : 1;
uint32_t _22 : 1; // 0
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 0
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 0
uint32_t _30 : 1; // 1
uint32_t _31 : 1; // 1
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.op0 = static_cast<uint8_t>(enc.op0);
inst.op1 = static_cast<uint8_t>(enc.op1);
inst.op2 = static_cast<uint8_t>(enc.op2);
inst.L = static_cast<uint8_t>(enc.L);
inst.CRn = static_cast<uint8_t>(enc.CRn);
inst.CRm = static_cast<uint8_t>(enc.CRm);
inst.iform = InstForm::SEVL_HI_SYSTEM;
inst.iclass = InstName::SEVL;
return true;
}
static bool TryExtractFRINTX_H_FLOATDP1(InstData &inst, uint32_t bits) {
// bits
// & 11111111111111111111110000000000
// --------------------------------
// 00011110111001110100000000000000
if ((bits & 0xfffffc00U) != 0x1ee74000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t _12 : 1; // 0
uint32_t _13 : 1; // 0
uint32_t _14 : 1; // 1
uint32_t rmode : 3;
uint32_t _18 : 1; // 1
uint32_t _19 : 1; // 0
uint32_t _20 : 1; // 0
uint32_t _21 : 1; // 1
uint32_t type : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t _30 : 1; // 0
uint32_t M : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.M = static_cast<uint8_t>(enc.M);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.type = static_cast<uint8_t>(enc.type);
inst.rmode = static_cast<uint8_t>(enc.rmode);
inst.iform = InstForm::FRINTX_H_FLOATDP1;
inst.iclass = InstName::FRINTX;
return true;
}
static bool TryExtractFRINTX_S_FLOATDP1(InstData &inst, uint32_t bits) {
// bits
// & 11111111111111111111110000000000
// --------------------------------
// 00011110001001110100000000000000
if ((bits & 0xfffffc00U) != 0x1e274000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t _12 : 1; // 0
uint32_t _13 : 1; // 0
uint32_t _14 : 1; // 1
uint32_t rmode : 3;
uint32_t _18 : 1; // 1
uint32_t _19 : 1; // 0
uint32_t _20 : 1; // 0
uint32_t _21 : 1; // 1
uint32_t type : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t _30 : 1; // 0
uint32_t M : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.M = static_cast<uint8_t>(enc.M);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.type = static_cast<uint8_t>(enc.type);
inst.rmode = static_cast<uint8_t>(enc.rmode);
inst.iform = InstForm::FRINTX_S_FLOATDP1;
inst.iclass = InstName::FRINTX;
return true;
}
static bool TryExtractFRINTX_D_FLOATDP1(InstData &inst, uint32_t bits) {
// bits
// & 11111111111111111111110000000000
// --------------------------------
// 00011110011001110100000000000000
if ((bits & 0xfffffc00U) != 0x1e674000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t _12 : 1; // 0
uint32_t _13 : 1; // 0
uint32_t _14 : 1; // 1
uint32_t rmode : 3;
uint32_t _18 : 1; // 1
uint32_t _19 : 1; // 0
uint32_t _20 : 1; // 0
uint32_t _21 : 1; // 1
uint32_t type : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t _30 : 1; // 0
uint32_t M : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.M = static_cast<uint8_t>(enc.M);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.type = static_cast<uint8_t>(enc.type);
inst.rmode = static_cast<uint8_t>(enc.rmode);
inst.iform = InstForm::FRINTX_D_FLOATDP1;
inst.iclass = InstName::FRINTX;
return true;
}
static bool TryExtractCMN_ADDS_32_ADDSUB_SHIFT(InstData &inst, uint32_t bits) {
// bits
// & 11111111001000000000000000011111
// --------------------------------
// 00101011000000000000000000011111
if ((bits & 0xff20001fU) != 0x2b00001fU) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t imm6 : 6;
uint32_t Rm : 5;
uint32_t _21 : 1; // 0
uint32_t shift : 2;
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t S : 1;
uint32_t op : 1;
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.shift = static_cast<uint8_t>(enc.shift);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.op = static_cast<uint8_t>(enc.op);
inst.sf = static_cast<uint8_t>(enc.sf);
inst.imm6.uimm = static_cast<uint64_t>(enc.imm6);
inst.iform = InstForm::CMN_ADDS_32_ADDSUB_SHIFT;
inst.iclass = InstName::ADDS;
return true;
}
static bool TryExtractCMN_ADDS_64_ADDSUB_SHIFT(InstData &inst, uint32_t bits) {
// bits
// & 11111111001000000000000000011111
// --------------------------------
// 10101011000000000000000000011111
if ((bits & 0xff20001fU) != 0xab00001fU) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t imm6 : 6;
uint32_t Rm : 5;
uint32_t _21 : 1; // 0
uint32_t shift : 2;
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t S : 1;
uint32_t op : 1;
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.shift = static_cast<uint8_t>(enc.shift);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.op = static_cast<uint8_t>(enc.op);
inst.sf = static_cast<uint8_t>(enc.sf);
inst.imm6.uimm = static_cast<uint64_t>(enc.imm6);
inst.iform = InstForm::CMN_ADDS_64_ADDSUB_SHIFT;
inst.iclass = InstName::ADDS;
return true;
}
static bool TryExtractSMIN_ASIMDSAME_ONLY(InstData &inst, uint32_t bits) {
// bits
// & 10111111001000001111110000000000
// --------------------------------
// 00001110001000000110110000000000
if ((bits & 0xbf20fc00U) != 0xe206c00U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t o1 : 1;
uint32_t _12 : 1; // 0
uint32_t _13 : 1; // 1
uint32_t _14 : 1; // 1
uint32_t _15 : 1; // 0
uint32_t Rm : 5;
uint32_t _21 : 1; // 1
uint32_t size : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o1 = static_cast<uint8_t>(enc.o1);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::SMIN_ASIMDSAME_ONLY;
inst.iclass = InstName::SMIN;
return true;
}
static bool TryExtractLDUMAXAB_32_MEMOP(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 00111000101000000110000000000000
if ((bits & 0xffe0fc00U) != 0x38a06000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t opc : 3;
uint32_t o3 : 1;
uint32_t Rs : 5;
uint32_t _21 : 1; // 1
uint32_t R : 1;
uint32_t A : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.A = static_cast<uint8_t>(enc.A);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.V = static_cast<uint8_t>(enc.V);
inst.R = static_cast<uint8_t>(enc.R);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o3 = static_cast<uint8_t>(enc.o3);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LDUMAXAB_32_MEMOP;
inst.iclass = InstName::LDUMAXAB;
return true;
}
static bool TryExtractLDUMAXALB_32_MEMOP(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 00111000111000000110000000000000
if ((bits & 0xffe0fc00U) != 0x38e06000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t opc : 3;
uint32_t o3 : 1;
uint32_t Rs : 5;
uint32_t _21 : 1; // 1
uint32_t R : 1;
uint32_t A : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.A = static_cast<uint8_t>(enc.A);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.V = static_cast<uint8_t>(enc.V);
inst.R = static_cast<uint8_t>(enc.R);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o3 = static_cast<uint8_t>(enc.o3);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LDUMAXALB_32_MEMOP;
inst.iclass = InstName::LDUMAXALB;
return true;
}
static bool TryExtractLDUMAXB_32_MEMOP(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 00111000001000000110000000000000
if ((bits & 0xffe0fc00U) != 0x38206000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t opc : 3;
uint32_t o3 : 1;
uint32_t Rs : 5;
uint32_t _21 : 1; // 1
uint32_t R : 1;
uint32_t A : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.A = static_cast<uint8_t>(enc.A);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.V = static_cast<uint8_t>(enc.V);
inst.R = static_cast<uint8_t>(enc.R);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o3 = static_cast<uint8_t>(enc.o3);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LDUMAXB_32_MEMOP;
inst.iclass = InstName::LDUMAXB;
return true;
}
static bool TryExtractLDUMAXLB_32_MEMOP(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 00111000011000000110000000000000
if ((bits & 0xffe0fc00U) != 0x38606000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t opc : 3;
uint32_t o3 : 1;
uint32_t Rs : 5;
uint32_t _21 : 1; // 1
uint32_t R : 1;
uint32_t A : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.A = static_cast<uint8_t>(enc.A);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.V = static_cast<uint8_t>(enc.V);
inst.R = static_cast<uint8_t>(enc.R);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o3 = static_cast<uint8_t>(enc.o3);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LDUMAXLB_32_MEMOP;
inst.iclass = InstName::LDUMAXLB;
return true;
}
static bool TryExtractAESE_B_CRYPTOAES(InstData &inst, uint32_t bits) {
// bits
// & 11111111111111111111110000000000
// --------------------------------
// 01001110001010000100100000000000
if ((bits & 0xfffffc00U) != 0x4e284800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t D : 1;
uint32_t _13 : 1; // 0
uint32_t _14 : 1; // 1
uint32_t _15 : 1; // 0
uint32_t _16 : 1; // 0
uint32_t _17 : 1; // 0
uint32_t _18 : 1; // 0
uint32_t _19 : 1; // 1
uint32_t _20 : 1; // 0
uint32_t _21 : 1; // 1
uint32_t size : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 0
uint32_t _30 : 1; // 1
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.D = static_cast<uint8_t>(enc.D);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::AESE_B_CRYPTOAES;
inst.iclass = InstName::AESE;
return true;
}
static bool TryExtractSMAXP_ASIMDSAME_ONLY(InstData &inst, uint32_t bits) {
// bits
// & 10111111001000001111110000000000
// --------------------------------
// 00001110001000001010010000000000
if ((bits & 0xbf20fc00U) != 0xe20a400U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t o1 : 1;
uint32_t _12 : 1; // 0
uint32_t _13 : 1; // 1
uint32_t _14 : 1; // 0
uint32_t _15 : 1; // 1
uint32_t Rm : 5;
uint32_t _21 : 1; // 1
uint32_t size : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o1 = static_cast<uint8_t>(enc.o1);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::SMAXP_ASIMDSAME_ONLY;
inst.iclass = InstName::SMAXP;
return true;
}
static bool TryExtractSTXR_SR32_LDSTEXCL(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 10001000000000000111110000000000
if ((bits & 0xffe0fc00U) != 0x88007c00U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t Rt2 : 5;
uint32_t o0 : 1;
uint32_t Rs : 5;
uint32_t o1 : 1;
uint32_t L : 1;
uint32_t o2 : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 0
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.L = static_cast<uint8_t>(enc.L);
inst.Rt2 = static_cast<uint8_t>(enc.Rt2);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.o2 = static_cast<uint8_t>(enc.o2);
inst.o1 = static_cast<uint8_t>(enc.o1);
inst.o0 = static_cast<uint8_t>(enc.o0);
inst.iform = InstForm::STXR_SR32_LDSTEXCL;
inst.iclass = InstName::STXR;
return true;
}
static bool TryExtractSTXR_SR64_LDSTEXCL(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 11001000000000000111110000000000
if ((bits & 0xffe0fc00U) != 0xc8007c00U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t Rt2 : 5;
uint32_t o0 : 1;
uint32_t Rs : 5;
uint32_t o1 : 1;
uint32_t L : 1;
uint32_t o2 : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 0
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.L = static_cast<uint8_t>(enc.L);
inst.Rt2 = static_cast<uint8_t>(enc.Rt2);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.o2 = static_cast<uint8_t>(enc.o2);
inst.o1 = static_cast<uint8_t>(enc.o1);
inst.o0 = static_cast<uint8_t>(enc.o0);
inst.iform = InstForm::STXR_SR64_LDSTEXCL;
inst.iclass = InstName::STXR;
return true;
}
static bool TryExtractSUB_32_ADDSUB_IMM(InstData &inst, uint32_t bits) {
// bits
// & 11111111000000000000000000000000
// --------------------------------
// 01010001000000000000000000000000
if ((bits & 0xff000000U) != 0x51000000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t imm12 : 12;
uint32_t shift : 2;
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 0
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t op : 1;
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.imm12.uimm = static_cast<uint64_t>(enc.imm12);
inst.shift = static_cast<uint8_t>(enc.shift);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.sf = static_cast<uint8_t>(enc.sf);
inst.op = static_cast<uint8_t>(enc.op);
inst.iform = InstForm::SUB_32_ADDSUB_IMM;
inst.iclass = InstName::SUB;
return true;
}
static bool TryExtractSUB_64_ADDSUB_IMM(InstData &inst, uint32_t bits) {
// bits
// & 11111111000000000000000000000000
// --------------------------------
// 11010001000000000000000000000000
if ((bits & 0xff000000U) != 0xd1000000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t imm12 : 12;
uint32_t shift : 2;
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 0
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t op : 1;
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.imm12.uimm = static_cast<uint64_t>(enc.imm12);
inst.shift = static_cast<uint8_t>(enc.shift);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.sf = static_cast<uint8_t>(enc.sf);
inst.op = static_cast<uint8_t>(enc.op);
inst.iform = InstForm::SUB_64_ADDSUB_IMM;
inst.iclass = InstName::SUB;
return true;
}
static bool TryExtractCMLT_ASISDMISC_Z(InstData &inst, uint32_t bits) {
// bits
// & 11111111001111111111110000000000
// --------------------------------
// 01011110001000001010100000000000
if ((bits & 0xff3ffc00U) != 0x5e20a800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t opcode : 5;
uint32_t _17 : 1; // 0
uint32_t _18 : 1; // 0
uint32_t _19 : 1; // 0
uint32_t _20 : 1; // 0
uint32_t _21 : 1; // 1
uint32_t size : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t U : 1;
uint32_t _30 : 1; // 1
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::CMLT_ASISDMISC_Z;
inst.iclass = InstName::CMLT;
return true;
}
static bool TryExtractCMLT_ASIMDMISC_Z(InstData &inst, uint32_t bits) {
// bits
// & 10111111001111111111110000000000
// --------------------------------
// 00001110001000001010100000000000
if ((bits & 0xbf3ffc00U) != 0xe20a800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t opcode : 5;
uint32_t _17 : 1; // 0
uint32_t _18 : 1; // 0
uint32_t _19 : 1; // 0
uint32_t _20 : 1; // 0
uint32_t _21 : 1; // 1
uint32_t size : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.U = static_cast<uint8_t>(enc.U);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::CMLT_ASIMDMISC_Z;
inst.iclass = InstName::CMLT;
return true;
}
static bool TryExtractFCMEQ_ASISDSAMEFP16_ONLY(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 01011110010000000010010000000000
if ((bits & 0xffe0fc00U) != 0x5e402400U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t ac : 1;
uint32_t _12 : 1; // 0
uint32_t _13 : 1; // 1
uint32_t _14 : 1; // 0
uint32_t _15 : 1; // 0
uint32_t Rm : 5;
uint32_t _21 : 1; // 0
uint32_t _22 : 1; // 1
uint32_t E : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t U : 1;
uint32_t _30 : 1; // 1
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.ac = static_cast<uint8_t>(enc.ac);
inst.E = static_cast<uint8_t>(enc.E);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.iform = InstForm::FCMEQ_ASISDSAMEFP16_ONLY;
inst.iclass = InstName::FCMEQ;
return true;
}
static bool TryExtractFCMEQ_ASISDSAME_ONLY(InstData &inst, uint32_t bits) {
// bits
// & 11111111101000001111110000000000
// --------------------------------
// 01011110001000001110010000000000
if ((bits & 0xffa0fc00U) != 0x5e20e400U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t ac : 1;
uint32_t _12 : 1; // 0
uint32_t _13 : 1; // 1
uint32_t _14 : 1; // 1
uint32_t _15 : 1; // 1
uint32_t Rm : 5;
uint32_t _21 : 1; // 1
uint32_t sz : 1;
uint32_t E : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t U : 1;
uint32_t _30 : 1; // 1
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.sz = static_cast<uint8_t>(enc.sz);
inst.ac = static_cast<uint8_t>(enc.ac);
inst.E = static_cast<uint8_t>(enc.E);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.iform = InstForm::FCMEQ_ASISDSAME_ONLY;
inst.iclass = InstName::FCMEQ;
return true;
}
static bool TryExtractFCMEQ_ASIMDSAMEFP16_ONLY(InstData &inst, uint32_t bits) {
// bits
// & 10111111111000001111110000000000
// --------------------------------
// 00001110010000000010010000000000
if ((bits & 0xbfe0fc00U) != 0xe402400U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t ac : 1;
uint32_t _12 : 1; // 0
uint32_t _13 : 1; // 1
uint32_t _14 : 1; // 0
uint32_t _15 : 1; // 0
uint32_t Rm : 5;
uint32_t _21 : 1; // 0
uint32_t _22 : 1; // 1
uint32_t E : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Q = static_cast<uint8_t>(enc.Q);
inst.ac = static_cast<uint8_t>(enc.ac);
inst.E = static_cast<uint8_t>(enc.E);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.iform = InstForm::FCMEQ_ASIMDSAMEFP16_ONLY;
inst.iclass = InstName::FCMEQ;
return true;
}
static bool TryExtractFCMEQ_ASIMDSAME_ONLY(InstData &inst, uint32_t bits) {
// bits
// & 10111111101000001111110000000000
// --------------------------------
// 00001110001000001110010000000000
if ((bits & 0xbfa0fc00U) != 0xe20e400U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t ac : 1;
uint32_t _12 : 1; // 0
uint32_t _13 : 1; // 1
uint32_t _14 : 1; // 1
uint32_t _15 : 1; // 1
uint32_t Rm : 5;
uint32_t _21 : 1; // 1
uint32_t sz : 1;
uint32_t E : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.sz = static_cast<uint8_t>(enc.sz);
inst.ac = static_cast<uint8_t>(enc.ac);
inst.E = static_cast<uint8_t>(enc.E);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.iform = InstForm::FCMEQ_ASIMDSAME_ONLY;
inst.iclass = InstName::FCMEQ;
return true;
}
static bool TryExtractCLREX_BN_SYSTEM(InstData &inst, uint32_t bits) {
// bits
// & 11111111111111111111000011111111
// --------------------------------
// 11010101000000110011000001011111
if ((bits & 0xfffff0ffU) != 0xd503305fU) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t op2 : 3;
uint32_t CRm : 4;
uint32_t CRn : 4;
uint32_t op1 : 3;
uint32_t op0 : 2;
uint32_t L : 1;
uint32_t _22 : 1; // 0
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 0
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 0
uint32_t _30 : 1; // 1
uint32_t _31 : 1; // 1
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.op0 = static_cast<uint8_t>(enc.op0);
inst.op1 = static_cast<uint8_t>(enc.op1);
inst.op2 = static_cast<uint8_t>(enc.op2);
inst.L = static_cast<uint8_t>(enc.L);
inst.CRn = static_cast<uint8_t>(enc.CRn);
inst.CRm = static_cast<uint8_t>(enc.CRm);
inst.iform = InstForm::CLREX_BN_SYSTEM;
inst.iclass = InstName::CLREX;
return true;
}
static bool TryExtractFSUB_ASIMDSAMEFP16_ONLY(InstData &inst, uint32_t bits) {
// bits
// & 10111111111000001111110000000000
// --------------------------------
// 00001110110000000001010000000000
if ((bits & 0xbfe0fc00U) != 0xec01400U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t opcode : 3;
uint32_t _14 : 1; // 0
uint32_t _15 : 1; // 0
uint32_t Rm : 5;
uint32_t _21 : 1; // 0
uint32_t _22 : 1; // 1
uint32_t a : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.a = static_cast<uint8_t>(enc.a);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.U = static_cast<uint8_t>(enc.U);
inst.iform = InstForm::FSUB_ASIMDSAMEFP16_ONLY;
inst.iclass = InstName::FSUB;
return true;
}
static bool TryExtractFSUB_ASIMDSAME_ONLY(InstData &inst, uint32_t bits) {
// bits
// & 10111111101000001111110000000000
// --------------------------------
// 00001110101000001101010000000000
if ((bits & 0xbfa0fc00U) != 0xea0d400U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t opcode : 5;
uint32_t Rm : 5;
uint32_t _21 : 1; // 1
uint32_t sz : 1;
uint32_t _23 : 1; // 1
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.sz = static_cast<uint8_t>(enc.sz);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.U = static_cast<uint8_t>(enc.U);
inst.iform = InstForm::FSUB_ASIMDSAME_ONLY;
inst.iclass = InstName::FSUB;
return true;
}
static bool TryExtractSHLL_ASIMDMISC_S(InstData &inst, uint32_t bits) {
// bits
// & 10111111001111111111110000000000
// --------------------------------
// 00101110001000010011100000000000
if ((bits & 0xbf3ffc00U) != 0x2e213800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t opcode : 5;
uint32_t _17 : 1; // 0
uint32_t _18 : 1; // 0
uint32_t _19 : 1; // 0
uint32_t _20 : 1; // 0
uint32_t _21 : 1; // 1
uint32_t size : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.U = static_cast<uint8_t>(enc.U);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::SHLL_ASIMDMISC_S;
inst.iclass = InstName::SHLL;
return true;
}
static bool TryExtractSQADD_ASISDSAME_ONLY(InstData &inst, uint32_t bits) {
// bits
// & 11111111001000001111110000000000
// --------------------------------
// 01011110001000000000110000000000
if ((bits & 0xff20fc00U) != 0x5e200c00U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t opcode : 5;
uint32_t Rm : 5;
uint32_t _21 : 1; // 1
uint32_t size : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t U : 1;
uint32_t _30 : 1; // 1
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.U = static_cast<uint8_t>(enc.U);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::SQADD_ASISDSAME_ONLY;
inst.iclass = InstName::SQADD;
return true;
}
static bool TryExtractSQADD_ASIMDSAME_ONLY(InstData &inst, uint32_t bits) {
// bits
// & 10111111001000001111110000000000
// --------------------------------
// 00001110001000000000110000000000
if ((bits & 0xbf20fc00U) != 0xe200c00U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t opcode : 5;
uint32_t Rm : 5;
uint32_t _21 : 1; // 1
uint32_t size : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.U = static_cast<uint8_t>(enc.U);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::SQADD_ASIMDSAME_ONLY;
inst.iclass = InstName::SQADD;
return true;
}
static bool TryExtractBIC_ASIMDSAME_ONLY(InstData &inst, uint32_t bits) {
// bits
// & 10111111111000001111110000000000
// --------------------------------
// 00001110011000000001110000000000
if ((bits & 0xbfe0fc00U) != 0xe601c00U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t opcode : 5;
uint32_t Rm : 5;
uint32_t _21 : 1; // 1
uint32_t size : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.U = static_cast<uint8_t>(enc.U);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::BIC_ASIMDSAME_ONLY;
inst.iclass = InstName::BIC;
return true;
}
static bool TryExtractSUB_ASISDSAME_ONLY(InstData &inst, uint32_t bits) {
// bits
// & 11111111001000001111110000000000
// --------------------------------
// 01111110001000001000010000000000
if ((bits & 0xff20fc00U) != 0x7e208400U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t opcode : 5;
uint32_t Rm : 5;
uint32_t _21 : 1; // 1
uint32_t size : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t U : 1;
uint32_t _30 : 1; // 1
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.U = static_cast<uint8_t>(enc.U);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::SUB_ASISDSAME_ONLY;
inst.iclass = InstName::SUB;
return true;
}
static bool TryExtractSUB_ASIMDSAME_ONLY(InstData &inst, uint32_t bits) {
// bits
// & 10111111001000001111110000000000
// --------------------------------
// 00101110001000001000010000000000
if ((bits & 0xbf20fc00U) != 0x2e208400U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t opcode : 5;
uint32_t Rm : 5;
uint32_t _21 : 1; // 1
uint32_t size : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.U = static_cast<uint8_t>(enc.U);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::SUB_ASIMDSAME_ONLY;
inst.iclass = InstName::SUB;
return true;
}
static bool TryExtractSWPA_32_MEMOP(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 10111000101000001000000000000000
if ((bits & 0xffe0fc00U) != 0xb8a08000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t opc : 3;
uint32_t o3 : 1;
uint32_t Rs : 5;
uint32_t _21 : 1; // 1
uint32_t R : 1;
uint32_t A : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.A = static_cast<uint8_t>(enc.A);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.V = static_cast<uint8_t>(enc.V);
inst.R = static_cast<uint8_t>(enc.R);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o3 = static_cast<uint8_t>(enc.o3);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::SWPA_32_MEMOP;
inst.iclass = InstName::SWPA;
return true;
}
static bool TryExtractSWPAL_32_MEMOP(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 10111000111000001000000000000000
if ((bits & 0xffe0fc00U) != 0xb8e08000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t opc : 3;
uint32_t o3 : 1;
uint32_t Rs : 5;
uint32_t _21 : 1; // 1
uint32_t R : 1;
uint32_t A : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.A = static_cast<uint8_t>(enc.A);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.V = static_cast<uint8_t>(enc.V);
inst.R = static_cast<uint8_t>(enc.R);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o3 = static_cast<uint8_t>(enc.o3);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::SWPAL_32_MEMOP;
inst.iclass = InstName::SWPAL;
return true;
}
static bool TryExtractSWP_32_MEMOP(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 10111000001000001000000000000000
if ((bits & 0xffe0fc00U) != 0xb8208000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t opc : 3;
uint32_t o3 : 1;
uint32_t Rs : 5;
uint32_t _21 : 1; // 1
uint32_t R : 1;
uint32_t A : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.A = static_cast<uint8_t>(enc.A);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.V = static_cast<uint8_t>(enc.V);
inst.R = static_cast<uint8_t>(enc.R);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o3 = static_cast<uint8_t>(enc.o3);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::SWP_32_MEMOP;
inst.iclass = InstName::SWP;
return true;
}
static bool TryExtractSWPL_32_MEMOP(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 10111000011000001000000000000000
if ((bits & 0xffe0fc00U) != 0xb8608000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t opc : 3;
uint32_t o3 : 1;
uint32_t Rs : 5;
uint32_t _21 : 1; // 1
uint32_t R : 1;
uint32_t A : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.A = static_cast<uint8_t>(enc.A);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.V = static_cast<uint8_t>(enc.V);
inst.R = static_cast<uint8_t>(enc.R);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o3 = static_cast<uint8_t>(enc.o3);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::SWPL_32_MEMOP;
inst.iclass = InstName::SWPL;
return true;
}
static bool TryExtractSWPA_64_MEMOP(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 11111000101000001000000000000000
if ((bits & 0xffe0fc00U) != 0xf8a08000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t opc : 3;
uint32_t o3 : 1;
uint32_t Rs : 5;
uint32_t _21 : 1; // 1
uint32_t R : 1;
uint32_t A : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.A = static_cast<uint8_t>(enc.A);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.V = static_cast<uint8_t>(enc.V);
inst.R = static_cast<uint8_t>(enc.R);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o3 = static_cast<uint8_t>(enc.o3);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::SWPA_64_MEMOP;
inst.iclass = InstName::SWPA;
return true;
}
static bool TryExtractSWPAL_64_MEMOP(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 11111000111000001000000000000000
if ((bits & 0xffe0fc00U) != 0xf8e08000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t opc : 3;
uint32_t o3 : 1;
uint32_t Rs : 5;
uint32_t _21 : 1; // 1
uint32_t R : 1;
uint32_t A : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.A = static_cast<uint8_t>(enc.A);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.V = static_cast<uint8_t>(enc.V);
inst.R = static_cast<uint8_t>(enc.R);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o3 = static_cast<uint8_t>(enc.o3);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::SWPAL_64_MEMOP;
inst.iclass = InstName::SWPAL;
return true;
}
static bool TryExtractSWP_64_MEMOP(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 11111000001000001000000000000000
if ((bits & 0xffe0fc00U) != 0xf8208000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t opc : 3;
uint32_t o3 : 1;
uint32_t Rs : 5;
uint32_t _21 : 1; // 1
uint32_t R : 1;
uint32_t A : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.A = static_cast<uint8_t>(enc.A);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.V = static_cast<uint8_t>(enc.V);
inst.R = static_cast<uint8_t>(enc.R);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o3 = static_cast<uint8_t>(enc.o3);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::SWP_64_MEMOP;
inst.iclass = InstName::SWP;
return true;
}
static bool TryExtractSWPL_64_MEMOP(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 11111000011000001000000000000000
if ((bits & 0xffe0fc00U) != 0xf8608000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t opc : 3;
uint32_t o3 : 1;
uint32_t Rs : 5;
uint32_t _21 : 1; // 1
uint32_t R : 1;
uint32_t A : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.A = static_cast<uint8_t>(enc.A);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.V = static_cast<uint8_t>(enc.V);
inst.R = static_cast<uint8_t>(enc.R);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o3 = static_cast<uint8_t>(enc.o3);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::SWPL_64_MEMOP;
inst.iclass = InstName::SWPL;
return true;
}
static bool TryExtractSMC_EX_EXCEPTION(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000000000000000011111
// --------------------------------
// 11010100000000000000000000000011
if ((bits & 0xffe0001fU) != 0xd4000003U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t LL : 2;
uint32_t op2 : 3;
uint32_t imm16 : 16;
uint32_t opc : 3;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 0
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 0
uint32_t _30 : 1; // 1
uint32_t _31 : 1; // 1
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.LL = static_cast<uint8_t>(enc.LL);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.op2 = static_cast<uint8_t>(enc.op2);
inst.imm16.uimm = static_cast<uint64_t>(enc.imm16);
inst.iform = InstForm::SMC_EX_EXCEPTION;
inst.iclass = InstName::SMC;
return true;
}
static bool TryExtractLDUR_32_LDST_UNSCALED(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000000000110000000000
// --------------------------------
// 10111000010000000000000000000000
if ((bits & 0xffe00c00U) != 0xb8400000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t imm9 : 9;
uint32_t _21 : 1; // 0
uint32_t opc : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.imm9.uimm = static_cast<uint64_t>(enc.imm9);
inst.V = static_cast<uint8_t>(enc.V);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LDUR_32_LDST_UNSCALED;
inst.iclass = InstName::LDUR;
return true;
}
static bool TryExtractLDUR_64_LDST_UNSCALED(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000000000110000000000
// --------------------------------
// 11111000010000000000000000000000
if ((bits & 0xffe00c00U) != 0xf8400000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t imm9 : 9;
uint32_t _21 : 1; // 0
uint32_t opc : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.imm9.uimm = static_cast<uint64_t>(enc.imm9);
inst.V = static_cast<uint8_t>(enc.V);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LDUR_64_LDST_UNSCALED;
inst.iclass = InstName::LDUR;
return true;
}
static bool TryExtractCMGE_ASISDMISC_Z(InstData &inst, uint32_t bits) {
// bits
// & 11111111001111111111110000000000
// --------------------------------
// 01111110001000001000100000000000
if ((bits & 0xff3ffc00U) != 0x7e208800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t op : 1;
uint32_t _13 : 1; // 0
uint32_t _14 : 1; // 0
uint32_t _15 : 1; // 1
uint32_t _16 : 1; // 0
uint32_t _17 : 1; // 0
uint32_t _18 : 1; // 0
uint32_t _19 : 1; // 0
uint32_t _20 : 1; // 0
uint32_t _21 : 1; // 1
uint32_t size : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t U : 1;
uint32_t _30 : 1; // 1
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.U = static_cast<uint8_t>(enc.U);
inst.op = static_cast<uint8_t>(enc.op);
inst.iform = InstForm::CMGE_ASISDMISC_Z;
inst.iclass = InstName::CMGE;
return true;
}
static bool TryExtractCMGE_ASIMDMISC_Z(InstData &inst, uint32_t bits) {
// bits
// & 10111111001111111111110000000000
// --------------------------------
// 00101110001000001000100000000000
if ((bits & 0xbf3ffc00U) != 0x2e208800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t op : 1;
uint32_t _13 : 1; // 0
uint32_t _14 : 1; // 0
uint32_t _15 : 1; // 1
uint32_t _16 : 1; // 0
uint32_t _17 : 1; // 0
uint32_t _18 : 1; // 0
uint32_t _19 : 1; // 0
uint32_t _20 : 1; // 0
uint32_t _21 : 1; // 1
uint32_t size : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.op = static_cast<uint8_t>(enc.op);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::CMGE_ASIMDMISC_Z;
inst.iclass = InstName::CMGE;
return true;
}
static bool TryExtractUCVTF_ASISDSHF_C(InstData &inst, uint32_t bits) {
// bits
// & 11111111100000001111110000000000
// --------------------------------
// 01111111000000001110010000000000
if ((bits & 0xff80fc00U) != 0x7f00e400U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t opcode : 5;
uint32_t immb : 3;
uint32_t immh : 4;
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t U : 1;
uint32_t _30 : 1; // 1
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.immh.uimm = static_cast<uint64_t>(enc.immh);
if (!(inst.immh.uimm != 0x0))
return false;
inst.immb.uimm = static_cast<uint64_t>(enc.immb);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.iform = InstForm::UCVTF_ASISDSHF_C;
inst.iclass = InstName::UCVTF;
return true;
}
static bool TryExtractUCVTF_ASIMDSHF_C(InstData &inst, uint32_t bits) {
// bits
// & 10111111100000001111110000000000
// --------------------------------
// 00101111000000001110010000000000
if ((bits & 0xbf80fc00U) != 0x2f00e400U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t opcode : 5;
uint32_t immb : 3;
uint32_t immh : 4;
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.immh.uimm = static_cast<uint64_t>(enc.immh);
if (!(inst.immh.uimm != 0x0))
return false;
inst.immb.uimm = static_cast<uint64_t>(enc.immb);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.iform = InstForm::UCVTF_ASIMDSHF_C;
inst.iclass = InstName::UCVTF;
return true;
}
static bool TryExtractSTLLR_SL32_LDSTEXCL(InstData &inst, uint32_t bits) {
// bits
// & 11111111111111111111110000000000
// --------------------------------
// 10001000100111110111110000000000
if ((bits & 0xfffffc00U) != 0x889f7c00U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t Rt2 : 5;
uint32_t o0 : 1;
uint32_t Rs : 5;
uint32_t o1 : 1;
uint32_t L : 1;
uint32_t o2 : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 0
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.L = static_cast<uint8_t>(enc.L);
inst.Rt2 = static_cast<uint8_t>(enc.Rt2);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.o2 = static_cast<uint8_t>(enc.o2);
inst.o1 = static_cast<uint8_t>(enc.o1);
inst.o0 = static_cast<uint8_t>(enc.o0);
inst.iform = InstForm::STLLR_SL32_LDSTEXCL;
inst.iclass = InstName::STLLR;
return true;
}
static bool TryExtractSTLLR_SL64_LDSTEXCL(InstData &inst, uint32_t bits) {
// bits
// & 11111111111111111111110000000000
// --------------------------------
// 11001000100111110111110000000000
if ((bits & 0xfffffc00U) != 0xc89f7c00U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t Rt2 : 5;
uint32_t o0 : 1;
uint32_t Rs : 5;
uint32_t o1 : 1;
uint32_t L : 1;
uint32_t o2 : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 0
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.L = static_cast<uint8_t>(enc.L);
inst.Rt2 = static_cast<uint8_t>(enc.Rt2);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.o2 = static_cast<uint8_t>(enc.o2);
inst.o1 = static_cast<uint8_t>(enc.o1);
inst.o0 = static_cast<uint8_t>(enc.o0);
inst.iform = InstForm::STLLR_SL64_LDSTEXCL;
inst.iclass = InstName::STLLR;
return true;
}
static bool TryExtractSSUBL_ASIMDDIFF_L(InstData &inst, uint32_t bits) {
// bits
// & 10111111001000001111110000000000
// --------------------------------
// 00001110001000000010000000000000
if ((bits & 0xbf20fc00U) != 0xe202000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t _12 : 1; // 0
uint32_t o1 : 1;
uint32_t _14 : 1; // 0
uint32_t _15 : 1; // 0
uint32_t Rm : 5;
uint32_t _21 : 1; // 1
uint32_t size : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o1 = static_cast<uint8_t>(enc.o1);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::SSUBL_ASIMDDIFF_L;
inst.iclass = InstName::SSUBL;
return true;
}
static bool TryExtractSMLSL_ASIMDDIFF_L(InstData &inst, uint32_t bits) {
// bits
// & 10111111001000001111110000000000
// --------------------------------
// 00001110001000001010000000000000
if ((bits & 0xbf20fc00U) != 0xe20a000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t _12 : 1; // 0
uint32_t o1 : 1;
uint32_t _14 : 1; // 0
uint32_t _15 : 1; // 1
uint32_t Rm : 5;
uint32_t _21 : 1; // 1
uint32_t size : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o1 = static_cast<uint8_t>(enc.o1);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::SMLSL_ASIMDDIFF_L;
inst.iclass = InstName::SMLSL;
return true;
}
static bool TryExtractMOV_ADD_32_ADDSUB_IMM(InstData &inst, uint32_t bits) {
// bits
// & 11111111111111111111110000000000
// --------------------------------
// 00010001000000000000000000000000
if ((bits & 0xfffffc00U) != 0x11000000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t imm12 : 12;
uint32_t shift : 2;
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 0
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t op : 1;
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.imm12.uimm = static_cast<uint64_t>(enc.imm12);
inst.shift = static_cast<uint8_t>(enc.shift);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.sf = static_cast<uint8_t>(enc.sf);
inst.op = static_cast<uint8_t>(enc.op);
inst.iform = InstForm::MOV_ADD_32_ADDSUB_IMM;
inst.iclass = InstName::ADD;
return true;
}
static bool TryExtractMOV_ADD_64_ADDSUB_IMM(InstData &inst, uint32_t bits) {
// bits
// & 11111111111111111111110000000000
// --------------------------------
// 10010001000000000000000000000000
if ((bits & 0xfffffc00U) != 0x91000000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t imm12 : 12;
uint32_t shift : 2;
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 0
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t op : 1;
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.imm12.uimm = static_cast<uint64_t>(enc.imm12);
inst.shift = static_cast<uint8_t>(enc.shift);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.sf = static_cast<uint8_t>(enc.sf);
inst.op = static_cast<uint8_t>(enc.op);
inst.iform = InstForm::MOV_ADD_64_ADDSUB_IMM;
inst.iclass = InstName::ADD;
return true;
}
static bool TryExtractSTTRB_32_LDST_UNPRIV(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000000000110000000000
// --------------------------------
// 00111000000000000000100000000000
if ((bits & 0xffe00c00U) != 0x38000800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t imm9 : 9;
uint32_t _21 : 1; // 0
uint32_t opc : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.imm9.uimm = static_cast<uint64_t>(enc.imm9);
inst.V = static_cast<uint8_t>(enc.V);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::STTRB_32_LDST_UNPRIV;
inst.iclass = InstName::STTRB;
return true;
}
static bool TryExtractBIC_32_LOG_SHIFT(InstData &inst, uint32_t bits) {
// bits
// & 11111111001000000000000000000000
// --------------------------------
// 00001010001000000000000000000000
if ((bits & 0xff200000U) != 0xa200000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t imm6 : 6;
uint32_t Rm : 5;
uint32_t N : 1;
uint32_t shift : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t opc : 2;
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.shift = static_cast<uint8_t>(enc.shift);
inst.N = static_cast<uint8_t>(enc.N);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.sf = static_cast<uint8_t>(enc.sf);
inst.imm6.uimm = static_cast<uint64_t>(enc.imm6);
inst.iform = InstForm::BIC_32_LOG_SHIFT;
inst.iclass = InstName::BIC;
return true;
}
static bool TryExtractBIC_64_LOG_SHIFT(InstData &inst, uint32_t bits) {
// bits
// & 11111111001000000000000000000000
// --------------------------------
// 10001010001000000000000000000000
if ((bits & 0xff200000U) != 0x8a200000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t imm6 : 6;
uint32_t Rm : 5;
uint32_t N : 1;
uint32_t shift : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t opc : 2;
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.shift = static_cast<uint8_t>(enc.shift);
inst.N = static_cast<uint8_t>(enc.N);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.sf = static_cast<uint8_t>(enc.sf);
inst.imm6.uimm = static_cast<uint64_t>(enc.imm6);
inst.iform = InstForm::BIC_64_LOG_SHIFT;
inst.iclass = InstName::BIC;
return true;
}
static bool TryExtractTST_ANDS_32S_LOG_IMM(InstData &inst, uint32_t bits) {
// bits
// & 11111111110000000000000000011111
// --------------------------------
// 01110010000000000000000000011111
if ((bits & 0xffc0001fU) != 0x7200001fU) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t imms : 6;
uint32_t immr : 6;
uint32_t N : 1;
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 0
uint32_t _28 : 1; // 1
uint32_t opc : 2;
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.sf = static_cast<uint8_t>(enc.sf);
inst.N = static_cast<uint8_t>(enc.N);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.immr.uimm = static_cast<uint64_t>(enc.immr);
inst.imms.uimm = static_cast<uint64_t>(enc.imms);
inst.iform = InstForm::TST_ANDS_32S_LOG_IMM;
inst.iclass = InstName::ANDS;
return true;
}
static bool TryExtractTST_ANDS_64S_LOG_IMM(InstData &inst, uint32_t bits) {
// bits
// & 11111111100000000000000000011111
// --------------------------------
// 11110010000000000000000000011111
if ((bits & 0xff80001fU) != 0xf200001fU) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t imms : 6;
uint32_t immr : 6;
uint32_t N : 1;
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 0
uint32_t _28 : 1; // 1
uint32_t opc : 2;
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.sf = static_cast<uint8_t>(enc.sf);
inst.N = static_cast<uint8_t>(enc.N);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.immr.uimm = static_cast<uint64_t>(enc.immr);
inst.imms.uimm = static_cast<uint64_t>(enc.imms);
inst.iform = InstForm::TST_ANDS_64S_LOG_IMM;
inst.iclass = InstName::ANDS;
return true;
}
static bool TryExtractAND_ASIMDSAME_ONLY(InstData &inst, uint32_t bits) {
// bits
// & 10111111111000001111110000000000
// --------------------------------
// 00001110001000000001110000000000
if ((bits & 0xbfe0fc00U) != 0xe201c00U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t opcode : 5;
uint32_t Rm : 5;
uint32_t _21 : 1; // 1
uint32_t size : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.U = static_cast<uint8_t>(enc.U);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::AND_ASIMDSAME_ONLY;
inst.iclass = InstName::AND;
return true;
}
static bool TryExtractSTLXP_SP32_LDSTEXCL(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001000000000000000
// --------------------------------
// 10001000001000001000000000000000
if ((bits & 0xffe08000U) != 0x88208000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t Rt2 : 5;
uint32_t o0 : 1;
uint32_t Rs : 5;
uint32_t o1 : 1;
uint32_t L : 1;
uint32_t o2 : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 0
uint32_t sz : 1;
uint32_t _31 : 1; // 1
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.sz = static_cast<uint8_t>(enc.sz);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.L = static_cast<uint8_t>(enc.L);
inst.Rt2 = static_cast<uint8_t>(enc.Rt2);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o2 = static_cast<uint8_t>(enc.o2);
inst.o1 = static_cast<uint8_t>(enc.o1);
inst.o0 = static_cast<uint8_t>(enc.o0);
inst.iform = InstForm::STLXP_SP32_LDSTEXCL;
inst.iclass = InstName::STLXP;
return true;
}
static bool TryExtractSTLXP_SP64_LDSTEXCL(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001000000000000000
// --------------------------------
// 11001000001000001000000000000000
if ((bits & 0xffe08000U) != 0xc8208000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t Rt2 : 5;
uint32_t o0 : 1;
uint32_t Rs : 5;
uint32_t o1 : 1;
uint32_t L : 1;
uint32_t o2 : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 0
uint32_t sz : 1;
uint32_t _31 : 1; // 1
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.sz = static_cast<uint8_t>(enc.sz);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.L = static_cast<uint8_t>(enc.L);
inst.Rt2 = static_cast<uint8_t>(enc.Rt2);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o2 = static_cast<uint8_t>(enc.o2);
inst.o1 = static_cast<uint8_t>(enc.o1);
inst.o0 = static_cast<uint8_t>(enc.o0);
inst.iform = InstForm::STLXP_SP64_LDSTEXCL;
inst.iclass = InstName::STLXP;
return true;
}
static bool TryExtractSQRSHL_ASISDSAME_ONLY(InstData &inst, uint32_t bits) {
// bits
// & 11111111001000001111110000000000
// --------------------------------
// 01011110001000000101110000000000
if ((bits & 0xff20fc00U) != 0x5e205c00U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t S : 1;
uint32_t R : 1;
uint32_t _13 : 1; // 0
uint32_t _14 : 1; // 1
uint32_t _15 : 1; // 0
uint32_t Rm : 5;
uint32_t _21 : 1; // 1
uint32_t size : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t U : 1;
uint32_t _30 : 1; // 1
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.R = static_cast<uint8_t>(enc.R);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::SQRSHL_ASISDSAME_ONLY;
inst.iclass = InstName::SQRSHL;
return true;
}
static bool TryExtractSQRSHL_ASIMDSAME_ONLY(InstData &inst, uint32_t bits) {
// bits
// & 10111111001000001111110000000000
// --------------------------------
// 00001110001000000101110000000000
if ((bits & 0xbf20fc00U) != 0xe205c00U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t S : 1;
uint32_t R : 1;
uint32_t _13 : 1; // 0
uint32_t _14 : 1; // 1
uint32_t _15 : 1; // 0
uint32_t Rm : 5;
uint32_t _21 : 1; // 1
uint32_t size : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.R = static_cast<uint8_t>(enc.R);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::SQRSHL_ASIMDSAME_ONLY;
inst.iclass = InstName::SQRSHL;
return true;
}
static bool TryExtractUABAL_ASIMDDIFF_L(InstData &inst, uint32_t bits) {
// bits
// & 10111111001000001111110000000000
// --------------------------------
// 00101110001000000101000000000000
if ((bits & 0xbf20fc00U) != 0x2e205000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t _12 : 1; // 1
uint32_t op : 1;
uint32_t _14 : 1; // 1
uint32_t _15 : 1; // 0
uint32_t Rm : 5;
uint32_t _21 : 1; // 1
uint32_t size : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.op = static_cast<uint8_t>(enc.op);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::UABAL_ASIMDDIFF_L;
inst.iclass = InstName::UABAL;
return true;
}
static bool TryExtractMVNI_ASIMDIMM_L_HL(InstData &inst, uint32_t bits) {
// bits
// & 10111111111110001101110000000000
// --------------------------------
// 00101111000000001000010000000000
if ((bits & 0xbff8dc00U) != 0x2f008400U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t h : 1;
uint32_t g : 1;
uint32_t f : 1;
uint32_t e : 1;
uint32_t d : 1;
uint32_t _10 : 1; // 1
uint32_t o2 : 1;
uint32_t cmode : 4;
uint32_t c : 1;
uint32_t b : 1;
uint32_t a : 1;
uint32_t _19 : 1; // 0
uint32_t _20 : 1; // 0
uint32_t _21 : 1; // 0
uint32_t _22 : 1; // 0
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t op : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.a = static_cast<uint8_t>(enc.a);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.c = static_cast<uint8_t>(enc.c);
inst.b = static_cast<uint8_t>(enc.b);
inst.e = static_cast<uint8_t>(enc.e);
inst.d = static_cast<uint8_t>(enc.d);
inst.g = static_cast<uint8_t>(enc.g);
inst.f = static_cast<uint8_t>(enc.f);
inst.h = static_cast<uint8_t>(enc.h);
inst.cmode = static_cast<uint8_t>(enc.cmode);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.o2 = static_cast<uint8_t>(enc.o2);
inst.op = static_cast<uint8_t>(enc.op);
inst.iform = InstForm::MVNI_ASIMDIMM_L_HL;
inst.iclass = InstName::MVNI;
return true;
}
static bool TryExtractMVNI_ASIMDIMM_L_SL(InstData &inst, uint32_t bits) {
// bits
// & 10111111111110001001110000000000
// --------------------------------
// 00101111000000000000010000000000
if ((bits & 0xbff89c00U) != 0x2f000400U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t h : 1;
uint32_t g : 1;
uint32_t f : 1;
uint32_t e : 1;
uint32_t d : 1;
uint32_t _10 : 1; // 1
uint32_t o2 : 1;
uint32_t cmode : 4;
uint32_t c : 1;
uint32_t b : 1;
uint32_t a : 1;
uint32_t _19 : 1; // 0
uint32_t _20 : 1; // 0
uint32_t _21 : 1; // 0
uint32_t _22 : 1; // 0
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t op : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.a = static_cast<uint8_t>(enc.a);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.c = static_cast<uint8_t>(enc.c);
inst.b = static_cast<uint8_t>(enc.b);
inst.e = static_cast<uint8_t>(enc.e);
inst.d = static_cast<uint8_t>(enc.d);
inst.g = static_cast<uint8_t>(enc.g);
inst.f = static_cast<uint8_t>(enc.f);
inst.h = static_cast<uint8_t>(enc.h);
inst.cmode = static_cast<uint8_t>(enc.cmode);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.o2 = static_cast<uint8_t>(enc.o2);
inst.op = static_cast<uint8_t>(enc.op);
inst.iform = InstForm::MVNI_ASIMDIMM_L_SL;
inst.iclass = InstName::MVNI;
return true;
}
static bool TryExtractMVNI_ASIMDIMM_M_SM(InstData &inst, uint32_t bits) {
// bits
// & 10111111111110001110110000000000
// --------------------------------
// 00101111000000001100010000000000
if ((bits & 0xbff8ec00U) != 0x2f00c400U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t h : 1;
uint32_t g : 1;
uint32_t f : 1;
uint32_t e : 1;
uint32_t d : 1;
uint32_t _10 : 1; // 1
uint32_t o2 : 1;
uint32_t cmode : 4;
uint32_t c : 1;
uint32_t b : 1;
uint32_t a : 1;
uint32_t _19 : 1; // 0
uint32_t _20 : 1; // 0
uint32_t _21 : 1; // 0
uint32_t _22 : 1; // 0
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t op : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.a = static_cast<uint8_t>(enc.a);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.c = static_cast<uint8_t>(enc.c);
inst.b = static_cast<uint8_t>(enc.b);
inst.e = static_cast<uint8_t>(enc.e);
inst.d = static_cast<uint8_t>(enc.d);
inst.g = static_cast<uint8_t>(enc.g);
inst.f = static_cast<uint8_t>(enc.f);
inst.h = static_cast<uint8_t>(enc.h);
inst.cmode = static_cast<uint8_t>(enc.cmode);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.o2 = static_cast<uint8_t>(enc.o2);
inst.op = static_cast<uint8_t>(enc.op);
inst.iform = InstForm::MVNI_ASIMDIMM_M_SM;
inst.iclass = InstName::MVNI;
return true;
}
static bool TryExtractMOV_INS_ASIMDINS_IV_V(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001000010000000000
// --------------------------------
// 01101110000000000000010000000000
if ((bits & 0xffe08400U) != 0x6e000400U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t imm4 : 4;
uint32_t _15 : 1; // 0
uint32_t imm5 : 5;
uint32_t _21 : 1; // 0
uint32_t _22 : 1; // 0
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t op : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.imm5.uimm = static_cast<uint64_t>(enc.imm5);
inst.imm4.uimm = static_cast<uint64_t>(enc.imm4);
inst.op = static_cast<uint8_t>(enc.op);
inst.iform = InstForm::MOV_INS_ASIMDINS_IV_V;
inst.iclass = InstName::INS;
return true;
}
static bool TryExtractSRSHR_ASISDSHF_R(InstData &inst, uint32_t bits) {
// bits
// & 11111111100000001111110000000000
// --------------------------------
// 01011111000000000010010000000000
if ((bits & 0xff80fc00U) != 0x5f002400U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t _11 : 1; // 0
uint32_t o0 : 1;
uint32_t o1 : 1;
uint32_t _14 : 1; // 0
uint32_t _15 : 1; // 0
uint32_t immb : 3;
uint32_t immh : 4;
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t U : 1;
uint32_t _30 : 1; // 1
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.immh.uimm = static_cast<uint64_t>(enc.immh);
if (!(inst.immh.uimm != 0x0))
return false;
inst.immb.uimm = static_cast<uint64_t>(enc.immb);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o1 = static_cast<uint8_t>(enc.o1);
inst.o0 = static_cast<uint8_t>(enc.o0);
inst.iform = InstForm::SRSHR_ASISDSHF_R;
inst.iclass = InstName::SRSHR;
return true;
}
static bool TryExtractSRSHR_ASIMDSHF_R(InstData &inst, uint32_t bits) {
// bits
// & 10111111100000001111110000000000
// --------------------------------
// 00001111000000000010010000000000
if ((bits & 0xbf80fc00U) != 0xf002400U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t _11 : 1; // 0
uint32_t o0 : 1;
uint32_t o1 : 1;
uint32_t _14 : 1; // 0
uint32_t _15 : 1; // 0
uint32_t immb : 3;
uint32_t immh : 4;
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.immh.uimm = static_cast<uint64_t>(enc.immh);
if (!(inst.immh.uimm != 0x0))
return false;
inst.immb.uimm = static_cast<uint64_t>(enc.immb);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o1 = static_cast<uint8_t>(enc.o1);
inst.o0 = static_cast<uint8_t>(enc.o0);
inst.iform = InstForm::SRSHR_ASIMDSHF_R;
inst.iclass = InstName::SRSHR;
return true;
}
static bool TryExtractLSL_UBFM_32M_BITFIELD(InstData &inst, uint32_t bits) {
// bits
// & 11111111110000000000000000000000
// --------------------------------
// 01010011000000000000000000000000
if ((bits & 0xffc00000U) != 0x53000000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t imms : 6;
uint32_t immr : 6;
uint32_t N : 1;
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 0
uint32_t _28 : 1; // 1
uint32_t opc : 2;
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.sf = static_cast<uint8_t>(enc.sf);
inst.N = static_cast<uint8_t>(enc.N);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.immr.uimm = static_cast<uint64_t>(enc.immr);
inst.imms.uimm = static_cast<uint64_t>(enc.imms);
if (!(inst.imms.uimm != 0x1f))
return false;
if (!(inst.imms.uimm != 0x3f))
return false;
inst.iform = InstForm::LSL_UBFM_32M_BITFIELD;
inst.iclass = InstName::UBFM;
return true;
}
static bool TryExtractLSL_UBFM_64M_BITFIELD(InstData &inst, uint32_t bits) {
// bits
// & 11111111110000000000000000000000
// --------------------------------
// 11010011010000000000000000000000
if ((bits & 0xffc00000U) != 0xd3400000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t imms : 6;
uint32_t immr : 6;
uint32_t N : 1;
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 0
uint32_t _28 : 1; // 1
uint32_t opc : 2;
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.sf = static_cast<uint8_t>(enc.sf);
inst.N = static_cast<uint8_t>(enc.N);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.immr.uimm = static_cast<uint64_t>(enc.immr);
inst.imms.uimm = static_cast<uint64_t>(enc.imms);
if (!(inst.imms.uimm != 0x1f))
return false;
if (!(inst.imms.uimm != 0x3f))
return false;
inst.iform = InstForm::LSL_UBFM_64M_BITFIELD;
inst.iclass = InstName::UBFM;
return true;
}
static bool TryExtractCLS_32_DP_1SRC(InstData &inst, uint32_t bits) {
// bits
// & 11111111111111111111110000000000
// --------------------------------
// 01011010110000000001010000000000
if ((bits & 0xfffffc00U) != 0x5ac01400U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t op : 1;
uint32_t opcode : 5;
uint32_t opcode2 : 5;
uint32_t _21 : 1; // 0
uint32_t _22 : 1; // 1
uint32_t _23 : 1; // 1
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t _30 : 1; // 1
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.opcode2 = static_cast<uint8_t>(enc.opcode2);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.sf = static_cast<uint8_t>(enc.sf);
inst.op = static_cast<uint8_t>(enc.op);
inst.iform = InstForm::CLS_32_DP_1SRC;
inst.iclass = InstName::CLS;
return true;
}
static bool TryExtractCLS_64_DP_1SRC(InstData &inst, uint32_t bits) {
// bits
// & 11111111111111111111110000000000
// --------------------------------
// 11011010110000000001010000000000
if ((bits & 0xfffffc00U) != 0xdac01400U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t op : 1;
uint32_t opcode : 5;
uint32_t opcode2 : 5;
uint32_t _21 : 1; // 0
uint32_t _22 : 1; // 1
uint32_t _23 : 1; // 1
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t _30 : 1; // 1
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.opcode2 = static_cast<uint8_t>(enc.opcode2);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.sf = static_cast<uint8_t>(enc.sf);
inst.op = static_cast<uint8_t>(enc.op);
inst.iform = InstForm::CLS_64_DP_1SRC;
inst.iclass = InstName::CLS;
return true;
}
static bool TryExtractSEV_HI_SYSTEM(InstData &inst, uint32_t bits) {
// bits
// & 11111111111111111111111111111111
// --------------------------------
// 11010101000000110010000010011111
if ((bits & 0xffffffffU) != 0xd503209fU) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t op2 : 3;
uint32_t CRm : 4;
uint32_t CRn : 4;
uint32_t op1 : 3;
uint32_t op0 : 2;
uint32_t L : 1;
uint32_t _22 : 1; // 0
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 0
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 0
uint32_t _30 : 1; // 1
uint32_t _31 : 1; // 1
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.op0 = static_cast<uint8_t>(enc.op0);
inst.op1 = static_cast<uint8_t>(enc.op1);
inst.op2 = static_cast<uint8_t>(enc.op2);
inst.L = static_cast<uint8_t>(enc.L);
inst.CRn = static_cast<uint8_t>(enc.CRn);
inst.CRm = static_cast<uint8_t>(enc.CRm);
inst.iform = InstForm::SEV_HI_SYSTEM;
inst.iclass = InstName::SEV;
return true;
}
static bool TryExtractUMIN_ASIMDSAME_ONLY(InstData &inst, uint32_t bits) {
// bits
// & 10111111001000001111110000000000
// --------------------------------
// 00101110001000000110110000000000
if ((bits & 0xbf20fc00U) != 0x2e206c00U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t o1 : 1;
uint32_t _12 : 1; // 0
uint32_t _13 : 1; // 1
uint32_t _14 : 1; // 1
uint32_t _15 : 1; // 0
uint32_t Rm : 5;
uint32_t _21 : 1; // 1
uint32_t size : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o1 = static_cast<uint8_t>(enc.o1);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::UMIN_ASIMDSAME_ONLY;
inst.iclass = InstName::UMIN;
return true;
}
static bool TryExtractFMULX_ASISDSAMEFP16_ONLY(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 01011110010000000001110000000000
if ((bits & 0xffe0fc00U) != 0x5e401c00U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t opcode : 3;
uint32_t _14 : 1; // 0
uint32_t _15 : 1; // 0
uint32_t Rm : 5;
uint32_t _21 : 1; // 0
uint32_t _22 : 1; // 1
uint32_t a : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t U : 1;
uint32_t _30 : 1; // 1
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.a = static_cast<uint8_t>(enc.a);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.U = static_cast<uint8_t>(enc.U);
inst.iform = InstForm::FMULX_ASISDSAMEFP16_ONLY;
inst.iclass = InstName::FMULX;
return true;
}
static bool TryExtractFMULX_ASISDSAME_ONLY(InstData &inst, uint32_t bits) {
// bits
// & 11111111101000001111110000000000
// --------------------------------
// 01011110001000001101110000000000
if ((bits & 0xffa0fc00U) != 0x5e20dc00U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t opcode : 5;
uint32_t Rm : 5;
uint32_t _21 : 1; // 1
uint32_t sz : 1;
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t U : 1;
uint32_t _30 : 1; // 1
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.sz = static_cast<uint8_t>(enc.sz);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.U = static_cast<uint8_t>(enc.U);
inst.iform = InstForm::FMULX_ASISDSAME_ONLY;
inst.iclass = InstName::FMULX;
return true;
}
static bool TryExtractFMULX_ASIMDSAMEFP16_ONLY(InstData &inst, uint32_t bits) {
// bits
// & 10111111111000001111110000000000
// --------------------------------
// 00001110010000000001110000000000
if ((bits & 0xbfe0fc00U) != 0xe401c00U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t opcode : 3;
uint32_t _14 : 1; // 0
uint32_t _15 : 1; // 0
uint32_t Rm : 5;
uint32_t _21 : 1; // 0
uint32_t _22 : 1; // 1
uint32_t a : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.a = static_cast<uint8_t>(enc.a);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.U = static_cast<uint8_t>(enc.U);
inst.iform = InstForm::FMULX_ASIMDSAMEFP16_ONLY;
inst.iclass = InstName::FMULX;
return true;
}
static bool TryExtractFMULX_ASIMDSAME_ONLY(InstData &inst, uint32_t bits) {
// bits
// & 10111111101000001111110000000000
// --------------------------------
// 00001110001000001101110000000000
if ((bits & 0xbfa0fc00U) != 0xe20dc00U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t opcode : 5;
uint32_t Rm : 5;
uint32_t _21 : 1; // 1
uint32_t sz : 1;
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.sz = static_cast<uint8_t>(enc.sz);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.U = static_cast<uint8_t>(enc.U);
inst.iform = InstForm::FMULX_ASIMDSAME_ONLY;
inst.iclass = InstName::FMULX;
return true;
}
static bool TryExtractADDS_32S_ADDSUB_IMM(InstData &inst, uint32_t bits) {
if (false && TryExtractCMN_ADDS_32S_ADDSUB_IMM(inst, bits))
return true;
// bits
// & 11111111000000000000000000000000
// --------------------------------
// 00110001000000000000000000000000
if ((bits & 0xff000000U) != 0x31000000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t imm12 : 12;
uint32_t shift : 2;
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 0
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t op : 1;
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.imm12.uimm = static_cast<uint64_t>(enc.imm12);
inst.shift = static_cast<uint8_t>(enc.shift);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.sf = static_cast<uint8_t>(enc.sf);
inst.op = static_cast<uint8_t>(enc.op);
inst.iform = InstForm::ADDS_32S_ADDSUB_IMM;
inst.iclass = InstName::ADDS;
return true;
}
static bool TryExtractADDS_64S_ADDSUB_IMM(InstData &inst, uint32_t bits) {
if (false && TryExtractCMN_ADDS_64S_ADDSUB_IMM(inst, bits))
return true;
// bits
// & 11111111000000000000000000000000
// --------------------------------
// 10110001000000000000000000000000
if ((bits & 0xff000000U) != 0xb1000000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t imm12 : 12;
uint32_t shift : 2;
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 0
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t op : 1;
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.imm12.uimm = static_cast<uint64_t>(enc.imm12);
inst.shift = static_cast<uint8_t>(enc.shift);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.sf = static_cast<uint8_t>(enc.sf);
inst.op = static_cast<uint8_t>(enc.op);
inst.iform = InstForm::ADDS_64S_ADDSUB_IMM;
inst.iclass = InstName::ADDS;
return true;
}
static bool TryExtractUQSHL_ASISDSAME_ONLY(InstData &inst, uint32_t bits) {
// bits
// & 11111111001000001111110000000000
// --------------------------------
// 01111110001000000100110000000000
if ((bits & 0xff20fc00U) != 0x7e204c00U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t S : 1;
uint32_t R : 1;
uint32_t _13 : 1; // 0
uint32_t _14 : 1; // 1
uint32_t _15 : 1; // 0
uint32_t Rm : 5;
uint32_t _21 : 1; // 1
uint32_t size : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t U : 1;
uint32_t _30 : 1; // 1
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.R = static_cast<uint8_t>(enc.R);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::UQSHL_ASISDSAME_ONLY;
inst.iclass = InstName::UQSHL;
return true;
}
static bool TryExtractUQSHL_ASIMDSAME_ONLY(InstData &inst, uint32_t bits) {
// bits
// & 10111111001000001111110000000000
// --------------------------------
// 00101110001000000100110000000000
if ((bits & 0xbf20fc00U) != 0x2e204c00U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t S : 1;
uint32_t R : 1;
uint32_t _13 : 1; // 0
uint32_t _14 : 1; // 1
uint32_t _15 : 1; // 0
uint32_t Rm : 5;
uint32_t _21 : 1; // 1
uint32_t size : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.R = static_cast<uint8_t>(enc.R);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::UQSHL_ASIMDSAME_ONLY;
inst.iclass = InstName::UQSHL;
return true;
}
static bool TryExtractSTEORB_32S_MEMOP(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000011111
// --------------------------------
// 00111000001000000010000000011111
if ((bits & 0xffe0fc1fU) != 0x3820201fU) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t opc : 3;
uint32_t o3 : 1;
uint32_t Rs : 5;
uint32_t _21 : 1; // 1
uint32_t R : 1;
uint32_t A : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.A = static_cast<uint8_t>(enc.A);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.V = static_cast<uint8_t>(enc.V);
inst.R = static_cast<uint8_t>(enc.R);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o3 = static_cast<uint8_t>(enc.o3);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::STEORB_32S_MEMOP;
inst.iclass = InstName::STEORB;
return true;
}
static bool TryExtractSTEORLB_32S_MEMOP(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000011111
// --------------------------------
// 00111000011000000010000000011111
if ((bits & 0xffe0fc1fU) != 0x3860201fU) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t opc : 3;
uint32_t o3 : 1;
uint32_t Rs : 5;
uint32_t _21 : 1; // 1
uint32_t R : 1;
uint32_t A : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.A = static_cast<uint8_t>(enc.A);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.V = static_cast<uint8_t>(enc.V);
inst.R = static_cast<uint8_t>(enc.R);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o3 = static_cast<uint8_t>(enc.o3);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::STEORLB_32S_MEMOP;
inst.iclass = InstName::STEORLB;
return true;
}
static bool TryExtractLDPSW_64_LDSTPAIR_POST(InstData &inst, uint32_t bits) {
// bits
// & 11111111110000000000000000000000
// --------------------------------
// 01101000110000000000000000000000
if ((bits & 0xffc00000U) != 0x68c00000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t Rt2 : 5;
uint32_t imm7 : 7;
uint32_t L : 1;
uint32_t _23 : 1; // 1
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 1
uint32_t opc : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rt2 = static_cast<uint8_t>(enc.Rt2);
inst.L = static_cast<uint8_t>(enc.L);
inst.V = static_cast<uint8_t>(enc.V);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.imm7.uimm = static_cast<uint64_t>(enc.imm7);
inst.iform = InstForm::LDPSW_64_LDSTPAIR_POST;
inst.iclass = InstName::LDPSW;
return true;
}
static bool TryExtractLDPSW_64_LDSTPAIR_PRE(InstData &inst, uint32_t bits) {
// bits
// & 11111111110000000000000000000000
// --------------------------------
// 01101001110000000000000000000000
if ((bits & 0xffc00000U) != 0x69c00000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t Rt2 : 5;
uint32_t imm7 : 7;
uint32_t L : 1;
uint32_t _23 : 1; // 1
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 1
uint32_t opc : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rt2 = static_cast<uint8_t>(enc.Rt2);
inst.L = static_cast<uint8_t>(enc.L);
inst.V = static_cast<uint8_t>(enc.V);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.imm7.uimm = static_cast<uint64_t>(enc.imm7);
inst.iform = InstForm::LDPSW_64_LDSTPAIR_PRE;
inst.iclass = InstName::LDPSW;
return true;
}
static bool TryExtractLDPSW_64_LDSTPAIR_OFF(InstData &inst, uint32_t bits) {
// bits
// & 11111111110000000000000000000000
// --------------------------------
// 01101001010000000000000000000000
if ((bits & 0xffc00000U) != 0x69400000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t Rt2 : 5;
uint32_t imm7 : 7;
uint32_t L : 1;
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 1
uint32_t opc : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rt2 = static_cast<uint8_t>(enc.Rt2);
inst.L = static_cast<uint8_t>(enc.L);
inst.V = static_cast<uint8_t>(enc.V);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.imm7.uimm = static_cast<uint64_t>(enc.imm7);
inst.iform = InstForm::LDPSW_64_LDSTPAIR_OFF;
inst.iclass = InstName::LDPSW;
return true;
}
static bool TryExtractSTUMAXH_32S_MEMOP(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000011111
// --------------------------------
// 01111000001000000110000000011111
if ((bits & 0xffe0fc1fU) != 0x7820601fU) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t opc : 3;
uint32_t o3 : 1;
uint32_t Rs : 5;
uint32_t _21 : 1; // 1
uint32_t R : 1;
uint32_t A : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.A = static_cast<uint8_t>(enc.A);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.V = static_cast<uint8_t>(enc.V);
inst.R = static_cast<uint8_t>(enc.R);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o3 = static_cast<uint8_t>(enc.o3);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::STUMAXH_32S_MEMOP;
inst.iclass = InstName::STUMAXH;
return true;
}
static bool TryExtractSTUMAXLH_32S_MEMOP(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000011111
// --------------------------------
// 01111000011000000110000000011111
if ((bits & 0xffe0fc1fU) != 0x7860601fU) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t opc : 3;
uint32_t o3 : 1;
uint32_t Rs : 5;
uint32_t _21 : 1; // 1
uint32_t R : 1;
uint32_t A : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.A = static_cast<uint8_t>(enc.A);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.V = static_cast<uint8_t>(enc.V);
inst.R = static_cast<uint8_t>(enc.R);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o3 = static_cast<uint8_t>(enc.o3);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::STUMAXLH_32S_MEMOP;
inst.iclass = InstName::STUMAXLH;
return true;
}
static bool TryExtractSMOV_ASIMDINS_W_W(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 00001110000000000010110000000000
if ((bits & 0xffe0fc00U) != 0xe002c00U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t imm4 : 4;
uint32_t _15 : 1; // 0
uint32_t imm5 : 5;
uint32_t _21 : 1; // 0
uint32_t _22 : 1; // 0
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t op : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.imm5.uimm = static_cast<uint64_t>(enc.imm5);
inst.imm4.uimm = static_cast<uint64_t>(enc.imm4);
inst.op = static_cast<uint8_t>(enc.op);
inst.iform = InstForm::SMOV_ASIMDINS_W_W;
inst.iclass = InstName::SMOV;
return true;
}
static bool TryExtractSMOV_ASIMDINS_X_X(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 01001110000000000010110000000000
if ((bits & 0xffe0fc00U) != 0x4e002c00U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t imm4 : 4;
uint32_t _15 : 1; // 0
uint32_t imm5 : 5;
uint32_t _21 : 1; // 0
uint32_t _22 : 1; // 0
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t op : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.imm5.uimm = static_cast<uint64_t>(enc.imm5);
inst.imm4.uimm = static_cast<uint64_t>(enc.imm4);
inst.op = static_cast<uint8_t>(enc.op);
inst.iform = InstForm::SMOV_ASIMDINS_X_X;
inst.iclass = InstName::SMOV;
return true;
}
static bool TryExtractUABA_ASIMDSAME_ONLY(InstData &inst, uint32_t bits) {
// bits
// & 10111111001000001111110000000000
// --------------------------------
// 00101110001000000111110000000000
if ((bits & 0xbf20fc00U) != 0x2e207c00U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t ac : 1;
uint32_t _12 : 1; // 1
uint32_t _13 : 1; // 1
uint32_t _14 : 1; // 1
uint32_t _15 : 1; // 0
uint32_t Rm : 5;
uint32_t _21 : 1; // 1
uint32_t size : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Q = static_cast<uint8_t>(enc.Q);
inst.ac = static_cast<uint8_t>(enc.ac);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::UABA_ASIMDSAME_ONLY;
inst.iclass = InstName::UABA;
return true;
}
static bool TryExtractSTSMINB_32S_MEMOP(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000011111
// --------------------------------
// 00111000001000000101000000011111
if ((bits & 0xffe0fc1fU) != 0x3820501fU) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t opc : 3;
uint32_t o3 : 1;
uint32_t Rs : 5;
uint32_t _21 : 1; // 1
uint32_t R : 1;
uint32_t A : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.A = static_cast<uint8_t>(enc.A);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.V = static_cast<uint8_t>(enc.V);
inst.R = static_cast<uint8_t>(enc.R);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o3 = static_cast<uint8_t>(enc.o3);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::STSMINB_32S_MEMOP;
inst.iclass = InstName::STSMINB;
return true;
}
static bool TryExtractSTSMINLB_32S_MEMOP(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000011111
// --------------------------------
// 00111000011000000101000000011111
if ((bits & 0xffe0fc1fU) != 0x3860501fU) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t opc : 3;
uint32_t o3 : 1;
uint32_t Rs : 5;
uint32_t _21 : 1; // 1
uint32_t R : 1;
uint32_t A : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.A = static_cast<uint8_t>(enc.A);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.V = static_cast<uint8_t>(enc.V);
inst.R = static_cast<uint8_t>(enc.R);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o3 = static_cast<uint8_t>(enc.o3);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::STSMINLB_32S_MEMOP;
inst.iclass = InstName::STSMINLB;
return true;
}
static bool TryExtractFCMGE_ASISDMISCFP16_FZ(InstData &inst, uint32_t bits) {
// bits
// & 11111111111111111111110000000000
// --------------------------------
// 01111110111110001100100000000000
if ((bits & 0xfffffc00U) != 0x7ef8c800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t op : 1;
uint32_t _13 : 1; // 0
uint32_t _14 : 1; // 1
uint32_t _15 : 1; // 1
uint32_t _16 : 1; // 0
uint32_t _17 : 1; // 0
uint32_t _18 : 1; // 0
uint32_t _19 : 1; // 1
uint32_t _20 : 1; // 1
uint32_t _21 : 1; // 1
uint32_t _22 : 1; // 1
uint32_t a : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t U : 1;
uint32_t _30 : 1; // 1
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.a = static_cast<uint8_t>(enc.a);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.U = static_cast<uint8_t>(enc.U);
inst.op = static_cast<uint8_t>(enc.op);
inst.iform = InstForm::FCMGE_ASISDMISCFP16_FZ;
inst.iclass = InstName::FCMGE;
return true;
}
static bool TryExtractFCMGE_ASISDMISC_FZ(InstData &inst, uint32_t bits) {
// bits
// & 11111111101111111111110000000000
// --------------------------------
// 01111110101000001100100000000000
if ((bits & 0xffbffc00U) != 0x7ea0c800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t op : 1;
uint32_t _13 : 1; // 0
uint32_t _14 : 1; // 1
uint32_t _15 : 1; // 1
uint32_t _16 : 1; // 0
uint32_t _17 : 1; // 0
uint32_t _18 : 1; // 0
uint32_t _19 : 1; // 0
uint32_t _20 : 1; // 0
uint32_t _21 : 1; // 1
uint32_t sz : 1;
uint32_t _23 : 1; // 1
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t U : 1;
uint32_t _30 : 1; // 1
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.sz = static_cast<uint8_t>(enc.sz);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.U = static_cast<uint8_t>(enc.U);
inst.op = static_cast<uint8_t>(enc.op);
inst.iform = InstForm::FCMGE_ASISDMISC_FZ;
inst.iclass = InstName::FCMGE;
return true;
}
static bool TryExtractFCMGE_ASIMDMISCFP16_FZ(InstData &inst, uint32_t bits) {
// bits
// & 10111111111111111111110000000000
// --------------------------------
// 00101110111110001100100000000000
if ((bits & 0xbffffc00U) != 0x2ef8c800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t op : 1;
uint32_t _13 : 1; // 0
uint32_t _14 : 1; // 1
uint32_t _15 : 1; // 1
uint32_t _16 : 1; // 0
uint32_t _17 : 1; // 0
uint32_t _18 : 1; // 0
uint32_t _19 : 1; // 1
uint32_t _20 : 1; // 1
uint32_t _21 : 1; // 1
uint32_t _22 : 1; // 1
uint32_t a : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.a = static_cast<uint8_t>(enc.a);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.op = static_cast<uint8_t>(enc.op);
inst.iform = InstForm::FCMGE_ASIMDMISCFP16_FZ;
inst.iclass = InstName::FCMGE;
return true;
}
static bool TryExtractFCMGE_ASIMDMISC_FZ(InstData &inst, uint32_t bits) {
// bits
// & 10111111101111111111110000000000
// --------------------------------
// 00101110101000001100100000000000
if ((bits & 0xbfbffc00U) != 0x2ea0c800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t op : 1;
uint32_t _13 : 1; // 0
uint32_t _14 : 1; // 1
uint32_t _15 : 1; // 1
uint32_t _16 : 1; // 0
uint32_t _17 : 1; // 0
uint32_t _18 : 1; // 0
uint32_t _19 : 1; // 0
uint32_t _20 : 1; // 0
uint32_t _21 : 1; // 1
uint32_t sz : 1;
uint32_t _23 : 1; // 1
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.sz = static_cast<uint8_t>(enc.sz);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.op = static_cast<uint8_t>(enc.op);
inst.iform = InstForm::FCMGE_ASIMDMISC_FZ;
inst.iclass = InstName::FCMGE;
return true;
}
static bool TryExtractSTLLRB_SL32_LDSTEXCL(InstData &inst, uint32_t bits) {
// bits
// & 11111111111111111111110000000000
// --------------------------------
// 00001000100111110111110000000000
if ((bits & 0xfffffc00U) != 0x89f7c00U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t Rt2 : 5;
uint32_t o0 : 1;
uint32_t Rs : 5;
uint32_t o1 : 1;
uint32_t L : 1;
uint32_t o2 : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 0
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.L = static_cast<uint8_t>(enc.L);
inst.Rt2 = static_cast<uint8_t>(enc.Rt2);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.o2 = static_cast<uint8_t>(enc.o2);
inst.o1 = static_cast<uint8_t>(enc.o1);
inst.o0 = static_cast<uint8_t>(enc.o0);
inst.iform = InstForm::STLLRB_SL32_LDSTEXCL;
inst.iclass = InstName::STLLRB;
return true;
}
static bool TryExtractFRINTZ_ASIMDMISCFP16_R(InstData &inst, uint32_t bits) {
// bits
// & 10111111111111111111110000000000
// --------------------------------
// 00001110111110011001100000000000
if ((bits & 0xbffffc00U) != 0xef99800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t o1 : 1;
uint32_t _13 : 1; // 0
uint32_t _14 : 1; // 0
uint32_t _15 : 1; // 1
uint32_t _16 : 1; // 1
uint32_t _17 : 1; // 0
uint32_t _18 : 1; // 0
uint32_t _19 : 1; // 1
uint32_t _20 : 1; // 1
uint32_t _21 : 1; // 1
uint32_t _22 : 1; // 1
uint32_t o2 : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o2 = static_cast<uint8_t>(enc.o2);
inst.o1 = static_cast<uint8_t>(enc.o1);
inst.iform = InstForm::FRINTZ_ASIMDMISCFP16_R;
inst.iclass = InstName::FRINTZ;
return true;
}
static bool TryExtractFRINTZ_ASIMDMISC_R(InstData &inst, uint32_t bits) {
// bits
// & 10111111101111111111110000000000
// --------------------------------
// 00001110101000011001100000000000
if ((bits & 0xbfbffc00U) != 0xea19800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t o1 : 1;
uint32_t _13 : 1; // 0
uint32_t _14 : 1; // 0
uint32_t _15 : 1; // 1
uint32_t _16 : 1; // 1
uint32_t _17 : 1; // 0
uint32_t _18 : 1; // 0
uint32_t _19 : 1; // 0
uint32_t _20 : 1; // 0
uint32_t _21 : 1; // 1
uint32_t sz : 1;
uint32_t o2 : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.sz = static_cast<uint8_t>(enc.sz);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o2 = static_cast<uint8_t>(enc.o2);
inst.o1 = static_cast<uint8_t>(enc.o1);
inst.iform = InstForm::FRINTZ_ASIMDMISC_R;
inst.iclass = InstName::FRINTZ;
return true;
}
static bool TryExtractSTXRH_SR32_LDSTEXCL(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 01001000000000000111110000000000
if ((bits & 0xffe0fc00U) != 0x48007c00U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t Rt2 : 5;
uint32_t o0 : 1;
uint32_t Rs : 5;
uint32_t o1 : 1;
uint32_t L : 1;
uint32_t o2 : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 0
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.L = static_cast<uint8_t>(enc.L);
inst.Rt2 = static_cast<uint8_t>(enc.Rt2);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.o2 = static_cast<uint8_t>(enc.o2);
inst.o1 = static_cast<uint8_t>(enc.o1);
inst.o0 = static_cast<uint8_t>(enc.o0);
inst.iform = InstForm::STXRH_SR32_LDSTEXCL;
inst.iclass = InstName::STXRH;
return true;
}
static bool TryExtractSTEORH_32S_MEMOP(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000011111
// --------------------------------
// 01111000001000000010000000011111
if ((bits & 0xffe0fc1fU) != 0x7820201fU) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t opc : 3;
uint32_t o3 : 1;
uint32_t Rs : 5;
uint32_t _21 : 1; // 1
uint32_t R : 1;
uint32_t A : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.A = static_cast<uint8_t>(enc.A);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.V = static_cast<uint8_t>(enc.V);
inst.R = static_cast<uint8_t>(enc.R);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o3 = static_cast<uint8_t>(enc.o3);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::STEORH_32S_MEMOP;
inst.iclass = InstName::STEORH;
return true;
}
static bool TryExtractSTEORLH_32S_MEMOP(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000011111
// --------------------------------
// 01111000011000000010000000011111
if ((bits & 0xffe0fc1fU) != 0x7860201fU) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t opc : 3;
uint32_t o3 : 1;
uint32_t Rs : 5;
uint32_t _21 : 1; // 1
uint32_t R : 1;
uint32_t A : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.A = static_cast<uint8_t>(enc.A);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.V = static_cast<uint8_t>(enc.V);
inst.R = static_cast<uint8_t>(enc.R);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o3 = static_cast<uint8_t>(enc.o3);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::STEORLH_32S_MEMOP;
inst.iclass = InstName::STEORLH;
return true;
}
static bool TryExtractFMINNMP_ASIMDSAMEFP16_ONLY(InstData &inst,
uint32_t bits) {
// bits
// & 10111111111000001111110000000000
// --------------------------------
// 00101110110000000000010000000000
if ((bits & 0xbfe0fc00U) != 0x2ec00400U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t Op3 : 3;
uint32_t _14 : 1; // 0
uint32_t _15 : 1; // 0
uint32_t Rm : 5;
uint32_t _21 : 1; // 0
uint32_t _22 : 1; // 1
uint32_t a : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.a = static_cast<uint8_t>(enc.a);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Op3 = static_cast<uint8_t>(enc.Op3);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.iform = InstForm::FMINNMP_ASIMDSAMEFP16_ONLY;
inst.iclass = InstName::FMINNMP;
return true;
}
static bool TryExtractFMINNMP_ASIMDSAME_ONLY(InstData &inst, uint32_t bits) {
// bits
// & 10111111101000001111110000000000
// --------------------------------
// 00101110101000001100010000000000
if ((bits & 0xbfa0fc00U) != 0x2ea0c400U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t opcode : 5;
uint32_t Rm : 5;
uint32_t _21 : 1; // 1
uint32_t sz : 1;
uint32_t o1 : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.sz = static_cast<uint8_t>(enc.sz);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.U = static_cast<uint8_t>(enc.U);
inst.o1 = static_cast<uint8_t>(enc.o1);
inst.iform = InstForm::FMINNMP_ASIMDSAME_ONLY;
inst.iclass = InstName::FMINNMP;
return true;
}
static bool TryExtractLDLAR_LR32_LDSTEXCL(InstData &inst, uint32_t bits) {
// bits
// & 11111111111111111111110000000000
// --------------------------------
// 10001000110111110111110000000000
if ((bits & 0xfffffc00U) != 0x88df7c00U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t Rt2 : 5;
uint32_t o0 : 1;
uint32_t Rs : 5;
uint32_t o1 : 1;
uint32_t L : 1;
uint32_t o2 : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 0
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.L = static_cast<uint8_t>(enc.L);
inst.Rt2 = static_cast<uint8_t>(enc.Rt2);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.o2 = static_cast<uint8_t>(enc.o2);
inst.o1 = static_cast<uint8_t>(enc.o1);
inst.o0 = static_cast<uint8_t>(enc.o0);
inst.iform = InstForm::LDLAR_LR32_LDSTEXCL;
inst.iclass = InstName::LDLAR;
return true;
}
static bool TryExtractLDLAR_LR64_LDSTEXCL(InstData &inst, uint32_t bits) {
// bits
// & 11111111111111111111110000000000
// --------------------------------
// 11001000110111110111110000000000
if ((bits & 0xfffffc00U) != 0xc8df7c00U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t Rt2 : 5;
uint32_t o0 : 1;
uint32_t Rs : 5;
uint32_t o1 : 1;
uint32_t L : 1;
uint32_t o2 : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 0
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.L = static_cast<uint8_t>(enc.L);
inst.Rt2 = static_cast<uint8_t>(enc.Rt2);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.o2 = static_cast<uint8_t>(enc.o2);
inst.o1 = static_cast<uint8_t>(enc.o1);
inst.o0 = static_cast<uint8_t>(enc.o0);
inst.iform = InstForm::LDLAR_LR64_LDSTEXCL;
inst.iclass = InstName::LDLAR;
return true;
}
static bool TryExtractADD_32_ADDSUB_SHIFT(InstData &inst, uint32_t bits) {
// bits
// & 11111111001000000000000000000000
// --------------------------------
// 00001011000000000000000000000000
if ((bits & 0xff200000U) != 0xb000000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t imm6 : 6;
uint32_t Rm : 5;
uint32_t _21 : 1; // 0
uint32_t shift : 2;
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t S : 1;
uint32_t op : 1;
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.shift = static_cast<uint8_t>(enc.shift);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.op = static_cast<uint8_t>(enc.op);
inst.sf = static_cast<uint8_t>(enc.sf);
inst.imm6.uimm = static_cast<uint64_t>(enc.imm6);
inst.iform = InstForm::ADD_32_ADDSUB_SHIFT;
inst.iclass = InstName::ADD;
return true;
}
static bool TryExtractADD_64_ADDSUB_SHIFT(InstData &inst, uint32_t bits) {
// bits
// & 11111111001000000000000000000000
// --------------------------------
// 10001011000000000000000000000000
if ((bits & 0xff200000U) != 0x8b000000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t imm6 : 6;
uint32_t Rm : 5;
uint32_t _21 : 1; // 0
uint32_t shift : 2;
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t S : 1;
uint32_t op : 1;
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.shift = static_cast<uint8_t>(enc.shift);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.op = static_cast<uint8_t>(enc.op);
inst.sf = static_cast<uint8_t>(enc.sf);
inst.imm6.uimm = static_cast<uint64_t>(enc.imm6);
inst.iform = InstForm::ADD_64_ADDSUB_SHIFT;
inst.iclass = InstName::ADD;
return true;
}
static bool TryExtractSSHLL_ASIMDSHF_L(InstData &inst, uint32_t bits) {
if (false && TryExtractSXTL_SSHLL_ASIMDSHF_L(inst, bits))
return true;
// bits
// & 10111111100000001111110000000000
// --------------------------------
// 00001111000000001010010000000000
if ((bits & 0xbf80fc00U) != 0xf00a400U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t opcode : 5;
uint32_t immb : 3;
uint32_t immh : 4;
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.immh.uimm = static_cast<uint64_t>(enc.immh);
if (!(inst.immh.uimm != 0x0))
return false;
inst.immb.uimm = static_cast<uint64_t>(enc.immb);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.iform = InstForm::SSHLL_ASIMDSHF_L;
inst.iclass = InstName::SSHLL;
return true;
}
static bool TryExtractRORV_32_DP_2SRC(InstData &inst, uint32_t bits) {
if (false && TryExtractROR_RORV_32_DP_2SRC(inst, bits))
return true;
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 00011010110000000010110000000000
if ((bits & 0xffe0fc00U) != 0x1ac02c00U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t op2 : 2;
uint32_t opcode2 : 4;
uint32_t Rm : 5;
uint32_t _21 : 1; // 0
uint32_t _22 : 1; // 1
uint32_t _23 : 1; // 1
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t op : 1;
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.opcode2 = static_cast<uint8_t>(enc.opcode2);
inst.op2 = static_cast<uint8_t>(enc.op2);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.sf = static_cast<uint8_t>(enc.sf);
inst.op = static_cast<uint8_t>(enc.op);
inst.iform = InstForm::RORV_32_DP_2SRC;
inst.iclass = InstName::RORV;
return true;
}
static bool TryExtractRORV_64_DP_2SRC(InstData &inst, uint32_t bits) {
if (false && TryExtractROR_RORV_64_DP_2SRC(inst, bits))
return true;
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 10011010110000000010110000000000
if ((bits & 0xffe0fc00U) != 0x9ac02c00U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t op2 : 2;
uint32_t opcode2 : 4;
uint32_t Rm : 5;
uint32_t _21 : 1; // 0
uint32_t _22 : 1; // 1
uint32_t _23 : 1; // 1
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t op : 1;
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.opcode2 = static_cast<uint8_t>(enc.opcode2);
inst.op2 = static_cast<uint8_t>(enc.op2);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.sf = static_cast<uint8_t>(enc.sf);
inst.op = static_cast<uint8_t>(enc.op);
inst.iform = InstForm::RORV_64_DP_2SRC;
inst.iclass = InstName::RORV;
return true;
}
static bool TryExtractSTCLRB_32S_MEMOP(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000011111
// --------------------------------
// 00111000001000000001000000011111
if ((bits & 0xffe0fc1fU) != 0x3820101fU) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t opc : 3;
uint32_t o3 : 1;
uint32_t Rs : 5;
uint32_t _21 : 1; // 1
uint32_t R : 1;
uint32_t A : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.A = static_cast<uint8_t>(enc.A);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.V = static_cast<uint8_t>(enc.V);
inst.R = static_cast<uint8_t>(enc.R);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o3 = static_cast<uint8_t>(enc.o3);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::STCLRB_32S_MEMOP;
inst.iclass = InstName::STCLRB;
return true;
}
static bool TryExtractSTCLRLB_32S_MEMOP(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000011111
// --------------------------------
// 00111000011000000001000000011111
if ((bits & 0xffe0fc1fU) != 0x3860101fU) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t opc : 3;
uint32_t o3 : 1;
uint32_t Rs : 5;
uint32_t _21 : 1; // 1
uint32_t R : 1;
uint32_t A : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.A = static_cast<uint8_t>(enc.A);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.V = static_cast<uint8_t>(enc.V);
inst.R = static_cast<uint8_t>(enc.R);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o3 = static_cast<uint8_t>(enc.o3);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::STCLRLB_32S_MEMOP;
inst.iclass = InstName::STCLRLB;
return true;
}
static bool TryExtractLDARH_LR32_LDSTEXCL(InstData &inst, uint32_t bits) {
// bits
// & 11111111111111111111110000000000
// --------------------------------
// 01001000110111111111110000000000
if ((bits & 0xfffffc00U) != 0x48dffc00U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t Rt2 : 5;
uint32_t o0 : 1;
uint32_t Rs : 5;
uint32_t o1 : 1;
uint32_t L : 1;
uint32_t o2 : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 0
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.L = static_cast<uint8_t>(enc.L);
inst.Rt2 = static_cast<uint8_t>(enc.Rt2);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.o2 = static_cast<uint8_t>(enc.o2);
inst.o1 = static_cast<uint8_t>(enc.o1);
inst.o0 = static_cast<uint8_t>(enc.o0);
inst.iform = InstForm::LDARH_LR32_LDSTEXCL;
inst.iclass = InstName::LDARH;
return true;
}
static bool TryExtractSTSMAX_32S_MEMOP(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000011111
// --------------------------------
// 10111000001000000100000000011111
if ((bits & 0xffe0fc1fU) != 0xb820401fU) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t opc : 3;
uint32_t o3 : 1;
uint32_t Rs : 5;
uint32_t _21 : 1; // 1
uint32_t R : 1;
uint32_t A : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.A = static_cast<uint8_t>(enc.A);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.V = static_cast<uint8_t>(enc.V);
inst.R = static_cast<uint8_t>(enc.R);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o3 = static_cast<uint8_t>(enc.o3);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::STSMAX_32S_MEMOP;
inst.iclass = InstName::STSMAX;
return true;
}
static bool TryExtractSTSMAXL_32S_MEMOP(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000011111
// --------------------------------
// 10111000011000000100000000011111
if ((bits & 0xffe0fc1fU) != 0xb860401fU) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t opc : 3;
uint32_t o3 : 1;
uint32_t Rs : 5;
uint32_t _21 : 1; // 1
uint32_t R : 1;
uint32_t A : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.A = static_cast<uint8_t>(enc.A);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.V = static_cast<uint8_t>(enc.V);
inst.R = static_cast<uint8_t>(enc.R);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o3 = static_cast<uint8_t>(enc.o3);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::STSMAXL_32S_MEMOP;
inst.iclass = InstName::STSMAXL;
return true;
}
static bool TryExtractSTSMAX_64S_MEMOP(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000011111
// --------------------------------
// 11111000001000000100000000011111
if ((bits & 0xffe0fc1fU) != 0xf820401fU) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t opc : 3;
uint32_t o3 : 1;
uint32_t Rs : 5;
uint32_t _21 : 1; // 1
uint32_t R : 1;
uint32_t A : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.A = static_cast<uint8_t>(enc.A);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.V = static_cast<uint8_t>(enc.V);
inst.R = static_cast<uint8_t>(enc.R);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o3 = static_cast<uint8_t>(enc.o3);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::STSMAX_64S_MEMOP;
inst.iclass = InstName::STSMAX;
return true;
}
static bool TryExtractSTSMAXL_64S_MEMOP(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000011111
// --------------------------------
// 11111000011000000100000000011111
if ((bits & 0xffe0fc1fU) != 0xf860401fU) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t opc : 3;
uint32_t o3 : 1;
uint32_t Rs : 5;
uint32_t _21 : 1; // 1
uint32_t R : 1;
uint32_t A : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.A = static_cast<uint8_t>(enc.A);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.V = static_cast<uint8_t>(enc.V);
inst.R = static_cast<uint8_t>(enc.R);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o3 = static_cast<uint8_t>(enc.o3);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::STSMAXL_64S_MEMOP;
inst.iclass = InstName::STSMAXL;
return true;
}
static bool TryExtractBLR_64_BRANCH_REG(InstData &inst, uint32_t bits) {
// bits
// & 11111111111111111111110000011111
// --------------------------------
// 11010110001111110000000000000000
if ((bits & 0xfffffc1fU) != 0xd63f0000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t op4 : 5;
uint32_t Rn : 5;
uint32_t op3 : 6;
uint32_t op2 : 5;
uint32_t op : 2;
uint32_t opc : 2;
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 0
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 0
uint32_t _30 : 1; // 1
uint32_t _31 : 1; // 1
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.op4 = static_cast<uint8_t>(enc.op4);
inst.op2 = static_cast<uint8_t>(enc.op2);
inst.op3 = static_cast<uint8_t>(enc.op3);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.op = static_cast<uint8_t>(enc.op);
inst.iform = InstForm::BLR_64_BRANCH_REG;
inst.iclass = InstName::BLR;
return true;
}
static bool TryExtractCMN_ADDS_32S_ADDSUB_IMM(InstData &inst, uint32_t bits) {
// bits
// & 11111111000000000000000000011111
// --------------------------------
// 00110001000000000000000000011111
if ((bits & 0xff00001fU) != 0x3100001fU) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t imm12 : 12;
uint32_t shift : 2;
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 0
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t op : 1;
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.imm12.uimm = static_cast<uint64_t>(enc.imm12);
inst.shift = static_cast<uint8_t>(enc.shift);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.sf = static_cast<uint8_t>(enc.sf);
inst.op = static_cast<uint8_t>(enc.op);
inst.iform = InstForm::CMN_ADDS_32S_ADDSUB_IMM;
inst.iclass = InstName::ADDS;
return true;
}
static bool TryExtractCMN_ADDS_64S_ADDSUB_IMM(InstData &inst, uint32_t bits) {
// bits
// & 11111111000000000000000000011111
// --------------------------------
// 10110001000000000000000000011111
if ((bits & 0xff00001fU) != 0xb100001fU) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t imm12 : 12;
uint32_t shift : 2;
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 0
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t op : 1;
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.imm12.uimm = static_cast<uint64_t>(enc.imm12);
inst.shift = static_cast<uint8_t>(enc.shift);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.sf = static_cast<uint8_t>(enc.sf);
inst.op = static_cast<uint8_t>(enc.op);
inst.iform = InstForm::CMN_ADDS_64S_ADDSUB_IMM;
inst.iclass = InstName::ADDS;
return true;
}
static bool TryExtractSQDMULL_ASISDELEM_L(InstData &inst, uint32_t bits) {
// bits
// & 11111111000000001111010000000000
// --------------------------------
// 01011111000000001011000000000000
if ((bits & 0xff00f400U) != 0x5f00b000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t H : 1;
uint32_t opcode : 4;
uint32_t Rm : 4;
uint32_t M : 1;
uint32_t L : 1;
uint32_t size : 2;
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t U : 1;
uint32_t _30 : 1; // 1
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.H = static_cast<uint8_t>(enc.H);
inst.M = static_cast<uint8_t>(enc.M);
inst.L = static_cast<uint8_t>(enc.L);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.U = static_cast<uint8_t>(enc.U);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::SQDMULL_ASISDELEM_L;
inst.iclass = InstName::SQDMULL;
return true;
}
static bool TryExtractSQDMULL_ASIMDELEM_L(InstData &inst, uint32_t bits) {
// bits
// & 10111111000000001111010000000000
// --------------------------------
// 00001111000000001011000000000000
if ((bits & 0xbf00f400U) != 0xf00b000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t H : 1;
uint32_t opcode : 4;
uint32_t Rm : 4;
uint32_t M : 1;
uint32_t L : 1;
uint32_t size : 2;
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Q = static_cast<uint8_t>(enc.Q);
inst.H = static_cast<uint8_t>(enc.H);
inst.M = static_cast<uint8_t>(enc.M);
inst.L = static_cast<uint8_t>(enc.L);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.U = static_cast<uint8_t>(enc.U);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::SQDMULL_ASIMDELEM_L;
inst.iclass = InstName::SQDMULL;
return true;
}
static bool TryExtractCSET_CSINC_32_CONDSEL(InstData &inst, uint32_t bits) {
// bits
// & 11111111111111110000111111100000
// --------------------------------
// 00011010100111110000011111100000
if ((bits & 0xffff0fe0U) != 0x1a9f07e0U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t o2 : 1;
uint32_t _11 : 1; // 0
uint32_t cond : 4;
uint32_t Rm : 5;
uint32_t _21 : 1; // 0
uint32_t _22 : 1; // 0
uint32_t _23 : 1; // 1
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t op : 1;
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.sf = static_cast<uint8_t>(enc.sf);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.cond = static_cast<uint8_t>(enc.cond);
if (!(inst.cond != 0xe))
return false;
if (!(inst.cond != 0xf))
return false;
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o2 = static_cast<uint8_t>(enc.o2);
inst.op = static_cast<uint8_t>(enc.op);
inst.iform = InstForm::CSET_CSINC_32_CONDSEL;
inst.iclass = InstName::CSINC;
return true;
}
static bool TryExtractCSET_CSINC_64_CONDSEL(InstData &inst, uint32_t bits) {
// bits
// & 11111111111111110000111111100000
// --------------------------------
// 10011010100111110000011111100000
if ((bits & 0xffff0fe0U) != 0x9a9f07e0U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t o2 : 1;
uint32_t _11 : 1; // 0
uint32_t cond : 4;
uint32_t Rm : 5;
uint32_t _21 : 1; // 0
uint32_t _22 : 1; // 0
uint32_t _23 : 1; // 1
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t op : 1;
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.sf = static_cast<uint8_t>(enc.sf);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.cond = static_cast<uint8_t>(enc.cond);
if (!(inst.cond != 0xe))
return false;
if (!(inst.cond != 0xf))
return false;
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o2 = static_cast<uint8_t>(enc.o2);
inst.op = static_cast<uint8_t>(enc.op);
inst.iform = InstForm::CSET_CSINC_64_CONDSEL;
inst.iclass = InstName::CSINC;
return true;
}
static bool TryExtractLD1_ASISDLSO_B1_1B(InstData &inst, uint32_t bits) {
// bits
// & 10111111111111111110000000000000
// --------------------------------
// 00001101010000000000000000000000
if ((bits & 0xbfffe000U) != 0xd400000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t size : 2;
uint32_t S : 1;
uint32_t opcode : 3;
uint32_t _16 : 1; // 0
uint32_t _17 : 1; // 0
uint32_t _18 : 1; // 0
uint32_t _19 : 1; // 0
uint32_t _20 : 1; // 0
uint32_t R : 1;
uint32_t L : 1;
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 0
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.L = static_cast<uint8_t>(enc.L);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.S = static_cast<uint8_t>(enc.S);
inst.R = static_cast<uint8_t>(enc.R);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LD1_ASISDLSO_B1_1B;
inst.iclass = InstName::LD1;
return true;
}
static bool TryExtractLD1_ASISDLSO_H1_1H(InstData &inst, uint32_t bits) {
// bits
// & 10111111111111111110010000000000
// --------------------------------
// 00001101010000000100000000000000
if ((bits & 0xbfffe400U) != 0xd404000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t size : 2;
uint32_t S : 1;
uint32_t opcode : 3;
uint32_t _16 : 1; // 0
uint32_t _17 : 1; // 0
uint32_t _18 : 1; // 0
uint32_t _19 : 1; // 0
uint32_t _20 : 1; // 0
uint32_t R : 1;
uint32_t L : 1;
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 0
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.L = static_cast<uint8_t>(enc.L);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.S = static_cast<uint8_t>(enc.S);
inst.R = static_cast<uint8_t>(enc.R);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LD1_ASISDLSO_H1_1H;
inst.iclass = InstName::LD1;
return true;
}
static bool TryExtractLD1_ASISDLSO_S1_1S(InstData &inst, uint32_t bits) {
// bits
// & 10111111111111111110110000000000
// --------------------------------
// 00001101010000001000000000000000
if ((bits & 0xbfffec00U) != 0xd408000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t size : 2;
uint32_t S : 1;
uint32_t opcode : 3;
uint32_t _16 : 1; // 0
uint32_t _17 : 1; // 0
uint32_t _18 : 1; // 0
uint32_t _19 : 1; // 0
uint32_t _20 : 1; // 0
uint32_t R : 1;
uint32_t L : 1;
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 0
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.L = static_cast<uint8_t>(enc.L);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.S = static_cast<uint8_t>(enc.S);
inst.R = static_cast<uint8_t>(enc.R);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LD1_ASISDLSO_S1_1S;
inst.iclass = InstName::LD1;
return true;
}
static bool TryExtractLD1_ASISDLSO_D1_1D(InstData &inst, uint32_t bits) {
// bits
// & 10111111111111111111110000000000
// --------------------------------
// 00001101010000001000010000000000
if ((bits & 0xbffffc00U) != 0xd408400U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t size : 2;
uint32_t S : 1;
uint32_t opcode : 3;
uint32_t _16 : 1; // 0
uint32_t _17 : 1; // 0
uint32_t _18 : 1; // 0
uint32_t _19 : 1; // 0
uint32_t _20 : 1; // 0
uint32_t R : 1;
uint32_t L : 1;
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 0
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.L = static_cast<uint8_t>(enc.L);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.S = static_cast<uint8_t>(enc.S);
inst.R = static_cast<uint8_t>(enc.R);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LD1_ASISDLSO_D1_1D;
inst.iclass = InstName::LD1;
return true;
}
static bool TryExtractLD1_ASISDLSOP_B1_I1B(InstData &inst, uint32_t bits) {
// bits
// & 10111111111111111110000000000000
// --------------------------------
// 00001101110111110000000000000000
if ((bits & 0xbfffe000U) != 0xddf0000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t size : 2;
uint32_t S : 1;
uint32_t opcode : 3;
uint32_t Rm : 5;
uint32_t R : 1;
uint32_t L : 1;
uint32_t _23 : 1; // 1
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 0
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.L = static_cast<uint8_t>(enc.L);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.S = static_cast<uint8_t>(enc.S);
inst.R = static_cast<uint8_t>(enc.R);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LD1_ASISDLSOP_B1_I1B;
inst.iclass = InstName::LD1;
return true;
}
static bool TryExtractLD1_ASISDLSOP_BX1_R1B(InstData &inst, uint32_t bits) {
// bits
// & 10111111111000001110000000000000
// --------------------------------
// 00001101110000000000000000000000
if ((bits & 0xbfe0e000U) != 0xdc00000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t size : 2;
uint32_t S : 1;
uint32_t opcode : 3;
uint32_t Rm : 5;
uint32_t R : 1;
uint32_t L : 1;
uint32_t _23 : 1; // 1
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 0
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.L = static_cast<uint8_t>(enc.L);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.S = static_cast<uint8_t>(enc.S);
inst.R = static_cast<uint8_t>(enc.R);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LD1_ASISDLSOP_BX1_R1B;
inst.iclass = InstName::LD1;
return true;
}
static bool TryExtractLD1_ASISDLSOP_H1_I1H(InstData &inst, uint32_t bits) {
// bits
// & 10111111111111111110010000000000
// --------------------------------
// 00001101110111110100000000000000
if ((bits & 0xbfffe400U) != 0xddf4000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t size : 2;
uint32_t S : 1;
uint32_t opcode : 3;
uint32_t Rm : 5;
uint32_t R : 1;
uint32_t L : 1;
uint32_t _23 : 1; // 1
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 0
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.L = static_cast<uint8_t>(enc.L);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.S = static_cast<uint8_t>(enc.S);
inst.R = static_cast<uint8_t>(enc.R);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LD1_ASISDLSOP_H1_I1H;
inst.iclass = InstName::LD1;
return true;
}
static bool TryExtractLD1_ASISDLSOP_HX1_R1H(InstData &inst, uint32_t bits) {
// bits
// & 10111111111000001110010000000000
// --------------------------------
// 00001101110000000100000000000000
if ((bits & 0xbfe0e400U) != 0xdc04000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t size : 2;
uint32_t S : 1;
uint32_t opcode : 3;
uint32_t Rm : 5;
uint32_t R : 1;
uint32_t L : 1;
uint32_t _23 : 1; // 1
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 0
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.L = static_cast<uint8_t>(enc.L);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.S = static_cast<uint8_t>(enc.S);
inst.R = static_cast<uint8_t>(enc.R);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LD1_ASISDLSOP_HX1_R1H;
inst.iclass = InstName::LD1;
return true;
}
static bool TryExtractLD1_ASISDLSOP_S1_I1S(InstData &inst, uint32_t bits) {
// bits
// & 10111111111111111110110000000000
// --------------------------------
// 00001101110111111000000000000000
if ((bits & 0xbfffec00U) != 0xddf8000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t size : 2;
uint32_t S : 1;
uint32_t opcode : 3;
uint32_t Rm : 5;
uint32_t R : 1;
uint32_t L : 1;
uint32_t _23 : 1; // 1
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 0
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.L = static_cast<uint8_t>(enc.L);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.S = static_cast<uint8_t>(enc.S);
inst.R = static_cast<uint8_t>(enc.R);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LD1_ASISDLSOP_S1_I1S;
inst.iclass = InstName::LD1;
return true;
}
static bool TryExtractLD1_ASISDLSOP_SX1_R1S(InstData &inst, uint32_t bits) {
// bits
// & 10111111111000001110110000000000
// --------------------------------
// 00001101110000001000000000000000
if ((bits & 0xbfe0ec00U) != 0xdc08000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t size : 2;
uint32_t S : 1;
uint32_t opcode : 3;
uint32_t Rm : 5;
uint32_t R : 1;
uint32_t L : 1;
uint32_t _23 : 1; // 1
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 0
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.L = static_cast<uint8_t>(enc.L);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.S = static_cast<uint8_t>(enc.S);
inst.R = static_cast<uint8_t>(enc.R);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LD1_ASISDLSOP_SX1_R1S;
inst.iclass = InstName::LD1;
return true;
}
static bool TryExtractLD1_ASISDLSOP_D1_I1D(InstData &inst, uint32_t bits) {
// bits
// & 10111111111111111111110000000000
// --------------------------------
// 00001101110111111000010000000000
if ((bits & 0xbffffc00U) != 0xddf8400U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t size : 2;
uint32_t S : 1;
uint32_t opcode : 3;
uint32_t Rm : 5;
uint32_t R : 1;
uint32_t L : 1;
uint32_t _23 : 1; // 1
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 0
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.L = static_cast<uint8_t>(enc.L);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.S = static_cast<uint8_t>(enc.S);
inst.R = static_cast<uint8_t>(enc.R);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LD1_ASISDLSOP_D1_I1D;
inst.iclass = InstName::LD1;
return true;
}
static bool TryExtractLD1_ASISDLSOP_DX1_R1D(InstData &inst, uint32_t bits) {
// bits
// & 10111111111000001111110000000000
// --------------------------------
// 00001101110000001000010000000000
if ((bits & 0xbfe0fc00U) != 0xdc08400U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t size : 2;
uint32_t S : 1;
uint32_t opcode : 3;
uint32_t Rm : 5;
uint32_t R : 1;
uint32_t L : 1;
uint32_t _23 : 1; // 1
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 0
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.L = static_cast<uint8_t>(enc.L);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.S = static_cast<uint8_t>(enc.S);
inst.R = static_cast<uint8_t>(enc.R);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LD1_ASISDLSOP_DX1_R1D;
inst.iclass = InstName::LD1;
return true;
}
static bool TryExtractCCMN_32_CONDCMP_REG(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000000000110000010000
// --------------------------------
// 00111010010000000000000000000000
if ((bits & 0xffe00c10U) != 0x3a400000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t nzcv : 4;
uint32_t o3 : 1;
uint32_t Rn : 5;
uint32_t o2 : 1;
uint32_t _11 : 1; // 0
uint32_t cond : 4;
uint32_t Rm : 5;
uint32_t _21 : 1; // 0
uint32_t _22 : 1; // 1
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t op : 1;
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.nzcv = static_cast<uint8_t>(enc.nzcv);
inst.sf = static_cast<uint8_t>(enc.sf);
inst.S = static_cast<uint8_t>(enc.S);
inst.cond = static_cast<uint8_t>(enc.cond);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o3 = static_cast<uint8_t>(enc.o3);
inst.o2 = static_cast<uint8_t>(enc.o2);
inst.op = static_cast<uint8_t>(enc.op);
inst.iform = InstForm::CCMN_32_CONDCMP_REG;
inst.iclass = InstName::CCMN;
return true;
}
static bool TryExtractCCMN_64_CONDCMP_REG(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000000000110000010000
// --------------------------------
// 10111010010000000000000000000000
if ((bits & 0xffe00c10U) != 0xba400000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t nzcv : 4;
uint32_t o3 : 1;
uint32_t Rn : 5;
uint32_t o2 : 1;
uint32_t _11 : 1; // 0
uint32_t cond : 4;
uint32_t Rm : 5;
uint32_t _21 : 1; // 0
uint32_t _22 : 1; // 1
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t op : 1;
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.nzcv = static_cast<uint8_t>(enc.nzcv);
inst.sf = static_cast<uint8_t>(enc.sf);
inst.S = static_cast<uint8_t>(enc.S);
inst.cond = static_cast<uint8_t>(enc.cond);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o3 = static_cast<uint8_t>(enc.o3);
inst.o2 = static_cast<uint8_t>(enc.o2);
inst.op = static_cast<uint8_t>(enc.op);
inst.iform = InstForm::CCMN_64_CONDCMP_REG;
inst.iclass = InstName::CCMN;
return true;
}
static bool TryExtractSTNP_S_LDSTNAPAIR_OFFS(InstData &inst, uint32_t bits) {
// bits
// & 11111111110000000000000000000000
// --------------------------------
// 00101100000000000000000000000000
if ((bits & 0xffc00000U) != 0x2c000000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t Rt2 : 5;
uint32_t imm7 : 7;
uint32_t L : 1;
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 1
uint32_t opc : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rt2 = static_cast<uint8_t>(enc.Rt2);
inst.L = static_cast<uint8_t>(enc.L);
inst.V = static_cast<uint8_t>(enc.V);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.imm7.uimm = static_cast<uint64_t>(enc.imm7);
inst.iform = InstForm::STNP_S_LDSTNAPAIR_OFFS;
inst.iclass = InstName::STNP;
return true;
}
static bool TryExtractSTNP_D_LDSTNAPAIR_OFFS(InstData &inst, uint32_t bits) {
// bits
// & 11111111110000000000000000000000
// --------------------------------
// 01101100000000000000000000000000
if ((bits & 0xffc00000U) != 0x6c000000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t Rt2 : 5;
uint32_t imm7 : 7;
uint32_t L : 1;
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 1
uint32_t opc : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rt2 = static_cast<uint8_t>(enc.Rt2);
inst.L = static_cast<uint8_t>(enc.L);
inst.V = static_cast<uint8_t>(enc.V);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.imm7.uimm = static_cast<uint64_t>(enc.imm7);
inst.iform = InstForm::STNP_D_LDSTNAPAIR_OFFS;
inst.iclass = InstName::STNP;
return true;
}
static bool TryExtractSTNP_Q_LDSTNAPAIR_OFFS(InstData &inst, uint32_t bits) {
// bits
// & 11111111110000000000000000000000
// --------------------------------
// 10101100000000000000000000000000
if ((bits & 0xffc00000U) != 0xac000000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t Rt2 : 5;
uint32_t imm7 : 7;
uint32_t L : 1;
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 1
uint32_t opc : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rt2 = static_cast<uint8_t>(enc.Rt2);
inst.L = static_cast<uint8_t>(enc.L);
inst.V = static_cast<uint8_t>(enc.V);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.imm7.uimm = static_cast<uint64_t>(enc.imm7);
inst.iform = InstForm::STNP_Q_LDSTNAPAIR_OFFS;
inst.iclass = InstName::STNP;
return true;
}
static bool TryExtractFSUB_H_FLOATDP2(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 00011110111000000011100000000000
if ((bits & 0xffe0fc00U) != 0x1ee03800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t op : 1;
uint32_t _13 : 1; // 1
uint32_t _14 : 1; // 0
uint32_t _15 : 1; // 0
uint32_t Rm : 5;
uint32_t _21 : 1; // 1
uint32_t type : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t _30 : 1; // 0
uint32_t M : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.M = static_cast<uint8_t>(enc.M);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.type = static_cast<uint8_t>(enc.type);
inst.op = static_cast<uint8_t>(enc.op);
inst.iform = InstForm::FSUB_H_FLOATDP2;
inst.iclass = InstName::FSUB;
return true;
}
static bool TryExtractFSUB_S_FLOATDP2(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 00011110001000000011100000000000
if ((bits & 0xffe0fc00U) != 0x1e203800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t op : 1;
uint32_t _13 : 1; // 1
uint32_t _14 : 1; // 0
uint32_t _15 : 1; // 0
uint32_t Rm : 5;
uint32_t _21 : 1; // 1
uint32_t type : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t _30 : 1; // 0
uint32_t M : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.M = static_cast<uint8_t>(enc.M);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.type = static_cast<uint8_t>(enc.type);
inst.op = static_cast<uint8_t>(enc.op);
inst.iform = InstForm::FSUB_S_FLOATDP2;
inst.iclass = InstName::FSUB;
return true;
}
static bool TryExtractFSUB_D_FLOATDP2(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 00011110011000000011100000000000
if ((bits & 0xffe0fc00U) != 0x1e603800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t op : 1;
uint32_t _13 : 1; // 1
uint32_t _14 : 1; // 0
uint32_t _15 : 1; // 0
uint32_t Rm : 5;
uint32_t _21 : 1; // 1
uint32_t type : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t _30 : 1; // 0
uint32_t M : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.M = static_cast<uint8_t>(enc.M);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.type = static_cast<uint8_t>(enc.type);
inst.op = static_cast<uint8_t>(enc.op);
inst.iform = InstForm::FSUB_D_FLOATDP2;
inst.iclass = InstName::FSUB;
return true;
}
static bool TryExtractCSNEG_32_CONDSEL(InstData &inst, uint32_t bits) {
if (false && TryExtractCNEG_CSNEG_32_CONDSEL(inst, bits))
return true;
// bits
// & 11111111111000000000110000000000
// --------------------------------
// 01011010100000000000010000000000
if ((bits & 0xffe00c00U) != 0x5a800400U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t o2 : 1;
uint32_t _11 : 1; // 0
uint32_t cond : 4;
uint32_t Rm : 5;
uint32_t _21 : 1; // 0
uint32_t _22 : 1; // 0
uint32_t _23 : 1; // 1
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t op : 1;
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.sf = static_cast<uint8_t>(enc.sf);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.cond = static_cast<uint8_t>(enc.cond);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o2 = static_cast<uint8_t>(enc.o2);
inst.op = static_cast<uint8_t>(enc.op);
inst.iform = InstForm::CSNEG_32_CONDSEL;
inst.iclass = InstName::CSNEG;
return true;
}
static bool TryExtractCSNEG_64_CONDSEL(InstData &inst, uint32_t bits) {
if (false && TryExtractCNEG_CSNEG_64_CONDSEL(inst, bits))
return true;
// bits
// & 11111111111000000000110000000000
// --------------------------------
// 11011010100000000000010000000000
if ((bits & 0xffe00c00U) != 0xda800400U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t o2 : 1;
uint32_t _11 : 1; // 0
uint32_t cond : 4;
uint32_t Rm : 5;
uint32_t _21 : 1; // 0
uint32_t _22 : 1; // 0
uint32_t _23 : 1; // 1
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t op : 1;
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.sf = static_cast<uint8_t>(enc.sf);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.cond = static_cast<uint8_t>(enc.cond);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o2 = static_cast<uint8_t>(enc.o2);
inst.op = static_cast<uint8_t>(enc.op);
inst.iform = InstForm::CSNEG_64_CONDSEL;
inst.iclass = InstName::CSNEG;
return true;
}
static bool TryExtractASR_ASRV_32_DP_2SRC(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 00011010110000000010100000000000
if ((bits & 0xffe0fc00U) != 0x1ac02800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t op2 : 2;
uint32_t opcode2 : 4;
uint32_t Rm : 5;
uint32_t _21 : 1; // 0
uint32_t _22 : 1; // 1
uint32_t _23 : 1; // 1
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t op : 1;
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.opcode2 = static_cast<uint8_t>(enc.opcode2);
inst.op2 = static_cast<uint8_t>(enc.op2);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.sf = static_cast<uint8_t>(enc.sf);
inst.op = static_cast<uint8_t>(enc.op);
inst.iform = InstForm::ASR_ASRV_32_DP_2SRC;
inst.iclass = InstName::ASRV;
return true;
}
static bool TryExtractASR_ASRV_64_DP_2SRC(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 10011010110000000010100000000000
if ((bits & 0xffe0fc00U) != 0x9ac02800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t op2 : 2;
uint32_t opcode2 : 4;
uint32_t Rm : 5;
uint32_t _21 : 1; // 0
uint32_t _22 : 1; // 1
uint32_t _23 : 1; // 1
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t op : 1;
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.opcode2 = static_cast<uint8_t>(enc.opcode2);
inst.op2 = static_cast<uint8_t>(enc.op2);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.sf = static_cast<uint8_t>(enc.sf);
inst.op = static_cast<uint8_t>(enc.op);
inst.iform = InstForm::ASR_ASRV_64_DP_2SRC;
inst.iclass = InstName::ASRV;
return true;
}
static bool TryExtractUMULL_UMADDL_64WA_DP_3SRC(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 10011011101000000111110000000000
if ((bits & 0xffe0fc00U) != 0x9ba07c00U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t Ra : 5;
uint32_t o0 : 1;
uint32_t Rm : 5;
uint32_t _21 : 1; // 1
uint32_t _22 : 1; // 0
uint32_t U : 1;
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t op54 : 2;
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.U = static_cast<uint8_t>(enc.U);
inst.Ra = static_cast<uint8_t>(enc.Ra);
inst.op54 = static_cast<uint8_t>(enc.op54);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.sf = static_cast<uint8_t>(enc.sf);
inst.o0 = static_cast<uint8_t>(enc.o0);
inst.iform = InstForm::UMULL_UMADDL_64WA_DP_3SRC;
inst.iclass = InstName::UMADDL;
return true;
}
static bool TryExtractFCMGT_ASISDSAMEFP16_ONLY(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 01111110110000000010010000000000
if ((bits & 0xffe0fc00U) != 0x7ec02400U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t ac : 1;
uint32_t _12 : 1; // 0
uint32_t _13 : 1; // 1
uint32_t _14 : 1; // 0
uint32_t _15 : 1; // 0
uint32_t Rm : 5;
uint32_t _21 : 1; // 0
uint32_t _22 : 1; // 1
uint32_t E : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t U : 1;
uint32_t _30 : 1; // 1
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.ac = static_cast<uint8_t>(enc.ac);
inst.E = static_cast<uint8_t>(enc.E);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.iform = InstForm::FCMGT_ASISDSAMEFP16_ONLY;
inst.iclass = InstName::FCMGT;
return true;
}
static bool TryExtractFCMGT_ASISDSAME_ONLY(InstData &inst, uint32_t bits) {
// bits
// & 11111111101000001111110000000000
// --------------------------------
// 01111110101000001110010000000000
if ((bits & 0xffa0fc00U) != 0x7ea0e400U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t ac : 1;
uint32_t _12 : 1; // 0
uint32_t _13 : 1; // 1
uint32_t _14 : 1; // 1
uint32_t _15 : 1; // 1
uint32_t Rm : 5;
uint32_t _21 : 1; // 1
uint32_t sz : 1;
uint32_t E : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t U : 1;
uint32_t _30 : 1; // 1
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.sz = static_cast<uint8_t>(enc.sz);
inst.ac = static_cast<uint8_t>(enc.ac);
inst.E = static_cast<uint8_t>(enc.E);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.iform = InstForm::FCMGT_ASISDSAME_ONLY;
inst.iclass = InstName::FCMGT;
return true;
}
static bool TryExtractFCMGT_ASIMDSAMEFP16_ONLY(InstData &inst, uint32_t bits) {
// bits
// & 10111111111000001111110000000000
// --------------------------------
// 00101110110000000010010000000000
if ((bits & 0xbfe0fc00U) != 0x2ec02400U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t ac : 1;
uint32_t _12 : 1; // 0
uint32_t _13 : 1; // 1
uint32_t _14 : 1; // 0
uint32_t _15 : 1; // 0
uint32_t Rm : 5;
uint32_t _21 : 1; // 0
uint32_t _22 : 1; // 1
uint32_t E : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Q = static_cast<uint8_t>(enc.Q);
inst.ac = static_cast<uint8_t>(enc.ac);
inst.E = static_cast<uint8_t>(enc.E);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.iform = InstForm::FCMGT_ASIMDSAMEFP16_ONLY;
inst.iclass = InstName::FCMGT;
return true;
}
static bool TryExtractFCMGT_ASIMDSAME_ONLY(InstData &inst, uint32_t bits) {
// bits
// & 10111111101000001111110000000000
// --------------------------------
// 00101110101000001110010000000000
if ((bits & 0xbfa0fc00U) != 0x2ea0e400U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t ac : 1;
uint32_t _12 : 1; // 0
uint32_t _13 : 1; // 1
uint32_t _14 : 1; // 1
uint32_t _15 : 1; // 1
uint32_t Rm : 5;
uint32_t _21 : 1; // 1
uint32_t sz : 1;
uint32_t E : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.sz = static_cast<uint8_t>(enc.sz);
inst.ac = static_cast<uint8_t>(enc.ac);
inst.E = static_cast<uint8_t>(enc.E);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.iform = InstForm::FCMGT_ASIMDSAME_ONLY;
inst.iclass = InstName::FCMGT;
return true;
}
static bool TryExtractUSUBW_ASIMDDIFF_W(InstData &inst, uint32_t bits) {
// bits
// & 10111111001000001111110000000000
// --------------------------------
// 00101110001000000011000000000000
if ((bits & 0xbf20fc00U) != 0x2e203000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t _12 : 1; // 1
uint32_t o1 : 1;
uint32_t _14 : 1; // 0
uint32_t _15 : 1; // 0
uint32_t Rm : 5;
uint32_t _21 : 1; // 1
uint32_t size : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o1 = static_cast<uint8_t>(enc.o1);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::USUBW_ASIMDDIFF_W;
inst.iclass = InstName::USUBW;
return true;
}
static bool TryExtractREV32_64_DP_1SRC(InstData &inst, uint32_t bits) {
// bits
// & 11111111111111111111110000000000
// --------------------------------
// 11011010110000000000100000000000
if ((bits & 0xfffffc00U) != 0xdac00800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t opc : 2;
uint32_t opcode : 4;
uint32_t opcode2 : 5;
uint32_t _21 : 1; // 0
uint32_t _22 : 1; // 1
uint32_t _23 : 1; // 1
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t _30 : 1; // 1
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.opcode2 = static_cast<uint8_t>(enc.opcode2);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.sf = static_cast<uint8_t>(enc.sf);
inst.iform = InstForm::REV32_64_DP_1SRC;
inst.iclass = InstName::REV32;
return true;
}
static bool TryExtractFSQRT_ASIMDMISCFP16_R(InstData &inst, uint32_t bits) {
// bits
// & 10111111111111111111110000000000
// --------------------------------
// 00101110111110011111100000000000
if ((bits & 0xbffffc00U) != 0x2ef9f800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t opcode : 5;
uint32_t _17 : 1; // 0
uint32_t _18 : 1; // 0
uint32_t _19 : 1; // 1
uint32_t _20 : 1; // 1
uint32_t _21 : 1; // 1
uint32_t _22 : 1; // 1
uint32_t a : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.a = static_cast<uint8_t>(enc.a);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.iform = InstForm::FSQRT_ASIMDMISCFP16_R;
inst.iclass = InstName::FSQRT;
return true;
}
static bool TryExtractFSQRT_ASIMDMISC_R(InstData &inst, uint32_t bits) {
// bits
// & 10111111101111111111110000000000
// --------------------------------
// 00101110101000011111100000000000
if ((bits & 0xbfbffc00U) != 0x2ea1f800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t opcode : 5;
uint32_t _17 : 1; // 0
uint32_t _18 : 1; // 0
uint32_t _19 : 1; // 0
uint32_t _20 : 1; // 0
uint32_t _21 : 1; // 1
uint32_t sz : 1;
uint32_t _23 : 1; // 1
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.sz = static_cast<uint8_t>(enc.sz);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.U = static_cast<uint8_t>(enc.U);
inst.iform = InstForm::FSQRT_ASIMDMISC_R;
inst.iclass = InstName::FSQRT;
return true;
}
static bool TryExtractLSL_LSLV_32_DP_2SRC(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 00011010110000000010000000000000
if ((bits & 0xffe0fc00U) != 0x1ac02000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t op2 : 2;
uint32_t opcode2 : 4;
uint32_t Rm : 5;
uint32_t _21 : 1; // 0
uint32_t _22 : 1; // 1
uint32_t _23 : 1; // 1
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t op : 1;
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.opcode2 = static_cast<uint8_t>(enc.opcode2);
inst.op2 = static_cast<uint8_t>(enc.op2);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.sf = static_cast<uint8_t>(enc.sf);
inst.op = static_cast<uint8_t>(enc.op);
inst.iform = InstForm::LSL_LSLV_32_DP_2SRC;
inst.iclass = InstName::LSLV;
return true;
}
static bool TryExtractLSL_LSLV_64_DP_2SRC(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 10011010110000000010000000000000
if ((bits & 0xffe0fc00U) != 0x9ac02000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t op2 : 2;
uint32_t opcode2 : 4;
uint32_t Rm : 5;
uint32_t _21 : 1; // 0
uint32_t _22 : 1; // 1
uint32_t _23 : 1; // 1
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t op : 1;
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.opcode2 = static_cast<uint8_t>(enc.opcode2);
inst.op2 = static_cast<uint8_t>(enc.op2);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.sf = static_cast<uint8_t>(enc.sf);
inst.op = static_cast<uint8_t>(enc.op);
inst.iform = InstForm::LSL_LSLV_64_DP_2SRC;
inst.iclass = InstName::LSLV;
return true;
}
static bool TryExtractEXTR_32_EXTRACT(InstData &inst, uint32_t bits) {
if (false && TryExtractROR_EXTR_32_EXTRACT(inst, bits))
return true;
// bits
// & 11111111111000001000000000000000
// --------------------------------
// 00010011100000000000000000000000
if ((bits & 0xffe08000U) != 0x13800000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t imms : 6;
uint32_t Rm : 5;
uint32_t o0 : 1;
uint32_t N : 1;
uint32_t _23 : 1; // 1
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 0
uint32_t _28 : 1; // 1
uint32_t op21 : 2;
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.N = static_cast<uint8_t>(enc.N);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.op21 = static_cast<uint8_t>(enc.op21);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.sf = static_cast<uint8_t>(enc.sf);
inst.imms.uimm = static_cast<uint64_t>(enc.imms);
inst.o0 = static_cast<uint8_t>(enc.o0);
inst.iform = InstForm::EXTR_32_EXTRACT;
inst.iclass = InstName::EXTR;
return true;
}
static bool TryExtractEXTR_64_EXTRACT(InstData &inst, uint32_t bits) {
if (false && TryExtractROR_EXTR_64_EXTRACT(inst, bits))
return true;
// bits
// & 11111111111000000000000000000000
// --------------------------------
// 10010011110000000000000000000000
if ((bits & 0xffe00000U) != 0x93c00000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t imms : 6;
uint32_t Rm : 5;
uint32_t o0 : 1;
uint32_t N : 1;
uint32_t _23 : 1; // 1
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 0
uint32_t _28 : 1; // 1
uint32_t op21 : 2;
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.N = static_cast<uint8_t>(enc.N);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.op21 = static_cast<uint8_t>(enc.op21);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.sf = static_cast<uint8_t>(enc.sf);
inst.imms.uimm = static_cast<uint64_t>(enc.imms);
inst.o0 = static_cast<uint8_t>(enc.o0);
inst.iform = InstForm::EXTR_64_EXTRACT;
inst.iclass = InstName::EXTR;
return true;
}
static bool TryExtractFCVTAU_ASISDMISCFP16_R(InstData &inst, uint32_t bits) {
// bits
// & 11111111111111111111110000000000
// --------------------------------
// 01111110011110011100100000000000
if ((bits & 0xfffffc00U) != 0x7e79c800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t opcode : 5;
uint32_t _17 : 1; // 0
uint32_t _18 : 1; // 0
uint32_t _19 : 1; // 1
uint32_t _20 : 1; // 1
uint32_t _21 : 1; // 1
uint32_t _22 : 1; // 1
uint32_t size : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t U : 1;
uint32_t _30 : 1; // 1
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::FCVTAU_ASISDMISCFP16_R;
inst.iclass = InstName::FCVTAU;
return true;
}
static bool TryExtractFCVTAU_ASISDMISC_R(InstData &inst, uint32_t bits) {
// bits
// & 11111111101111111111110000000000
// --------------------------------
// 01111110001000011100100000000000
if ((bits & 0xffbffc00U) != 0x7e21c800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t opcode : 5;
uint32_t _17 : 1; // 0
uint32_t _18 : 1; // 0
uint32_t _19 : 1; // 0
uint32_t _20 : 1; // 0
uint32_t _21 : 1; // 1
uint32_t sz : 1;
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t U : 1;
uint32_t _30 : 1; // 1
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.sz = static_cast<uint8_t>(enc.sz);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.U = static_cast<uint8_t>(enc.U);
inst.iform = InstForm::FCVTAU_ASISDMISC_R;
inst.iclass = InstName::FCVTAU;
return true;
}
static bool TryExtractFCVTAU_ASIMDMISCFP16_R(InstData &inst, uint32_t bits) {
// bits
// & 10111111111111111111110000000000
// --------------------------------
// 00101110011110011100100000000000
if ((bits & 0xbffffc00U) != 0x2e79c800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t opcode : 5;
uint32_t _17 : 1; // 0
uint32_t _18 : 1; // 0
uint32_t _19 : 1; // 1
uint32_t _20 : 1; // 1
uint32_t _21 : 1; // 1
uint32_t _22 : 1; // 1
uint32_t a : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.a = static_cast<uint8_t>(enc.a);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.iform = InstForm::FCVTAU_ASIMDMISCFP16_R;
inst.iclass = InstName::FCVTAU;
return true;
}
static bool TryExtractFCVTAU_ASIMDMISC_R(InstData &inst, uint32_t bits) {
// bits
// & 10111111101111111111110000000000
// --------------------------------
// 00101110001000011100100000000000
if ((bits & 0xbfbffc00U) != 0x2e21c800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t opcode : 5;
uint32_t _17 : 1; // 0
uint32_t _18 : 1; // 0
uint32_t _19 : 1; // 0
uint32_t _20 : 1; // 0
uint32_t _21 : 1; // 1
uint32_t sz : 1;
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.sz = static_cast<uint8_t>(enc.sz);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.U = static_cast<uint8_t>(enc.U);
inst.iform = InstForm::FCVTAU_ASIMDMISC_R;
inst.iclass = InstName::FCVTAU;
return true;
}
static bool TryExtractBFXIL_BFM_32M_BITFIELD(InstData &inst, uint32_t bits) {
// bits
// & 11111111110000000000000000000000
// --------------------------------
// 00110011000000000000000000000000
if ((bits & 0xffc00000U) != 0x33000000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t imms : 6;
uint32_t immr : 6;
uint32_t N : 1;
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 0
uint32_t _28 : 1; // 1
uint32_t opc : 2;
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.sf = static_cast<uint8_t>(enc.sf);
inst.N = static_cast<uint8_t>(enc.N);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.immr.uimm = static_cast<uint64_t>(enc.immr);
inst.imms.uimm = static_cast<uint64_t>(enc.imms);
inst.iform = InstForm::BFXIL_BFM_32M_BITFIELD;
inst.iclass = InstName::BFM;
return true;
}
static bool TryExtractBFXIL_BFM_64M_BITFIELD(InstData &inst, uint32_t bits) {
// bits
// & 11111111110000000000000000000000
// --------------------------------
// 10110011010000000000000000000000
if ((bits & 0xffc00000U) != 0xb3400000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t imms : 6;
uint32_t immr : 6;
uint32_t N : 1;
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 0
uint32_t _28 : 1; // 1
uint32_t opc : 2;
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.sf = static_cast<uint8_t>(enc.sf);
inst.N = static_cast<uint8_t>(enc.N);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.immr.uimm = static_cast<uint64_t>(enc.immr);
inst.imms.uimm = static_cast<uint64_t>(enc.imms);
inst.iform = InstForm::BFXIL_BFM_64M_BITFIELD;
inst.iclass = InstName::BFM;
return true;
}
static bool TryExtractZIP1_ASIMDPERM_ONLY(InstData &inst, uint32_t bits) {
// bits
// & 10111111001000001111110000000000
// --------------------------------
// 00001110000000000011100000000000
if ((bits & 0xbf20fc00U) != 0xe003800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t _12 : 1; // 1
uint32_t _13 : 1; // 1
uint32_t op : 1;
uint32_t _15 : 1; // 0
uint32_t Rm : 5;
uint32_t _21 : 1; // 0
uint32_t size : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 0
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.op = static_cast<uint8_t>(enc.op);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::ZIP1_ASIMDPERM_ONLY;
inst.iclass = InstName::ZIP1;
return true;
}
static bool TryExtractLDSETAH_32_MEMOP(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 01111000101000000011000000000000
if ((bits & 0xffe0fc00U) != 0x78a03000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t opc : 3;
uint32_t o3 : 1;
uint32_t Rs : 5;
uint32_t _21 : 1; // 1
uint32_t R : 1;
uint32_t A : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.A = static_cast<uint8_t>(enc.A);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.V = static_cast<uint8_t>(enc.V);
inst.R = static_cast<uint8_t>(enc.R);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o3 = static_cast<uint8_t>(enc.o3);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LDSETAH_32_MEMOP;
inst.iclass = InstName::LDSETAH;
return true;
}
static bool TryExtractLDSETALH_32_MEMOP(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 01111000111000000011000000000000
if ((bits & 0xffe0fc00U) != 0x78e03000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t opc : 3;
uint32_t o3 : 1;
uint32_t Rs : 5;
uint32_t _21 : 1; // 1
uint32_t R : 1;
uint32_t A : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.A = static_cast<uint8_t>(enc.A);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.V = static_cast<uint8_t>(enc.V);
inst.R = static_cast<uint8_t>(enc.R);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o3 = static_cast<uint8_t>(enc.o3);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LDSETALH_32_MEMOP;
inst.iclass = InstName::LDSETALH;
return true;
}
static bool TryExtractLDSETH_32_MEMOP(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 01111000001000000011000000000000
if ((bits & 0xffe0fc00U) != 0x78203000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t opc : 3;
uint32_t o3 : 1;
uint32_t Rs : 5;
uint32_t _21 : 1; // 1
uint32_t R : 1;
uint32_t A : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.A = static_cast<uint8_t>(enc.A);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.V = static_cast<uint8_t>(enc.V);
inst.R = static_cast<uint8_t>(enc.R);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o3 = static_cast<uint8_t>(enc.o3);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LDSETH_32_MEMOP;
inst.iclass = InstName::LDSETH;
return true;
}
static bool TryExtractLDSETLH_32_MEMOP(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 01111000011000000011000000000000
if ((bits & 0xffe0fc00U) != 0x78603000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t opc : 3;
uint32_t o3 : 1;
uint32_t Rs : 5;
uint32_t _21 : 1; // 1
uint32_t R : 1;
uint32_t A : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.A = static_cast<uint8_t>(enc.A);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.V = static_cast<uint8_t>(enc.V);
inst.R = static_cast<uint8_t>(enc.R);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o3 = static_cast<uint8_t>(enc.o3);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LDSETLH_32_MEMOP;
inst.iclass = InstName::LDSETLH;
return true;
}
static bool TryExtractLDR_32_LDST_REGOFF(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000000000110000000000
// --------------------------------
// 10111000011000000000100000000000
if ((bits & 0xffe00c00U) != 0xb8600800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t S : 1;
uint32_t option : 3;
uint32_t Rm : 5;
uint32_t _21 : 1; // 1
uint32_t opc : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.option = static_cast<uint8_t>(enc.option);
inst.V = static_cast<uint8_t>(enc.V);
inst.S = static_cast<uint8_t>(enc.S);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LDR_32_LDST_REGOFF;
inst.iclass = InstName::LDR;
return true;
}
static bool TryExtractLDR_64_LDST_REGOFF(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000000000110000000000
// --------------------------------
// 11111000011000000000100000000000
if ((bits & 0xffe00c00U) != 0xf8600800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t S : 1;
uint32_t option : 3;
uint32_t Rm : 5;
uint32_t _21 : 1; // 1
uint32_t opc : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.option = static_cast<uint8_t>(enc.option);
inst.V = static_cast<uint8_t>(enc.V);
inst.S = static_cast<uint8_t>(enc.S);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LDR_64_LDST_REGOFF;
inst.iclass = InstName::LDR;
return true;
}
static bool TryExtractLDADDAH_32_MEMOP(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 01111000101000000000000000000000
if ((bits & 0xffe0fc00U) != 0x78a00000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t opc : 3;
uint32_t o3 : 1;
uint32_t Rs : 5;
uint32_t _21 : 1; // 1
uint32_t R : 1;
uint32_t A : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.A = static_cast<uint8_t>(enc.A);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.V = static_cast<uint8_t>(enc.V);
inst.R = static_cast<uint8_t>(enc.R);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o3 = static_cast<uint8_t>(enc.o3);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LDADDAH_32_MEMOP;
inst.iclass = InstName::LDADDAH;
return true;
}
static bool TryExtractLDADDALH_32_MEMOP(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 01111000111000000000000000000000
if ((bits & 0xffe0fc00U) != 0x78e00000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t opc : 3;
uint32_t o3 : 1;
uint32_t Rs : 5;
uint32_t _21 : 1; // 1
uint32_t R : 1;
uint32_t A : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.A = static_cast<uint8_t>(enc.A);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.V = static_cast<uint8_t>(enc.V);
inst.R = static_cast<uint8_t>(enc.R);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o3 = static_cast<uint8_t>(enc.o3);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LDADDALH_32_MEMOP;
inst.iclass = InstName::LDADDALH;
return true;
}
static bool TryExtractLDADDH_32_MEMOP(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 01111000001000000000000000000000
if ((bits & 0xffe0fc00U) != 0x78200000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t opc : 3;
uint32_t o3 : 1;
uint32_t Rs : 5;
uint32_t _21 : 1; // 1
uint32_t R : 1;
uint32_t A : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.A = static_cast<uint8_t>(enc.A);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.V = static_cast<uint8_t>(enc.V);
inst.R = static_cast<uint8_t>(enc.R);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o3 = static_cast<uint8_t>(enc.o3);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LDADDH_32_MEMOP;
inst.iclass = InstName::LDADDH;
return true;
}
static bool TryExtractLDADDLH_32_MEMOP(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 01111000011000000000000000000000
if ((bits & 0xffe0fc00U) != 0x78600000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t opc : 3;
uint32_t o3 : 1;
uint32_t Rs : 5;
uint32_t _21 : 1; // 1
uint32_t R : 1;
uint32_t A : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.A = static_cast<uint8_t>(enc.A);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.V = static_cast<uint8_t>(enc.V);
inst.R = static_cast<uint8_t>(enc.R);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o3 = static_cast<uint8_t>(enc.o3);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LDADDLH_32_MEMOP;
inst.iclass = InstName::LDADDLH;
return true;
}
static bool TryExtractANDS_32_LOG_SHIFT(InstData &inst, uint32_t bits) {
if (false && TryExtractTST_ANDS_32_LOG_SHIFT(inst, bits))
return true;
// bits
// & 11111111001000000000000000000000
// --------------------------------
// 01101010000000000000000000000000
if ((bits & 0xff200000U) != 0x6a000000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t imm6 : 6;
uint32_t Rm : 5;
uint32_t N : 1;
uint32_t shift : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t opc : 2;
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.shift = static_cast<uint8_t>(enc.shift);
inst.N = static_cast<uint8_t>(enc.N);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.sf = static_cast<uint8_t>(enc.sf);
inst.imm6.uimm = static_cast<uint64_t>(enc.imm6);
inst.iform = InstForm::ANDS_32_LOG_SHIFT;
inst.iclass = InstName::ANDS;
return true;
}
static bool TryExtractANDS_64_LOG_SHIFT(InstData &inst, uint32_t bits) {
if (false && TryExtractTST_ANDS_64_LOG_SHIFT(inst, bits))
return true;
// bits
// & 11111111001000000000000000000000
// --------------------------------
// 11101010000000000000000000000000
if ((bits & 0xff200000U) != 0xea000000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t imm6 : 6;
uint32_t Rm : 5;
uint32_t N : 1;
uint32_t shift : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t opc : 2;
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.shift = static_cast<uint8_t>(enc.shift);
inst.N = static_cast<uint8_t>(enc.N);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.sf = static_cast<uint8_t>(enc.sf);
inst.imm6.uimm = static_cast<uint64_t>(enc.imm6);
inst.iform = InstForm::ANDS_64_LOG_SHIFT;
inst.iclass = InstName::ANDS;
return true;
}
static bool TryExtractLD3_ASISDLSE_R3(InstData &inst, uint32_t bits) {
// bits
// & 10111111111111111111000000000000
// --------------------------------
// 00001100010000000100000000000000
if ((bits & 0xbffff000U) != 0xc404000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t size : 2;
uint32_t opcode : 4;
uint32_t _16 : 1; // 0
uint32_t _17 : 1; // 0
uint32_t _18 : 1; // 0
uint32_t _19 : 1; // 0
uint32_t _20 : 1; // 0
uint32_t _21 : 1; // 0
uint32_t L : 1;
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 0
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.L = static_cast<uint8_t>(enc.L);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LD3_ASISDLSE_R3;
inst.iclass = InstName::LD3;
return true;
}
static bool TryExtractLD3_ASISDLSEP_I3_I(InstData &inst, uint32_t bits) {
// bits
// & 10111111111111111111000000000000
// --------------------------------
// 00001100110111110100000000000000
if ((bits & 0xbffff000U) != 0xcdf4000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t size : 2;
uint32_t opcode : 4;
uint32_t Rm : 5;
uint32_t _21 : 1; // 0
uint32_t L : 1;
uint32_t _23 : 1; // 1
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 0
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.L = static_cast<uint8_t>(enc.L);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LD3_ASISDLSEP_I3_I;
inst.iclass = InstName::LD3;
return true;
}
static bool TryExtractLD3_ASISDLSEP_R3_R(InstData &inst, uint32_t bits) {
// bits
// & 10111111111000001111000000000000
// --------------------------------
// 00001100110000000100000000000000
if ((bits & 0xbfe0f000U) != 0xcc04000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t size : 2;
uint32_t opcode : 4;
uint32_t Rm : 5;
uint32_t _21 : 1; // 0
uint32_t L : 1;
uint32_t _23 : 1; // 1
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 0
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.L = static_cast<uint8_t>(enc.L);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LD3_ASISDLSEP_R3_R;
inst.iclass = InstName::LD3;
return true;
}
static bool TryExtractFMUL_H_FLOATDP2(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 00011110111000000000100000000000
if ((bits & 0xffe0fc00U) != 0x1ee00800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t _12 : 1; // 0
uint32_t _13 : 1; // 0
uint32_t _14 : 1; // 0
uint32_t op : 1;
uint32_t Rm : 5;
uint32_t _21 : 1; // 1
uint32_t type : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t _30 : 1; // 0
uint32_t M : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.M = static_cast<uint8_t>(enc.M);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.type = static_cast<uint8_t>(enc.type);
inst.op = static_cast<uint8_t>(enc.op);
inst.iform = InstForm::FMUL_H_FLOATDP2;
inst.iclass = InstName::FMUL;
return true;
}
static bool TryExtractFMUL_S_FLOATDP2(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 00011110001000000000100000000000
if ((bits & 0xffe0fc00U) != 0x1e200800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t _12 : 1; // 0
uint32_t _13 : 1; // 0
uint32_t _14 : 1; // 0
uint32_t op : 1;
uint32_t Rm : 5;
uint32_t _21 : 1; // 1
uint32_t type : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t _30 : 1; // 0
uint32_t M : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.M = static_cast<uint8_t>(enc.M);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.type = static_cast<uint8_t>(enc.type);
inst.op = static_cast<uint8_t>(enc.op);
inst.iform = InstForm::FMUL_S_FLOATDP2;
inst.iclass = InstName::FMUL;
return true;
}
static bool TryExtractFMUL_D_FLOATDP2(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 00011110011000000000100000000000
if ((bits & 0xffe0fc00U) != 0x1e600800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t _12 : 1; // 0
uint32_t _13 : 1; // 0
uint32_t _14 : 1; // 0
uint32_t op : 1;
uint32_t Rm : 5;
uint32_t _21 : 1; // 1
uint32_t type : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t _30 : 1; // 0
uint32_t M : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.M = static_cast<uint8_t>(enc.M);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.type = static_cast<uint8_t>(enc.type);
inst.op = static_cast<uint8_t>(enc.op);
inst.iform = InstForm::FMUL_D_FLOATDP2;
inst.iclass = InstName::FMUL;
return true;
}
static bool TryExtractLDAXR_LR32_LDSTEXCL(InstData &inst, uint32_t bits) {
// bits
// & 11111111111111111111110000000000
// --------------------------------
// 10001000010111111111110000000000
if ((bits & 0xfffffc00U) != 0x885ffc00U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t Rt2 : 5;
uint32_t o0 : 1;
uint32_t Rs : 5;
uint32_t o1 : 1;
uint32_t L : 1;
uint32_t o2 : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 0
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.L = static_cast<uint8_t>(enc.L);
inst.Rt2 = static_cast<uint8_t>(enc.Rt2);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.o2 = static_cast<uint8_t>(enc.o2);
inst.o1 = static_cast<uint8_t>(enc.o1);
inst.o0 = static_cast<uint8_t>(enc.o0);
inst.iform = InstForm::LDAXR_LR32_LDSTEXCL;
inst.iclass = InstName::LDAXR;
return true;
}
static bool TryExtractLDAXR_LR64_LDSTEXCL(InstData &inst, uint32_t bits) {
// bits
// & 11111111111111111111110000000000
// --------------------------------
// 11001000010111111111110000000000
if ((bits & 0xfffffc00U) != 0xc85ffc00U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t Rt2 : 5;
uint32_t o0 : 1;
uint32_t Rs : 5;
uint32_t o1 : 1;
uint32_t L : 1;
uint32_t o2 : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 0
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.L = static_cast<uint8_t>(enc.L);
inst.Rt2 = static_cast<uint8_t>(enc.Rt2);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.o2 = static_cast<uint8_t>(enc.o2);
inst.o1 = static_cast<uint8_t>(enc.o1);
inst.o0 = static_cast<uint8_t>(enc.o0);
inst.iform = InstForm::LDAXR_LR64_LDSTEXCL;
inst.iclass = InstName::LDAXR;
return true;
}
static bool TryExtractLDRB_32B_LDST_REGOFF(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000000000110000000000
// --------------------------------
// 00111000011000000000100000000000
if ((bits & 0xffe00c00U) != 0x38600800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t S : 1;
uint32_t option : 3;
uint32_t Rm : 5;
uint32_t _21 : 1; // 1
uint32_t opc : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.option = static_cast<uint8_t>(enc.option);
inst.V = static_cast<uint8_t>(enc.V);
inst.S = static_cast<uint8_t>(enc.S);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LDRB_32B_LDST_REGOFF;
inst.iclass = InstName::LDRB;
return true;
}
static bool TryExtractLDRB_32BL_LDST_REGOFF(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001110110000000000
// --------------------------------
// 00111000011000000110100000000000
if ((bits & 0xffe0ec00U) != 0x38606800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t S : 1;
uint32_t option : 3;
uint32_t Rm : 5;
uint32_t _21 : 1; // 1
uint32_t opc : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.option = static_cast<uint8_t>(enc.option);
inst.V = static_cast<uint8_t>(enc.V);
inst.S = static_cast<uint8_t>(enc.S);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LDRB_32BL_LDST_REGOFF;
inst.iclass = InstName::LDRB;
return true;
}
static bool TryExtractUADALP_ASIMDMISC_P(InstData &inst, uint32_t bits) {
// bits
// & 10111111001111111111110000000000
// --------------------------------
// 00101110001000000110100000000000
if ((bits & 0xbf3ffc00U) != 0x2e206800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t _12 : 1; // 0
uint32_t _13 : 1; // 1
uint32_t op : 1;
uint32_t _15 : 1; // 0
uint32_t _16 : 1; // 0
uint32_t _17 : 1; // 0
uint32_t _18 : 1; // 0
uint32_t _19 : 1; // 0
uint32_t _20 : 1; // 0
uint32_t _21 : 1; // 1
uint32_t size : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.op = static_cast<uint8_t>(enc.op);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::UADALP_ASIMDMISC_P;
inst.iclass = InstName::UADALP;
return true;
}
static bool TryExtractFRINTX_ASIMDMISCFP16_R(InstData &inst, uint32_t bits) {
// bits
// & 10111111111111111111110000000000
// --------------------------------
// 00101110011110011001100000000000
if ((bits & 0xbffffc00U) != 0x2e799800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t o1 : 1;
uint32_t _13 : 1; // 0
uint32_t _14 : 1; // 0
uint32_t _15 : 1; // 1
uint32_t _16 : 1; // 1
uint32_t _17 : 1; // 0
uint32_t _18 : 1; // 0
uint32_t _19 : 1; // 1
uint32_t _20 : 1; // 1
uint32_t _21 : 1; // 1
uint32_t _22 : 1; // 1
uint32_t o2 : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o2 = static_cast<uint8_t>(enc.o2);
inst.o1 = static_cast<uint8_t>(enc.o1);
inst.iform = InstForm::FRINTX_ASIMDMISCFP16_R;
inst.iclass = InstName::FRINTX;
return true;
}
static bool TryExtractFRINTX_ASIMDMISC_R(InstData &inst, uint32_t bits) {
// bits
// & 10111111101111111111110000000000
// --------------------------------
// 00101110001000011001100000000000
if ((bits & 0xbfbffc00U) != 0x2e219800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t o1 : 1;
uint32_t _13 : 1; // 0
uint32_t _14 : 1; // 0
uint32_t _15 : 1; // 1
uint32_t _16 : 1; // 1
uint32_t _17 : 1; // 0
uint32_t _18 : 1; // 0
uint32_t _19 : 1; // 0
uint32_t _20 : 1; // 0
uint32_t _21 : 1; // 1
uint32_t sz : 1;
uint32_t o2 : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.sz = static_cast<uint8_t>(enc.sz);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o2 = static_cast<uint8_t>(enc.o2);
inst.o1 = static_cast<uint8_t>(enc.o1);
inst.iform = InstForm::FRINTX_ASIMDMISC_R;
inst.iclass = InstName::FRINTX;
return true;
}
static bool TryExtractHLT_EX_EXCEPTION(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000000000000000011111
// --------------------------------
// 11010100010000000000000000000000
if ((bits & 0xffe0001fU) != 0xd4400000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t LL : 2;
uint32_t op2 : 3;
uint32_t imm16 : 16;
uint32_t opc : 3;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 0
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 0
uint32_t _30 : 1; // 1
uint32_t _31 : 1; // 1
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.LL = static_cast<uint8_t>(enc.LL);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.op2 = static_cast<uint8_t>(enc.op2);
inst.imm16.uimm = static_cast<uint64_t>(enc.imm16);
inst.iform = InstForm::HLT_EX_EXCEPTION;
inst.iclass = InstName::HLT;
return true;
}
static bool TryExtractSABA_ASIMDSAME_ONLY(InstData &inst, uint32_t bits) {
// bits
// & 10111111001000001111110000000000
// --------------------------------
// 00001110001000000111110000000000
if ((bits & 0xbf20fc00U) != 0xe207c00U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t ac : 1;
uint32_t _12 : 1; // 1
uint32_t _13 : 1; // 1
uint32_t _14 : 1; // 1
uint32_t _15 : 1; // 0
uint32_t Rm : 5;
uint32_t _21 : 1; // 1
uint32_t size : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Q = static_cast<uint8_t>(enc.Q);
inst.ac = static_cast<uint8_t>(enc.ac);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::SABA_ASIMDSAME_ONLY;
inst.iclass = InstName::SABA;
return true;
}
static bool TryExtractFMAX_H_FLOATDP2(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 00011110111000000100100000000000
if ((bits & 0xffe0fc00U) != 0x1ee04800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t op : 2;
uint32_t _14 : 1; // 1
uint32_t _15 : 1; // 0
uint32_t Rm : 5;
uint32_t _21 : 1; // 1
uint32_t type : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t _30 : 1; // 0
uint32_t M : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.M = static_cast<uint8_t>(enc.M);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.type = static_cast<uint8_t>(enc.type);
inst.op = static_cast<uint8_t>(enc.op);
inst.iform = InstForm::FMAX_H_FLOATDP2;
inst.iclass = InstName::FMAX;
return true;
}
static bool TryExtractFMAX_S_FLOATDP2(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 00011110001000000100100000000000
if ((bits & 0xffe0fc00U) != 0x1e204800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t op : 2;
uint32_t _14 : 1; // 1
uint32_t _15 : 1; // 0
uint32_t Rm : 5;
uint32_t _21 : 1; // 1
uint32_t type : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t _30 : 1; // 0
uint32_t M : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.M = static_cast<uint8_t>(enc.M);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.type = static_cast<uint8_t>(enc.type);
inst.op = static_cast<uint8_t>(enc.op);
inst.iform = InstForm::FMAX_S_FLOATDP2;
inst.iclass = InstName::FMAX;
return true;
}
static bool TryExtractFMAX_D_FLOATDP2(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 00011110011000000100100000000000
if ((bits & 0xffe0fc00U) != 0x1e604800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t op : 2;
uint32_t _14 : 1; // 1
uint32_t _15 : 1; // 0
uint32_t Rm : 5;
uint32_t _21 : 1; // 1
uint32_t type : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t _30 : 1; // 0
uint32_t M : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.M = static_cast<uint8_t>(enc.M);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.type = static_cast<uint8_t>(enc.type);
inst.op = static_cast<uint8_t>(enc.op);
inst.iform = InstForm::FMAX_D_FLOATDP2;
inst.iclass = InstName::FMAX;
return true;
}
static bool TryExtractAESD_B_CRYPTOAES(InstData &inst, uint32_t bits) {
// bits
// & 11111111111111111111110000000000
// --------------------------------
// 01001110001010000101100000000000
if ((bits & 0xfffffc00U) != 0x4e285800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t D : 1;
uint32_t _13 : 1; // 0
uint32_t _14 : 1; // 1
uint32_t _15 : 1; // 0
uint32_t _16 : 1; // 0
uint32_t _17 : 1; // 0
uint32_t _18 : 1; // 0
uint32_t _19 : 1; // 1
uint32_t _20 : 1; // 0
uint32_t _21 : 1; // 1
uint32_t size : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 0
uint32_t _30 : 1; // 1
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.D = static_cast<uint8_t>(enc.D);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::AESD_B_CRYPTOAES;
inst.iclass = InstName::AESD;
return true;
}
static bool TryExtractAESMC_B_CRYPTOAES(InstData &inst, uint32_t bits) {
// bits
// & 11111111111111111111110000000000
// --------------------------------
// 01001110001010000110100000000000
if ((bits & 0xfffffc00U) != 0x4e286800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t D : 1;
uint32_t _13 : 1; // 1
uint32_t _14 : 1; // 1
uint32_t _15 : 1; // 0
uint32_t _16 : 1; // 0
uint32_t _17 : 1; // 0
uint32_t _18 : 1; // 0
uint32_t _19 : 1; // 1
uint32_t _20 : 1; // 0
uint32_t _21 : 1; // 1
uint32_t size : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 0
uint32_t _30 : 1; // 1
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.D = static_cast<uint8_t>(enc.D);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::AESMC_B_CRYPTOAES;
inst.iclass = InstName::AESMC;
return true;
}
static bool TryExtractLD2_ASISDLSO_B2_2B(InstData &inst, uint32_t bits) {
// bits
// & 10111111111111111110000000000000
// --------------------------------
// 00001101011000000000000000000000
if ((bits & 0xbfffe000U) != 0xd600000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t size : 2;
uint32_t S : 1;
uint32_t opcode : 3;
uint32_t _16 : 1; // 0
uint32_t _17 : 1; // 0
uint32_t _18 : 1; // 0
uint32_t _19 : 1; // 0
uint32_t _20 : 1; // 0
uint32_t R : 1;
uint32_t L : 1;
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 0
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.L = static_cast<uint8_t>(enc.L);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.S = static_cast<uint8_t>(enc.S);
inst.R = static_cast<uint8_t>(enc.R);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LD2_ASISDLSO_B2_2B;
inst.iclass = InstName::LD2;
return true;
}
static bool TryExtractLD2_ASISDLSO_H2_2H(InstData &inst, uint32_t bits) {
// bits
// & 10111111111111111110010000000000
// --------------------------------
// 00001101011000000100000000000000
if ((bits & 0xbfffe400U) != 0xd604000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t size : 2;
uint32_t S : 1;
uint32_t opcode : 3;
uint32_t _16 : 1; // 0
uint32_t _17 : 1; // 0
uint32_t _18 : 1; // 0
uint32_t _19 : 1; // 0
uint32_t _20 : 1; // 0
uint32_t R : 1;
uint32_t L : 1;
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 0
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.L = static_cast<uint8_t>(enc.L);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.S = static_cast<uint8_t>(enc.S);
inst.R = static_cast<uint8_t>(enc.R);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LD2_ASISDLSO_H2_2H;
inst.iclass = InstName::LD2;
return true;
}
static bool TryExtractLD2_ASISDLSO_S2_2S(InstData &inst, uint32_t bits) {
// bits
// & 10111111111111111110110000000000
// --------------------------------
// 00001101011000001000000000000000
if ((bits & 0xbfffec00U) != 0xd608000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t size : 2;
uint32_t S : 1;
uint32_t opcode : 3;
uint32_t _16 : 1; // 0
uint32_t _17 : 1; // 0
uint32_t _18 : 1; // 0
uint32_t _19 : 1; // 0
uint32_t _20 : 1; // 0
uint32_t R : 1;
uint32_t L : 1;
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 0
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.L = static_cast<uint8_t>(enc.L);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.S = static_cast<uint8_t>(enc.S);
inst.R = static_cast<uint8_t>(enc.R);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LD2_ASISDLSO_S2_2S;
inst.iclass = InstName::LD2;
return true;
}
static bool TryExtractLD2_ASISDLSO_D2_2D(InstData &inst, uint32_t bits) {
// bits
// & 10111111111111111111110000000000
// --------------------------------
// 00001101011000001000010000000000
if ((bits & 0xbffffc00U) != 0xd608400U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t size : 2;
uint32_t S : 1;
uint32_t opcode : 3;
uint32_t _16 : 1; // 0
uint32_t _17 : 1; // 0
uint32_t _18 : 1; // 0
uint32_t _19 : 1; // 0
uint32_t _20 : 1; // 0
uint32_t R : 1;
uint32_t L : 1;
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 0
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.L = static_cast<uint8_t>(enc.L);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.S = static_cast<uint8_t>(enc.S);
inst.R = static_cast<uint8_t>(enc.R);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LD2_ASISDLSO_D2_2D;
inst.iclass = InstName::LD2;
return true;
}
static bool TryExtractLD2_ASISDLSOP_B2_I2B(InstData &inst, uint32_t bits) {
// bits
// & 10111111111111111110000000000000
// --------------------------------
// 00001101111111110000000000000000
if ((bits & 0xbfffe000U) != 0xdff0000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t size : 2;
uint32_t S : 1;
uint32_t opcode : 3;
uint32_t Rm : 5;
uint32_t R : 1;
uint32_t L : 1;
uint32_t _23 : 1; // 1
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 0
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.L = static_cast<uint8_t>(enc.L);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.S = static_cast<uint8_t>(enc.S);
inst.R = static_cast<uint8_t>(enc.R);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LD2_ASISDLSOP_B2_I2B;
inst.iclass = InstName::LD2;
return true;
}
static bool TryExtractLD2_ASISDLSOP_BX2_R2B(InstData &inst, uint32_t bits) {
// bits
// & 10111111111000001110000000000000
// --------------------------------
// 00001101111000000000000000000000
if ((bits & 0xbfe0e000U) != 0xde00000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t size : 2;
uint32_t S : 1;
uint32_t opcode : 3;
uint32_t Rm : 5;
uint32_t R : 1;
uint32_t L : 1;
uint32_t _23 : 1; // 1
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 0
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.L = static_cast<uint8_t>(enc.L);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.S = static_cast<uint8_t>(enc.S);
inst.R = static_cast<uint8_t>(enc.R);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LD2_ASISDLSOP_BX2_R2B;
inst.iclass = InstName::LD2;
return true;
}
static bool TryExtractLD2_ASISDLSOP_H2_I2H(InstData &inst, uint32_t bits) {
// bits
// & 10111111111111111110010000000000
// --------------------------------
// 00001101111111110100000000000000
if ((bits & 0xbfffe400U) != 0xdff4000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t size : 2;
uint32_t S : 1;
uint32_t opcode : 3;
uint32_t Rm : 5;
uint32_t R : 1;
uint32_t L : 1;
uint32_t _23 : 1; // 1
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 0
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.L = static_cast<uint8_t>(enc.L);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.S = static_cast<uint8_t>(enc.S);
inst.R = static_cast<uint8_t>(enc.R);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LD2_ASISDLSOP_H2_I2H;
inst.iclass = InstName::LD2;
return true;
}
static bool TryExtractLD2_ASISDLSOP_HX2_R2H(InstData &inst, uint32_t bits) {
// bits
// & 10111111111000001110010000000000
// --------------------------------
// 00001101111000000100000000000000
if ((bits & 0xbfe0e400U) != 0xde04000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t size : 2;
uint32_t S : 1;
uint32_t opcode : 3;
uint32_t Rm : 5;
uint32_t R : 1;
uint32_t L : 1;
uint32_t _23 : 1; // 1
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 0
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.L = static_cast<uint8_t>(enc.L);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.S = static_cast<uint8_t>(enc.S);
inst.R = static_cast<uint8_t>(enc.R);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LD2_ASISDLSOP_HX2_R2H;
inst.iclass = InstName::LD2;
return true;
}
static bool TryExtractLD2_ASISDLSOP_S2_I2S(InstData &inst, uint32_t bits) {
// bits
// & 10111111111111111110110000000000
// --------------------------------
// 00001101111111111000000000000000
if ((bits & 0xbfffec00U) != 0xdff8000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t size : 2;
uint32_t S : 1;
uint32_t opcode : 3;
uint32_t Rm : 5;
uint32_t R : 1;
uint32_t L : 1;
uint32_t _23 : 1; // 1
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 0
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.L = static_cast<uint8_t>(enc.L);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.S = static_cast<uint8_t>(enc.S);
inst.R = static_cast<uint8_t>(enc.R);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LD2_ASISDLSOP_S2_I2S;
inst.iclass = InstName::LD2;
return true;
}
static bool TryExtractLD2_ASISDLSOP_SX2_R2S(InstData &inst, uint32_t bits) {
// bits
// & 10111111111000001110110000000000
// --------------------------------
// 00001101111000001000000000000000
if ((bits & 0xbfe0ec00U) != 0xde08000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t size : 2;
uint32_t S : 1;
uint32_t opcode : 3;
uint32_t Rm : 5;
uint32_t R : 1;
uint32_t L : 1;
uint32_t _23 : 1; // 1
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 0
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.L = static_cast<uint8_t>(enc.L);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.S = static_cast<uint8_t>(enc.S);
inst.R = static_cast<uint8_t>(enc.R);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LD2_ASISDLSOP_SX2_R2S;
inst.iclass = InstName::LD2;
return true;
}
static bool TryExtractLD2_ASISDLSOP_D2_I2D(InstData &inst, uint32_t bits) {
// bits
// & 10111111111111111111110000000000
// --------------------------------
// 00001101111111111000010000000000
if ((bits & 0xbffffc00U) != 0xdff8400U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t size : 2;
uint32_t S : 1;
uint32_t opcode : 3;
uint32_t Rm : 5;
uint32_t R : 1;
uint32_t L : 1;
uint32_t _23 : 1; // 1
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 0
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.L = static_cast<uint8_t>(enc.L);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.S = static_cast<uint8_t>(enc.S);
inst.R = static_cast<uint8_t>(enc.R);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LD2_ASISDLSOP_D2_I2D;
inst.iclass = InstName::LD2;
return true;
}
static bool TryExtractLD2_ASISDLSOP_DX2_R2D(InstData &inst, uint32_t bits) {
// bits
// & 10111111111000001111110000000000
// --------------------------------
// 00001101111000001000010000000000
if ((bits & 0xbfe0fc00U) != 0xde08400U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t size : 2;
uint32_t S : 1;
uint32_t opcode : 3;
uint32_t Rm : 5;
uint32_t R : 1;
uint32_t L : 1;
uint32_t _23 : 1; // 1
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 0
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.L = static_cast<uint8_t>(enc.L);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.S = static_cast<uint8_t>(enc.S);
inst.R = static_cast<uint8_t>(enc.R);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LD2_ASISDLSOP_DX2_R2D;
inst.iclass = InstName::LD2;
return true;
}
static bool TryExtractBR_64_BRANCH_REG(InstData &inst, uint32_t bits) {
// bits
// & 11111111111111111111110000011111
// --------------------------------
// 11010110000111110000000000000000
if ((bits & 0xfffffc1fU) != 0xd61f0000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t op4 : 5;
uint32_t Rn : 5;
uint32_t op3 : 6;
uint32_t op2 : 5;
uint32_t op : 2;
uint32_t opc : 2;
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 0
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 0
uint32_t _30 : 1; // 1
uint32_t _31 : 1; // 1
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.op4 = static_cast<uint8_t>(enc.op4);
inst.op2 = static_cast<uint8_t>(enc.op2);
inst.op3 = static_cast<uint8_t>(enc.op3);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.op = static_cast<uint8_t>(enc.op);
inst.iform = InstForm::BR_64_BRANCH_REG;
inst.iclass = InstName::BR;
return true;
}
static bool TryExtractFCVTZU_ASISDMISCFP16_R(InstData &inst, uint32_t bits) {
// bits
// & 11111111111111111111110000000000
// --------------------------------
// 01111110111110011011100000000000
if ((bits & 0xfffffc00U) != 0x7ef9b800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t o1 : 1;
uint32_t _13 : 1; // 1
uint32_t _14 : 1; // 0
uint32_t _15 : 1; // 1
uint32_t _16 : 1; // 1
uint32_t _17 : 1; // 0
uint32_t _18 : 1; // 0
uint32_t _19 : 1; // 1
uint32_t _20 : 1; // 1
uint32_t _21 : 1; // 1
uint32_t _22 : 1; // 1
uint32_t o2 : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t U : 1;
uint32_t _30 : 1; // 1
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.U = static_cast<uint8_t>(enc.U);
inst.o2 = static_cast<uint8_t>(enc.o2);
inst.o1 = static_cast<uint8_t>(enc.o1);
inst.iform = InstForm::FCVTZU_ASISDMISCFP16_R;
inst.iclass = InstName::FCVTZU;
return true;
}
static bool TryExtractFCVTZU_ASISDMISC_R(InstData &inst, uint32_t bits) {
// bits
// & 11111111101111111111110000000000
// --------------------------------
// 01111110101000011011100000000000
if ((bits & 0xffbffc00U) != 0x7ea1b800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t o1 : 1;
uint32_t _13 : 1; // 1
uint32_t _14 : 1; // 0
uint32_t _15 : 1; // 1
uint32_t _16 : 1; // 1
uint32_t _17 : 1; // 0
uint32_t _18 : 1; // 0
uint32_t _19 : 1; // 0
uint32_t _20 : 1; // 0
uint32_t _21 : 1; // 1
uint32_t sz : 1;
uint32_t o2 : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t U : 1;
uint32_t _30 : 1; // 1
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.sz = static_cast<uint8_t>(enc.sz);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o2 = static_cast<uint8_t>(enc.o2);
inst.o1 = static_cast<uint8_t>(enc.o1);
inst.iform = InstForm::FCVTZU_ASISDMISC_R;
inst.iclass = InstName::FCVTZU;
return true;
}
static bool TryExtractFCVTZU_ASIMDMISCFP16_R(InstData &inst, uint32_t bits) {
// bits
// & 10111111111111111111110000000000
// --------------------------------
// 00101110111110011011100000000000
if ((bits & 0xbffffc00U) != 0x2ef9b800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t o1 : 1;
uint32_t _13 : 1; // 1
uint32_t _14 : 1; // 0
uint32_t _15 : 1; // 1
uint32_t _16 : 1; // 1
uint32_t _17 : 1; // 0
uint32_t _18 : 1; // 0
uint32_t _19 : 1; // 1
uint32_t _20 : 1; // 1
uint32_t _21 : 1; // 1
uint32_t _22 : 1; // 1
uint32_t o2 : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o2 = static_cast<uint8_t>(enc.o2);
inst.o1 = static_cast<uint8_t>(enc.o1);
inst.iform = InstForm::FCVTZU_ASIMDMISCFP16_R;
inst.iclass = InstName::FCVTZU;
return true;
}
static bool TryExtractFCVTZU_ASIMDMISC_R(InstData &inst, uint32_t bits) {
// bits
// & 10111111101111111111110000000000
// --------------------------------
// 00101110101000011011100000000000
if ((bits & 0xbfbffc00U) != 0x2ea1b800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t o1 : 1;
uint32_t _13 : 1; // 1
uint32_t _14 : 1; // 0
uint32_t _15 : 1; // 1
uint32_t _16 : 1; // 1
uint32_t _17 : 1; // 0
uint32_t _18 : 1; // 0
uint32_t _19 : 1; // 0
uint32_t _20 : 1; // 0
uint32_t _21 : 1; // 1
uint32_t sz : 1;
uint32_t o2 : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.sz = static_cast<uint8_t>(enc.sz);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o2 = static_cast<uint8_t>(enc.o2);
inst.o1 = static_cast<uint8_t>(enc.o1);
inst.iform = InstForm::FCVTZU_ASIMDMISC_R;
inst.iclass = InstName::FCVTZU;
return true;
}
static bool TryExtractMVN_ORN_32_LOG_SHIFT(InstData &inst, uint32_t bits) {
// bits
// & 11111111001000000000001111100000
// --------------------------------
// 00101010001000000000001111100000
if ((bits & 0xff2003e0U) != 0x2a2003e0U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t imm6 : 6;
uint32_t Rm : 5;
uint32_t N : 1;
uint32_t shift : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t opc : 2;
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.shift = static_cast<uint8_t>(enc.shift);
inst.N = static_cast<uint8_t>(enc.N);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.sf = static_cast<uint8_t>(enc.sf);
inst.imm6.uimm = static_cast<uint64_t>(enc.imm6);
inst.iform = InstForm::MVN_ORN_32_LOG_SHIFT;
inst.iclass = InstName::ORN;
return true;
}
static bool TryExtractMVN_ORN_64_LOG_SHIFT(InstData &inst, uint32_t bits) {
// bits
// & 11111111001000000000001111100000
// --------------------------------
// 10101010001000000000001111100000
if ((bits & 0xff2003e0U) != 0xaa2003e0U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t imm6 : 6;
uint32_t Rm : 5;
uint32_t N : 1;
uint32_t shift : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t opc : 2;
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.shift = static_cast<uint8_t>(enc.shift);
inst.N = static_cast<uint8_t>(enc.N);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.sf = static_cast<uint8_t>(enc.sf);
inst.imm6.uimm = static_cast<uint64_t>(enc.imm6);
inst.iform = InstForm::MVN_ORN_64_LOG_SHIFT;
inst.iclass = InstName::ORN;
return true;
}
static bool TryExtractSTEOR_32S_MEMOP(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000011111
// --------------------------------
// 10111000001000000010000000011111
if ((bits & 0xffe0fc1fU) != 0xb820201fU) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t opc : 3;
uint32_t o3 : 1;
uint32_t Rs : 5;
uint32_t _21 : 1; // 1
uint32_t R : 1;
uint32_t A : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.A = static_cast<uint8_t>(enc.A);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.V = static_cast<uint8_t>(enc.V);
inst.R = static_cast<uint8_t>(enc.R);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o3 = static_cast<uint8_t>(enc.o3);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::STEOR_32S_MEMOP;
inst.iclass = InstName::STEOR;
return true;
}
static bool TryExtractSTEORL_32S_MEMOP(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000011111
// --------------------------------
// 10111000011000000010000000011111
if ((bits & 0xffe0fc1fU) != 0xb860201fU) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t opc : 3;
uint32_t o3 : 1;
uint32_t Rs : 5;
uint32_t _21 : 1; // 1
uint32_t R : 1;
uint32_t A : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.A = static_cast<uint8_t>(enc.A);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.V = static_cast<uint8_t>(enc.V);
inst.R = static_cast<uint8_t>(enc.R);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o3 = static_cast<uint8_t>(enc.o3);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::STEORL_32S_MEMOP;
inst.iclass = InstName::STEORL;
return true;
}
static bool TryExtractSTEOR_64S_MEMOP(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000011111
// --------------------------------
// 11111000001000000010000000011111
if ((bits & 0xffe0fc1fU) != 0xf820201fU) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t opc : 3;
uint32_t o3 : 1;
uint32_t Rs : 5;
uint32_t _21 : 1; // 1
uint32_t R : 1;
uint32_t A : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.A = static_cast<uint8_t>(enc.A);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.V = static_cast<uint8_t>(enc.V);
inst.R = static_cast<uint8_t>(enc.R);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o3 = static_cast<uint8_t>(enc.o3);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::STEOR_64S_MEMOP;
inst.iclass = InstName::STEOR;
return true;
}
static bool TryExtractSTEORL_64S_MEMOP(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000011111
// --------------------------------
// 11111000011000000010000000011111
if ((bits & 0xffe0fc1fU) != 0xf860201fU) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t opc : 3;
uint32_t o3 : 1;
uint32_t Rs : 5;
uint32_t _21 : 1; // 1
uint32_t R : 1;
uint32_t A : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.A = static_cast<uint8_t>(enc.A);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.V = static_cast<uint8_t>(enc.V);
inst.R = static_cast<uint8_t>(enc.R);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o3 = static_cast<uint8_t>(enc.o3);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::STEORL_64S_MEMOP;
inst.iclass = InstName::STEORL;
return true;
}
static bool TryExtractTBX_ASIMDTBL_L2_2(InstData &inst, uint32_t bits) {
// bits
// & 10111111111000001111110000000000
// --------------------------------
// 00001110000000000011000000000000
if ((bits & 0xbfe0fc00U) != 0xe003000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t op : 1;
uint32_t len : 2;
uint32_t _15 : 1; // 0
uint32_t Rm : 5;
uint32_t _21 : 1; // 0
uint32_t op2 : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 0
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Q = static_cast<uint8_t>(enc.Q);
inst.op2 = static_cast<uint8_t>(enc.op2);
inst.len = static_cast<uint8_t>(enc.len);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.op = static_cast<uint8_t>(enc.op);
inst.iform = InstForm::TBX_ASIMDTBL_L2_2;
inst.iclass = InstName::TBX;
return true;
}
static bool TryExtractTBX_ASIMDTBL_L3_3(InstData &inst, uint32_t bits) {
// bits
// & 10111111111000001111110000000000
// --------------------------------
// 00001110000000000101000000000000
if ((bits & 0xbfe0fc00U) != 0xe005000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t op : 1;
uint32_t len : 2;
uint32_t _15 : 1; // 0
uint32_t Rm : 5;
uint32_t _21 : 1; // 0
uint32_t op2 : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 0
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Q = static_cast<uint8_t>(enc.Q);
inst.op2 = static_cast<uint8_t>(enc.op2);
inst.len = static_cast<uint8_t>(enc.len);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.op = static_cast<uint8_t>(enc.op);
inst.iform = InstForm::TBX_ASIMDTBL_L3_3;
inst.iclass = InstName::TBX;
return true;
}
static bool TryExtractTBX_ASIMDTBL_L4_4(InstData &inst, uint32_t bits) {
// bits
// & 10111111111000001111110000000000
// --------------------------------
// 00001110000000000111000000000000
if ((bits & 0xbfe0fc00U) != 0xe007000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t op : 1;
uint32_t len : 2;
uint32_t _15 : 1; // 0
uint32_t Rm : 5;
uint32_t _21 : 1; // 0
uint32_t op2 : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 0
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Q = static_cast<uint8_t>(enc.Q);
inst.op2 = static_cast<uint8_t>(enc.op2);
inst.len = static_cast<uint8_t>(enc.len);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.op = static_cast<uint8_t>(enc.op);
inst.iform = InstForm::TBX_ASIMDTBL_L4_4;
inst.iclass = InstName::TBX;
return true;
}
static bool TryExtractTBX_ASIMDTBL_L1_1(InstData &inst, uint32_t bits) {
// bits
// & 10111111111000001111110000000000
// --------------------------------
// 00001110000000000001000000000000
if ((bits & 0xbfe0fc00U) != 0xe001000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t op : 1;
uint32_t len : 2;
uint32_t _15 : 1; // 0
uint32_t Rm : 5;
uint32_t _21 : 1; // 0
uint32_t op2 : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 0
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Q = static_cast<uint8_t>(enc.Q);
inst.op2 = static_cast<uint8_t>(enc.op2);
inst.len = static_cast<uint8_t>(enc.len);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.op = static_cast<uint8_t>(enc.op);
inst.iform = InstForm::TBX_ASIMDTBL_L1_1;
inst.iclass = InstName::TBX;
return true;
}
static bool TryExtractUMLAL_ASIMDELEM_L(InstData &inst, uint32_t bits) {
// bits
// & 10111111000000001111010000000000
// --------------------------------
// 00101111000000000010000000000000
if ((bits & 0xbf00f400U) != 0x2f002000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t H : 1;
uint32_t _12 : 1; // 0
uint32_t _13 : 1; // 1
uint32_t o2 : 1;
uint32_t _15 : 1; // 0
uint32_t Rm : 4;
uint32_t M : 1;
uint32_t L : 1;
uint32_t size : 2;
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Q = static_cast<uint8_t>(enc.Q);
inst.H = static_cast<uint8_t>(enc.H);
inst.M = static_cast<uint8_t>(enc.M);
inst.L = static_cast<uint8_t>(enc.L);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o2 = static_cast<uint8_t>(enc.o2);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::UMLAL_ASIMDELEM_L;
inst.iclass = InstName::UMLAL;
return true;
}
static bool TryExtractUMINP_ASIMDSAME_ONLY(InstData &inst, uint32_t bits) {
// bits
// & 10111111001000001111110000000000
// --------------------------------
// 00101110001000001010110000000000
if ((bits & 0xbf20fc00U) != 0x2e20ac00U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t o1 : 1;
uint32_t _12 : 1; // 0
uint32_t _13 : 1; // 1
uint32_t _14 : 1; // 0
uint32_t _15 : 1; // 1
uint32_t Rm : 5;
uint32_t _21 : 1; // 1
uint32_t size : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o1 = static_cast<uint8_t>(enc.o1);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::UMINP_ASIMDSAME_ONLY;
inst.iclass = InstName::UMINP;
return true;
}
static bool TryExtractCMLE_ASISDMISC_Z(InstData &inst, uint32_t bits) {
// bits
// & 11111111001111111111110000000000
// --------------------------------
// 01111110001000001001100000000000
if ((bits & 0xff3ffc00U) != 0x7e209800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t op : 1;
uint32_t _13 : 1; // 0
uint32_t _14 : 1; // 0
uint32_t _15 : 1; // 1
uint32_t _16 : 1; // 0
uint32_t _17 : 1; // 0
uint32_t _18 : 1; // 0
uint32_t _19 : 1; // 0
uint32_t _20 : 1; // 0
uint32_t _21 : 1; // 1
uint32_t size : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t U : 1;
uint32_t _30 : 1; // 1
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.U = static_cast<uint8_t>(enc.U);
inst.op = static_cast<uint8_t>(enc.op);
inst.iform = InstForm::CMLE_ASISDMISC_Z;
inst.iclass = InstName::CMLE;
return true;
}
static bool TryExtractCMLE_ASIMDMISC_Z(InstData &inst, uint32_t bits) {
// bits
// & 10111111001111111111110000000000
// --------------------------------
// 00101110001000001001100000000000
if ((bits & 0xbf3ffc00U) != 0x2e209800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t op : 1;
uint32_t _13 : 1; // 0
uint32_t _14 : 1; // 0
uint32_t _15 : 1; // 1
uint32_t _16 : 1; // 0
uint32_t _17 : 1; // 0
uint32_t _18 : 1; // 0
uint32_t _19 : 1; // 0
uint32_t _20 : 1; // 0
uint32_t _21 : 1; // 1
uint32_t size : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.op = static_cast<uint8_t>(enc.op);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::CMLE_ASIMDMISC_Z;
inst.iclass = InstName::CMLE;
return true;
}
static bool TryExtractEOR_ASIMDSAME_ONLY(InstData &inst, uint32_t bits) {
// bits
// & 10111111111000001111110000000000
// --------------------------------
// 00101110001000000001110000000000
if ((bits & 0xbfe0fc00U) != 0x2e201c00U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t opcode : 5;
uint32_t Rm : 5;
uint32_t _21 : 1; // 1
uint32_t opc2 : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Q = static_cast<uint8_t>(enc.Q);
inst.opc2 = static_cast<uint8_t>(enc.opc2);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.U = static_cast<uint8_t>(enc.U);
inst.iform = InstForm::EOR_ASIMDSAME_ONLY;
inst.iclass = InstName::EOR;
return true;
}
static bool TryExtractCMEQ_ASISDMISC_Z(InstData &inst, uint32_t bits) {
// bits
// & 11111111001111111111110000000000
// --------------------------------
// 01011110001000001001100000000000
if ((bits & 0xff3ffc00U) != 0x5e209800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t op : 1;
uint32_t _13 : 1; // 0
uint32_t _14 : 1; // 0
uint32_t _15 : 1; // 1
uint32_t _16 : 1; // 0
uint32_t _17 : 1; // 0
uint32_t _18 : 1; // 0
uint32_t _19 : 1; // 0
uint32_t _20 : 1; // 0
uint32_t _21 : 1; // 1
uint32_t size : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t U : 1;
uint32_t _30 : 1; // 1
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.U = static_cast<uint8_t>(enc.U);
inst.op = static_cast<uint8_t>(enc.op);
inst.iform = InstForm::CMEQ_ASISDMISC_Z;
inst.iclass = InstName::CMEQ;
return true;
}
static bool TryExtractCMEQ_ASIMDMISC_Z(InstData &inst, uint32_t bits) {
// bits
// & 10111111001111111111110000000000
// --------------------------------
// 00001110001000001001100000000000
if ((bits & 0xbf3ffc00U) != 0xe209800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t op : 1;
uint32_t _13 : 1; // 0
uint32_t _14 : 1; // 0
uint32_t _15 : 1; // 1
uint32_t _16 : 1; // 0
uint32_t _17 : 1; // 0
uint32_t _18 : 1; // 0
uint32_t _19 : 1; // 0
uint32_t _20 : 1; // 0
uint32_t _21 : 1; // 1
uint32_t size : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.op = static_cast<uint8_t>(enc.op);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::CMEQ_ASIMDMISC_Z;
inst.iclass = InstName::CMEQ;
return true;
}
static bool TryExtractLDUMAXAH_32_MEMOP(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 01111000101000000110000000000000
if ((bits & 0xffe0fc00U) != 0x78a06000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t opc : 3;
uint32_t o3 : 1;
uint32_t Rs : 5;
uint32_t _21 : 1; // 1
uint32_t R : 1;
uint32_t A : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.A = static_cast<uint8_t>(enc.A);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.V = static_cast<uint8_t>(enc.V);
inst.R = static_cast<uint8_t>(enc.R);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o3 = static_cast<uint8_t>(enc.o3);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LDUMAXAH_32_MEMOP;
inst.iclass = InstName::LDUMAXAH;
return true;
}
static bool TryExtractLDUMAXALH_32_MEMOP(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 01111000111000000110000000000000
if ((bits & 0xffe0fc00U) != 0x78e06000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t opc : 3;
uint32_t o3 : 1;
uint32_t Rs : 5;
uint32_t _21 : 1; // 1
uint32_t R : 1;
uint32_t A : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.A = static_cast<uint8_t>(enc.A);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.V = static_cast<uint8_t>(enc.V);
inst.R = static_cast<uint8_t>(enc.R);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o3 = static_cast<uint8_t>(enc.o3);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LDUMAXALH_32_MEMOP;
inst.iclass = InstName::LDUMAXALH;
return true;
}
static bool TryExtractLDUMAXH_32_MEMOP(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 01111000001000000110000000000000
if ((bits & 0xffe0fc00U) != 0x78206000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t opc : 3;
uint32_t o3 : 1;
uint32_t Rs : 5;
uint32_t _21 : 1; // 1
uint32_t R : 1;
uint32_t A : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.A = static_cast<uint8_t>(enc.A);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.V = static_cast<uint8_t>(enc.V);
inst.R = static_cast<uint8_t>(enc.R);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o3 = static_cast<uint8_t>(enc.o3);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LDUMAXH_32_MEMOP;
inst.iclass = InstName::LDUMAXH;
return true;
}
static bool TryExtractLDUMAXLH_32_MEMOP(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 01111000011000000110000000000000
if ((bits & 0xffe0fc00U) != 0x78606000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t opc : 3;
uint32_t o3 : 1;
uint32_t Rs : 5;
uint32_t _21 : 1; // 1
uint32_t R : 1;
uint32_t A : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.A = static_cast<uint8_t>(enc.A);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.V = static_cast<uint8_t>(enc.V);
inst.R = static_cast<uint8_t>(enc.R);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o3 = static_cast<uint8_t>(enc.o3);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LDUMAXLH_32_MEMOP;
inst.iclass = InstName::LDUMAXLH;
return true;
}
static bool TryExtractST3_ASISDLSO_B3_3B(InstData &inst, uint32_t bits) {
// bits
// & 10111111111111111110000000000000
// --------------------------------
// 00001101000000000010000000000000
if ((bits & 0xbfffe000U) != 0xd002000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t size : 2;
uint32_t S : 1;
uint32_t opcode : 3;
uint32_t _16 : 1; // 0
uint32_t _17 : 1; // 0
uint32_t _18 : 1; // 0
uint32_t _19 : 1; // 0
uint32_t _20 : 1; // 0
uint32_t R : 1;
uint32_t L : 1;
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 0
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.L = static_cast<uint8_t>(enc.L);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.S = static_cast<uint8_t>(enc.S);
inst.R = static_cast<uint8_t>(enc.R);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::ST3_ASISDLSO_B3_3B;
inst.iclass = InstName::ST3;
return true;
}
static bool TryExtractST3_ASISDLSO_H3_3H(InstData &inst, uint32_t bits) {
// bits
// & 10111111111111111110010000000000
// --------------------------------
// 00001101000000000110000000000000
if ((bits & 0xbfffe400U) != 0xd006000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t size : 2;
uint32_t S : 1;
uint32_t opcode : 3;
uint32_t _16 : 1; // 0
uint32_t _17 : 1; // 0
uint32_t _18 : 1; // 0
uint32_t _19 : 1; // 0
uint32_t _20 : 1; // 0
uint32_t R : 1;
uint32_t L : 1;
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 0
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.L = static_cast<uint8_t>(enc.L);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.S = static_cast<uint8_t>(enc.S);
inst.R = static_cast<uint8_t>(enc.R);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::ST3_ASISDLSO_H3_3H;
inst.iclass = InstName::ST3;
return true;
}
static bool TryExtractST3_ASISDLSO_S3_3S(InstData &inst, uint32_t bits) {
// bits
// & 10111111111111111110110000000000
// --------------------------------
// 00001101000000001010000000000000
if ((bits & 0xbfffec00U) != 0xd00a000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t size : 2;
uint32_t S : 1;
uint32_t opcode : 3;
uint32_t _16 : 1; // 0
uint32_t _17 : 1; // 0
uint32_t _18 : 1; // 0
uint32_t _19 : 1; // 0
uint32_t _20 : 1; // 0
uint32_t R : 1;
uint32_t L : 1;
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 0
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.L = static_cast<uint8_t>(enc.L);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.S = static_cast<uint8_t>(enc.S);
inst.R = static_cast<uint8_t>(enc.R);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::ST3_ASISDLSO_S3_3S;
inst.iclass = InstName::ST3;
return true;
}
static bool TryExtractST3_ASISDLSO_D3_3D(InstData &inst, uint32_t bits) {
// bits
// & 10111111111111111111110000000000
// --------------------------------
// 00001101000000001010010000000000
if ((bits & 0xbffffc00U) != 0xd00a400U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t size : 2;
uint32_t S : 1;
uint32_t opcode : 3;
uint32_t _16 : 1; // 0
uint32_t _17 : 1; // 0
uint32_t _18 : 1; // 0
uint32_t _19 : 1; // 0
uint32_t _20 : 1; // 0
uint32_t R : 1;
uint32_t L : 1;
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 0
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.L = static_cast<uint8_t>(enc.L);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.S = static_cast<uint8_t>(enc.S);
inst.R = static_cast<uint8_t>(enc.R);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::ST3_ASISDLSO_D3_3D;
inst.iclass = InstName::ST3;
return true;
}
static bool TryExtractST3_ASISDLSOP_B3_I3B(InstData &inst, uint32_t bits) {
// bits
// & 10111111111111111110000000000000
// --------------------------------
// 00001101100111110010000000000000
if ((bits & 0xbfffe000U) != 0xd9f2000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t size : 2;
uint32_t S : 1;
uint32_t opcode : 3;
uint32_t Rm : 5;
uint32_t R : 1;
uint32_t L : 1;
uint32_t _23 : 1; // 1
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 0
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.L = static_cast<uint8_t>(enc.L);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.S = static_cast<uint8_t>(enc.S);
inst.R = static_cast<uint8_t>(enc.R);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::ST3_ASISDLSOP_B3_I3B;
inst.iclass = InstName::ST3;
return true;
}
static bool TryExtractST3_ASISDLSOP_BX3_R3B(InstData &inst, uint32_t bits) {
// bits
// & 10111111111000001110000000000000
// --------------------------------
// 00001101100000000010000000000000
if ((bits & 0xbfe0e000U) != 0xd802000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t size : 2;
uint32_t S : 1;
uint32_t opcode : 3;
uint32_t Rm : 5;
uint32_t R : 1;
uint32_t L : 1;
uint32_t _23 : 1; // 1
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 0
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.L = static_cast<uint8_t>(enc.L);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.S = static_cast<uint8_t>(enc.S);
inst.R = static_cast<uint8_t>(enc.R);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::ST3_ASISDLSOP_BX3_R3B;
inst.iclass = InstName::ST3;
return true;
}
static bool TryExtractST3_ASISDLSOP_H3_I3H(InstData &inst, uint32_t bits) {
// bits
// & 10111111111111111110010000000000
// --------------------------------
// 00001101100111110110000000000000
if ((bits & 0xbfffe400U) != 0xd9f6000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t size : 2;
uint32_t S : 1;
uint32_t opcode : 3;
uint32_t Rm : 5;
uint32_t R : 1;
uint32_t L : 1;
uint32_t _23 : 1; // 1
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 0
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.L = static_cast<uint8_t>(enc.L);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.S = static_cast<uint8_t>(enc.S);
inst.R = static_cast<uint8_t>(enc.R);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::ST3_ASISDLSOP_H3_I3H;
inst.iclass = InstName::ST3;
return true;
}
static bool TryExtractST3_ASISDLSOP_HX3_R3H(InstData &inst, uint32_t bits) {
// bits
// & 10111111111000001110010000000000
// --------------------------------
// 00001101100000000110000000000000
if ((bits & 0xbfe0e400U) != 0xd806000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t size : 2;
uint32_t S : 1;
uint32_t opcode : 3;
uint32_t Rm : 5;
uint32_t R : 1;
uint32_t L : 1;
uint32_t _23 : 1; // 1
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 0
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.L = static_cast<uint8_t>(enc.L);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.S = static_cast<uint8_t>(enc.S);
inst.R = static_cast<uint8_t>(enc.R);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::ST3_ASISDLSOP_HX3_R3H;
inst.iclass = InstName::ST3;
return true;
}
static bool TryExtractST3_ASISDLSOP_S3_I3S(InstData &inst, uint32_t bits) {
// bits
// & 10111111111111111110110000000000
// --------------------------------
// 00001101100111111010000000000000
if ((bits & 0xbfffec00U) != 0xd9fa000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t size : 2;
uint32_t S : 1;
uint32_t opcode : 3;
uint32_t Rm : 5;
uint32_t R : 1;
uint32_t L : 1;
uint32_t _23 : 1; // 1
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 0
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.L = static_cast<uint8_t>(enc.L);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.S = static_cast<uint8_t>(enc.S);
inst.R = static_cast<uint8_t>(enc.R);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::ST3_ASISDLSOP_S3_I3S;
inst.iclass = InstName::ST3;
return true;
}
static bool TryExtractST3_ASISDLSOP_SX3_R3S(InstData &inst, uint32_t bits) {
// bits
// & 10111111111000001110110000000000
// --------------------------------
// 00001101100000001010000000000000
if ((bits & 0xbfe0ec00U) != 0xd80a000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t size : 2;
uint32_t S : 1;
uint32_t opcode : 3;
uint32_t Rm : 5;
uint32_t R : 1;
uint32_t L : 1;
uint32_t _23 : 1; // 1
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 0
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.L = static_cast<uint8_t>(enc.L);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.S = static_cast<uint8_t>(enc.S);
inst.R = static_cast<uint8_t>(enc.R);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::ST3_ASISDLSOP_SX3_R3S;
inst.iclass = InstName::ST3;
return true;
}
static bool TryExtractST3_ASISDLSOP_D3_I3D(InstData &inst, uint32_t bits) {
// bits
// & 10111111111111111111110000000000
// --------------------------------
// 00001101100111111010010000000000
if ((bits & 0xbffffc00U) != 0xd9fa400U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t size : 2;
uint32_t S : 1;
uint32_t opcode : 3;
uint32_t Rm : 5;
uint32_t R : 1;
uint32_t L : 1;
uint32_t _23 : 1; // 1
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 0
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.L = static_cast<uint8_t>(enc.L);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.S = static_cast<uint8_t>(enc.S);
inst.R = static_cast<uint8_t>(enc.R);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::ST3_ASISDLSOP_D3_I3D;
inst.iclass = InstName::ST3;
return true;
}
static bool TryExtractST3_ASISDLSOP_DX3_R3D(InstData &inst, uint32_t bits) {
// bits
// & 10111111111000001111110000000000
// --------------------------------
// 00001101100000001010010000000000
if ((bits & 0xbfe0fc00U) != 0xd80a400U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t size : 2;
uint32_t S : 1;
uint32_t opcode : 3;
uint32_t Rm : 5;
uint32_t R : 1;
uint32_t L : 1;
uint32_t _23 : 1; // 1
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 0
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.L = static_cast<uint8_t>(enc.L);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.S = static_cast<uint8_t>(enc.S);
inst.R = static_cast<uint8_t>(enc.R);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::ST3_ASISDLSOP_DX3_R3D;
inst.iclass = InstName::ST3;
return true;
}
static bool TryExtractASR_SBFM_32M_BITFIELD(InstData &inst, uint32_t bits) {
// bits
// & 11111111110000001111110000000000
// --------------------------------
// 00010011000000000111110000000000
if ((bits & 0xffc0fc00U) != 0x13007c00U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t imms : 6;
uint32_t immr : 6;
uint32_t N : 1;
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 0
uint32_t _28 : 1; // 1
uint32_t opc : 2;
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.sf = static_cast<uint8_t>(enc.sf);
inst.N = static_cast<uint8_t>(enc.N);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.immr.uimm = static_cast<uint64_t>(enc.immr);
inst.imms.uimm = static_cast<uint64_t>(enc.imms);
inst.iform = InstForm::ASR_SBFM_32M_BITFIELD;
inst.iclass = InstName::SBFM;
return true;
}
static bool TryExtractASR_SBFM_64M_BITFIELD(InstData &inst, uint32_t bits) {
// bits
// & 11111111110000001111110000000000
// --------------------------------
// 10010011010000001111110000000000
if ((bits & 0xffc0fc00U) != 0x9340fc00U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t imms : 6;
uint32_t immr : 6;
uint32_t N : 1;
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 0
uint32_t _28 : 1; // 1
uint32_t opc : 2;
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.sf = static_cast<uint8_t>(enc.sf);
inst.N = static_cast<uint8_t>(enc.N);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.immr.uimm = static_cast<uint64_t>(enc.immr);
inst.imms.uimm = static_cast<uint64_t>(enc.imms);
inst.iform = InstForm::ASR_SBFM_64M_BITFIELD;
inst.iclass = InstName::SBFM;
return true;
}
static bool TryExtractLDRSW_64_LOADLIT(InstData &inst, uint32_t bits) {
// bits
// & 11111111000000000000000000000000
// --------------------------------
// 10011000000000000000000000000000
if ((bits & 0xff000000U) != 0x98000000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t imm19 : 19;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 0
uint32_t opc : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.imm19.uimm = static_cast<uint64_t>(enc.imm19);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.V = static_cast<uint8_t>(enc.V);
inst.iform = InstForm::LDRSW_64_LOADLIT;
inst.iclass = InstName::LDRSW;
return true;
}
static bool TryExtractLDADDA_32_MEMOP(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 10111000101000000000000000000000
if ((bits & 0xffe0fc00U) != 0xb8a00000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t opc : 3;
uint32_t o3 : 1;
uint32_t Rs : 5;
uint32_t _21 : 1; // 1
uint32_t R : 1;
uint32_t A : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.A = static_cast<uint8_t>(enc.A);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.V = static_cast<uint8_t>(enc.V);
inst.R = static_cast<uint8_t>(enc.R);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o3 = static_cast<uint8_t>(enc.o3);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LDADDA_32_MEMOP;
inst.iclass = InstName::LDADDA;
return true;
}
static bool TryExtractLDADDAL_32_MEMOP(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 10111000111000000000000000000000
if ((bits & 0xffe0fc00U) != 0xb8e00000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t opc : 3;
uint32_t o3 : 1;
uint32_t Rs : 5;
uint32_t _21 : 1; // 1
uint32_t R : 1;
uint32_t A : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.A = static_cast<uint8_t>(enc.A);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.V = static_cast<uint8_t>(enc.V);
inst.R = static_cast<uint8_t>(enc.R);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o3 = static_cast<uint8_t>(enc.o3);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LDADDAL_32_MEMOP;
inst.iclass = InstName::LDADDAL;
return true;
}
static bool TryExtractLDADD_32_MEMOP(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 10111000001000000000000000000000
if ((bits & 0xffe0fc00U) != 0xb8200000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t opc : 3;
uint32_t o3 : 1;
uint32_t Rs : 5;
uint32_t _21 : 1; // 1
uint32_t R : 1;
uint32_t A : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.A = static_cast<uint8_t>(enc.A);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.V = static_cast<uint8_t>(enc.V);
inst.R = static_cast<uint8_t>(enc.R);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o3 = static_cast<uint8_t>(enc.o3);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LDADD_32_MEMOP;
inst.iclass = InstName::LDADD;
return true;
}
static bool TryExtractLDADDL_32_MEMOP(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 10111000011000000000000000000000
if ((bits & 0xffe0fc00U) != 0xb8600000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t opc : 3;
uint32_t o3 : 1;
uint32_t Rs : 5;
uint32_t _21 : 1; // 1
uint32_t R : 1;
uint32_t A : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.A = static_cast<uint8_t>(enc.A);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.V = static_cast<uint8_t>(enc.V);
inst.R = static_cast<uint8_t>(enc.R);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o3 = static_cast<uint8_t>(enc.o3);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LDADDL_32_MEMOP;
inst.iclass = InstName::LDADDL;
return true;
}
static bool TryExtractLDADDA_64_MEMOP(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 11111000101000000000000000000000
if ((bits & 0xffe0fc00U) != 0xf8a00000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t opc : 3;
uint32_t o3 : 1;
uint32_t Rs : 5;
uint32_t _21 : 1; // 1
uint32_t R : 1;
uint32_t A : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.A = static_cast<uint8_t>(enc.A);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.V = static_cast<uint8_t>(enc.V);
inst.R = static_cast<uint8_t>(enc.R);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o3 = static_cast<uint8_t>(enc.o3);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LDADDA_64_MEMOP;
inst.iclass = InstName::LDADDA;
return true;
}
static bool TryExtractLDADDAL_64_MEMOP(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 11111000111000000000000000000000
if ((bits & 0xffe0fc00U) != 0xf8e00000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t opc : 3;
uint32_t o3 : 1;
uint32_t Rs : 5;
uint32_t _21 : 1; // 1
uint32_t R : 1;
uint32_t A : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.A = static_cast<uint8_t>(enc.A);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.V = static_cast<uint8_t>(enc.V);
inst.R = static_cast<uint8_t>(enc.R);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o3 = static_cast<uint8_t>(enc.o3);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LDADDAL_64_MEMOP;
inst.iclass = InstName::LDADDAL;
return true;
}
static bool TryExtractLDADD_64_MEMOP(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 11111000001000000000000000000000
if ((bits & 0xffe0fc00U) != 0xf8200000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t opc : 3;
uint32_t o3 : 1;
uint32_t Rs : 5;
uint32_t _21 : 1; // 1
uint32_t R : 1;
uint32_t A : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.A = static_cast<uint8_t>(enc.A);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.V = static_cast<uint8_t>(enc.V);
inst.R = static_cast<uint8_t>(enc.R);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o3 = static_cast<uint8_t>(enc.o3);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LDADD_64_MEMOP;
inst.iclass = InstName::LDADD;
return true;
}
static bool TryExtractLDADDL_64_MEMOP(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 11111000011000000000000000000000
if ((bits & 0xffe0fc00U) != 0xf8600000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t opc : 3;
uint32_t o3 : 1;
uint32_t Rs : 5;
uint32_t _21 : 1; // 1
uint32_t R : 1;
uint32_t A : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.A = static_cast<uint8_t>(enc.A);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.V = static_cast<uint8_t>(enc.V);
inst.R = static_cast<uint8_t>(enc.R);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o3 = static_cast<uint8_t>(enc.o3);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LDADDL_64_MEMOP;
inst.iclass = InstName::LDADDL;
return true;
}
static bool TryExtractFCVTZS_ASISDSHF_C(InstData &inst, uint32_t bits) {
// bits
// & 11111111100000001111110000000000
// --------------------------------
// 01011111000000001111110000000000
if ((bits & 0xff80fc00U) != 0x5f00fc00U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t opcode : 5;
uint32_t immb : 3;
uint32_t immh : 4;
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t U : 1;
uint32_t _30 : 1; // 1
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.immh.uimm = static_cast<uint64_t>(enc.immh);
if (!(inst.immh.uimm != 0x0))
return false;
inst.immb.uimm = static_cast<uint64_t>(enc.immb);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.iform = InstForm::FCVTZS_ASISDSHF_C;
inst.iclass = InstName::FCVTZS;
return true;
}
static bool TryExtractFCVTZS_ASIMDSHF_C(InstData &inst, uint32_t bits) {
// bits
// & 10111111100000001111110000000000
// --------------------------------
// 00001111000000001111110000000000
if ((bits & 0xbf80fc00U) != 0xf00fc00U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t opcode : 5;
uint32_t immb : 3;
uint32_t immh : 4;
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.immh.uimm = static_cast<uint64_t>(enc.immh);
if (!(inst.immh.uimm != 0x0))
return false;
inst.immb.uimm = static_cast<uint64_t>(enc.immb);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.iform = InstForm::FCVTZS_ASIMDSHF_C;
inst.iclass = InstName::FCVTZS;
return true;
}
static bool TryExtractLSR_UBFM_32M_BITFIELD(InstData &inst, uint32_t bits) {
// bits
// & 11111111110000001111110000000000
// --------------------------------
// 01010011000000000111110000000000
if ((bits & 0xffc0fc00U) != 0x53007c00U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t imms : 6;
uint32_t immr : 6;
uint32_t N : 1;
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 0
uint32_t _28 : 1; // 1
uint32_t opc : 2;
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.sf = static_cast<uint8_t>(enc.sf);
inst.N = static_cast<uint8_t>(enc.N);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.immr.uimm = static_cast<uint64_t>(enc.immr);
inst.imms.uimm = static_cast<uint64_t>(enc.imms);
inst.iform = InstForm::LSR_UBFM_32M_BITFIELD;
inst.iclass = InstName::UBFM;
return true;
}
static bool TryExtractLSR_UBFM_64M_BITFIELD(InstData &inst, uint32_t bits) {
// bits
// & 11111111110000001111110000000000
// --------------------------------
// 11010011010000001111110000000000
if ((bits & 0xffc0fc00U) != 0xd340fc00U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t imms : 6;
uint32_t immr : 6;
uint32_t N : 1;
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 0
uint32_t _28 : 1; // 1
uint32_t opc : 2;
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.sf = static_cast<uint8_t>(enc.sf);
inst.N = static_cast<uint8_t>(enc.N);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.immr.uimm = static_cast<uint64_t>(enc.immr);
inst.imms.uimm = static_cast<uint64_t>(enc.imms);
inst.iform = InstForm::LSR_UBFM_64M_BITFIELD;
inst.iclass = InstName::UBFM;
return true;
}
static bool TryExtractST2_ASISDLSO_B2_2B(InstData &inst, uint32_t bits) {
// bits
// & 10111111111111111110000000000000
// --------------------------------
// 00001101001000000000000000000000
if ((bits & 0xbfffe000U) != 0xd200000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t size : 2;
uint32_t S : 1;
uint32_t opcode : 3;
uint32_t _16 : 1; // 0
uint32_t _17 : 1; // 0
uint32_t _18 : 1; // 0
uint32_t _19 : 1; // 0
uint32_t _20 : 1; // 0
uint32_t R : 1;
uint32_t L : 1;
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 0
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.L = static_cast<uint8_t>(enc.L);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.S = static_cast<uint8_t>(enc.S);
inst.R = static_cast<uint8_t>(enc.R);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::ST2_ASISDLSO_B2_2B;
inst.iclass = InstName::ST2;
return true;
}
static bool TryExtractST2_ASISDLSO_H2_2H(InstData &inst, uint32_t bits) {
// bits
// & 10111111111111111110010000000000
// --------------------------------
// 00001101001000000100000000000000
if ((bits & 0xbfffe400U) != 0xd204000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t size : 2;
uint32_t S : 1;
uint32_t opcode : 3;
uint32_t _16 : 1; // 0
uint32_t _17 : 1; // 0
uint32_t _18 : 1; // 0
uint32_t _19 : 1; // 0
uint32_t _20 : 1; // 0
uint32_t R : 1;
uint32_t L : 1;
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 0
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.L = static_cast<uint8_t>(enc.L);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.S = static_cast<uint8_t>(enc.S);
inst.R = static_cast<uint8_t>(enc.R);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::ST2_ASISDLSO_H2_2H;
inst.iclass = InstName::ST2;
return true;
}
static bool TryExtractST2_ASISDLSO_S2_2S(InstData &inst, uint32_t bits) {
// bits
// & 10111111111111111110110000000000
// --------------------------------
// 00001101001000001000000000000000
if ((bits & 0xbfffec00U) != 0xd208000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t size : 2;
uint32_t S : 1;
uint32_t opcode : 3;
uint32_t _16 : 1; // 0
uint32_t _17 : 1; // 0
uint32_t _18 : 1; // 0
uint32_t _19 : 1; // 0
uint32_t _20 : 1; // 0
uint32_t R : 1;
uint32_t L : 1;
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 0
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.L = static_cast<uint8_t>(enc.L);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.S = static_cast<uint8_t>(enc.S);
inst.R = static_cast<uint8_t>(enc.R);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::ST2_ASISDLSO_S2_2S;
inst.iclass = InstName::ST2;
return true;
}
static bool TryExtractST2_ASISDLSO_D2_2D(InstData &inst, uint32_t bits) {
// bits
// & 10111111111111111111110000000000
// --------------------------------
// 00001101001000001000010000000000
if ((bits & 0xbffffc00U) != 0xd208400U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t size : 2;
uint32_t S : 1;
uint32_t opcode : 3;
uint32_t _16 : 1; // 0
uint32_t _17 : 1; // 0
uint32_t _18 : 1; // 0
uint32_t _19 : 1; // 0
uint32_t _20 : 1; // 0
uint32_t R : 1;
uint32_t L : 1;
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 0
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.L = static_cast<uint8_t>(enc.L);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.S = static_cast<uint8_t>(enc.S);
inst.R = static_cast<uint8_t>(enc.R);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::ST2_ASISDLSO_D2_2D;
inst.iclass = InstName::ST2;
return true;
}
static bool TryExtractST2_ASISDLSOP_B2_I2B(InstData &inst, uint32_t bits) {
// bits
// & 10111111111111111110000000000000
// --------------------------------
// 00001101101111110000000000000000
if ((bits & 0xbfffe000U) != 0xdbf0000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t size : 2;
uint32_t S : 1;
uint32_t opcode : 3;
uint32_t Rm : 5;
uint32_t R : 1;
uint32_t L : 1;
uint32_t _23 : 1; // 1
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 0
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.L = static_cast<uint8_t>(enc.L);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.S = static_cast<uint8_t>(enc.S);
inst.R = static_cast<uint8_t>(enc.R);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::ST2_ASISDLSOP_B2_I2B;
inst.iclass = InstName::ST2;
return true;
}
static bool TryExtractST2_ASISDLSOP_BX2_R2B(InstData &inst, uint32_t bits) {
// bits
// & 10111111111000001110000000000000
// --------------------------------
// 00001101101000000000000000000000
if ((bits & 0xbfe0e000U) != 0xda00000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t size : 2;
uint32_t S : 1;
uint32_t opcode : 3;
uint32_t Rm : 5;
uint32_t R : 1;
uint32_t L : 1;
uint32_t _23 : 1; // 1
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 0
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.L = static_cast<uint8_t>(enc.L);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.S = static_cast<uint8_t>(enc.S);
inst.R = static_cast<uint8_t>(enc.R);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::ST2_ASISDLSOP_BX2_R2B;
inst.iclass = InstName::ST2;
return true;
}
static bool TryExtractST2_ASISDLSOP_H2_I2H(InstData &inst, uint32_t bits) {
// bits
// & 10111111111111111110010000000000
// --------------------------------
// 00001101101111110100000000000000
if ((bits & 0xbfffe400U) != 0xdbf4000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t size : 2;
uint32_t S : 1;
uint32_t opcode : 3;
uint32_t Rm : 5;
uint32_t R : 1;
uint32_t L : 1;
uint32_t _23 : 1; // 1
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 0
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.L = static_cast<uint8_t>(enc.L);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.S = static_cast<uint8_t>(enc.S);
inst.R = static_cast<uint8_t>(enc.R);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::ST2_ASISDLSOP_H2_I2H;
inst.iclass = InstName::ST2;
return true;
}
static bool TryExtractST2_ASISDLSOP_HX2_R2H(InstData &inst, uint32_t bits) {
// bits
// & 10111111111000001110010000000000
// --------------------------------
// 00001101101000000100000000000000
if ((bits & 0xbfe0e400U) != 0xda04000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t size : 2;
uint32_t S : 1;
uint32_t opcode : 3;
uint32_t Rm : 5;
uint32_t R : 1;
uint32_t L : 1;
uint32_t _23 : 1; // 1
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 0
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.L = static_cast<uint8_t>(enc.L);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.S = static_cast<uint8_t>(enc.S);
inst.R = static_cast<uint8_t>(enc.R);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::ST2_ASISDLSOP_HX2_R2H;
inst.iclass = InstName::ST2;
return true;
}
static bool TryExtractST2_ASISDLSOP_S2_I2S(InstData &inst, uint32_t bits) {
// bits
// & 10111111111111111110110000000000
// --------------------------------
// 00001101101111111000000000000000
if ((bits & 0xbfffec00U) != 0xdbf8000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t size : 2;
uint32_t S : 1;
uint32_t opcode : 3;
uint32_t Rm : 5;
uint32_t R : 1;
uint32_t L : 1;
uint32_t _23 : 1; // 1
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 0
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.L = static_cast<uint8_t>(enc.L);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.S = static_cast<uint8_t>(enc.S);
inst.R = static_cast<uint8_t>(enc.R);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::ST2_ASISDLSOP_S2_I2S;
inst.iclass = InstName::ST2;
return true;
}
static bool TryExtractST2_ASISDLSOP_SX2_R2S(InstData &inst, uint32_t bits) {
// bits
// & 10111111111000001110110000000000
// --------------------------------
// 00001101101000001000000000000000
if ((bits & 0xbfe0ec00U) != 0xda08000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t size : 2;
uint32_t S : 1;
uint32_t opcode : 3;
uint32_t Rm : 5;
uint32_t R : 1;
uint32_t L : 1;
uint32_t _23 : 1; // 1
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 0
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.L = static_cast<uint8_t>(enc.L);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.S = static_cast<uint8_t>(enc.S);
inst.R = static_cast<uint8_t>(enc.R);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::ST2_ASISDLSOP_SX2_R2S;
inst.iclass = InstName::ST2;
return true;
}
static bool TryExtractST2_ASISDLSOP_D2_I2D(InstData &inst, uint32_t bits) {
// bits
// & 10111111111111111111110000000000
// --------------------------------
// 00001101101111111000010000000000
if ((bits & 0xbffffc00U) != 0xdbf8400U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t size : 2;
uint32_t S : 1;
uint32_t opcode : 3;
uint32_t Rm : 5;
uint32_t R : 1;
uint32_t L : 1;
uint32_t _23 : 1; // 1
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 0
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.L = static_cast<uint8_t>(enc.L);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.S = static_cast<uint8_t>(enc.S);
inst.R = static_cast<uint8_t>(enc.R);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::ST2_ASISDLSOP_D2_I2D;
inst.iclass = InstName::ST2;
return true;
}
static bool TryExtractST2_ASISDLSOP_DX2_R2D(InstData &inst, uint32_t bits) {
// bits
// & 10111111111000001111110000000000
// --------------------------------
// 00001101101000001000010000000000
if ((bits & 0xbfe0fc00U) != 0xda08400U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t size : 2;
uint32_t S : 1;
uint32_t opcode : 3;
uint32_t Rm : 5;
uint32_t R : 1;
uint32_t L : 1;
uint32_t _23 : 1; // 1
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 0
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.L = static_cast<uint8_t>(enc.L);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.S = static_cast<uint8_t>(enc.S);
inst.R = static_cast<uint8_t>(enc.R);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::ST2_ASISDLSOP_DX2_R2D;
inst.iclass = InstName::ST2;
return true;
}
static bool TryExtractRADDHN_ASIMDDIFF_N(InstData &inst, uint32_t bits) {
// bits
// & 10111111001000001111110000000000
// --------------------------------
// 00101110001000000100000000000000
if ((bits & 0xbf20fc00U) != 0x2e204000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t _12 : 1; // 0
uint32_t o1 : 1;
uint32_t _14 : 1; // 1
uint32_t _15 : 1; // 0
uint32_t Rm : 5;
uint32_t _21 : 1; // 1
uint32_t size : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o1 = static_cast<uint8_t>(enc.o1);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::RADDHN_ASIMDDIFF_N;
inst.iclass = InstName::RADDHN;
return true;
}
static bool TryExtractSTUR_32_LDST_UNSCALED(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000000000110000000000
// --------------------------------
// 10111000000000000000000000000000
if ((bits & 0xffe00c00U) != 0xb8000000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t imm9 : 9;
uint32_t _21 : 1; // 0
uint32_t opc : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.imm9.uimm = static_cast<uint64_t>(enc.imm9);
inst.V = static_cast<uint8_t>(enc.V);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::STUR_32_LDST_UNSCALED;
inst.iclass = InstName::STUR;
return true;
}
static bool TryExtractSTUR_64_LDST_UNSCALED(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000000000110000000000
// --------------------------------
// 11111000000000000000000000000000
if ((bits & 0xffe00c00U) != 0xf8000000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t imm9 : 9;
uint32_t _21 : 1; // 0
uint32_t opc : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.imm9.uimm = static_cast<uint64_t>(enc.imm9);
inst.V = static_cast<uint8_t>(enc.V);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::STUR_64_LDST_UNSCALED;
inst.iclass = InstName::STUR;
return true;
}
static bool TryExtractCLS_ASIMDMISC_R(InstData &inst, uint32_t bits) {
// bits
// & 10111111001111111111110000000000
// --------------------------------
// 00001110001000000100100000000000
if ((bits & 0xbf3ffc00U) != 0xe204800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t opcode : 5;
uint32_t _17 : 1; // 0
uint32_t _18 : 1; // 0
uint32_t _19 : 1; // 0
uint32_t _20 : 1; // 0
uint32_t _21 : 1; // 1
uint32_t size : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.U = static_cast<uint8_t>(enc.U);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::CLS_ASIMDMISC_R;
inst.iclass = InstName::CLS;
return true;
}
static bool TryExtractSADDL_ASIMDDIFF_L(InstData &inst, uint32_t bits) {
// bits
// & 10111111001000001111110000000000
// --------------------------------
// 00001110001000000000000000000000
if ((bits & 0xbf20fc00U) != 0xe200000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t _12 : 1; // 0
uint32_t o1 : 1;
uint32_t _14 : 1; // 0
uint32_t _15 : 1; // 0
uint32_t Rm : 5;
uint32_t _21 : 1; // 1
uint32_t size : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o1 = static_cast<uint8_t>(enc.o1);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::SADDL_ASIMDDIFF_L;
inst.iclass = InstName::SADDL;
return true;
}
static bool TryExtractADDP_ASISDPAIR_ONLY(InstData &inst, uint32_t bits) {
// bits
// & 11111111001111111111110000000000
// --------------------------------
// 01011110001100011011100000000000
if ((bits & 0xff3ffc00U) != 0x5e31b800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t opcode : 5;
uint32_t _17 : 1; // 0
uint32_t _18 : 1; // 0
uint32_t _19 : 1; // 0
uint32_t _20 : 1; // 1
uint32_t _21 : 1; // 1
uint32_t size : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t U : 1;
uint32_t _30 : 1; // 1
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::ADDP_ASISDPAIR_ONLY;
inst.iclass = InstName::ADDP;
return true;
}
static bool TryExtractCMP_SUBS_32_ADDSUB_SHIFT(InstData &inst, uint32_t bits) {
// bits
// & 11111111001000000000000000011111
// --------------------------------
// 01101011000000000000000000011111
if ((bits & 0xff20001fU) != 0x6b00001fU) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t imm6 : 6;
uint32_t Rm : 5;
uint32_t _21 : 1; // 0
uint32_t shift : 2;
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t S : 1;
uint32_t op : 1;
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.shift = static_cast<uint8_t>(enc.shift);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.op = static_cast<uint8_t>(enc.op);
inst.sf = static_cast<uint8_t>(enc.sf);
inst.imm6.uimm = static_cast<uint64_t>(enc.imm6);
inst.iform = InstForm::CMP_SUBS_32_ADDSUB_SHIFT;
inst.iclass = InstName::SUBS;
return true;
}
static bool TryExtractCMP_SUBS_64_ADDSUB_SHIFT(InstData &inst, uint32_t bits) {
// bits
// & 11111111001000000000000000011111
// --------------------------------
// 11101011000000000000000000011111
if ((bits & 0xff20001fU) != 0xeb00001fU) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t imm6 : 6;
uint32_t Rm : 5;
uint32_t _21 : 1; // 0
uint32_t shift : 2;
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t S : 1;
uint32_t op : 1;
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.shift = static_cast<uint8_t>(enc.shift);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.op = static_cast<uint8_t>(enc.op);
inst.sf = static_cast<uint8_t>(enc.sf);
inst.imm6.uimm = static_cast<uint64_t>(enc.imm6);
inst.iform = InstForm::CMP_SUBS_64_ADDSUB_SHIFT;
inst.iclass = InstName::SUBS;
return true;
}
static bool TryExtractSTR_B_LDST_IMMPOST(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000000000110000000000
// --------------------------------
// 00111100000000000000010000000000
if ((bits & 0xffe00c00U) != 0x3c000400U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t _11 : 1; // 0
uint32_t imm9 : 9;
uint32_t _21 : 1; // 0
uint32_t opc : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.imm9.uimm = static_cast<uint64_t>(enc.imm9);
inst.V = static_cast<uint8_t>(enc.V);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::STR_B_LDST_IMMPOST;
inst.iclass = InstName::STR;
return true;
}
static bool TryExtractSTR_H_LDST_IMMPOST(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000000000110000000000
// --------------------------------
// 01111100000000000000010000000000
if ((bits & 0xffe00c00U) != 0x7c000400U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t _11 : 1; // 0
uint32_t imm9 : 9;
uint32_t _21 : 1; // 0
uint32_t opc : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.imm9.uimm = static_cast<uint64_t>(enc.imm9);
inst.V = static_cast<uint8_t>(enc.V);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::STR_H_LDST_IMMPOST;
inst.iclass = InstName::STR;
return true;
}
static bool TryExtractSTR_S_LDST_IMMPOST(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000000000110000000000
// --------------------------------
// 10111100000000000000010000000000
if ((bits & 0xffe00c00U) != 0xbc000400U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t _11 : 1; // 0
uint32_t imm9 : 9;
uint32_t _21 : 1; // 0
uint32_t opc : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.imm9.uimm = static_cast<uint64_t>(enc.imm9);
inst.V = static_cast<uint8_t>(enc.V);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::STR_S_LDST_IMMPOST;
inst.iclass = InstName::STR;
return true;
}
static bool TryExtractSTR_D_LDST_IMMPOST(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000000000110000000000
// --------------------------------
// 11111100000000000000010000000000
if ((bits & 0xffe00c00U) != 0xfc000400U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t _11 : 1; // 0
uint32_t imm9 : 9;
uint32_t _21 : 1; // 0
uint32_t opc : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.imm9.uimm = static_cast<uint64_t>(enc.imm9);
inst.V = static_cast<uint8_t>(enc.V);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::STR_D_LDST_IMMPOST;
inst.iclass = InstName::STR;
return true;
}
static bool TryExtractSTR_Q_LDST_IMMPOST(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000000000110000000000
// --------------------------------
// 00111100100000000000010000000000
if ((bits & 0xffe00c00U) != 0x3c800400U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t _11 : 1; // 0
uint32_t imm9 : 9;
uint32_t _21 : 1; // 0
uint32_t opc : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.imm9.uimm = static_cast<uint64_t>(enc.imm9);
inst.V = static_cast<uint8_t>(enc.V);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::STR_Q_LDST_IMMPOST;
inst.iclass = InstName::STR;
return true;
}
static bool TryExtractSTR_B_LDST_IMMPRE(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000000000110000000000
// --------------------------------
// 00111100000000000000110000000000
if ((bits & 0xffe00c00U) != 0x3c000c00U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t _11 : 1; // 1
uint32_t imm9 : 9;
uint32_t _21 : 1; // 0
uint32_t opc : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.imm9.uimm = static_cast<uint64_t>(enc.imm9);
inst.V = static_cast<uint8_t>(enc.V);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::STR_B_LDST_IMMPRE;
inst.iclass = InstName::STR;
return true;
}
static bool TryExtractSTR_H_LDST_IMMPRE(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000000000110000000000
// --------------------------------
// 01111100000000000000110000000000
if ((bits & 0xffe00c00U) != 0x7c000c00U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t _11 : 1; // 1
uint32_t imm9 : 9;
uint32_t _21 : 1; // 0
uint32_t opc : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.imm9.uimm = static_cast<uint64_t>(enc.imm9);
inst.V = static_cast<uint8_t>(enc.V);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::STR_H_LDST_IMMPRE;
inst.iclass = InstName::STR;
return true;
}
static bool TryExtractSTR_S_LDST_IMMPRE(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000000000110000000000
// --------------------------------
// 10111100000000000000110000000000
if ((bits & 0xffe00c00U) != 0xbc000c00U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t _11 : 1; // 1
uint32_t imm9 : 9;
uint32_t _21 : 1; // 0
uint32_t opc : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.imm9.uimm = static_cast<uint64_t>(enc.imm9);
inst.V = static_cast<uint8_t>(enc.V);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::STR_S_LDST_IMMPRE;
inst.iclass = InstName::STR;
return true;
}
static bool TryExtractSTR_D_LDST_IMMPRE(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000000000110000000000
// --------------------------------
// 11111100000000000000110000000000
if ((bits & 0xffe00c00U) != 0xfc000c00U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t _11 : 1; // 1
uint32_t imm9 : 9;
uint32_t _21 : 1; // 0
uint32_t opc : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.imm9.uimm = static_cast<uint64_t>(enc.imm9);
inst.V = static_cast<uint8_t>(enc.V);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::STR_D_LDST_IMMPRE;
inst.iclass = InstName::STR;
return true;
}
static bool TryExtractSTR_Q_LDST_IMMPRE(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000000000110000000000
// --------------------------------
// 00111100100000000000110000000000
if ((bits & 0xffe00c00U) != 0x3c800c00U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t _11 : 1; // 1
uint32_t imm9 : 9;
uint32_t _21 : 1; // 0
uint32_t opc : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.imm9.uimm = static_cast<uint64_t>(enc.imm9);
inst.V = static_cast<uint8_t>(enc.V);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::STR_Q_LDST_IMMPRE;
inst.iclass = InstName::STR;
return true;
}
static bool TryExtractSTR_B_LDST_POS(InstData &inst, uint32_t bits) {
// bits
// & 11111111110000000000000000000000
// --------------------------------
// 00111101000000000000000000000000
if ((bits & 0xffc00000U) != 0x3d000000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t imm12 : 12;
uint32_t opc : 2;
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.imm12.uimm = static_cast<uint64_t>(enc.imm12);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.V = static_cast<uint8_t>(enc.V);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::STR_B_LDST_POS;
inst.iclass = InstName::STR;
return true;
}
static bool TryExtractSTR_H_LDST_POS(InstData &inst, uint32_t bits) {
// bits
// & 11111111110000000000000000000000
// --------------------------------
// 01111101000000000000000000000000
if ((bits & 0xffc00000U) != 0x7d000000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t imm12 : 12;
uint32_t opc : 2;
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.imm12.uimm = static_cast<uint64_t>(enc.imm12);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.V = static_cast<uint8_t>(enc.V);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::STR_H_LDST_POS;
inst.iclass = InstName::STR;
return true;
}
static bool TryExtractSTR_S_LDST_POS(InstData &inst, uint32_t bits) {
// bits
// & 11111111110000000000000000000000
// --------------------------------
// 10111101000000000000000000000000
if ((bits & 0xffc00000U) != 0xbd000000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t imm12 : 12;
uint32_t opc : 2;
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.imm12.uimm = static_cast<uint64_t>(enc.imm12);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.V = static_cast<uint8_t>(enc.V);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::STR_S_LDST_POS;
inst.iclass = InstName::STR;
return true;
}
static bool TryExtractSTR_D_LDST_POS(InstData &inst, uint32_t bits) {
// bits
// & 11111111110000000000000000000000
// --------------------------------
// 11111101000000000000000000000000
if ((bits & 0xffc00000U) != 0xfd000000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t imm12 : 12;
uint32_t opc : 2;
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.imm12.uimm = static_cast<uint64_t>(enc.imm12);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.V = static_cast<uint8_t>(enc.V);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::STR_D_LDST_POS;
inst.iclass = InstName::STR;
return true;
}
static bool TryExtractSTR_Q_LDST_POS(InstData &inst, uint32_t bits) {
// bits
// & 11111111110000000000000000000000
// --------------------------------
// 00111101100000000000000000000000
if ((bits & 0xffc00000U) != 0x3d800000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t imm12 : 12;
uint32_t opc : 2;
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.imm12.uimm = static_cast<uint64_t>(enc.imm12);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.V = static_cast<uint8_t>(enc.V);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::STR_Q_LDST_POS;
inst.iclass = InstName::STR;
return true;
}
static bool TryExtractLDSETAB_32_MEMOP(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 00111000101000000011000000000000
if ((bits & 0xffe0fc00U) != 0x38a03000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t opc : 3;
uint32_t o3 : 1;
uint32_t Rs : 5;
uint32_t _21 : 1; // 1
uint32_t R : 1;
uint32_t A : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.A = static_cast<uint8_t>(enc.A);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.V = static_cast<uint8_t>(enc.V);
inst.R = static_cast<uint8_t>(enc.R);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o3 = static_cast<uint8_t>(enc.o3);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LDSETAB_32_MEMOP;
inst.iclass = InstName::LDSETAB;
return true;
}
static bool TryExtractLDSETALB_32_MEMOP(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 00111000111000000011000000000000
if ((bits & 0xffe0fc00U) != 0x38e03000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t opc : 3;
uint32_t o3 : 1;
uint32_t Rs : 5;
uint32_t _21 : 1; // 1
uint32_t R : 1;
uint32_t A : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.A = static_cast<uint8_t>(enc.A);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.V = static_cast<uint8_t>(enc.V);
inst.R = static_cast<uint8_t>(enc.R);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o3 = static_cast<uint8_t>(enc.o3);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LDSETALB_32_MEMOP;
inst.iclass = InstName::LDSETALB;
return true;
}
static bool TryExtractLDSETB_32_MEMOP(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 00111000001000000011000000000000
if ((bits & 0xffe0fc00U) != 0x38203000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t opc : 3;
uint32_t o3 : 1;
uint32_t Rs : 5;
uint32_t _21 : 1; // 1
uint32_t R : 1;
uint32_t A : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.A = static_cast<uint8_t>(enc.A);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.V = static_cast<uint8_t>(enc.V);
inst.R = static_cast<uint8_t>(enc.R);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o3 = static_cast<uint8_t>(enc.o3);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LDSETB_32_MEMOP;
inst.iclass = InstName::LDSETB;
return true;
}
static bool TryExtractLDSETLB_32_MEMOP(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 00111000011000000011000000000000
if ((bits & 0xffe0fc00U) != 0x38603000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t opc : 3;
uint32_t o3 : 1;
uint32_t Rs : 5;
uint32_t _21 : 1; // 1
uint32_t R : 1;
uint32_t A : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.A = static_cast<uint8_t>(enc.A);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.V = static_cast<uint8_t>(enc.V);
inst.R = static_cast<uint8_t>(enc.R);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o3 = static_cast<uint8_t>(enc.o3);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LDSETLB_32_MEMOP;
inst.iclass = InstName::LDSETLB;
return true;
}
static bool TryExtractMOV_ORR_32_LOG_SHIFT(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111111111100000
// --------------------------------
// 00101010000000000000001111100000
if ((bits & 0xffe0ffe0U) != 0x2a0003e0U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t imm6 : 6;
uint32_t Rm : 5;
uint32_t N : 1;
uint32_t shift : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t opc : 2;
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.shift = static_cast<uint8_t>(enc.shift);
inst.N = static_cast<uint8_t>(enc.N);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.sf = static_cast<uint8_t>(enc.sf);
inst.imm6.uimm = static_cast<uint64_t>(enc.imm6);
inst.iform = InstForm::MOV_ORR_32_LOG_SHIFT;
inst.iclass = InstName::ORR;
return true;
}
static bool TryExtractMOV_ORR_64_LOG_SHIFT(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111111111100000
// --------------------------------
// 10101010000000000000001111100000
if ((bits & 0xffe0ffe0U) != 0xaa0003e0U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t imm6 : 6;
uint32_t Rm : 5;
uint32_t N : 1;
uint32_t shift : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t opc : 2;
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.shift = static_cast<uint8_t>(enc.shift);
inst.N = static_cast<uint8_t>(enc.N);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.sf = static_cast<uint8_t>(enc.sf);
inst.imm6.uimm = static_cast<uint64_t>(enc.imm6);
inst.iform = InstForm::MOV_ORR_64_LOG_SHIFT;
inst.iclass = InstName::ORR;
return true;
}
static bool TryExtractFRINTP_H_FLOATDP1(InstData &inst, uint32_t bits) {
// bits
// & 11111111111111111111110000000000
// --------------------------------
// 00011110111001001100000000000000
if ((bits & 0xfffffc00U) != 0x1ee4c000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t _12 : 1; // 0
uint32_t _13 : 1; // 0
uint32_t _14 : 1; // 1
uint32_t rmode : 3;
uint32_t _18 : 1; // 1
uint32_t _19 : 1; // 0
uint32_t _20 : 1; // 0
uint32_t _21 : 1; // 1
uint32_t type : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t _30 : 1; // 0
uint32_t M : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.M = static_cast<uint8_t>(enc.M);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.type = static_cast<uint8_t>(enc.type);
inst.rmode = static_cast<uint8_t>(enc.rmode);
inst.iform = InstForm::FRINTP_H_FLOATDP1;
inst.iclass = InstName::FRINTP;
return true;
}
static bool TryExtractFRINTP_S_FLOATDP1(InstData &inst, uint32_t bits) {
// bits
// & 11111111111111111111110000000000
// --------------------------------
// 00011110001001001100000000000000
if ((bits & 0xfffffc00U) != 0x1e24c000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t _12 : 1; // 0
uint32_t _13 : 1; // 0
uint32_t _14 : 1; // 1
uint32_t rmode : 3;
uint32_t _18 : 1; // 1
uint32_t _19 : 1; // 0
uint32_t _20 : 1; // 0
uint32_t _21 : 1; // 1
uint32_t type : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t _30 : 1; // 0
uint32_t M : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.M = static_cast<uint8_t>(enc.M);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.type = static_cast<uint8_t>(enc.type);
inst.rmode = static_cast<uint8_t>(enc.rmode);
inst.iform = InstForm::FRINTP_S_FLOATDP1;
inst.iclass = InstName::FRINTP;
return true;
}
static bool TryExtractFRINTP_D_FLOATDP1(InstData &inst, uint32_t bits) {
// bits
// & 11111111111111111111110000000000
// --------------------------------
// 00011110011001001100000000000000
if ((bits & 0xfffffc00U) != 0x1e64c000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t _12 : 1; // 0
uint32_t _13 : 1; // 0
uint32_t _14 : 1; // 1
uint32_t rmode : 3;
uint32_t _18 : 1; // 1
uint32_t _19 : 1; // 0
uint32_t _20 : 1; // 0
uint32_t _21 : 1; // 1
uint32_t type : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t _30 : 1; // 0
uint32_t M : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.M = static_cast<uint8_t>(enc.M);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.type = static_cast<uint8_t>(enc.type);
inst.rmode = static_cast<uint8_t>(enc.rmode);
inst.iform = InstForm::FRINTP_D_FLOATDP1;
inst.iclass = InstName::FRINTP;
return true;
}
static bool TryExtractCASA_C32_LDSTEXCL(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 10001000111000000111110000000000
if ((bits & 0xffe0fc00U) != 0x88e07c00U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t Rt2 : 5;
uint32_t o0 : 1;
uint32_t Rs : 5;
uint32_t o1 : 1;
uint32_t L : 1;
uint32_t o2 : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 0
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.L = static_cast<uint8_t>(enc.L);
inst.Rt2 = static_cast<uint8_t>(enc.Rt2);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.o2 = static_cast<uint8_t>(enc.o2);
inst.o1 = static_cast<uint8_t>(enc.o1);
inst.o0 = static_cast<uint8_t>(enc.o0);
inst.iform = InstForm::CASA_C32_LDSTEXCL;
inst.iclass = InstName::CASA;
return true;
}
static bool TryExtractCASAL_C32_LDSTEXCL(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 10001000111000001111110000000000
if ((bits & 0xffe0fc00U) != 0x88e0fc00U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t Rt2 : 5;
uint32_t o0 : 1;
uint32_t Rs : 5;
uint32_t o1 : 1;
uint32_t L : 1;
uint32_t o2 : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 0
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.L = static_cast<uint8_t>(enc.L);
inst.Rt2 = static_cast<uint8_t>(enc.Rt2);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.o2 = static_cast<uint8_t>(enc.o2);
inst.o1 = static_cast<uint8_t>(enc.o1);
inst.o0 = static_cast<uint8_t>(enc.o0);
inst.iform = InstForm::CASAL_C32_LDSTEXCL;
inst.iclass = InstName::CASAL;
return true;
}
static bool TryExtractCAS_C32_LDSTEXCL(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 10001000101000000111110000000000
if ((bits & 0xffe0fc00U) != 0x88a07c00U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t Rt2 : 5;
uint32_t o0 : 1;
uint32_t Rs : 5;
uint32_t o1 : 1;
uint32_t L : 1;
uint32_t o2 : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 0
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.L = static_cast<uint8_t>(enc.L);
inst.Rt2 = static_cast<uint8_t>(enc.Rt2);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.o2 = static_cast<uint8_t>(enc.o2);
inst.o1 = static_cast<uint8_t>(enc.o1);
inst.o0 = static_cast<uint8_t>(enc.o0);
inst.iform = InstForm::CAS_C32_LDSTEXCL;
inst.iclass = InstName::CAS;
return true;
}
static bool TryExtractCASL_C32_LDSTEXCL(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 10001000101000001111110000000000
if ((bits & 0xffe0fc00U) != 0x88a0fc00U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t Rt2 : 5;
uint32_t o0 : 1;
uint32_t Rs : 5;
uint32_t o1 : 1;
uint32_t L : 1;
uint32_t o2 : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 0
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.L = static_cast<uint8_t>(enc.L);
inst.Rt2 = static_cast<uint8_t>(enc.Rt2);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.o2 = static_cast<uint8_t>(enc.o2);
inst.o1 = static_cast<uint8_t>(enc.o1);
inst.o0 = static_cast<uint8_t>(enc.o0);
inst.iform = InstForm::CASL_C32_LDSTEXCL;
inst.iclass = InstName::CASL;
return true;
}
static bool TryExtractCASA_C64_LDSTEXCL(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 11001000111000000111110000000000
if ((bits & 0xffe0fc00U) != 0xc8e07c00U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t Rt2 : 5;
uint32_t o0 : 1;
uint32_t Rs : 5;
uint32_t o1 : 1;
uint32_t L : 1;
uint32_t o2 : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 0
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.L = static_cast<uint8_t>(enc.L);
inst.Rt2 = static_cast<uint8_t>(enc.Rt2);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.o2 = static_cast<uint8_t>(enc.o2);
inst.o1 = static_cast<uint8_t>(enc.o1);
inst.o0 = static_cast<uint8_t>(enc.o0);
inst.iform = InstForm::CASA_C64_LDSTEXCL;
inst.iclass = InstName::CASA;
return true;
}
static bool TryExtractCASAL_C64_LDSTEXCL(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 11001000111000001111110000000000
if ((bits & 0xffe0fc00U) != 0xc8e0fc00U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t Rt2 : 5;
uint32_t o0 : 1;
uint32_t Rs : 5;
uint32_t o1 : 1;
uint32_t L : 1;
uint32_t o2 : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 0
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.L = static_cast<uint8_t>(enc.L);
inst.Rt2 = static_cast<uint8_t>(enc.Rt2);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.o2 = static_cast<uint8_t>(enc.o2);
inst.o1 = static_cast<uint8_t>(enc.o1);
inst.o0 = static_cast<uint8_t>(enc.o0);
inst.iform = InstForm::CASAL_C64_LDSTEXCL;
inst.iclass = InstName::CASAL;
return true;
}
static bool TryExtractCAS_C64_LDSTEXCL(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 11001000101000000111110000000000
if ((bits & 0xffe0fc00U) != 0xc8a07c00U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t Rt2 : 5;
uint32_t o0 : 1;
uint32_t Rs : 5;
uint32_t o1 : 1;
uint32_t L : 1;
uint32_t o2 : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 0
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.L = static_cast<uint8_t>(enc.L);
inst.Rt2 = static_cast<uint8_t>(enc.Rt2);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.o2 = static_cast<uint8_t>(enc.o2);
inst.o1 = static_cast<uint8_t>(enc.o1);
inst.o0 = static_cast<uint8_t>(enc.o0);
inst.iform = InstForm::CAS_C64_LDSTEXCL;
inst.iclass = InstName::CAS;
return true;
}
static bool TryExtractCASL_C64_LDSTEXCL(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 11001000101000001111110000000000
if ((bits & 0xffe0fc00U) != 0xc8a0fc00U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t Rt2 : 5;
uint32_t o0 : 1;
uint32_t Rs : 5;
uint32_t o1 : 1;
uint32_t L : 1;
uint32_t o2 : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 0
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.L = static_cast<uint8_t>(enc.L);
inst.Rt2 = static_cast<uint8_t>(enc.Rt2);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.o2 = static_cast<uint8_t>(enc.o2);
inst.o1 = static_cast<uint8_t>(enc.o1);
inst.o0 = static_cast<uint8_t>(enc.o0);
inst.iform = InstForm::CASL_C64_LDSTEXCL;
inst.iclass = InstName::CASL;
return true;
}
static bool TryExtractWFE_HI_SYSTEM(InstData &inst, uint32_t bits) {
// bits
// & 11111111111111111111111111111111
// --------------------------------
// 11010101000000110010000001011111
if ((bits & 0xffffffffU) != 0xd503205fU) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t op2 : 3;
uint32_t CRm : 4;
uint32_t CRn : 4;
uint32_t op1 : 3;
uint32_t op0 : 2;
uint32_t L : 1;
uint32_t _22 : 1; // 0
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 0
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 0
uint32_t _30 : 1; // 1
uint32_t _31 : 1; // 1
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.op0 = static_cast<uint8_t>(enc.op0);
inst.op1 = static_cast<uint8_t>(enc.op1);
inst.op2 = static_cast<uint8_t>(enc.op2);
inst.L = static_cast<uint8_t>(enc.L);
inst.CRn = static_cast<uint8_t>(enc.CRn);
inst.CRm = static_cast<uint8_t>(enc.CRm);
inst.iform = InstForm::WFE_HI_SYSTEM;
inst.iclass = InstName::WFE;
return true;
}
static bool TryExtractLDUMINA_32_MEMOP(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 10111000101000000111000000000000
if ((bits & 0xffe0fc00U) != 0xb8a07000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t opc : 3;
uint32_t o3 : 1;
uint32_t Rs : 5;
uint32_t _21 : 1; // 1
uint32_t R : 1;
uint32_t A : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.A = static_cast<uint8_t>(enc.A);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.V = static_cast<uint8_t>(enc.V);
inst.R = static_cast<uint8_t>(enc.R);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o3 = static_cast<uint8_t>(enc.o3);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LDUMINA_32_MEMOP;
inst.iclass = InstName::LDUMINA;
return true;
}
static bool TryExtractLDUMINAL_32_MEMOP(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 10111000111000000111000000000000
if ((bits & 0xffe0fc00U) != 0xb8e07000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t opc : 3;
uint32_t o3 : 1;
uint32_t Rs : 5;
uint32_t _21 : 1; // 1
uint32_t R : 1;
uint32_t A : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.A = static_cast<uint8_t>(enc.A);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.V = static_cast<uint8_t>(enc.V);
inst.R = static_cast<uint8_t>(enc.R);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o3 = static_cast<uint8_t>(enc.o3);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LDUMINAL_32_MEMOP;
inst.iclass = InstName::LDUMINAL;
return true;
}
static bool TryExtractLDUMIN_32_MEMOP(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 10111000001000000111000000000000
if ((bits & 0xffe0fc00U) != 0xb8207000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t opc : 3;
uint32_t o3 : 1;
uint32_t Rs : 5;
uint32_t _21 : 1; // 1
uint32_t R : 1;
uint32_t A : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.A = static_cast<uint8_t>(enc.A);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.V = static_cast<uint8_t>(enc.V);
inst.R = static_cast<uint8_t>(enc.R);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o3 = static_cast<uint8_t>(enc.o3);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LDUMIN_32_MEMOP;
inst.iclass = InstName::LDUMIN;
return true;
}
static bool TryExtractLDUMINL_32_MEMOP(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 10111000011000000111000000000000
if ((bits & 0xffe0fc00U) != 0xb8607000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t opc : 3;
uint32_t o3 : 1;
uint32_t Rs : 5;
uint32_t _21 : 1; // 1
uint32_t R : 1;
uint32_t A : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.A = static_cast<uint8_t>(enc.A);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.V = static_cast<uint8_t>(enc.V);
inst.R = static_cast<uint8_t>(enc.R);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o3 = static_cast<uint8_t>(enc.o3);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LDUMINL_32_MEMOP;
inst.iclass = InstName::LDUMINL;
return true;
}
static bool TryExtractLDUMINA_64_MEMOP(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 11111000101000000111000000000000
if ((bits & 0xffe0fc00U) != 0xf8a07000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t opc : 3;
uint32_t o3 : 1;
uint32_t Rs : 5;
uint32_t _21 : 1; // 1
uint32_t R : 1;
uint32_t A : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.A = static_cast<uint8_t>(enc.A);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.V = static_cast<uint8_t>(enc.V);
inst.R = static_cast<uint8_t>(enc.R);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o3 = static_cast<uint8_t>(enc.o3);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LDUMINA_64_MEMOP;
inst.iclass = InstName::LDUMINA;
return true;
}
static bool TryExtractLDUMINAL_64_MEMOP(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 11111000111000000111000000000000
if ((bits & 0xffe0fc00U) != 0xf8e07000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t opc : 3;
uint32_t o3 : 1;
uint32_t Rs : 5;
uint32_t _21 : 1; // 1
uint32_t R : 1;
uint32_t A : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.A = static_cast<uint8_t>(enc.A);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.V = static_cast<uint8_t>(enc.V);
inst.R = static_cast<uint8_t>(enc.R);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o3 = static_cast<uint8_t>(enc.o3);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LDUMINAL_64_MEMOP;
inst.iclass = InstName::LDUMINAL;
return true;
}
static bool TryExtractLDUMIN_64_MEMOP(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 11111000001000000111000000000000
if ((bits & 0xffe0fc00U) != 0xf8207000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t opc : 3;
uint32_t o3 : 1;
uint32_t Rs : 5;
uint32_t _21 : 1; // 1
uint32_t R : 1;
uint32_t A : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.A = static_cast<uint8_t>(enc.A);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.V = static_cast<uint8_t>(enc.V);
inst.R = static_cast<uint8_t>(enc.R);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o3 = static_cast<uint8_t>(enc.o3);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LDUMIN_64_MEMOP;
inst.iclass = InstName::LDUMIN;
return true;
}
static bool TryExtractLDUMINL_64_MEMOP(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 11111000011000000111000000000000
if ((bits & 0xffe0fc00U) != 0xf8607000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t opc : 3;
uint32_t o3 : 1;
uint32_t Rs : 5;
uint32_t _21 : 1; // 1
uint32_t R : 1;
uint32_t A : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.A = static_cast<uint8_t>(enc.A);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.V = static_cast<uint8_t>(enc.V);
inst.R = static_cast<uint8_t>(enc.R);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o3 = static_cast<uint8_t>(enc.o3);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LDUMINL_64_MEMOP;
inst.iclass = InstName::LDUMINL;
return true;
}
static bool TryExtractSTXRB_SR32_LDSTEXCL(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 00001000000000000111110000000000
if ((bits & 0xffe0fc00U) != 0x8007c00U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t Rt2 : 5;
uint32_t o0 : 1;
uint32_t Rs : 5;
uint32_t o1 : 1;
uint32_t L : 1;
uint32_t o2 : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 0
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.L = static_cast<uint8_t>(enc.L);
inst.Rt2 = static_cast<uint8_t>(enc.Rt2);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.o2 = static_cast<uint8_t>(enc.o2);
inst.o1 = static_cast<uint8_t>(enc.o1);
inst.o0 = static_cast<uint8_t>(enc.o0);
inst.iform = InstForm::STXRB_SR32_LDSTEXCL;
inst.iclass = InstName::STXRB;
return true;
}
static bool TryExtractSTLXRH_SR32_LDSTEXCL(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 01001000000000001111110000000000
if ((bits & 0xffe0fc00U) != 0x4800fc00U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t Rt2 : 5;
uint32_t o0 : 1;
uint32_t Rs : 5;
uint32_t o1 : 1;
uint32_t L : 1;
uint32_t o2 : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 0
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.L = static_cast<uint8_t>(enc.L);
inst.Rt2 = static_cast<uint8_t>(enc.Rt2);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.o2 = static_cast<uint8_t>(enc.o2);
inst.o1 = static_cast<uint8_t>(enc.o1);
inst.o0 = static_cast<uint8_t>(enc.o0);
inst.iform = InstForm::STLXRH_SR32_LDSTEXCL;
inst.iclass = InstName::STLXRH;
return true;
}
static bool TryExtractSTLLRH_SL32_LDSTEXCL(InstData &inst, uint32_t bits) {
// bits
// & 11111111111111111111110000000000
// --------------------------------
// 01001000100111110111110000000000
if ((bits & 0xfffffc00U) != 0x489f7c00U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t Rt2 : 5;
uint32_t o0 : 1;
uint32_t Rs : 5;
uint32_t o1 : 1;
uint32_t L : 1;
uint32_t o2 : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 0
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.L = static_cast<uint8_t>(enc.L);
inst.Rt2 = static_cast<uint8_t>(enc.Rt2);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.o2 = static_cast<uint8_t>(enc.o2);
inst.o1 = static_cast<uint8_t>(enc.o1);
inst.o0 = static_cast<uint8_t>(enc.o0);
inst.iform = InstForm::STLLRH_SL32_LDSTEXCL;
inst.iclass = InstName::STLLRH;
return true;
}
static bool TryExtractLDUMINAH_32_MEMOP(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 01111000101000000111000000000000
if ((bits & 0xffe0fc00U) != 0x78a07000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t opc : 3;
uint32_t o3 : 1;
uint32_t Rs : 5;
uint32_t _21 : 1; // 1
uint32_t R : 1;
uint32_t A : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.A = static_cast<uint8_t>(enc.A);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.V = static_cast<uint8_t>(enc.V);
inst.R = static_cast<uint8_t>(enc.R);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o3 = static_cast<uint8_t>(enc.o3);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LDUMINAH_32_MEMOP;
inst.iclass = InstName::LDUMINAH;
return true;
}
static bool TryExtractLDUMINALH_32_MEMOP(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 01111000111000000111000000000000
if ((bits & 0xffe0fc00U) != 0x78e07000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t opc : 3;
uint32_t o3 : 1;
uint32_t Rs : 5;
uint32_t _21 : 1; // 1
uint32_t R : 1;
uint32_t A : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.A = static_cast<uint8_t>(enc.A);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.V = static_cast<uint8_t>(enc.V);
inst.R = static_cast<uint8_t>(enc.R);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o3 = static_cast<uint8_t>(enc.o3);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LDUMINALH_32_MEMOP;
inst.iclass = InstName::LDUMINALH;
return true;
}
static bool TryExtractLDUMINH_32_MEMOP(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 01111000001000000111000000000000
if ((bits & 0xffe0fc00U) != 0x78207000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t opc : 3;
uint32_t o3 : 1;
uint32_t Rs : 5;
uint32_t _21 : 1; // 1
uint32_t R : 1;
uint32_t A : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.A = static_cast<uint8_t>(enc.A);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.V = static_cast<uint8_t>(enc.V);
inst.R = static_cast<uint8_t>(enc.R);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o3 = static_cast<uint8_t>(enc.o3);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LDUMINH_32_MEMOP;
inst.iclass = InstName::LDUMINH;
return true;
}
static bool TryExtractLDUMINLH_32_MEMOP(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 01111000011000000111000000000000
if ((bits & 0xffe0fc00U) != 0x78607000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t opc : 3;
uint32_t o3 : 1;
uint32_t Rs : 5;
uint32_t _21 : 1; // 1
uint32_t R : 1;
uint32_t A : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.A = static_cast<uint8_t>(enc.A);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.V = static_cast<uint8_t>(enc.V);
inst.R = static_cast<uint8_t>(enc.R);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o3 = static_cast<uint8_t>(enc.o3);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LDUMINLH_32_MEMOP;
inst.iclass = InstName::LDUMINLH;
return true;
}
static bool TryExtractLSLV_32_DP_2SRC(InstData &inst, uint32_t bits) {
if (false && TryExtractLSL_LSLV_32_DP_2SRC(inst, bits))
return true;
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 00011010110000000010000000000000
if ((bits & 0xffe0fc00U) != 0x1ac02000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t op2 : 2;
uint32_t opcode2 : 4;
uint32_t Rm : 5;
uint32_t _21 : 1; // 0
uint32_t _22 : 1; // 1
uint32_t _23 : 1; // 1
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t op : 1;
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.opcode2 = static_cast<uint8_t>(enc.opcode2);
inst.op2 = static_cast<uint8_t>(enc.op2);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.sf = static_cast<uint8_t>(enc.sf);
inst.op = static_cast<uint8_t>(enc.op);
inst.iform = InstForm::LSLV_32_DP_2SRC;
inst.iclass = InstName::LSLV;
return true;
}
static bool TryExtractLSLV_64_DP_2SRC(InstData &inst, uint32_t bits) {
if (false && TryExtractLSL_LSLV_64_DP_2SRC(inst, bits))
return true;
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 10011010110000000010000000000000
if ((bits & 0xffe0fc00U) != 0x9ac02000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t op2 : 2;
uint32_t opcode2 : 4;
uint32_t Rm : 5;
uint32_t _21 : 1; // 0
uint32_t _22 : 1; // 1
uint32_t _23 : 1; // 1
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t op : 1;
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.opcode2 = static_cast<uint8_t>(enc.opcode2);
inst.op2 = static_cast<uint8_t>(enc.op2);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.sf = static_cast<uint8_t>(enc.sf);
inst.op = static_cast<uint8_t>(enc.op);
inst.iform = InstForm::LSLV_64_DP_2SRC;
inst.iclass = InstName::LSLV;
return true;
}
static bool TryExtractINS_ASIMDINS_IR_R(InstData &inst, uint32_t bits) {
if (false && TryExtractMOV_INS_ASIMDINS_IR_R(inst, bits))
return true;
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 01001110000000000001110000000000
if ((bits & 0xffe0fc00U) != 0x4e001c00U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t imm4 : 4;
uint32_t _15 : 1; // 0
uint32_t imm5 : 5;
uint32_t _21 : 1; // 0
uint32_t _22 : 1; // 0
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t op : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.imm5.uimm = static_cast<uint64_t>(enc.imm5);
inst.imm4.uimm = static_cast<uint64_t>(enc.imm4);
inst.op = static_cast<uint8_t>(enc.op);
inst.iform = InstForm::INS_ASIMDINS_IR_R;
inst.iclass = InstName::INS;
return true;
}
static bool TryExtractCMGT_ASISDMISC_Z(InstData &inst, uint32_t bits) {
// bits
// & 11111111001111111111110000000000
// --------------------------------
// 01011110001000001000100000000000
if ((bits & 0xff3ffc00U) != 0x5e208800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t op : 1;
uint32_t _13 : 1; // 0
uint32_t _14 : 1; // 0
uint32_t _15 : 1; // 1
uint32_t _16 : 1; // 0
uint32_t _17 : 1; // 0
uint32_t _18 : 1; // 0
uint32_t _19 : 1; // 0
uint32_t _20 : 1; // 0
uint32_t _21 : 1; // 1
uint32_t size : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t U : 1;
uint32_t _30 : 1; // 1
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.U = static_cast<uint8_t>(enc.U);
inst.op = static_cast<uint8_t>(enc.op);
inst.iform = InstForm::CMGT_ASISDMISC_Z;
inst.iclass = InstName::CMGT;
return true;
}
static bool TryExtractCMGT_ASIMDMISC_Z(InstData &inst, uint32_t bits) {
// bits
// & 10111111001111111111110000000000
// --------------------------------
// 00001110001000001000100000000000
if ((bits & 0xbf3ffc00U) != 0xe208800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t op : 1;
uint32_t _13 : 1; // 0
uint32_t _14 : 1; // 0
uint32_t _15 : 1; // 1
uint32_t _16 : 1; // 0
uint32_t _17 : 1; // 0
uint32_t _18 : 1; // 0
uint32_t _19 : 1; // 0
uint32_t _20 : 1; // 0
uint32_t _21 : 1; // 1
uint32_t size : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.op = static_cast<uint8_t>(enc.op);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::CMGT_ASIMDMISC_Z;
inst.iclass = InstName::CMGT;
return true;
}
static bool TryExtractSMLAL_ASIMDELEM_L(InstData &inst, uint32_t bits) {
// bits
// & 10111111000000001111010000000000
// --------------------------------
// 00001111000000000010000000000000
if ((bits & 0xbf00f400U) != 0xf002000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t H : 1;
uint32_t _12 : 1; // 0
uint32_t _13 : 1; // 1
uint32_t o2 : 1;
uint32_t _15 : 1; // 0
uint32_t Rm : 4;
uint32_t M : 1;
uint32_t L : 1;
uint32_t size : 2;
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Q = static_cast<uint8_t>(enc.Q);
inst.H = static_cast<uint8_t>(enc.H);
inst.M = static_cast<uint8_t>(enc.M);
inst.L = static_cast<uint8_t>(enc.L);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o2 = static_cast<uint8_t>(enc.o2);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::SMLAL_ASIMDELEM_L;
inst.iclass = InstName::SMLAL;
return true;
}
static bool TryExtractSTCLR_32S_MEMOP(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000011111
// --------------------------------
// 10111000001000000001000000011111
if ((bits & 0xffe0fc1fU) != 0xb820101fU) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t opc : 3;
uint32_t o3 : 1;
uint32_t Rs : 5;
uint32_t _21 : 1; // 1
uint32_t R : 1;
uint32_t A : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.A = static_cast<uint8_t>(enc.A);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.V = static_cast<uint8_t>(enc.V);
inst.R = static_cast<uint8_t>(enc.R);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o3 = static_cast<uint8_t>(enc.o3);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::STCLR_32S_MEMOP;
inst.iclass = InstName::STCLR;
return true;
}
static bool TryExtractSTCLRL_32S_MEMOP(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000011111
// --------------------------------
// 10111000011000000001000000011111
if ((bits & 0xffe0fc1fU) != 0xb860101fU) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t opc : 3;
uint32_t o3 : 1;
uint32_t Rs : 5;
uint32_t _21 : 1; // 1
uint32_t R : 1;
uint32_t A : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.A = static_cast<uint8_t>(enc.A);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.V = static_cast<uint8_t>(enc.V);
inst.R = static_cast<uint8_t>(enc.R);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o3 = static_cast<uint8_t>(enc.o3);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::STCLRL_32S_MEMOP;
inst.iclass = InstName::STCLRL;
return true;
}
static bool TryExtractSTCLR_64S_MEMOP(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000011111
// --------------------------------
// 11111000001000000001000000011111
if ((bits & 0xffe0fc1fU) != 0xf820101fU) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t opc : 3;
uint32_t o3 : 1;
uint32_t Rs : 5;
uint32_t _21 : 1; // 1
uint32_t R : 1;
uint32_t A : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.A = static_cast<uint8_t>(enc.A);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.V = static_cast<uint8_t>(enc.V);
inst.R = static_cast<uint8_t>(enc.R);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o3 = static_cast<uint8_t>(enc.o3);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::STCLR_64S_MEMOP;
inst.iclass = InstName::STCLR;
return true;
}
static bool TryExtractSTCLRL_64S_MEMOP(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000011111
// --------------------------------
// 11111000011000000001000000011111
if ((bits & 0xffe0fc1fU) != 0xf860101fU) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t opc : 3;
uint32_t o3 : 1;
uint32_t Rs : 5;
uint32_t _21 : 1; // 1
uint32_t R : 1;
uint32_t A : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.A = static_cast<uint8_t>(enc.A);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.V = static_cast<uint8_t>(enc.V);
inst.R = static_cast<uint8_t>(enc.R);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o3 = static_cast<uint8_t>(enc.o3);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::STCLRL_64S_MEMOP;
inst.iclass = InstName::STCLRL;
return true;
}
static bool TryExtractBIT_ASIMDSAME_ONLY(InstData &inst, uint32_t bits) {
// bits
// & 10111111111000001111110000000000
// --------------------------------
// 00101110101000000001110000000000
if ((bits & 0xbfe0fc00U) != 0x2ea01c00U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t opcode : 5;
uint32_t Rm : 5;
uint32_t _21 : 1; // 1
uint32_t opc2 : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Q = static_cast<uint8_t>(enc.Q);
inst.opc2 = static_cast<uint8_t>(enc.opc2);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.U = static_cast<uint8_t>(enc.U);
inst.iform = InstForm::BIT_ASIMDSAME_ONLY;
inst.iclass = InstName::BIT;
return true;
}
static bool TryExtractCMEQ_ASISDSAME_ONLY(InstData &inst, uint32_t bits) {
// bits
// & 11111111001000001111110000000000
// --------------------------------
// 01111110001000001000110000000000
if ((bits & 0xff20fc00U) != 0x7e208c00U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t opcode : 5;
uint32_t Rm : 5;
uint32_t _21 : 1; // 1
uint32_t size : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t U : 1;
uint32_t _30 : 1; // 1
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.U = static_cast<uint8_t>(enc.U);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::CMEQ_ASISDSAME_ONLY;
inst.iclass = InstName::CMEQ;
return true;
}
static bool TryExtractCMEQ_ASIMDSAME_ONLY(InstData &inst, uint32_t bits) {
// bits
// & 10111111001000001111110000000000
// --------------------------------
// 00101110001000001000110000000000
if ((bits & 0xbf20fc00U) != 0x2e208c00U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t opcode : 5;
uint32_t Rm : 5;
uint32_t _21 : 1; // 1
uint32_t size : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.U = static_cast<uint8_t>(enc.U);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::CMEQ_ASIMDSAME_ONLY;
inst.iclass = InstName::CMEQ;
return true;
}
static bool TryExtractCRC32CB_32C_DP_2SRC(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 00011010110000000101000000000000
if ((bits & 0xffe0fc00U) != 0x1ac05000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t sz : 2;
uint32_t C : 1;
uint32_t opcode2 : 3;
uint32_t Rm : 5;
uint32_t _21 : 1; // 0
uint32_t _22 : 1; // 1
uint32_t _23 : 1; // 1
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t op : 1;
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.sz = static_cast<uint8_t>(enc.sz);
inst.C = static_cast<uint8_t>(enc.C);
inst.opcode2 = static_cast<uint8_t>(enc.opcode2);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.sf = static_cast<uint8_t>(enc.sf);
inst.op = static_cast<uint8_t>(enc.op);
inst.iform = InstForm::CRC32CB_32C_DP_2SRC;
inst.iclass = InstName::CRC32CB;
return true;
}
static bool TryExtractCRC32CH_32C_DP_2SRC(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 00011010110000000101010000000000
if ((bits & 0xffe0fc00U) != 0x1ac05400U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t sz : 2;
uint32_t C : 1;
uint32_t opcode2 : 3;
uint32_t Rm : 5;
uint32_t _21 : 1; // 0
uint32_t _22 : 1; // 1
uint32_t _23 : 1; // 1
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t op : 1;
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.sz = static_cast<uint8_t>(enc.sz);
inst.C = static_cast<uint8_t>(enc.C);
inst.opcode2 = static_cast<uint8_t>(enc.opcode2);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.sf = static_cast<uint8_t>(enc.sf);
inst.op = static_cast<uint8_t>(enc.op);
inst.iform = InstForm::CRC32CH_32C_DP_2SRC;
inst.iclass = InstName::CRC32CH;
return true;
}
static bool TryExtractCRC32CW_32C_DP_2SRC(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 00011010110000000101100000000000
if ((bits & 0xffe0fc00U) != 0x1ac05800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t sz : 2;
uint32_t C : 1;
uint32_t opcode2 : 3;
uint32_t Rm : 5;
uint32_t _21 : 1; // 0
uint32_t _22 : 1; // 1
uint32_t _23 : 1; // 1
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t op : 1;
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.sz = static_cast<uint8_t>(enc.sz);
inst.C = static_cast<uint8_t>(enc.C);
inst.opcode2 = static_cast<uint8_t>(enc.opcode2);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.sf = static_cast<uint8_t>(enc.sf);
inst.op = static_cast<uint8_t>(enc.op);
inst.iform = InstForm::CRC32CW_32C_DP_2SRC;
inst.iclass = InstName::CRC32CW;
return true;
}
static bool TryExtractCRC32CX_64C_DP_2SRC(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 10011010110000000101110000000000
if ((bits & 0xffe0fc00U) != 0x9ac05c00U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t sz : 2;
uint32_t C : 1;
uint32_t opcode2 : 3;
uint32_t Rm : 5;
uint32_t _21 : 1; // 0
uint32_t _22 : 1; // 1
uint32_t _23 : 1; // 1
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t op : 1;
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.sz = static_cast<uint8_t>(enc.sz);
inst.C = static_cast<uint8_t>(enc.C);
inst.opcode2 = static_cast<uint8_t>(enc.opcode2);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.sf = static_cast<uint8_t>(enc.sf);
inst.op = static_cast<uint8_t>(enc.op);
inst.iform = InstForm::CRC32CX_64C_DP_2SRC;
inst.iclass = InstName::CRC32CX;
return true;
}
static bool TryExtractSTRH_32_LDST_REGOFF(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000000000110000000000
// --------------------------------
// 01111000001000000000100000000000
if ((bits & 0xffe00c00U) != 0x78200800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t S : 1;
uint32_t option : 3;
uint32_t Rm : 5;
uint32_t _21 : 1; // 1
uint32_t opc : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.option = static_cast<uint8_t>(enc.option);
inst.V = static_cast<uint8_t>(enc.V);
inst.S = static_cast<uint8_t>(enc.S);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::STRH_32_LDST_REGOFF;
inst.iclass = InstName::STRH;
return true;
}
static bool TryExtractBRK_EX_EXCEPTION(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000000000000000011111
// --------------------------------
// 11010100001000000000000000000000
if ((bits & 0xffe0001fU) != 0xd4200000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t LL : 2;
uint32_t op2 : 3;
uint32_t imm16 : 16;
uint32_t opc : 3;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 0
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 0
uint32_t _30 : 1; // 1
uint32_t _31 : 1; // 1
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.LL = static_cast<uint8_t>(enc.LL);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.op2 = static_cast<uint8_t>(enc.op2);
inst.imm16.uimm = static_cast<uint64_t>(enc.imm16);
inst.iform = InstForm::BRK_EX_EXCEPTION;
inst.iclass = InstName::BRK;
return true;
}
static bool TryExtractUADDLP_ASIMDMISC_P(InstData &inst, uint32_t bits) {
// bits
// & 10111111001111111111110000000000
// --------------------------------
// 00101110001000000010100000000000
if ((bits & 0xbf3ffc00U) != 0x2e202800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t _12 : 1; // 0
uint32_t _13 : 1; // 1
uint32_t op : 1;
uint32_t _15 : 1; // 0
uint32_t _16 : 1; // 0
uint32_t _17 : 1; // 0
uint32_t _18 : 1; // 0
uint32_t _19 : 1; // 0
uint32_t _20 : 1; // 0
uint32_t _21 : 1; // 1
uint32_t size : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.op = static_cast<uint8_t>(enc.op);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::UADDLP_ASIMDMISC_P;
inst.iclass = InstName::UADDLP;
return true;
}
static bool TryExtractUMAXV_ASIMDALL_ONLY(InstData &inst, uint32_t bits) {
// bits
// & 10111111001111111111110000000000
// --------------------------------
// 00101110001100001010100000000000
if ((bits & 0xbf3ffc00U) != 0x2e30a800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t _12 : 1; // 0
uint32_t _13 : 1; // 1
uint32_t _14 : 1; // 0
uint32_t _15 : 1; // 1
uint32_t op : 1;
uint32_t _17 : 1; // 0
uint32_t _18 : 1; // 0
uint32_t _19 : 1; // 0
uint32_t _20 : 1; // 1
uint32_t _21 : 1; // 1
uint32_t size : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.op = static_cast<uint8_t>(enc.op);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::UMAXV_ASIMDALL_ONLY;
inst.iclass = InstName::UMAXV;
return true;
}
static bool TryExtractLDEORAH_32_MEMOP(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 01111000101000000010000000000000
if ((bits & 0xffe0fc00U) != 0x78a02000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t opc : 3;
uint32_t o3 : 1;
uint32_t Rs : 5;
uint32_t _21 : 1; // 1
uint32_t R : 1;
uint32_t A : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.A = static_cast<uint8_t>(enc.A);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.V = static_cast<uint8_t>(enc.V);
inst.R = static_cast<uint8_t>(enc.R);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o3 = static_cast<uint8_t>(enc.o3);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LDEORAH_32_MEMOP;
inst.iclass = InstName::LDEORAH;
return true;
}
static bool TryExtractLDEORALH_32_MEMOP(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 01111000111000000010000000000000
if ((bits & 0xffe0fc00U) != 0x78e02000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t opc : 3;
uint32_t o3 : 1;
uint32_t Rs : 5;
uint32_t _21 : 1; // 1
uint32_t R : 1;
uint32_t A : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.A = static_cast<uint8_t>(enc.A);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.V = static_cast<uint8_t>(enc.V);
inst.R = static_cast<uint8_t>(enc.R);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o3 = static_cast<uint8_t>(enc.o3);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LDEORALH_32_MEMOP;
inst.iclass = InstName::LDEORALH;
return true;
}
static bool TryExtractLDEORH_32_MEMOP(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 01111000001000000010000000000000
if ((bits & 0xffe0fc00U) != 0x78202000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t opc : 3;
uint32_t o3 : 1;
uint32_t Rs : 5;
uint32_t _21 : 1; // 1
uint32_t R : 1;
uint32_t A : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.A = static_cast<uint8_t>(enc.A);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.V = static_cast<uint8_t>(enc.V);
inst.R = static_cast<uint8_t>(enc.R);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o3 = static_cast<uint8_t>(enc.o3);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LDEORH_32_MEMOP;
inst.iclass = InstName::LDEORH;
return true;
}
static bool TryExtractLDEORLH_32_MEMOP(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 01111000011000000010000000000000
if ((bits & 0xffe0fc00U) != 0x78602000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t opc : 3;
uint32_t o3 : 1;
uint32_t Rs : 5;
uint32_t _21 : 1; // 1
uint32_t R : 1;
uint32_t A : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.A = static_cast<uint8_t>(enc.A);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.V = static_cast<uint8_t>(enc.V);
inst.R = static_cast<uint8_t>(enc.R);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o3 = static_cast<uint8_t>(enc.o3);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LDEORLH_32_MEMOP;
inst.iclass = InstName::LDEORLH;
return true;
}
static bool TryExtractSMAXV_ASIMDALL_ONLY(InstData &inst, uint32_t bits) {
// bits
// & 10111111001111111111110000000000
// --------------------------------
// 00001110001100001010100000000000
if ((bits & 0xbf3ffc00U) != 0xe30a800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t _12 : 1; // 0
uint32_t _13 : 1; // 1
uint32_t _14 : 1; // 0
uint32_t _15 : 1; // 1
uint32_t op : 1;
uint32_t _17 : 1; // 0
uint32_t _18 : 1; // 0
uint32_t _19 : 1; // 0
uint32_t _20 : 1; // 1
uint32_t _21 : 1; // 1
uint32_t size : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.op = static_cast<uint8_t>(enc.op);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::SMAXV_ASIMDALL_ONLY;
inst.iclass = InstName::SMAXV;
return true;
}
static bool TryExtractXTN_ASIMDMISC_N(InstData &inst, uint32_t bits) {
// bits
// & 10111111001111111111110000000000
// --------------------------------
// 00001110001000010010100000000000
if ((bits & 0xbf3ffc00U) != 0xe212800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t opcode : 5;
uint32_t _17 : 1; // 0
uint32_t _18 : 1; // 0
uint32_t _19 : 1; // 0
uint32_t _20 : 1; // 0
uint32_t _21 : 1; // 1
uint32_t size : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.U = static_cast<uint8_t>(enc.U);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::XTN_ASIMDMISC_N;
inst.iclass = InstName::XTN;
return true;
}
static bool TryExtractSTRB_32_LDST_IMMPOST(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000000000110000000000
// --------------------------------
// 00111000000000000000010000000000
if ((bits & 0xffe00c00U) != 0x38000400U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t _11 : 1; // 0
uint32_t imm9 : 9;
uint32_t _21 : 1; // 0
uint32_t opc : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.imm9.uimm = static_cast<uint64_t>(enc.imm9);
inst.V = static_cast<uint8_t>(enc.V);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::STRB_32_LDST_IMMPOST;
inst.iclass = InstName::STRB;
return true;
}
static bool TryExtractSTRB_32_LDST_IMMPRE(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000000000110000000000
// --------------------------------
// 00111000000000000000110000000000
if ((bits & 0xffe00c00U) != 0x38000c00U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t _11 : 1; // 1
uint32_t imm9 : 9;
uint32_t _21 : 1; // 0
uint32_t opc : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.imm9.uimm = static_cast<uint64_t>(enc.imm9);
inst.V = static_cast<uint8_t>(enc.V);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::STRB_32_LDST_IMMPRE;
inst.iclass = InstName::STRB;
return true;
}
static bool TryExtractSTRB_32_LDST_POS(InstData &inst, uint32_t bits) {
// bits
// & 11111111110000000000000000000000
// --------------------------------
// 00111001000000000000000000000000
if ((bits & 0xffc00000U) != 0x39000000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t imm12 : 12;
uint32_t opc : 2;
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.imm12.uimm = static_cast<uint64_t>(enc.imm12);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.V = static_cast<uint8_t>(enc.V);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::STRB_32_LDST_POS;
inst.iclass = InstName::STRB;
return true;
}
static bool TryExtractUSQADD_ASISDMISC_R(InstData &inst, uint32_t bits) {
// bits
// & 11111111001111111111110000000000
// --------------------------------
// 01111110001000000011100000000000
if ((bits & 0xff3ffc00U) != 0x7e203800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t opcode : 5;
uint32_t _17 : 1; // 0
uint32_t _18 : 1; // 0
uint32_t _19 : 1; // 0
uint32_t _20 : 1; // 0
uint32_t _21 : 1; // 1
uint32_t size : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t U : 1;
uint32_t _30 : 1; // 1
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::USQADD_ASISDMISC_R;
inst.iclass = InstName::USQADD;
return true;
}
static bool TryExtractUSQADD_ASIMDMISC_R(InstData &inst, uint32_t bits) {
// bits
// & 10111111001111111111110000000000
// --------------------------------
// 00101110001000000011100000000000
if ((bits & 0xbf3ffc00U) != 0x2e203800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t opcode : 5;
uint32_t _17 : 1; // 0
uint32_t _18 : 1; // 0
uint32_t _19 : 1; // 0
uint32_t _20 : 1; // 0
uint32_t _21 : 1; // 1
uint32_t size : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.U = static_cast<uint8_t>(enc.U);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::USQADD_ASIMDMISC_R;
inst.iclass = InstName::USQADD;
return true;
}
static bool TryExtractFCVTZS_32H_FLOAT2FIX(InstData &inst, uint32_t bits) {
// bits
// & 11111111111111110000000000000000
// --------------------------------
// 00011110110110000000000000000000
if ((bits & 0xffff0000U) != 0x1ed80000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t scale : 6;
uint32_t opcode : 3;
uint32_t rmode : 2;
uint32_t _21 : 1; // 0
uint32_t type : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t _30 : 1; // 0
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.scale = static_cast<uint8_t>(enc.scale);
inst.sf = static_cast<uint8_t>(enc.sf);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.type = static_cast<uint8_t>(enc.type);
inst.rmode = static_cast<uint8_t>(enc.rmode);
inst.iform = InstForm::FCVTZS_32H_FLOAT2FIX;
inst.iclass = InstName::FCVTZS;
return true;
}
static bool TryExtractFCVTZS_64H_FLOAT2FIX(InstData &inst, uint32_t bits) {
// bits
// & 11111111111111110000000000000000
// --------------------------------
// 10011110110110000000000000000000
if ((bits & 0xffff0000U) != 0x9ed80000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t scale : 6;
uint32_t opcode : 3;
uint32_t rmode : 2;
uint32_t _21 : 1; // 0
uint32_t type : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t _30 : 1; // 0
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.scale = static_cast<uint8_t>(enc.scale);
inst.sf = static_cast<uint8_t>(enc.sf);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.type = static_cast<uint8_t>(enc.type);
inst.rmode = static_cast<uint8_t>(enc.rmode);
inst.iform = InstForm::FCVTZS_64H_FLOAT2FIX;
inst.iclass = InstName::FCVTZS;
return true;
}
static bool TryExtractFCVTZS_32S_FLOAT2FIX(InstData &inst, uint32_t bits) {
// bits
// & 11111111111111110000000000000000
// --------------------------------
// 00011110000110000000000000000000
if ((bits & 0xffff0000U) != 0x1e180000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t scale : 6;
uint32_t opcode : 3;
uint32_t rmode : 2;
uint32_t _21 : 1; // 0
uint32_t type : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t _30 : 1; // 0
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.scale = static_cast<uint8_t>(enc.scale);
inst.sf = static_cast<uint8_t>(enc.sf);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.type = static_cast<uint8_t>(enc.type);
inst.rmode = static_cast<uint8_t>(enc.rmode);
inst.iform = InstForm::FCVTZS_32S_FLOAT2FIX;
inst.iclass = InstName::FCVTZS;
return true;
}
static bool TryExtractFCVTZS_64S_FLOAT2FIX(InstData &inst, uint32_t bits) {
// bits
// & 11111111111111110000000000000000
// --------------------------------
// 10011110000110000000000000000000
if ((bits & 0xffff0000U) != 0x9e180000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t scale : 6;
uint32_t opcode : 3;
uint32_t rmode : 2;
uint32_t _21 : 1; // 0
uint32_t type : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t _30 : 1; // 0
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.scale = static_cast<uint8_t>(enc.scale);
inst.sf = static_cast<uint8_t>(enc.sf);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.type = static_cast<uint8_t>(enc.type);
inst.rmode = static_cast<uint8_t>(enc.rmode);
inst.iform = InstForm::FCVTZS_64S_FLOAT2FIX;
inst.iclass = InstName::FCVTZS;
return true;
}
static bool TryExtractFCVTZS_32D_FLOAT2FIX(InstData &inst, uint32_t bits) {
// bits
// & 11111111111111110000000000000000
// --------------------------------
// 00011110010110000000000000000000
if ((bits & 0xffff0000U) != 0x1e580000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t scale : 6;
uint32_t opcode : 3;
uint32_t rmode : 2;
uint32_t _21 : 1; // 0
uint32_t type : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t _30 : 1; // 0
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.scale = static_cast<uint8_t>(enc.scale);
inst.sf = static_cast<uint8_t>(enc.sf);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.type = static_cast<uint8_t>(enc.type);
inst.rmode = static_cast<uint8_t>(enc.rmode);
inst.iform = InstForm::FCVTZS_32D_FLOAT2FIX;
inst.iclass = InstName::FCVTZS;
return true;
}
static bool TryExtractFCVTZS_64D_FLOAT2FIX(InstData &inst, uint32_t bits) {
// bits
// & 11111111111111110000000000000000
// --------------------------------
// 10011110010110000000000000000000
if ((bits & 0xffff0000U) != 0x9e580000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t scale : 6;
uint32_t opcode : 3;
uint32_t rmode : 2;
uint32_t _21 : 1; // 0
uint32_t type : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t _30 : 1; // 0
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.scale = static_cast<uint8_t>(enc.scale);
inst.sf = static_cast<uint8_t>(enc.sf);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.type = static_cast<uint8_t>(enc.type);
inst.rmode = static_cast<uint8_t>(enc.rmode);
inst.iform = InstForm::FCVTZS_64D_FLOAT2FIX;
inst.iclass = InstName::FCVTZS;
return true;
}
static bool TryExtractUQADD_ASISDSAME_ONLY(InstData &inst, uint32_t bits) {
// bits
// & 11111111001000001111110000000000
// --------------------------------
// 01111110001000000000110000000000
if ((bits & 0xff20fc00U) != 0x7e200c00U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t opcode : 5;
uint32_t Rm : 5;
uint32_t _21 : 1; // 1
uint32_t size : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t U : 1;
uint32_t _30 : 1; // 1
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.U = static_cast<uint8_t>(enc.U);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::UQADD_ASISDSAME_ONLY;
inst.iclass = InstName::UQADD;
return true;
}
static bool TryExtractUQADD_ASIMDSAME_ONLY(InstData &inst, uint32_t bits) {
// bits
// & 10111111001000001111110000000000
// --------------------------------
// 00101110001000000000110000000000
if ((bits & 0xbf20fc00U) != 0x2e200c00U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t opcode : 5;
uint32_t Rm : 5;
uint32_t _21 : 1; // 1
uint32_t size : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.U = static_cast<uint8_t>(enc.U);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::UQADD_ASIMDSAME_ONLY;
inst.iclass = InstName::UQADD;
return true;
}
static bool TryExtractLDR_32_LOADLIT(InstData &inst, uint32_t bits) {
// bits
// & 11111111000000000000000000000000
// --------------------------------
// 00011000000000000000000000000000
if ((bits & 0xff000000U) != 0x18000000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t imm19 : 19;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 0
uint32_t opc : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.imm19.uimm = static_cast<uint64_t>(enc.imm19);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.V = static_cast<uint8_t>(enc.V);
inst.iform = InstForm::LDR_32_LOADLIT;
inst.iclass = InstName::LDR;
return true;
}
static bool TryExtractLDR_64_LOADLIT(InstData &inst, uint32_t bits) {
// bits
// & 11111111000000000000000000000000
// --------------------------------
// 01011000000000000000000000000000
if ((bits & 0xff000000U) != 0x58000000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t imm19 : 19;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 0
uint32_t opc : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.imm19.uimm = static_cast<uint64_t>(enc.imm19);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.V = static_cast<uint8_t>(enc.V);
inst.iform = InstForm::LDR_64_LOADLIT;
inst.iclass = InstName::LDR;
return true;
}
static bool TryExtractFNMSUB_H_FLOATDP3(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001000000000000000
// --------------------------------
// 00011111111000001000000000000000
if ((bits & 0xffe08000U) != 0x1fe08000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t Ra : 5;
uint32_t o0 : 1;
uint32_t Rm : 5;
uint32_t o1 : 1;
uint32_t type : 2;
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t _30 : 1; // 0
uint32_t M : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.M = static_cast<uint8_t>(enc.M);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.Ra = static_cast<uint8_t>(enc.Ra);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.type = static_cast<uint8_t>(enc.type);
inst.o1 = static_cast<uint8_t>(enc.o1);
inst.o0 = static_cast<uint8_t>(enc.o0);
inst.iform = InstForm::FNMSUB_H_FLOATDP3;
inst.iclass = InstName::FNMSUB;
return true;
}
static bool TryExtractFNMSUB_S_FLOATDP3(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001000000000000000
// --------------------------------
// 00011111001000001000000000000000
if ((bits & 0xffe08000U) != 0x1f208000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t Ra : 5;
uint32_t o0 : 1;
uint32_t Rm : 5;
uint32_t o1 : 1;
uint32_t type : 2;
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t _30 : 1; // 0
uint32_t M : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.M = static_cast<uint8_t>(enc.M);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.Ra = static_cast<uint8_t>(enc.Ra);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.type = static_cast<uint8_t>(enc.type);
inst.o1 = static_cast<uint8_t>(enc.o1);
inst.o0 = static_cast<uint8_t>(enc.o0);
inst.iform = InstForm::FNMSUB_S_FLOATDP3;
inst.iclass = InstName::FNMSUB;
return true;
}
static bool TryExtractFNMSUB_D_FLOATDP3(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001000000000000000
// --------------------------------
// 00011111011000001000000000000000
if ((bits & 0xffe08000U) != 0x1f608000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t Ra : 5;
uint32_t o0 : 1;
uint32_t Rm : 5;
uint32_t o1 : 1;
uint32_t type : 2;
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t _30 : 1; // 0
uint32_t M : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.M = static_cast<uint8_t>(enc.M);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.Ra = static_cast<uint8_t>(enc.Ra);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.type = static_cast<uint8_t>(enc.type);
inst.o1 = static_cast<uint8_t>(enc.o1);
inst.o0 = static_cast<uint8_t>(enc.o0);
inst.iform = InstForm::FNMSUB_D_FLOATDP3;
inst.iclass = InstName::FNMSUB;
return true;
}
static bool TryExtractADDP_ASIMDSAME_ONLY(InstData &inst, uint32_t bits) {
// bits
// & 10111111001000001111110000000000
// --------------------------------
// 00001110001000001011110000000000
if ((bits & 0xbf20fc00U) != 0xe20bc00U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t opcode : 5;
uint32_t Rm : 5;
uint32_t _21 : 1; // 1
uint32_t size : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.U = static_cast<uint8_t>(enc.U);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::ADDP_ASIMDSAME_ONLY;
inst.iclass = InstName::ADDP;
return true;
}
static bool TryExtractSHA1M_QSV_CRYPTOSHA3(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 01011110000000000010000000000000
if ((bits & 0xffe0fc00U) != 0x5e002000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t opcode : 3;
uint32_t _15 : 1; // 0
uint32_t Rm : 5;
uint32_t _21 : 1; // 0
uint32_t size : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 0
uint32_t _30 : 1; // 1
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::SHA1M_QSV_CRYPTOSHA3;
inst.iclass = InstName::SHA1M;
return true;
}
static bool TryExtractLDAXP_LP32_LDSTEXCL(InstData &inst, uint32_t bits) {
// bits
// & 11111111111111111000000000000000
// --------------------------------
// 10001000011111111000000000000000
if ((bits & 0xffff8000U) != 0x887f8000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t Rt2 : 5;
uint32_t o0 : 1;
uint32_t Rs : 5;
uint32_t o1 : 1;
uint32_t L : 1;
uint32_t o2 : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 0
uint32_t sz : 1;
uint32_t _31 : 1; // 1
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.sz = static_cast<uint8_t>(enc.sz);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.L = static_cast<uint8_t>(enc.L);
inst.Rt2 = static_cast<uint8_t>(enc.Rt2);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o2 = static_cast<uint8_t>(enc.o2);
inst.o1 = static_cast<uint8_t>(enc.o1);
inst.o0 = static_cast<uint8_t>(enc.o0);
inst.iform = InstForm::LDAXP_LP32_LDSTEXCL;
inst.iclass = InstName::LDAXP;
return true;
}
static bool TryExtractLDAXP_LP64_LDSTEXCL(InstData &inst, uint32_t bits) {
// bits
// & 11111111111111111000000000000000
// --------------------------------
// 11001000011111111000000000000000
if ((bits & 0xffff8000U) != 0xc87f8000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t Rt2 : 5;
uint32_t o0 : 1;
uint32_t Rs : 5;
uint32_t o1 : 1;
uint32_t L : 1;
uint32_t o2 : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 0
uint32_t sz : 1;
uint32_t _31 : 1; // 1
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.sz = static_cast<uint8_t>(enc.sz);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.L = static_cast<uint8_t>(enc.L);
inst.Rt2 = static_cast<uint8_t>(enc.Rt2);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o2 = static_cast<uint8_t>(enc.o2);
inst.o1 = static_cast<uint8_t>(enc.o1);
inst.o0 = static_cast<uint8_t>(enc.o0);
inst.iform = InstForm::LDAXP_LP64_LDSTEXCL;
inst.iclass = InstName::LDAXP;
return true;
}
static bool TryExtractCASPA_CP32_LDSTEXCL(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 00001000011000000111110000000000
if ((bits & 0xffe0fc00U) != 0x8607c00U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t Rt2 : 5;
uint32_t o0 : 1;
uint32_t Rs : 5;
uint32_t o1 : 1;
uint32_t L : 1;
uint32_t o2 : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 0
uint32_t sz : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.sz = static_cast<uint8_t>(enc.sz);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.L = static_cast<uint8_t>(enc.L);
inst.Rt2 = static_cast<uint8_t>(enc.Rt2);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o2 = static_cast<uint8_t>(enc.o2);
inst.o1 = static_cast<uint8_t>(enc.o1);
inst.o0 = static_cast<uint8_t>(enc.o0);
inst.iform = InstForm::CASPA_CP32_LDSTEXCL;
inst.iclass = InstName::CASPA;
return true;
}
static bool TryExtractCASPAL_CP32_LDSTEXCL(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 00001000011000001111110000000000
if ((bits & 0xffe0fc00U) != 0x860fc00U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t Rt2 : 5;
uint32_t o0 : 1;
uint32_t Rs : 5;
uint32_t o1 : 1;
uint32_t L : 1;
uint32_t o2 : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 0
uint32_t sz : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.sz = static_cast<uint8_t>(enc.sz);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.L = static_cast<uint8_t>(enc.L);
inst.Rt2 = static_cast<uint8_t>(enc.Rt2);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o2 = static_cast<uint8_t>(enc.o2);
inst.o1 = static_cast<uint8_t>(enc.o1);
inst.o0 = static_cast<uint8_t>(enc.o0);
inst.iform = InstForm::CASPAL_CP32_LDSTEXCL;
inst.iclass = InstName::CASPAL;
return true;
}
static bool TryExtractCASP_CP32_LDSTEXCL(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 00001000001000000111110000000000
if ((bits & 0xffe0fc00U) != 0x8207c00U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t Rt2 : 5;
uint32_t o0 : 1;
uint32_t Rs : 5;
uint32_t o1 : 1;
uint32_t L : 1;
uint32_t o2 : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 0
uint32_t sz : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.sz = static_cast<uint8_t>(enc.sz);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.L = static_cast<uint8_t>(enc.L);
inst.Rt2 = static_cast<uint8_t>(enc.Rt2);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o2 = static_cast<uint8_t>(enc.o2);
inst.o1 = static_cast<uint8_t>(enc.o1);
inst.o0 = static_cast<uint8_t>(enc.o0);
inst.iform = InstForm::CASP_CP32_LDSTEXCL;
inst.iclass = InstName::CASP;
return true;
}
static bool TryExtractCASPL_CP32_LDSTEXCL(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 00001000001000001111110000000000
if ((bits & 0xffe0fc00U) != 0x820fc00U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t Rt2 : 5;
uint32_t o0 : 1;
uint32_t Rs : 5;
uint32_t o1 : 1;
uint32_t L : 1;
uint32_t o2 : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 0
uint32_t sz : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.sz = static_cast<uint8_t>(enc.sz);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.L = static_cast<uint8_t>(enc.L);
inst.Rt2 = static_cast<uint8_t>(enc.Rt2);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o2 = static_cast<uint8_t>(enc.o2);
inst.o1 = static_cast<uint8_t>(enc.o1);
inst.o0 = static_cast<uint8_t>(enc.o0);
inst.iform = InstForm::CASPL_CP32_LDSTEXCL;
inst.iclass = InstName::CASPL;
return true;
}
static bool TryExtractCASPA_CP64_LDSTEXCL(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 01001000011000000111110000000000
if ((bits & 0xffe0fc00U) != 0x48607c00U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t Rt2 : 5;
uint32_t o0 : 1;
uint32_t Rs : 5;
uint32_t o1 : 1;
uint32_t L : 1;
uint32_t o2 : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 0
uint32_t sz : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.sz = static_cast<uint8_t>(enc.sz);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.L = static_cast<uint8_t>(enc.L);
inst.Rt2 = static_cast<uint8_t>(enc.Rt2);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o2 = static_cast<uint8_t>(enc.o2);
inst.o1 = static_cast<uint8_t>(enc.o1);
inst.o0 = static_cast<uint8_t>(enc.o0);
inst.iform = InstForm::CASPA_CP64_LDSTEXCL;
inst.iclass = InstName::CASPA;
return true;
}
static bool TryExtractCASPAL_CP64_LDSTEXCL(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 01001000011000001111110000000000
if ((bits & 0xffe0fc00U) != 0x4860fc00U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t Rt2 : 5;
uint32_t o0 : 1;
uint32_t Rs : 5;
uint32_t o1 : 1;
uint32_t L : 1;
uint32_t o2 : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 0
uint32_t sz : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.sz = static_cast<uint8_t>(enc.sz);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.L = static_cast<uint8_t>(enc.L);
inst.Rt2 = static_cast<uint8_t>(enc.Rt2);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o2 = static_cast<uint8_t>(enc.o2);
inst.o1 = static_cast<uint8_t>(enc.o1);
inst.o0 = static_cast<uint8_t>(enc.o0);
inst.iform = InstForm::CASPAL_CP64_LDSTEXCL;
inst.iclass = InstName::CASPAL;
return true;
}
static bool TryExtractCASP_CP64_LDSTEXCL(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 01001000001000000111110000000000
if ((bits & 0xffe0fc00U) != 0x48207c00U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t Rt2 : 5;
uint32_t o0 : 1;
uint32_t Rs : 5;
uint32_t o1 : 1;
uint32_t L : 1;
uint32_t o2 : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 0
uint32_t sz : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.sz = static_cast<uint8_t>(enc.sz);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.L = static_cast<uint8_t>(enc.L);
inst.Rt2 = static_cast<uint8_t>(enc.Rt2);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o2 = static_cast<uint8_t>(enc.o2);
inst.o1 = static_cast<uint8_t>(enc.o1);
inst.o0 = static_cast<uint8_t>(enc.o0);
inst.iform = InstForm::CASP_CP64_LDSTEXCL;
inst.iclass = InstName::CASP;
return true;
}
static bool TryExtractCASPL_CP64_LDSTEXCL(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 01001000001000001111110000000000
if ((bits & 0xffe0fc00U) != 0x4820fc00U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t Rt2 : 5;
uint32_t o0 : 1;
uint32_t Rs : 5;
uint32_t o1 : 1;
uint32_t L : 1;
uint32_t o2 : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 0
uint32_t sz : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.sz = static_cast<uint8_t>(enc.sz);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.L = static_cast<uint8_t>(enc.L);
inst.Rt2 = static_cast<uint8_t>(enc.Rt2);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o2 = static_cast<uint8_t>(enc.o2);
inst.o1 = static_cast<uint8_t>(enc.o1);
inst.o0 = static_cast<uint8_t>(enc.o0);
inst.iform = InstForm::CASPL_CP64_LDSTEXCL;
inst.iclass = InstName::CASPL;
return true;
}
static bool TryExtractFCVTZU_32H_FLOAT2FIX(InstData &inst, uint32_t bits) {
// bits
// & 11111111111111110000000000000000
// --------------------------------
// 00011110110110010000000000000000
if ((bits & 0xffff0000U) != 0x1ed90000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t scale : 6;
uint32_t opcode : 3;
uint32_t rmode : 2;
uint32_t _21 : 1; // 0
uint32_t type : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t _30 : 1; // 0
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.scale = static_cast<uint8_t>(enc.scale);
inst.sf = static_cast<uint8_t>(enc.sf);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.type = static_cast<uint8_t>(enc.type);
inst.rmode = static_cast<uint8_t>(enc.rmode);
inst.iform = InstForm::FCVTZU_32H_FLOAT2FIX;
inst.iclass = InstName::FCVTZU;
return true;
}
static bool TryExtractFCVTZU_64H_FLOAT2FIX(InstData &inst, uint32_t bits) {
// bits
// & 11111111111111110000000000000000
// --------------------------------
// 10011110110110010000000000000000
if ((bits & 0xffff0000U) != 0x9ed90000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t scale : 6;
uint32_t opcode : 3;
uint32_t rmode : 2;
uint32_t _21 : 1; // 0
uint32_t type : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t _30 : 1; // 0
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.scale = static_cast<uint8_t>(enc.scale);
inst.sf = static_cast<uint8_t>(enc.sf);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.type = static_cast<uint8_t>(enc.type);
inst.rmode = static_cast<uint8_t>(enc.rmode);
inst.iform = InstForm::FCVTZU_64H_FLOAT2FIX;
inst.iclass = InstName::FCVTZU;
return true;
}
static bool TryExtractFCVTZU_32S_FLOAT2FIX(InstData &inst, uint32_t bits) {
// bits
// & 11111111111111110000000000000000
// --------------------------------
// 00011110000110010000000000000000
if ((bits & 0xffff0000U) != 0x1e190000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t scale : 6;
uint32_t opcode : 3;
uint32_t rmode : 2;
uint32_t _21 : 1; // 0
uint32_t type : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t _30 : 1; // 0
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.scale = static_cast<uint8_t>(enc.scale);
inst.sf = static_cast<uint8_t>(enc.sf);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.type = static_cast<uint8_t>(enc.type);
inst.rmode = static_cast<uint8_t>(enc.rmode);
inst.iform = InstForm::FCVTZU_32S_FLOAT2FIX;
inst.iclass = InstName::FCVTZU;
return true;
}
static bool TryExtractFCVTZU_64S_FLOAT2FIX(InstData &inst, uint32_t bits) {
// bits
// & 11111111111111110000000000000000
// --------------------------------
// 10011110000110010000000000000000
if ((bits & 0xffff0000U) != 0x9e190000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t scale : 6;
uint32_t opcode : 3;
uint32_t rmode : 2;
uint32_t _21 : 1; // 0
uint32_t type : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t _30 : 1; // 0
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.scale = static_cast<uint8_t>(enc.scale);
inst.sf = static_cast<uint8_t>(enc.sf);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.type = static_cast<uint8_t>(enc.type);
inst.rmode = static_cast<uint8_t>(enc.rmode);
inst.iform = InstForm::FCVTZU_64S_FLOAT2FIX;
inst.iclass = InstName::FCVTZU;
return true;
}
static bool TryExtractFCVTZU_32D_FLOAT2FIX(InstData &inst, uint32_t bits) {
// bits
// & 11111111111111110000000000000000
// --------------------------------
// 00011110010110010000000000000000
if ((bits & 0xffff0000U) != 0x1e590000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t scale : 6;
uint32_t opcode : 3;
uint32_t rmode : 2;
uint32_t _21 : 1; // 0
uint32_t type : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t _30 : 1; // 0
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.scale = static_cast<uint8_t>(enc.scale);
inst.sf = static_cast<uint8_t>(enc.sf);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.type = static_cast<uint8_t>(enc.type);
inst.rmode = static_cast<uint8_t>(enc.rmode);
inst.iform = InstForm::FCVTZU_32D_FLOAT2FIX;
inst.iclass = InstName::FCVTZU;
return true;
}
static bool TryExtractFCVTZU_64D_FLOAT2FIX(InstData &inst, uint32_t bits) {
// bits
// & 11111111111111110000000000000000
// --------------------------------
// 10011110010110010000000000000000
if ((bits & 0xffff0000U) != 0x9e590000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t scale : 6;
uint32_t opcode : 3;
uint32_t rmode : 2;
uint32_t _21 : 1; // 0
uint32_t type : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t _30 : 1; // 0
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.scale = static_cast<uint8_t>(enc.scale);
inst.sf = static_cast<uint8_t>(enc.sf);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.type = static_cast<uint8_t>(enc.type);
inst.rmode = static_cast<uint8_t>(enc.rmode);
inst.iform = InstForm::FCVTZU_64D_FLOAT2FIX;
inst.iclass = InstName::FCVTZU;
return true;
}
static bool TryExtractSHA1P_QSV_CRYPTOSHA3(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 01011110000000000001000000000000
if ((bits & 0xffe0fc00U) != 0x5e001000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t opcode : 3;
uint32_t _15 : 1; // 0
uint32_t Rm : 5;
uint32_t _21 : 1; // 0
uint32_t size : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 0
uint32_t _30 : 1; // 1
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::SHA1P_QSV_CRYPTOSHA3;
inst.iclass = InstName::SHA1P;
return true;
}
static bool TryExtractSADDLV_ASIMDALL_ONLY(InstData &inst, uint32_t bits) {
// bits
// & 10111111001111111111110000000000
// --------------------------------
// 00001110001100000011100000000000
if ((bits & 0xbf3ffc00U) != 0xe303800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t opcode : 5;
uint32_t _17 : 1; // 0
uint32_t _18 : 1; // 0
uint32_t _19 : 1; // 0
uint32_t _20 : 1; // 1
uint32_t _21 : 1; // 1
uint32_t size : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.U = static_cast<uint8_t>(enc.U);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::SADDLV_ASIMDALL_ONLY;
inst.iclass = InstName::SADDLV;
return true;
}
static bool TryExtractTBL_ASIMDTBL_L2_2(InstData &inst, uint32_t bits) {
// bits
// & 10111111111000001111110000000000
// --------------------------------
// 00001110000000000010000000000000
if ((bits & 0xbfe0fc00U) != 0xe002000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t op : 1;
uint32_t len : 2;
uint32_t _15 : 1; // 0
uint32_t Rm : 5;
uint32_t _21 : 1; // 0
uint32_t op2 : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 0
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Q = static_cast<uint8_t>(enc.Q);
inst.op2 = static_cast<uint8_t>(enc.op2);
inst.len = static_cast<uint8_t>(enc.len);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.op = static_cast<uint8_t>(enc.op);
inst.iform = InstForm::TBL_ASIMDTBL_L2_2;
inst.iclass = InstName::TBL;
return true;
}
static bool TryExtractTBL_ASIMDTBL_L3_3(InstData &inst, uint32_t bits) {
// bits
// & 10111111111000001111110000000000
// --------------------------------
// 00001110000000000100000000000000
if ((bits & 0xbfe0fc00U) != 0xe004000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t op : 1;
uint32_t len : 2;
uint32_t _15 : 1; // 0
uint32_t Rm : 5;
uint32_t _21 : 1; // 0
uint32_t op2 : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 0
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Q = static_cast<uint8_t>(enc.Q);
inst.op2 = static_cast<uint8_t>(enc.op2);
inst.len = static_cast<uint8_t>(enc.len);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.op = static_cast<uint8_t>(enc.op);
inst.iform = InstForm::TBL_ASIMDTBL_L3_3;
inst.iclass = InstName::TBL;
return true;
}
static bool TryExtractTBL_ASIMDTBL_L4_4(InstData &inst, uint32_t bits) {
// bits
// & 10111111111000001111110000000000
// --------------------------------
// 00001110000000000110000000000000
if ((bits & 0xbfe0fc00U) != 0xe006000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t op : 1;
uint32_t len : 2;
uint32_t _15 : 1; // 0
uint32_t Rm : 5;
uint32_t _21 : 1; // 0
uint32_t op2 : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 0
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Q = static_cast<uint8_t>(enc.Q);
inst.op2 = static_cast<uint8_t>(enc.op2);
inst.len = static_cast<uint8_t>(enc.len);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.op = static_cast<uint8_t>(enc.op);
inst.iform = InstForm::TBL_ASIMDTBL_L4_4;
inst.iclass = InstName::TBL;
return true;
}
static bool TryExtractTBL_ASIMDTBL_L1_1(InstData &inst, uint32_t bits) {
// bits
// & 10111111111000001111110000000000
// --------------------------------
// 00001110000000000000000000000000
if ((bits & 0xbfe0fc00U) != 0xe000000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t op : 1;
uint32_t len : 2;
uint32_t _15 : 1; // 0
uint32_t Rm : 5;
uint32_t _21 : 1; // 0
uint32_t op2 : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 0
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Q = static_cast<uint8_t>(enc.Q);
inst.op2 = static_cast<uint8_t>(enc.op2);
inst.len = static_cast<uint8_t>(enc.len);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.op = static_cast<uint8_t>(enc.op);
inst.iform = InstForm::TBL_ASIMDTBL_L1_1;
inst.iclass = InstName::TBL;
return true;
}
static bool TryExtractADD_32_ADDSUB_EXT(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000000000000000000000
// --------------------------------
// 00001011001000000000000000000000
if ((bits & 0xffe00000U) != 0xb200000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t imm3 : 3;
uint32_t option : 3;
uint32_t Rm : 5;
uint32_t _21 : 1; // 1
uint32_t opt : 2;
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t S : 1;
uint32_t op : 1;
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.opt = static_cast<uint8_t>(enc.opt);
inst.option = static_cast<uint8_t>(enc.option);
inst.sf = static_cast<uint8_t>(enc.sf);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.imm3.uimm = static_cast<uint64_t>(enc.imm3);
inst.op = static_cast<uint8_t>(enc.op);
inst.iform = InstForm::ADD_32_ADDSUB_EXT;
inst.iclass = InstName::ADD;
return true;
}
static bool TryExtractADD_64_ADDSUB_EXT(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000000000000000000000
// --------------------------------
// 10001011001000000000000000000000
if ((bits & 0xffe00000U) != 0x8b200000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t imm3 : 3;
uint32_t option : 3;
uint32_t Rm : 5;
uint32_t _21 : 1; // 1
uint32_t opt : 2;
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t S : 1;
uint32_t op : 1;
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.opt = static_cast<uint8_t>(enc.opt);
inst.option = static_cast<uint8_t>(enc.option);
inst.sf = static_cast<uint8_t>(enc.sf);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.imm3.uimm = static_cast<uint64_t>(enc.imm3);
inst.op = static_cast<uint8_t>(enc.op);
inst.iform = InstForm::ADD_64_ADDSUB_EXT;
inst.iclass = InstName::ADD;
return true;
}
static bool TryExtractFMAXNMP_ASISDPAIR_ONLY_H(InstData &inst, uint32_t bits) {
// bits
// & 11111111111111111111110000000000
// --------------------------------
// 01011110001100001100100000000000
if ((bits & 0xfffffc00U) != 0x5e30c800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t opcode : 5;
uint32_t _17 : 1; // 0
uint32_t _18 : 1; // 0
uint32_t _19 : 1; // 0
uint32_t _20 : 1; // 1
uint32_t _21 : 1; // 1
uint32_t sz : 1;
uint32_t o1 : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t U : 1;
uint32_t _30 : 1; // 1
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.sz = static_cast<uint8_t>(enc.sz);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o1 = static_cast<uint8_t>(enc.o1);
inst.iform = InstForm::FMAXNMP_ASISDPAIR_ONLY_H;
inst.iclass = InstName::FMAXNMP;
return true;
}
static bool TryExtractFMAXNMP_ASISDPAIR_ONLY_SD(InstData &inst, uint32_t bits) {
// bits
// & 11111111101111111111110000000000
// --------------------------------
// 01111110001100001100100000000000
if ((bits & 0xffbffc00U) != 0x7e30c800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t opcode : 5;
uint32_t _17 : 1; // 0
uint32_t _18 : 1; // 0
uint32_t _19 : 1; // 0
uint32_t _20 : 1; // 1
uint32_t _21 : 1; // 1
uint32_t sz : 1;
uint32_t o1 : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t U : 1;
uint32_t _30 : 1; // 1
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.sz = static_cast<uint8_t>(enc.sz);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o1 = static_cast<uint8_t>(enc.o1);
inst.iform = InstForm::FMAXNMP_ASISDPAIR_ONLY_SD;
inst.iclass = InstName::FMAXNMP;
return true;
}
static bool TryExtractBICS_32_LOG_SHIFT(InstData &inst, uint32_t bits) {
// bits
// & 11111111001000000000000000000000
// --------------------------------
// 01101010001000000000000000000000
if ((bits & 0xff200000U) != 0x6a200000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t imm6 : 6;
uint32_t Rm : 5;
uint32_t N : 1;
uint32_t shift : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t opc : 2;
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.shift = static_cast<uint8_t>(enc.shift);
inst.N = static_cast<uint8_t>(enc.N);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.sf = static_cast<uint8_t>(enc.sf);
inst.imm6.uimm = static_cast<uint64_t>(enc.imm6);
inst.iform = InstForm::BICS_32_LOG_SHIFT;
inst.iclass = InstName::BICS;
return true;
}
static bool TryExtractBICS_64_LOG_SHIFT(InstData &inst, uint32_t bits) {
// bits
// & 11111111001000000000000000000000
// --------------------------------
// 11101010001000000000000000000000
if ((bits & 0xff200000U) != 0xea200000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t imm6 : 6;
uint32_t Rm : 5;
uint32_t N : 1;
uint32_t shift : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t opc : 2;
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.shift = static_cast<uint8_t>(enc.shift);
inst.N = static_cast<uint8_t>(enc.N);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.sf = static_cast<uint8_t>(enc.sf);
inst.imm6.uimm = static_cast<uint64_t>(enc.imm6);
inst.iform = InstForm::BICS_64_LOG_SHIFT;
inst.iclass = InstName::BICS;
return true;
}
static bool TryExtractFNMUL_H_FLOATDP2(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 00011110111000001000100000000000
if ((bits & 0xffe0fc00U) != 0x1ee08800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t _12 : 1; // 0
uint32_t _13 : 1; // 0
uint32_t _14 : 1; // 0
uint32_t op : 1;
uint32_t Rm : 5;
uint32_t _21 : 1; // 1
uint32_t type : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t _30 : 1; // 0
uint32_t M : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.M = static_cast<uint8_t>(enc.M);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.type = static_cast<uint8_t>(enc.type);
inst.op = static_cast<uint8_t>(enc.op);
inst.iform = InstForm::FNMUL_H_FLOATDP2;
inst.iclass = InstName::FNMUL;
return true;
}
static bool TryExtractFNMUL_S_FLOATDP2(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 00011110001000001000100000000000
if ((bits & 0xffe0fc00U) != 0x1e208800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t _12 : 1; // 0
uint32_t _13 : 1; // 0
uint32_t _14 : 1; // 0
uint32_t op : 1;
uint32_t Rm : 5;
uint32_t _21 : 1; // 1
uint32_t type : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t _30 : 1; // 0
uint32_t M : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.M = static_cast<uint8_t>(enc.M);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.type = static_cast<uint8_t>(enc.type);
inst.op = static_cast<uint8_t>(enc.op);
inst.iform = InstForm::FNMUL_S_FLOATDP2;
inst.iclass = InstName::FNMUL;
return true;
}
static bool TryExtractFNMUL_D_FLOATDP2(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 00011110011000001000100000000000
if ((bits & 0xffe0fc00U) != 0x1e608800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t _12 : 1; // 0
uint32_t _13 : 1; // 0
uint32_t _14 : 1; // 0
uint32_t op : 1;
uint32_t Rm : 5;
uint32_t _21 : 1; // 1
uint32_t type : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t _30 : 1; // 0
uint32_t M : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.M = static_cast<uint8_t>(enc.M);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.type = static_cast<uint8_t>(enc.type);
inst.op = static_cast<uint8_t>(enc.op);
inst.iform = InstForm::FNMUL_D_FLOATDP2;
inst.iclass = InstName::FNMUL;
return true;
}
static bool TryExtractSQSUB_ASISDSAME_ONLY(InstData &inst, uint32_t bits) {
// bits
// & 11111111001000001111110000000000
// --------------------------------
// 01011110001000000010110000000000
if ((bits & 0xff20fc00U) != 0x5e202c00U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t opcode : 5;
uint32_t Rm : 5;
uint32_t _21 : 1; // 1
uint32_t size : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t U : 1;
uint32_t _30 : 1; // 1
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.U = static_cast<uint8_t>(enc.U);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::SQSUB_ASISDSAME_ONLY;
inst.iclass = InstName::SQSUB;
return true;
}
static bool TryExtractSQSUB_ASIMDSAME_ONLY(InstData &inst, uint32_t bits) {
// bits
// & 10111111001000001111110000000000
// --------------------------------
// 00001110001000000010110000000000
if ((bits & 0xbf20fc00U) != 0xe202c00U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t opcode : 5;
uint32_t Rm : 5;
uint32_t _21 : 1; // 1
uint32_t size : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.U = static_cast<uint8_t>(enc.U);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::SQSUB_ASIMDSAME_ONLY;
inst.iclass = InstName::SQSUB;
return true;
}
static bool TryExtractSQXTN_ASISDMISC_N(InstData &inst, uint32_t bits) {
// bits
// & 11111111001111111111110000000000
// --------------------------------
// 01011110001000010100100000000000
if ((bits & 0xff3ffc00U) != 0x5e214800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t opcode : 5;
uint32_t _17 : 1; // 0
uint32_t _18 : 1; // 0
uint32_t _19 : 1; // 0
uint32_t _20 : 1; // 0
uint32_t _21 : 1; // 1
uint32_t size : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t U : 1;
uint32_t _30 : 1; // 1
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::SQXTN_ASISDMISC_N;
inst.iclass = InstName::SQXTN;
return true;
}
static bool TryExtractSQXTN_ASIMDMISC_N(InstData &inst, uint32_t bits) {
// bits
// & 10111111001111111111110000000000
// --------------------------------
// 00001110001000010100100000000000
if ((bits & 0xbf3ffc00U) != 0xe214800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t opcode : 5;
uint32_t _17 : 1; // 0
uint32_t _18 : 1; // 0
uint32_t _19 : 1; // 0
uint32_t _20 : 1; // 0
uint32_t _21 : 1; // 1
uint32_t size : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.U = static_cast<uint8_t>(enc.U);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::SQXTN_ASIMDMISC_N;
inst.iclass = InstName::SQXTN;
return true;
}
static bool TryExtractMOV_ORR_ASIMDSAME_ONLY(InstData &inst, uint32_t bits) {
// bits
// & 10111111111000001111110000000000
// --------------------------------
// 00001110101000000001110000000000
if ((bits & 0xbfe0fc00U) != 0xea01c00U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t opcode : 5;
uint32_t Rm : 5;
uint32_t _21 : 1; // 1
uint32_t size : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.U = static_cast<uint8_t>(enc.U);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::MOV_ORR_ASIMDSAME_ONLY;
inst.iclass = InstName::ORR;
return true;
}
static bool TryExtractREV64_REV_64_DP_1SRC(InstData &inst, uint32_t bits) {
// bits
// & 11111111111111111111110000000000
// --------------------------------
// 11011010110000000000110000000000
if ((bits & 0xfffffc00U) != 0xdac00c00U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t opc : 2;
uint32_t opcode : 4;
uint32_t opcode2 : 5;
uint32_t _21 : 1; // 0
uint32_t _22 : 1; // 1
uint32_t _23 : 1; // 1
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t _30 : 1; // 1
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.opcode2 = static_cast<uint8_t>(enc.opcode2);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.sf = static_cast<uint8_t>(enc.sf);
inst.iform = InstForm::REV64_REV_64_DP_1SRC;
inst.iclass = InstName::REV;
return true;
}
static bool TryExtractSTLXRB_SR32_LDSTEXCL(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 00001000000000001111110000000000
if ((bits & 0xffe0fc00U) != 0x800fc00U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t Rt2 : 5;
uint32_t o0 : 1;
uint32_t Rs : 5;
uint32_t o1 : 1;
uint32_t L : 1;
uint32_t o2 : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 0
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.L = static_cast<uint8_t>(enc.L);
inst.Rt2 = static_cast<uint8_t>(enc.Rt2);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.o2 = static_cast<uint8_t>(enc.o2);
inst.o1 = static_cast<uint8_t>(enc.o1);
inst.o0 = static_cast<uint8_t>(enc.o0);
inst.iform = InstForm::STLXRB_SR32_LDSTEXCL;
inst.iclass = InstName::STLXRB;
return true;
}
static bool TryExtractSTTRH_32_LDST_UNPRIV(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000000000110000000000
// --------------------------------
// 01111000000000000000100000000000
if ((bits & 0xffe00c00U) != 0x78000800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t imm9 : 9;
uint32_t _21 : 1; // 0
uint32_t opc : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.imm9.uimm = static_cast<uint64_t>(enc.imm9);
inst.V = static_cast<uint8_t>(enc.V);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::STTRH_32_LDST_UNPRIV;
inst.iclass = InstName::STTRH;
return true;
}
static bool TryExtractSMINP_ASIMDSAME_ONLY(InstData &inst, uint32_t bits) {
// bits
// & 10111111001000001111110000000000
// --------------------------------
// 00001110001000001010110000000000
if ((bits & 0xbf20fc00U) != 0xe20ac00U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t o1 : 1;
uint32_t _12 : 1; // 0
uint32_t _13 : 1; // 1
uint32_t _14 : 1; // 0
uint32_t _15 : 1; // 1
uint32_t Rm : 5;
uint32_t _21 : 1; // 1
uint32_t size : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o1 = static_cast<uint8_t>(enc.o1);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::SMINP_ASIMDSAME_ONLY;
inst.iclass = InstName::SMINP;
return true;
}
static bool TryExtractSHA256SU1_VVV_CRYPTOSHA3(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 01011110000000000110000000000000
if ((bits & 0xffe0fc00U) != 0x5e006000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t opcode : 3;
uint32_t _15 : 1; // 0
uint32_t Rm : 5;
uint32_t _21 : 1; // 0
uint32_t size : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 0
uint32_t _30 : 1; // 1
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::SHA256SU1_VVV_CRYPTOSHA3;
inst.iclass = InstName::SHA256SU1;
return true;
}
static bool TryExtractFMSUB_H_FLOATDP3(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001000000000000000
// --------------------------------
// 00011111110000001000000000000000
if ((bits & 0xffe08000U) != 0x1fc08000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t Ra : 5;
uint32_t o0 : 1;
uint32_t Rm : 5;
uint32_t o1 : 1;
uint32_t type : 2;
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t _30 : 1; // 0
uint32_t M : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.M = static_cast<uint8_t>(enc.M);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.Ra = static_cast<uint8_t>(enc.Ra);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.type = static_cast<uint8_t>(enc.type);
inst.o1 = static_cast<uint8_t>(enc.o1);
inst.o0 = static_cast<uint8_t>(enc.o0);
inst.iform = InstForm::FMSUB_H_FLOATDP3;
inst.iclass = InstName::FMSUB;
return true;
}
static bool TryExtractFMSUB_S_FLOATDP3(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001000000000000000
// --------------------------------
// 00011111000000001000000000000000
if ((bits & 0xffe08000U) != 0x1f008000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t Ra : 5;
uint32_t o0 : 1;
uint32_t Rm : 5;
uint32_t o1 : 1;
uint32_t type : 2;
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t _30 : 1; // 0
uint32_t M : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.M = static_cast<uint8_t>(enc.M);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.Ra = static_cast<uint8_t>(enc.Ra);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.type = static_cast<uint8_t>(enc.type);
inst.o1 = static_cast<uint8_t>(enc.o1);
inst.o0 = static_cast<uint8_t>(enc.o0);
inst.iform = InstForm::FMSUB_S_FLOATDP3;
inst.iclass = InstName::FMSUB;
return true;
}
static bool TryExtractFMSUB_D_FLOATDP3(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001000000000000000
// --------------------------------
// 00011111010000001000000000000000
if ((bits & 0xffe08000U) != 0x1f408000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t Ra : 5;
uint32_t o0 : 1;
uint32_t Rm : 5;
uint32_t o1 : 1;
uint32_t type : 2;
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t _30 : 1; // 0
uint32_t M : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.M = static_cast<uint8_t>(enc.M);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.Ra = static_cast<uint8_t>(enc.Ra);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.type = static_cast<uint8_t>(enc.type);
inst.o1 = static_cast<uint8_t>(enc.o1);
inst.o0 = static_cast<uint8_t>(enc.o0);
inst.iform = InstForm::FMSUB_D_FLOATDP3;
inst.iclass = InstName::FMSUB;
return true;
}
static bool TryExtractNGCS_SBCS_32_ADDSUB_CARRY(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111111111100000
// --------------------------------
// 01111010000000000000001111100000
if ((bits & 0xffe0ffe0U) != 0x7a0003e0U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t opcode2 : 6;
uint32_t Rm : 5;
uint32_t _21 : 1; // 0
uint32_t _22 : 1; // 0
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t op : 1;
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.opcode2 = static_cast<uint8_t>(enc.opcode2);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.sf = static_cast<uint8_t>(enc.sf);
inst.op = static_cast<uint8_t>(enc.op);
inst.iform = InstForm::NGCS_SBCS_32_ADDSUB_CARRY;
inst.iclass = InstName::SBCS;
return true;
}
static bool TryExtractNGCS_SBCS_64_ADDSUB_CARRY(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111111111100000
// --------------------------------
// 11111010000000000000001111100000
if ((bits & 0xffe0ffe0U) != 0xfa0003e0U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t opcode2 : 6;
uint32_t Rm : 5;
uint32_t _21 : 1; // 0
uint32_t _22 : 1; // 0
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t op : 1;
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.opcode2 = static_cast<uint8_t>(enc.opcode2);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.sf = static_cast<uint8_t>(enc.sf);
inst.op = static_cast<uint8_t>(enc.op);
inst.iform = InstForm::NGCS_SBCS_64_ADDSUB_CARRY;
inst.iclass = InstName::SBCS;
return true;
}
static bool TryExtractSTR_32_LDST_IMMPOST(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000000000110000000000
// --------------------------------
// 10111000000000000000010000000000
if ((bits & 0xffe00c00U) != 0xb8000400U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t _11 : 1; // 0
uint32_t imm9 : 9;
uint32_t _21 : 1; // 0
uint32_t opc : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.imm9.uimm = static_cast<uint64_t>(enc.imm9);
inst.V = static_cast<uint8_t>(enc.V);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::STR_32_LDST_IMMPOST;
inst.iclass = InstName::STR;
return true;
}
static bool TryExtractSTR_64_LDST_IMMPOST(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000000000110000000000
// --------------------------------
// 11111000000000000000010000000000
if ((bits & 0xffe00c00U) != 0xf8000400U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t _11 : 1; // 0
uint32_t imm9 : 9;
uint32_t _21 : 1; // 0
uint32_t opc : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.imm9.uimm = static_cast<uint64_t>(enc.imm9);
inst.V = static_cast<uint8_t>(enc.V);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::STR_64_LDST_IMMPOST;
inst.iclass = InstName::STR;
return true;
}
static bool TryExtractSTR_32_LDST_IMMPRE(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000000000110000000000
// --------------------------------
// 10111000000000000000110000000000
if ((bits & 0xffe00c00U) != 0xb8000c00U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t _11 : 1; // 1
uint32_t imm9 : 9;
uint32_t _21 : 1; // 0
uint32_t opc : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.imm9.uimm = static_cast<uint64_t>(enc.imm9);
inst.V = static_cast<uint8_t>(enc.V);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::STR_32_LDST_IMMPRE;
inst.iclass = InstName::STR;
return true;
}
static bool TryExtractSTR_64_LDST_IMMPRE(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000000000110000000000
// --------------------------------
// 11111000000000000000110000000000
if ((bits & 0xffe00c00U) != 0xf8000c00U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t _11 : 1; // 1
uint32_t imm9 : 9;
uint32_t _21 : 1; // 0
uint32_t opc : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.imm9.uimm = static_cast<uint64_t>(enc.imm9);
inst.V = static_cast<uint8_t>(enc.V);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::STR_64_LDST_IMMPRE;
inst.iclass = InstName::STR;
return true;
}
static bool TryExtractSTR_32_LDST_POS(InstData &inst, uint32_t bits) {
// bits
// & 11111111110000000000000000000000
// --------------------------------
// 10111001000000000000000000000000
if ((bits & 0xffc00000U) != 0xb9000000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t imm12 : 12;
uint32_t opc : 2;
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.imm12.uimm = static_cast<uint64_t>(enc.imm12);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.V = static_cast<uint8_t>(enc.V);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::STR_32_LDST_POS;
inst.iclass = InstName::STR;
return true;
}
static bool TryExtractSTR_64_LDST_POS(InstData &inst, uint32_t bits) {
// bits
// & 11111111110000000000000000000000
// --------------------------------
// 11111001000000000000000000000000
if ((bits & 0xffc00000U) != 0xf9000000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t imm12 : 12;
uint32_t opc : 2;
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.imm12.uimm = static_cast<uint64_t>(enc.imm12);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.V = static_cast<uint8_t>(enc.V);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::STR_64_LDST_POS;
inst.iclass = InstName::STR;
return true;
}
static bool TryExtractINS_ASIMDINS_IV_V(InstData &inst, uint32_t bits) {
if (false && TryExtractMOV_INS_ASIMDINS_IV_V(inst, bits))
return true;
// bits
// & 11111111111000001000010000000000
// --------------------------------
// 01101110000000000000010000000000
if ((bits & 0xffe08400U) != 0x6e000400U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t imm4 : 4;
uint32_t _15 : 1; // 0
uint32_t imm5 : 5;
uint32_t _21 : 1; // 0
uint32_t _22 : 1; // 0
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t op : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.imm5.uimm = static_cast<uint64_t>(enc.imm5);
inst.imm4.uimm = static_cast<uint64_t>(enc.imm4);
inst.op = static_cast<uint8_t>(enc.op);
inst.iform = InstForm::INS_ASIMDINS_IV_V;
inst.iclass = InstName::INS;
return true;
}
static bool TryExtractDCPS2_DC_EXCEPTION(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000000000000000011111
// --------------------------------
// 11010100101000000000000000000010
if ((bits & 0xffe0001fU) != 0xd4a00002U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t LL : 2;
uint32_t op2 : 3;
uint32_t imm16 : 16;
uint32_t opc : 3;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 0
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 0
uint32_t _30 : 1; // 1
uint32_t _31 : 1; // 1
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.LL = static_cast<uint8_t>(enc.LL);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.op2 = static_cast<uint8_t>(enc.op2);
inst.imm16.uimm = static_cast<uint64_t>(enc.imm16);
inst.iform = InstForm::DCPS2_DC_EXCEPTION;
inst.iclass = InstName::DCPS2;
return true;
}
static bool TryExtractTST_ANDS_32_LOG_SHIFT(InstData &inst, uint32_t bits) {
// bits
// & 11111111001000000000000000011111
// --------------------------------
// 01101010000000000000000000011111
if ((bits & 0xff20001fU) != 0x6a00001fU) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t imm6 : 6;
uint32_t Rm : 5;
uint32_t N : 1;
uint32_t shift : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t opc : 2;
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.shift = static_cast<uint8_t>(enc.shift);
inst.N = static_cast<uint8_t>(enc.N);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.sf = static_cast<uint8_t>(enc.sf);
inst.imm6.uimm = static_cast<uint64_t>(enc.imm6);
inst.iform = InstForm::TST_ANDS_32_LOG_SHIFT;
inst.iclass = InstName::ANDS;
return true;
}
static bool TryExtractTST_ANDS_64_LOG_SHIFT(InstData &inst, uint32_t bits) {
// bits
// & 11111111001000000000000000011111
// --------------------------------
// 11101010000000000000000000011111
if ((bits & 0xff20001fU) != 0xea00001fU) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t imm6 : 6;
uint32_t Rm : 5;
uint32_t N : 1;
uint32_t shift : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t opc : 2;
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.shift = static_cast<uint8_t>(enc.shift);
inst.N = static_cast<uint8_t>(enc.N);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.sf = static_cast<uint8_t>(enc.sf);
inst.imm6.uimm = static_cast<uint64_t>(enc.imm6);
inst.iform = InstForm::TST_ANDS_64_LOG_SHIFT;
inst.iclass = InstName::ANDS;
return true;
}
static bool TryExtractDCPS1_DC_EXCEPTION(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000000000000000011111
// --------------------------------
// 11010100101000000000000000000001
if ((bits & 0xffe0001fU) != 0xd4a00001U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t LL : 2;
uint32_t op2 : 3;
uint32_t imm16 : 16;
uint32_t opc : 3;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 0
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 0
uint32_t _30 : 1; // 1
uint32_t _31 : 1; // 1
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.LL = static_cast<uint8_t>(enc.LL);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.op2 = static_cast<uint8_t>(enc.op2);
inst.imm16.uimm = static_cast<uint64_t>(enc.imm16);
inst.iform = InstForm::DCPS1_DC_EXCEPTION;
inst.iclass = InstName::DCPS1;
return true;
}
static bool TryExtractFMLA_ASISDELEM_RH_H(InstData &inst, uint32_t bits) {
// bits
// & 11111111110000001111010000000000
// --------------------------------
// 01011111000000000001000000000000
if ((bits & 0xffc0f400U) != 0x5f001000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t H : 1;
uint32_t _12 : 1; // 1
uint32_t _13 : 1; // 0
uint32_t o2 : 1;
uint32_t _15 : 1; // 0
uint32_t Rm : 4;
uint32_t M : 1;
uint32_t L : 1;
uint32_t size : 2;
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t U : 1;
uint32_t _30 : 1; // 1
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.H = static_cast<uint8_t>(enc.H);
inst.M = static_cast<uint8_t>(enc.M);
inst.L = static_cast<uint8_t>(enc.L);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o2 = static_cast<uint8_t>(enc.o2);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::FMLA_ASISDELEM_RH_H;
inst.iclass = InstName::FMLA;
return true;
}
static bool TryExtractFMLA_ASISDELEM_R_SD(InstData &inst, uint32_t bits) {
// bits
// & 11111111100000001111010000000000
// --------------------------------
// 01011111100000000001000000000000
if ((bits & 0xff80f400U) != 0x5f801000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t H : 1;
uint32_t _12 : 1; // 1
uint32_t _13 : 1; // 0
uint32_t o2 : 1;
uint32_t _15 : 1; // 0
uint32_t Rm : 4;
uint32_t M : 1;
uint32_t L : 1;
uint32_t sz : 1;
uint32_t _23 : 1; // 1
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t U : 1;
uint32_t _30 : 1; // 1
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.sz = static_cast<uint8_t>(enc.sz);
inst.H = static_cast<uint8_t>(enc.H);
inst.M = static_cast<uint8_t>(enc.M);
inst.L = static_cast<uint8_t>(enc.L);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o2 = static_cast<uint8_t>(enc.o2);
inst.iform = InstForm::FMLA_ASISDELEM_R_SD;
inst.iclass = InstName::FMLA;
return true;
}
static bool TryExtractFMLA_ASIMDELEM_RH_H(InstData &inst, uint32_t bits) {
// bits
// & 10111111110000001111010000000000
// --------------------------------
// 00001111000000000001000000000000
if ((bits & 0xbfc0f400U) != 0xf001000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t H : 1;
uint32_t _12 : 1; // 1
uint32_t _13 : 1; // 0
uint32_t o2 : 1;
uint32_t _15 : 1; // 0
uint32_t Rm : 4;
uint32_t M : 1;
uint32_t L : 1;
uint32_t size : 2;
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Q = static_cast<uint8_t>(enc.Q);
inst.H = static_cast<uint8_t>(enc.H);
inst.M = static_cast<uint8_t>(enc.M);
inst.L = static_cast<uint8_t>(enc.L);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o2 = static_cast<uint8_t>(enc.o2);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::FMLA_ASIMDELEM_RH_H;
inst.iclass = InstName::FMLA;
return true;
}
static bool TryExtractFMLA_ASIMDELEM_R_SD(InstData &inst, uint32_t bits) {
// bits
// & 10111111100000001111010000000000
// --------------------------------
// 00001111100000000001000000000000
if ((bits & 0xbf80f400U) != 0xf801000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t H : 1;
uint32_t _12 : 1; // 1
uint32_t _13 : 1; // 0
uint32_t o2 : 1;
uint32_t _15 : 1; // 0
uint32_t Rm : 4;
uint32_t M : 1;
uint32_t L : 1;
uint32_t sz : 1;
uint32_t _23 : 1; // 1
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.sz = static_cast<uint8_t>(enc.sz);
inst.H = static_cast<uint8_t>(enc.H);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.M = static_cast<uint8_t>(enc.M);
inst.L = static_cast<uint8_t>(enc.L);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o2 = static_cast<uint8_t>(enc.o2);
inst.iform = InstForm::FMLA_ASIMDELEM_R_SD;
inst.iclass = InstName::FMLA;
return true;
}
static bool TryExtractSCVTF_ASISDMISCFP16_R(InstData &inst, uint32_t bits) {
// bits
// & 11111111111111111111110000000000
// --------------------------------
// 01011110011110011101100000000000
if ((bits & 0xfffffc00U) != 0x5e79d800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t opcode : 5;
uint32_t _17 : 1; // 0
uint32_t _18 : 1; // 0
uint32_t _19 : 1; // 1
uint32_t _20 : 1; // 1
uint32_t _21 : 1; // 1
uint32_t _22 : 1; // 1
uint32_t a : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t U : 1;
uint32_t _30 : 1; // 1
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.a = static_cast<uint8_t>(enc.a);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.U = static_cast<uint8_t>(enc.U);
inst.iform = InstForm::SCVTF_ASISDMISCFP16_R;
inst.iclass = InstName::SCVTF;
return true;
}
static bool TryExtractSCVTF_ASISDMISC_R(InstData &inst, uint32_t bits) {
// bits
// & 11111111101111111111110000000000
// --------------------------------
// 01011110001000011101100000000000
if ((bits & 0xffbffc00U) != 0x5e21d800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t opcode : 5;
uint32_t _17 : 1; // 0
uint32_t _18 : 1; // 0
uint32_t _19 : 1; // 0
uint32_t _20 : 1; // 0
uint32_t _21 : 1; // 1
uint32_t sz : 1;
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t U : 1;
uint32_t _30 : 1; // 1
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.sz = static_cast<uint8_t>(enc.sz);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.U = static_cast<uint8_t>(enc.U);
inst.iform = InstForm::SCVTF_ASISDMISC_R;
inst.iclass = InstName::SCVTF;
return true;
}
static bool TryExtractSCVTF_ASIMDMISCFP16_R(InstData &inst, uint32_t bits) {
// bits
// & 10111111111111111111110000000000
// --------------------------------
// 00001110011110011101100000000000
if ((bits & 0xbffffc00U) != 0xe79d800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t opcode : 5;
uint32_t _17 : 1; // 0
uint32_t _18 : 1; // 0
uint32_t _19 : 1; // 1
uint32_t _20 : 1; // 1
uint32_t _21 : 1; // 1
uint32_t _22 : 1; // 1
uint32_t a : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.a = static_cast<uint8_t>(enc.a);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.iform = InstForm::SCVTF_ASIMDMISCFP16_R;
inst.iclass = InstName::SCVTF;
return true;
}
static bool TryExtractSCVTF_ASIMDMISC_R(InstData &inst, uint32_t bits) {
// bits
// & 10111111101111111111110000000000
// --------------------------------
// 00001110001000011101100000000000
if ((bits & 0xbfbffc00U) != 0xe21d800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t opcode : 5;
uint32_t _17 : 1; // 0
uint32_t _18 : 1; // 0
uint32_t _19 : 1; // 0
uint32_t _20 : 1; // 0
uint32_t _21 : 1; // 1
uint32_t sz : 1;
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.sz = static_cast<uint8_t>(enc.sz);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.U = static_cast<uint8_t>(enc.U);
inst.iform = InstForm::SCVTF_ASIMDMISC_R;
inst.iclass = InstName::SCVTF;
return true;
}
static bool TryExtractUMULL_ASIMDDIFF_L(InstData &inst, uint32_t bits) {
// bits
// & 10111111001000001111110000000000
// --------------------------------
// 00101110001000001100000000000000
if ((bits & 0xbf20fc00U) != 0x2e20c000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t opcode : 4;
uint32_t Rm : 5;
uint32_t _21 : 1; // 1
uint32_t size : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.U = static_cast<uint8_t>(enc.U);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::UMULL_ASIMDDIFF_L;
inst.iclass = InstName::UMULL;
return true;
}
static bool TryExtractFMUL_ASIMDSAMEFP16_ONLY(InstData &inst, uint32_t bits) {
// bits
// & 10111111111000001111110000000000
// --------------------------------
// 00101110010000000001110000000000
if ((bits & 0xbfe0fc00U) != 0x2e401c00U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t opcode : 3;
uint32_t _14 : 1; // 0
uint32_t _15 : 1; // 0
uint32_t Rm : 5;
uint32_t _21 : 1; // 0
uint32_t _22 : 1; // 1
uint32_t a : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.a = static_cast<uint8_t>(enc.a);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.U = static_cast<uint8_t>(enc.U);
inst.iform = InstForm::FMUL_ASIMDSAMEFP16_ONLY;
inst.iclass = InstName::FMUL;
return true;
}
static bool TryExtractFMUL_ASIMDSAME_ONLY(InstData &inst, uint32_t bits) {
// bits
// & 10111111101000001111110000000000
// --------------------------------
// 00101110001000001101110000000000
if ((bits & 0xbfa0fc00U) != 0x2e20dc00U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t opcode : 5;
uint32_t Rm : 5;
uint32_t _21 : 1; // 1
uint32_t sz : 1;
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.sz = static_cast<uint8_t>(enc.sz);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.U = static_cast<uint8_t>(enc.U);
inst.iform = InstForm::FMUL_ASIMDSAME_ONLY;
inst.iclass = InstName::FMUL;
return true;
}
static bool TryExtractFMLA_ASIMDSAMEFP16_ONLY(InstData &inst, uint32_t bits) {
// bits
// & 10111111111000001111110000000000
// --------------------------------
// 00001110010000000000110000000000
if ((bits & 0xbfe0fc00U) != 0xe400c00U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t opcode : 3;
uint32_t _14 : 1; // 0
uint32_t _15 : 1; // 0
uint32_t Rm : 5;
uint32_t _21 : 1; // 0
uint32_t _22 : 1; // 1
uint32_t a : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.a = static_cast<uint8_t>(enc.a);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.U = static_cast<uint8_t>(enc.U);
inst.iform = InstForm::FMLA_ASIMDSAMEFP16_ONLY;
inst.iclass = InstName::FMLA;
return true;
}
static bool TryExtractFMLA_ASIMDSAME_ONLY(InstData &inst, uint32_t bits) {
// bits
// & 10111111101000001111110000000000
// --------------------------------
// 00001110001000001100110000000000
if ((bits & 0xbfa0fc00U) != 0xe20cc00U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t opcode : 5;
uint32_t Rm : 5;
uint32_t _21 : 1; // 1
uint32_t sz : 1;
uint32_t op : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.sz = static_cast<uint8_t>(enc.sz);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.U = static_cast<uint8_t>(enc.U);
inst.op = static_cast<uint8_t>(enc.op);
inst.iform = InstForm::FMLA_ASIMDSAME_ONLY;
inst.iclass = InstName::FMLA;
return true;
}
static bool TryExtractSDIV_32_DP_2SRC(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 00011010110000000000110000000000
if ((bits & 0xffe0fc00U) != 0x1ac00c00U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t o1 : 1;
uint32_t opcode2 : 5;
uint32_t Rm : 5;
uint32_t _21 : 1; // 0
uint32_t _22 : 1; // 1
uint32_t _23 : 1; // 1
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t op : 1;
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.opcode2 = static_cast<uint8_t>(enc.opcode2);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.sf = static_cast<uint8_t>(enc.sf);
inst.o1 = static_cast<uint8_t>(enc.o1);
inst.op = static_cast<uint8_t>(enc.op);
inst.iform = InstForm::SDIV_32_DP_2SRC;
inst.iclass = InstName::SDIV;
return true;
}
static bool TryExtractSDIV_64_DP_2SRC(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 10011010110000000000110000000000
if ((bits & 0xffe0fc00U) != 0x9ac00c00U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t o1 : 1;
uint32_t opcode2 : 5;
uint32_t Rm : 5;
uint32_t _21 : 1; // 0
uint32_t _22 : 1; // 1
uint32_t _23 : 1; // 1
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t op : 1;
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.opcode2 = static_cast<uint8_t>(enc.opcode2);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.sf = static_cast<uint8_t>(enc.sf);
inst.o1 = static_cast<uint8_t>(enc.o1);
inst.op = static_cast<uint8_t>(enc.op);
inst.iform = InstForm::SDIV_64_DP_2SRC;
inst.iclass = InstName::SDIV;
return true;
}
static bool TryExtractADD_32_ADDSUB_IMM(InstData &inst, uint32_t bits) {
if (false && TryExtractMOV_ADD_32_ADDSUB_IMM(inst, bits))
return true;
// bits
// & 11111111000000000000000000000000
// --------------------------------
// 00010001000000000000000000000000
if ((bits & 0xff000000U) != 0x11000000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t imm12 : 12;
uint32_t shift : 2;
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 0
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t op : 1;
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.imm12.uimm = static_cast<uint64_t>(enc.imm12);
inst.shift = static_cast<uint8_t>(enc.shift);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.sf = static_cast<uint8_t>(enc.sf);
inst.op = static_cast<uint8_t>(enc.op);
inst.iform = InstForm::ADD_32_ADDSUB_IMM;
inst.iclass = InstName::ADD;
return true;
}
static bool TryExtractADD_64_ADDSUB_IMM(InstData &inst, uint32_t bits) {
if (false && TryExtractMOV_ADD_64_ADDSUB_IMM(inst, bits))
return true;
// bits
// & 11111111000000000000000000000000
// --------------------------------
// 10010001000000000000000000000000
if ((bits & 0xff000000U) != 0x91000000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t imm12 : 12;
uint32_t shift : 2;
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 0
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t op : 1;
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.imm12.uimm = static_cast<uint64_t>(enc.imm12);
inst.shift = static_cast<uint8_t>(enc.shift);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.sf = static_cast<uint8_t>(enc.sf);
inst.op = static_cast<uint8_t>(enc.op);
inst.iform = InstForm::ADD_64_ADDSUB_IMM;
inst.iclass = InstName::ADD;
return true;
}
static bool TryExtractRBIT_32_DP_1SRC(InstData &inst, uint32_t bits) {
// bits
// & 11111111111111111111110000000000
// --------------------------------
// 01011010110000000000000000000000
if ((bits & 0xfffffc00U) != 0x5ac00000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t opcode : 6;
uint32_t opcode2 : 5;
uint32_t _21 : 1; // 0
uint32_t _22 : 1; // 1
uint32_t _23 : 1; // 1
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t _30 : 1; // 1
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.opcode2 = static_cast<uint8_t>(enc.opcode2);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.sf = static_cast<uint8_t>(enc.sf);
inst.iform = InstForm::RBIT_32_DP_1SRC;
inst.iclass = InstName::RBIT;
return true;
}
static bool TryExtractRBIT_64_DP_1SRC(InstData &inst, uint32_t bits) {
// bits
// & 11111111111111111111110000000000
// --------------------------------
// 11011010110000000000000000000000
if ((bits & 0xfffffc00U) != 0xdac00000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t opcode : 6;
uint32_t opcode2 : 5;
uint32_t _21 : 1; // 0
uint32_t _22 : 1; // 1
uint32_t _23 : 1; // 1
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t _30 : 1; // 1
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.opcode2 = static_cast<uint8_t>(enc.opcode2);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.sf = static_cast<uint8_t>(enc.sf);
inst.iform = InstForm::RBIT_64_DP_1SRC;
inst.iclass = InstName::RBIT;
return true;
}
static bool TryExtractSMNEGL_SMSUBL_64WA_DP_3SRC(InstData &inst,
uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 10011011001000001111110000000000
if ((bits & 0xffe0fc00U) != 0x9b20fc00U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t Ra : 5;
uint32_t o0 : 1;
uint32_t Rm : 5;
uint32_t _21 : 1; // 1
uint32_t _22 : 1; // 0
uint32_t U : 1;
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t op54 : 2;
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.U = static_cast<uint8_t>(enc.U);
inst.Ra = static_cast<uint8_t>(enc.Ra);
inst.op54 = static_cast<uint8_t>(enc.op54);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.sf = static_cast<uint8_t>(enc.sf);
inst.o0 = static_cast<uint8_t>(enc.o0);
inst.iform = InstForm::SMNEGL_SMSUBL_64WA_DP_3SRC;
inst.iclass = InstName::SMSUBL;
return true;
}
static bool TryExtractMOV_DUP_ASISDONE_ONLY(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 01011110000000000000010000000000
if ((bits & 0xffe0fc00U) != 0x5e000400U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t imm4 : 4;
uint32_t _15 : 1; // 0
uint32_t imm5 : 5;
uint32_t _21 : 1; // 0
uint32_t _22 : 1; // 0
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t op : 1;
uint32_t _30 : 1; // 1
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.imm5.uimm = static_cast<uint64_t>(enc.imm5);
inst.imm4.uimm = static_cast<uint64_t>(enc.imm4);
inst.op = static_cast<uint8_t>(enc.op);
inst.iform = InstForm::MOV_DUP_ASISDONE_ONLY;
inst.iclass = InstName::DUP;
return true;
}
static bool TryExtractSMULL_SMADDL_64WA_DP_3SRC(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 10011011001000000111110000000000
if ((bits & 0xffe0fc00U) != 0x9b207c00U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t Ra : 5;
uint32_t o0 : 1;
uint32_t Rm : 5;
uint32_t _21 : 1; // 1
uint32_t _22 : 1; // 0
uint32_t U : 1;
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t op54 : 2;
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.U = static_cast<uint8_t>(enc.U);
inst.Ra = static_cast<uint8_t>(enc.Ra);
inst.op54 = static_cast<uint8_t>(enc.op54);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.sf = static_cast<uint8_t>(enc.sf);
inst.o0 = static_cast<uint8_t>(enc.o0);
inst.iform = InstForm::SMULL_SMADDL_64WA_DP_3SRC;
inst.iclass = InstName::SMADDL;
return true;
}
static bool TryExtractZIP2_ASIMDPERM_ONLY(InstData &inst, uint32_t bits) {
// bits
// & 10111111001000001111110000000000
// --------------------------------
// 00001110000000000111100000000000
if ((bits & 0xbf20fc00U) != 0xe007800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t _12 : 1; // 1
uint32_t _13 : 1; // 1
uint32_t op : 1;
uint32_t _15 : 1; // 0
uint32_t Rm : 5;
uint32_t _21 : 1; // 0
uint32_t size : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 0
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.op = static_cast<uint8_t>(enc.op);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::ZIP2_ASIMDPERM_ONLY;
inst.iclass = InstName::ZIP2;
return true;
}
static bool TryExtractLDAXRB_LR32_LDSTEXCL(InstData &inst, uint32_t bits) {
// bits
// & 11111111111111111111110000000000
// --------------------------------
// 00001000010111111111110000000000
if ((bits & 0xfffffc00U) != 0x85ffc00U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t Rt2 : 5;
uint32_t o0 : 1;
uint32_t Rs : 5;
uint32_t o1 : 1;
uint32_t L : 1;
uint32_t o2 : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 0
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.L = static_cast<uint8_t>(enc.L);
inst.Rt2 = static_cast<uint8_t>(enc.Rt2);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.o2 = static_cast<uint8_t>(enc.o2);
inst.o1 = static_cast<uint8_t>(enc.o1);
inst.o0 = static_cast<uint8_t>(enc.o0);
inst.iform = InstForm::LDAXRB_LR32_LDSTEXCL;
inst.iclass = InstName::LDAXRB;
return true;
}
static bool TryExtractMNEG_MSUB_32A_DP_3SRC(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 00011011000000001111110000000000
if ((bits & 0xffe0fc00U) != 0x1b00fc00U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t Ra : 5;
uint32_t o0 : 1;
uint32_t Rm : 5;
uint32_t op31 : 3;
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t op54 : 2;
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.Ra = static_cast<uint8_t>(enc.Ra);
inst.op54 = static_cast<uint8_t>(enc.op54);
inst.op31 = static_cast<uint8_t>(enc.op31);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.sf = static_cast<uint8_t>(enc.sf);
inst.o0 = static_cast<uint8_t>(enc.o0);
inst.iform = InstForm::MNEG_MSUB_32A_DP_3SRC;
inst.iclass = InstName::MSUB;
return true;
}
static bool TryExtractMNEG_MSUB_64A_DP_3SRC(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 10011011000000001111110000000000
if ((bits & 0xffe0fc00U) != 0x9b00fc00U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t Ra : 5;
uint32_t o0 : 1;
uint32_t Rm : 5;
uint32_t op31 : 3;
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t op54 : 2;
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.Ra = static_cast<uint8_t>(enc.Ra);
inst.op54 = static_cast<uint8_t>(enc.op54);
inst.op31 = static_cast<uint8_t>(enc.op31);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.sf = static_cast<uint8_t>(enc.sf);
inst.o0 = static_cast<uint8_t>(enc.o0);
inst.iform = InstForm::MNEG_MSUB_64A_DP_3SRC;
inst.iclass = InstName::MSUB;
return true;
}
static bool TryExtractHVC_EX_EXCEPTION(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000000000000000011111
// --------------------------------
// 11010100000000000000000000000010
if ((bits & 0xffe0001fU) != 0xd4000002U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t LL : 2;
uint32_t op2 : 3;
uint32_t imm16 : 16;
uint32_t opc : 3;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 0
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 0
uint32_t _30 : 1; // 1
uint32_t _31 : 1; // 1
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.LL = static_cast<uint8_t>(enc.LL);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.op2 = static_cast<uint8_t>(enc.op2);
inst.imm16.uimm = static_cast<uint64_t>(enc.imm16);
inst.iform = InstForm::HVC_EX_EXCEPTION;
inst.iclass = InstName::HVC;
return true;
}
static bool TryExtractDCPS3_DC_EXCEPTION(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000000000000000011111
// --------------------------------
// 11010100101000000000000000000011
if ((bits & 0xffe0001fU) != 0xd4a00003U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t LL : 2;
uint32_t op2 : 3;
uint32_t imm16 : 16;
uint32_t opc : 3;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 0
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 0
uint32_t _30 : 1; // 1
uint32_t _31 : 1; // 1
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.LL = static_cast<uint8_t>(enc.LL);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.op2 = static_cast<uint8_t>(enc.op2);
inst.imm16.uimm = static_cast<uint64_t>(enc.imm16);
inst.iform = InstForm::DCPS3_DC_EXCEPTION;
inst.iclass = InstName::DCPS3;
return true;
}
static bool TryExtractFCVTNU_ASISDMISCFP16_R(InstData &inst, uint32_t bits) {
// bits
// & 11111111111111111111110000000000
// --------------------------------
// 01111110011110011010100000000000
if ((bits & 0xfffffc00U) != 0x7e79a800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t o1 : 1;
uint32_t _13 : 1; // 1
uint32_t _14 : 1; // 0
uint32_t _15 : 1; // 1
uint32_t _16 : 1; // 1
uint32_t _17 : 1; // 0
uint32_t _18 : 1; // 0
uint32_t _19 : 1; // 1
uint32_t _20 : 1; // 1
uint32_t _21 : 1; // 1
uint32_t _22 : 1; // 1
uint32_t o2 : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t U : 1;
uint32_t _30 : 1; // 1
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.U = static_cast<uint8_t>(enc.U);
inst.o2 = static_cast<uint8_t>(enc.o2);
inst.o1 = static_cast<uint8_t>(enc.o1);
inst.iform = InstForm::FCVTNU_ASISDMISCFP16_R;
inst.iclass = InstName::FCVTNU;
return true;
}
static bool TryExtractFCVTNU_ASISDMISC_R(InstData &inst, uint32_t bits) {
// bits
// & 11111111101111111111110000000000
// --------------------------------
// 01111110001000011010100000000000
if ((bits & 0xffbffc00U) != 0x7e21a800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t o1 : 1;
uint32_t _13 : 1; // 1
uint32_t _14 : 1; // 0
uint32_t _15 : 1; // 1
uint32_t _16 : 1; // 1
uint32_t _17 : 1; // 0
uint32_t _18 : 1; // 0
uint32_t _19 : 1; // 0
uint32_t _20 : 1; // 0
uint32_t _21 : 1; // 1
uint32_t sz : 1;
uint32_t o2 : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t U : 1;
uint32_t _30 : 1; // 1
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.sz = static_cast<uint8_t>(enc.sz);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o2 = static_cast<uint8_t>(enc.o2);
inst.o1 = static_cast<uint8_t>(enc.o1);
inst.iform = InstForm::FCVTNU_ASISDMISC_R;
inst.iclass = InstName::FCVTNU;
return true;
}
static bool TryExtractFCVTNU_ASIMDMISCFP16_R(InstData &inst, uint32_t bits) {
// bits
// & 10111111111111111111110000000000
// --------------------------------
// 00101110011110011010100000000000
if ((bits & 0xbffffc00U) != 0x2e79a800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t o1 : 1;
uint32_t _13 : 1; // 1
uint32_t _14 : 1; // 0
uint32_t _15 : 1; // 1
uint32_t _16 : 1; // 1
uint32_t _17 : 1; // 0
uint32_t _18 : 1; // 0
uint32_t _19 : 1; // 1
uint32_t _20 : 1; // 1
uint32_t _21 : 1; // 1
uint32_t _22 : 1; // 1
uint32_t o2 : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o2 = static_cast<uint8_t>(enc.o2);
inst.o1 = static_cast<uint8_t>(enc.o1);
inst.iform = InstForm::FCVTNU_ASIMDMISCFP16_R;
inst.iclass = InstName::FCVTNU;
return true;
}
static bool TryExtractFCVTNU_ASIMDMISC_R(InstData &inst, uint32_t bits) {
// bits
// & 10111111101111111111110000000000
// --------------------------------
// 00101110001000011010100000000000
if ((bits & 0xbfbffc00U) != 0x2e21a800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t o1 : 1;
uint32_t _13 : 1; // 1
uint32_t _14 : 1; // 0
uint32_t _15 : 1; // 1
uint32_t _16 : 1; // 1
uint32_t _17 : 1; // 0
uint32_t _18 : 1; // 0
uint32_t _19 : 1; // 0
uint32_t _20 : 1; // 0
uint32_t _21 : 1; // 1
uint32_t sz : 1;
uint32_t o2 : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.sz = static_cast<uint8_t>(enc.sz);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o2 = static_cast<uint8_t>(enc.o2);
inst.o1 = static_cast<uint8_t>(enc.o1);
inst.iform = InstForm::FCVTNU_ASIMDMISC_R;
inst.iclass = InstName::FCVTNU;
return true;
}
static bool TryExtractSTUMINB_32S_MEMOP(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000011111
// --------------------------------
// 00111000001000000111000000011111
if ((bits & 0xffe0fc1fU) != 0x3820701fU) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t opc : 3;
uint32_t o3 : 1;
uint32_t Rs : 5;
uint32_t _21 : 1; // 1
uint32_t R : 1;
uint32_t A : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.A = static_cast<uint8_t>(enc.A);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.V = static_cast<uint8_t>(enc.V);
inst.R = static_cast<uint8_t>(enc.R);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o3 = static_cast<uint8_t>(enc.o3);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::STUMINB_32S_MEMOP;
inst.iclass = InstName::STUMINB;
return true;
}
static bool TryExtractSTUMINLB_32S_MEMOP(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000011111
// --------------------------------
// 00111000011000000111000000011111
if ((bits & 0xffe0fc1fU) != 0x3860701fU) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t opc : 3;
uint32_t o3 : 1;
uint32_t Rs : 5;
uint32_t _21 : 1; // 1
uint32_t R : 1;
uint32_t A : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.A = static_cast<uint8_t>(enc.A);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.V = static_cast<uint8_t>(enc.V);
inst.R = static_cast<uint8_t>(enc.R);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o3 = static_cast<uint8_t>(enc.o3);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::STUMINLB_32S_MEMOP;
inst.iclass = InstName::STUMINLB;
return true;
}
static bool TryExtractTBNZ_ONLY_TESTBRANCH(InstData &inst, uint32_t bits) {
// bits
// & 01111111000000000000000000000000
// --------------------------------
// 00110111000000000000000000000000
if ((bits & 0x7f000000U) != 0x37000000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t imm14 : 14;
uint32_t b40 : 5;
uint32_t op : 1;
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 0
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t _30 : 1; // 0
uint32_t b5 : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.b5 = static_cast<uint8_t>(enc.b5);
inst.op = static_cast<uint8_t>(enc.op);
inst.imm14.uimm = static_cast<uint64_t>(enc.imm14);
inst.b40 = static_cast<uint8_t>(enc.b40);
inst.iform = InstForm::TBNZ_ONLY_TESTBRANCH;
inst.iclass = InstName::TBNZ;
return true;
}
static bool TryExtractSTCLRH_32S_MEMOP(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000011111
// --------------------------------
// 01111000001000000001000000011111
if ((bits & 0xffe0fc1fU) != 0x7820101fU) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t opc : 3;
uint32_t o3 : 1;
uint32_t Rs : 5;
uint32_t _21 : 1; // 1
uint32_t R : 1;
uint32_t A : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.A = static_cast<uint8_t>(enc.A);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.V = static_cast<uint8_t>(enc.V);
inst.R = static_cast<uint8_t>(enc.R);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o3 = static_cast<uint8_t>(enc.o3);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::STCLRH_32S_MEMOP;
inst.iclass = InstName::STCLRH;
return true;
}
static bool TryExtractSTCLRLH_32S_MEMOP(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000011111
// --------------------------------
// 01111000011000000001000000011111
if ((bits & 0xffe0fc1fU) != 0x7860101fU) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t opc : 3;
uint32_t o3 : 1;
uint32_t Rs : 5;
uint32_t _21 : 1; // 1
uint32_t R : 1;
uint32_t A : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.A = static_cast<uint8_t>(enc.A);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.V = static_cast<uint8_t>(enc.V);
inst.R = static_cast<uint8_t>(enc.R);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o3 = static_cast<uint8_t>(enc.o3);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::STCLRLH_32S_MEMOP;
inst.iclass = InstName::STCLRLH;
return true;
}
static bool TryExtractBL_ONLY_BRANCH_IMM(InstData &inst, uint32_t bits) {
// bits
// & 11111100000000000000000000000000
// --------------------------------
// 10010100000000000000000000000000
if ((bits & 0xfc000000U) != 0x94000000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t imm26 : 26;
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 0
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 0
uint32_t _30 : 1; // 0
uint32_t op : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.imm26.uimm = static_cast<uint64_t>(enc.imm26);
inst.op = static_cast<uint8_t>(enc.op);
inst.iform = InstForm::BL_ONLY_BRANCH_IMM;
inst.iclass = InstName::BL;
return true;
}
static bool TryExtractFCVTMU_ASISDMISCFP16_R(InstData &inst, uint32_t bits) {
// bits
// & 11111111111111111111110000000000
// --------------------------------
// 01111110011110011011100000000000
if ((bits & 0xfffffc00U) != 0x7e79b800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t o1 : 1;
uint32_t _13 : 1; // 1
uint32_t _14 : 1; // 0
uint32_t _15 : 1; // 1
uint32_t _16 : 1; // 1
uint32_t _17 : 1; // 0
uint32_t _18 : 1; // 0
uint32_t _19 : 1; // 1
uint32_t _20 : 1; // 1
uint32_t _21 : 1; // 1
uint32_t _22 : 1; // 1
uint32_t o2 : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t U : 1;
uint32_t _30 : 1; // 1
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.U = static_cast<uint8_t>(enc.U);
inst.o2 = static_cast<uint8_t>(enc.o2);
inst.o1 = static_cast<uint8_t>(enc.o1);
inst.iform = InstForm::FCVTMU_ASISDMISCFP16_R;
inst.iclass = InstName::FCVTMU;
return true;
}
static bool TryExtractFCVTMU_ASISDMISC_R(InstData &inst, uint32_t bits) {
// bits
// & 11111111101111111111110000000000
// --------------------------------
// 01111110001000011011100000000000
if ((bits & 0xffbffc00U) != 0x7e21b800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t o1 : 1;
uint32_t _13 : 1; // 1
uint32_t _14 : 1; // 0
uint32_t _15 : 1; // 1
uint32_t _16 : 1; // 1
uint32_t _17 : 1; // 0
uint32_t _18 : 1; // 0
uint32_t _19 : 1; // 0
uint32_t _20 : 1; // 0
uint32_t _21 : 1; // 1
uint32_t sz : 1;
uint32_t o2 : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t U : 1;
uint32_t _30 : 1; // 1
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.sz = static_cast<uint8_t>(enc.sz);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o2 = static_cast<uint8_t>(enc.o2);
inst.o1 = static_cast<uint8_t>(enc.o1);
inst.iform = InstForm::FCVTMU_ASISDMISC_R;
inst.iclass = InstName::FCVTMU;
return true;
}
static bool TryExtractFCVTMU_ASIMDMISCFP16_R(InstData &inst, uint32_t bits) {
// bits
// & 10111111111111111111110000000000
// --------------------------------
// 00101110011110011011100000000000
if ((bits & 0xbffffc00U) != 0x2e79b800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t o1 : 1;
uint32_t _13 : 1; // 1
uint32_t _14 : 1; // 0
uint32_t _15 : 1; // 1
uint32_t _16 : 1; // 1
uint32_t _17 : 1; // 0
uint32_t _18 : 1; // 0
uint32_t _19 : 1; // 1
uint32_t _20 : 1; // 1
uint32_t _21 : 1; // 1
uint32_t _22 : 1; // 1
uint32_t o2 : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o2 = static_cast<uint8_t>(enc.o2);
inst.o1 = static_cast<uint8_t>(enc.o1);
inst.iform = InstForm::FCVTMU_ASIMDMISCFP16_R;
inst.iclass = InstName::FCVTMU;
return true;
}
static bool TryExtractFCVTMU_ASIMDMISC_R(InstData &inst, uint32_t bits) {
// bits
// & 10111111101111111111110000000000
// --------------------------------
// 00101110001000011011100000000000
if ((bits & 0xbfbffc00U) != 0x2e21b800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t o1 : 1;
uint32_t _13 : 1; // 1
uint32_t _14 : 1; // 0
uint32_t _15 : 1; // 1
uint32_t _16 : 1; // 1
uint32_t _17 : 1; // 0
uint32_t _18 : 1; // 0
uint32_t _19 : 1; // 0
uint32_t _20 : 1; // 0
uint32_t _21 : 1; // 1
uint32_t sz : 1;
uint32_t o2 : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.sz = static_cast<uint8_t>(enc.sz);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o2 = static_cast<uint8_t>(enc.o2);
inst.o1 = static_cast<uint8_t>(enc.o1);
inst.iform = InstForm::FCVTMU_ASIMDMISC_R;
inst.iclass = InstName::FCVTMU;
return true;
}
static bool TryExtractFMAXNMP_ASIMDSAMEFP16_ONLY(InstData &inst,
uint32_t bits) {
// bits
// & 10111111111000001111110000000000
// --------------------------------
// 00101110010000000000010000000000
if ((bits & 0xbfe0fc00U) != 0x2e400400U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t Op3 : 3;
uint32_t _14 : 1; // 0
uint32_t _15 : 1; // 0
uint32_t Rm : 5;
uint32_t _21 : 1; // 0
uint32_t _22 : 1; // 1
uint32_t a : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.a = static_cast<uint8_t>(enc.a);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Op3 = static_cast<uint8_t>(enc.Op3);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.iform = InstForm::FMAXNMP_ASIMDSAMEFP16_ONLY;
inst.iclass = InstName::FMAXNMP;
return true;
}
static bool TryExtractFMAXNMP_ASIMDSAME_ONLY(InstData &inst, uint32_t bits) {
// bits
// & 10111111101000001111110000000000
// --------------------------------
// 00101110001000001100010000000000
if ((bits & 0xbfa0fc00U) != 0x2e20c400U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t opcode : 5;
uint32_t Rm : 5;
uint32_t _21 : 1; // 1
uint32_t sz : 1;
uint32_t o1 : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.sz = static_cast<uint8_t>(enc.sz);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.U = static_cast<uint8_t>(enc.U);
inst.o1 = static_cast<uint8_t>(enc.o1);
inst.iform = InstForm::FMAXNMP_ASIMDSAME_ONLY;
inst.iclass = InstName::FMAXNMP;
return true;
}
static bool TryExtractFMOV_32H_FLOAT2INT(InstData &inst, uint32_t bits) {
// bits
// & 11111111111111111111110000000000
// --------------------------------
// 00011110111001100000000000000000
if ((bits & 0xfffffc00U) != 0x1ee60000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t _12 : 1; // 0
uint32_t _13 : 1; // 0
uint32_t _14 : 1; // 0
uint32_t _15 : 1; // 0
uint32_t opcode : 3;
uint32_t rmode : 2;
uint32_t _21 : 1; // 1
uint32_t type : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t _30 : 1; // 0
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.sf = static_cast<uint8_t>(enc.sf);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.type = static_cast<uint8_t>(enc.type);
inst.rmode = static_cast<uint8_t>(enc.rmode);
inst.iform = InstForm::FMOV_32H_FLOAT2INT;
inst.iclass = InstName::FMOV;
return true;
}
static bool TryExtractFMOV_64H_FLOAT2INT(InstData &inst, uint32_t bits) {
// bits
// & 11111111111111111111110000000000
// --------------------------------
// 10011110111001100000000000000000
if ((bits & 0xfffffc00U) != 0x9ee60000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t _12 : 1; // 0
uint32_t _13 : 1; // 0
uint32_t _14 : 1; // 0
uint32_t _15 : 1; // 0
uint32_t opcode : 3;
uint32_t rmode : 2;
uint32_t _21 : 1; // 1
uint32_t type : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t _30 : 1; // 0
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.sf = static_cast<uint8_t>(enc.sf);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.type = static_cast<uint8_t>(enc.type);
inst.rmode = static_cast<uint8_t>(enc.rmode);
inst.iform = InstForm::FMOV_64H_FLOAT2INT;
inst.iclass = InstName::FMOV;
return true;
}
static bool TryExtractFMOV_H32_FLOAT2INT(InstData &inst, uint32_t bits) {
// bits
// & 11111111111111111111110000000000
// --------------------------------
// 00011110111001110000000000000000
if ((bits & 0xfffffc00U) != 0x1ee70000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t _12 : 1; // 0
uint32_t _13 : 1; // 0
uint32_t _14 : 1; // 0
uint32_t _15 : 1; // 0
uint32_t opcode : 3;
uint32_t rmode : 2;
uint32_t _21 : 1; // 1
uint32_t type : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t _30 : 1; // 0
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.sf = static_cast<uint8_t>(enc.sf);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.type = static_cast<uint8_t>(enc.type);
inst.rmode = static_cast<uint8_t>(enc.rmode);
inst.iform = InstForm::FMOV_H32_FLOAT2INT;
inst.iclass = InstName::FMOV;
return true;
}
static bool TryExtractFMOV_S32_FLOAT2INT(InstData &inst, uint32_t bits) {
// bits
// & 11111111111111111111110000000000
// --------------------------------
// 00011110001001110000000000000000
if ((bits & 0xfffffc00U) != 0x1e270000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t _12 : 1; // 0
uint32_t _13 : 1; // 0
uint32_t _14 : 1; // 0
uint32_t _15 : 1; // 0
uint32_t opcode : 3;
uint32_t rmode : 2;
uint32_t _21 : 1; // 1
uint32_t type : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t _30 : 1; // 0
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.sf = static_cast<uint8_t>(enc.sf);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.type = static_cast<uint8_t>(enc.type);
inst.rmode = static_cast<uint8_t>(enc.rmode);
inst.iform = InstForm::FMOV_S32_FLOAT2INT;
inst.iclass = InstName::FMOV;
return true;
}
static bool TryExtractFMOV_32S_FLOAT2INT(InstData &inst, uint32_t bits) {
// bits
// & 11111111111111111111110000000000
// --------------------------------
// 00011110001001100000000000000000
if ((bits & 0xfffffc00U) != 0x1e260000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t _12 : 1; // 0
uint32_t _13 : 1; // 0
uint32_t _14 : 1; // 0
uint32_t _15 : 1; // 0
uint32_t opcode : 3;
uint32_t rmode : 2;
uint32_t _21 : 1; // 1
uint32_t type : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t _30 : 1; // 0
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.sf = static_cast<uint8_t>(enc.sf);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.type = static_cast<uint8_t>(enc.type);
inst.rmode = static_cast<uint8_t>(enc.rmode);
inst.iform = InstForm::FMOV_32S_FLOAT2INT;
inst.iclass = InstName::FMOV;
return true;
}
static bool TryExtractFMOV_H64_FLOAT2INT(InstData &inst, uint32_t bits) {
// bits
// & 11111111111111111111110000000000
// --------------------------------
// 10011110111001110000000000000000
if ((bits & 0xfffffc00U) != 0x9ee70000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t _12 : 1; // 0
uint32_t _13 : 1; // 0
uint32_t _14 : 1; // 0
uint32_t _15 : 1; // 0
uint32_t opcode : 3;
uint32_t rmode : 2;
uint32_t _21 : 1; // 1
uint32_t type : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t _30 : 1; // 0
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.sf = static_cast<uint8_t>(enc.sf);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.type = static_cast<uint8_t>(enc.type);
inst.rmode = static_cast<uint8_t>(enc.rmode);
inst.iform = InstForm::FMOV_H64_FLOAT2INT;
inst.iclass = InstName::FMOV;
return true;
}
static bool TryExtractFMOV_D64_FLOAT2INT(InstData &inst, uint32_t bits) {
// bits
// & 11111111111111111111110000000000
// --------------------------------
// 10011110011001110000000000000000
if ((bits & 0xfffffc00U) != 0x9e670000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t _12 : 1; // 0
uint32_t _13 : 1; // 0
uint32_t _14 : 1; // 0
uint32_t _15 : 1; // 0
uint32_t opcode : 3;
uint32_t rmode : 2;
uint32_t _21 : 1; // 1
uint32_t type : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t _30 : 1; // 0
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.sf = static_cast<uint8_t>(enc.sf);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.type = static_cast<uint8_t>(enc.type);
inst.rmode = static_cast<uint8_t>(enc.rmode);
inst.iform = InstForm::FMOV_D64_FLOAT2INT;
inst.iclass = InstName::FMOV;
return true;
}
static bool TryExtractFMOV_V64I_FLOAT2INT(InstData &inst, uint32_t bits) {
// bits
// & 11111111111111111111110000000000
// --------------------------------
// 10011110101011110000000000000000
if ((bits & 0xfffffc00U) != 0x9eaf0000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t _12 : 1; // 0
uint32_t _13 : 1; // 0
uint32_t _14 : 1; // 0
uint32_t _15 : 1; // 0
uint32_t opcode : 3;
uint32_t rmode : 2;
uint32_t _21 : 1; // 1
uint32_t type : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t _30 : 1; // 0
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.sf = static_cast<uint8_t>(enc.sf);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.type = static_cast<uint8_t>(enc.type);
inst.rmode = static_cast<uint8_t>(enc.rmode);
inst.iform = InstForm::FMOV_V64I_FLOAT2INT;
inst.iclass = InstName::FMOV;
return true;
}
static bool TryExtractFMOV_64D_FLOAT2INT(InstData &inst, uint32_t bits) {
// bits
// & 11111111111111111111110000000000
// --------------------------------
// 10011110011001100000000000000000
if ((bits & 0xfffffc00U) != 0x9e660000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t _12 : 1; // 0
uint32_t _13 : 1; // 0
uint32_t _14 : 1; // 0
uint32_t _15 : 1; // 0
uint32_t opcode : 3;
uint32_t rmode : 2;
uint32_t _21 : 1; // 1
uint32_t type : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t _30 : 1; // 0
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.sf = static_cast<uint8_t>(enc.sf);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.type = static_cast<uint8_t>(enc.type);
inst.rmode = static_cast<uint8_t>(enc.rmode);
inst.iform = InstForm::FMOV_64D_FLOAT2INT;
inst.iclass = InstName::FMOV;
return true;
}
static bool TryExtractFMOV_64VX_FLOAT2INT(InstData &inst, uint32_t bits) {
// bits
// & 11111111111111111111110000000000
// --------------------------------
// 10011110101011100000000000000000
if ((bits & 0xfffffc00U) != 0x9eae0000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t _12 : 1; // 0
uint32_t _13 : 1; // 0
uint32_t _14 : 1; // 0
uint32_t _15 : 1; // 0
uint32_t opcode : 3;
uint32_t rmode : 2;
uint32_t _21 : 1; // 1
uint32_t type : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t _30 : 1; // 0
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.sf = static_cast<uint8_t>(enc.sf);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.type = static_cast<uint8_t>(enc.type);
inst.rmode = static_cast<uint8_t>(enc.rmode);
inst.iform = InstForm::FMOV_64VX_FLOAT2INT;
inst.iclass = InstName::FMOV;
return true;
}
static bool TryExtractLDCLRAH_32_MEMOP(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 01111000101000000001000000000000
if ((bits & 0xffe0fc00U) != 0x78a01000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t opc : 3;
uint32_t o3 : 1;
uint32_t Rs : 5;
uint32_t _21 : 1; // 1
uint32_t R : 1;
uint32_t A : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.A = static_cast<uint8_t>(enc.A);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.V = static_cast<uint8_t>(enc.V);
inst.R = static_cast<uint8_t>(enc.R);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o3 = static_cast<uint8_t>(enc.o3);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LDCLRAH_32_MEMOP;
inst.iclass = InstName::LDCLRAH;
return true;
}
static bool TryExtractLDCLRALH_32_MEMOP(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 01111000111000000001000000000000
if ((bits & 0xffe0fc00U) != 0x78e01000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t opc : 3;
uint32_t o3 : 1;
uint32_t Rs : 5;
uint32_t _21 : 1; // 1
uint32_t R : 1;
uint32_t A : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.A = static_cast<uint8_t>(enc.A);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.V = static_cast<uint8_t>(enc.V);
inst.R = static_cast<uint8_t>(enc.R);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o3 = static_cast<uint8_t>(enc.o3);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LDCLRALH_32_MEMOP;
inst.iclass = InstName::LDCLRALH;
return true;
}
static bool TryExtractLDCLRH_32_MEMOP(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 01111000001000000001000000000000
if ((bits & 0xffe0fc00U) != 0x78201000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t opc : 3;
uint32_t o3 : 1;
uint32_t Rs : 5;
uint32_t _21 : 1; // 1
uint32_t R : 1;
uint32_t A : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.A = static_cast<uint8_t>(enc.A);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.V = static_cast<uint8_t>(enc.V);
inst.R = static_cast<uint8_t>(enc.R);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o3 = static_cast<uint8_t>(enc.o3);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LDCLRH_32_MEMOP;
inst.iclass = InstName::LDCLRH;
return true;
}
static bool TryExtractLDCLRLH_32_MEMOP(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 01111000011000000001000000000000
if ((bits & 0xffe0fc00U) != 0x78601000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t opc : 3;
uint32_t o3 : 1;
uint32_t Rs : 5;
uint32_t _21 : 1; // 1
uint32_t R : 1;
uint32_t A : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.A = static_cast<uint8_t>(enc.A);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.V = static_cast<uint8_t>(enc.V);
inst.R = static_cast<uint8_t>(enc.R);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o3 = static_cast<uint8_t>(enc.o3);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LDCLRLH_32_MEMOP;
inst.iclass = InstName::LDCLRLH;
return true;
}
static bool TryExtractSABAL_ASIMDDIFF_L(InstData &inst, uint32_t bits) {
// bits
// & 10111111001000001111110000000000
// --------------------------------
// 00001110001000000101000000000000
if ((bits & 0xbf20fc00U) != 0xe205000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t _12 : 1; // 1
uint32_t op : 1;
uint32_t _14 : 1; // 1
uint32_t _15 : 1; // 0
uint32_t Rm : 5;
uint32_t _21 : 1; // 1
uint32_t size : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.op = static_cast<uint8_t>(enc.op);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::SABAL_ASIMDDIFF_L;
inst.iclass = InstName::SABAL;
return true;
}
static bool TryExtractLDSETA_32_MEMOP(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 10111000101000000011000000000000
if ((bits & 0xffe0fc00U) != 0xb8a03000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t opc : 3;
uint32_t o3 : 1;
uint32_t Rs : 5;
uint32_t _21 : 1; // 1
uint32_t R : 1;
uint32_t A : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.A = static_cast<uint8_t>(enc.A);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.V = static_cast<uint8_t>(enc.V);
inst.R = static_cast<uint8_t>(enc.R);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o3 = static_cast<uint8_t>(enc.o3);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LDSETA_32_MEMOP;
inst.iclass = InstName::LDSETA;
return true;
}
static bool TryExtractLDSETAL_32_MEMOP(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 10111000111000000011000000000000
if ((bits & 0xffe0fc00U) != 0xb8e03000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t opc : 3;
uint32_t o3 : 1;
uint32_t Rs : 5;
uint32_t _21 : 1; // 1
uint32_t R : 1;
uint32_t A : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.A = static_cast<uint8_t>(enc.A);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.V = static_cast<uint8_t>(enc.V);
inst.R = static_cast<uint8_t>(enc.R);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o3 = static_cast<uint8_t>(enc.o3);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LDSETAL_32_MEMOP;
inst.iclass = InstName::LDSETAL;
return true;
}
static bool TryExtractLDSET_32_MEMOP(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 10111000001000000011000000000000
if ((bits & 0xffe0fc00U) != 0xb8203000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t opc : 3;
uint32_t o3 : 1;
uint32_t Rs : 5;
uint32_t _21 : 1; // 1
uint32_t R : 1;
uint32_t A : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.A = static_cast<uint8_t>(enc.A);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.V = static_cast<uint8_t>(enc.V);
inst.R = static_cast<uint8_t>(enc.R);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o3 = static_cast<uint8_t>(enc.o3);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LDSET_32_MEMOP;
inst.iclass = InstName::LDSET;
return true;
}
static bool TryExtractLDSETL_32_MEMOP(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 10111000011000000011000000000000
if ((bits & 0xffe0fc00U) != 0xb8603000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t opc : 3;
uint32_t o3 : 1;
uint32_t Rs : 5;
uint32_t _21 : 1; // 1
uint32_t R : 1;
uint32_t A : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.A = static_cast<uint8_t>(enc.A);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.V = static_cast<uint8_t>(enc.V);
inst.R = static_cast<uint8_t>(enc.R);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o3 = static_cast<uint8_t>(enc.o3);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LDSETL_32_MEMOP;
inst.iclass = InstName::LDSETL;
return true;
}
static bool TryExtractLDSETA_64_MEMOP(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 11111000101000000011000000000000
if ((bits & 0xffe0fc00U) != 0xf8a03000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t opc : 3;
uint32_t o3 : 1;
uint32_t Rs : 5;
uint32_t _21 : 1; // 1
uint32_t R : 1;
uint32_t A : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.A = static_cast<uint8_t>(enc.A);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.V = static_cast<uint8_t>(enc.V);
inst.R = static_cast<uint8_t>(enc.R);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o3 = static_cast<uint8_t>(enc.o3);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LDSETA_64_MEMOP;
inst.iclass = InstName::LDSETA;
return true;
}
static bool TryExtractLDSETAL_64_MEMOP(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 11111000111000000011000000000000
if ((bits & 0xffe0fc00U) != 0xf8e03000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t opc : 3;
uint32_t o3 : 1;
uint32_t Rs : 5;
uint32_t _21 : 1; // 1
uint32_t R : 1;
uint32_t A : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.A = static_cast<uint8_t>(enc.A);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.V = static_cast<uint8_t>(enc.V);
inst.R = static_cast<uint8_t>(enc.R);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o3 = static_cast<uint8_t>(enc.o3);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LDSETAL_64_MEMOP;
inst.iclass = InstName::LDSETAL;
return true;
}
static bool TryExtractLDSET_64_MEMOP(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 11111000001000000011000000000000
if ((bits & 0xffe0fc00U) != 0xf8203000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t opc : 3;
uint32_t o3 : 1;
uint32_t Rs : 5;
uint32_t _21 : 1; // 1
uint32_t R : 1;
uint32_t A : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.A = static_cast<uint8_t>(enc.A);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.V = static_cast<uint8_t>(enc.V);
inst.R = static_cast<uint8_t>(enc.R);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o3 = static_cast<uint8_t>(enc.o3);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LDSET_64_MEMOP;
inst.iclass = InstName::LDSET;
return true;
}
static bool TryExtractLDSETL_64_MEMOP(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 11111000011000000011000000000000
if ((bits & 0xffe0fc00U) != 0xf8603000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t opc : 3;
uint32_t o3 : 1;
uint32_t Rs : 5;
uint32_t _21 : 1; // 1
uint32_t R : 1;
uint32_t A : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.A = static_cast<uint8_t>(enc.A);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.V = static_cast<uint8_t>(enc.V);
inst.R = static_cast<uint8_t>(enc.R);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o3 = static_cast<uint8_t>(enc.o3);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LDSETL_64_MEMOP;
inst.iclass = InstName::LDSETL;
return true;
}
static bool TryExtractFRECPS_ASISDSAMEFP16_ONLY(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 01011110010000000011110000000000
if ((bits & 0xffe0fc00U) != 0x5e403c00U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t opcode : 3;
uint32_t _14 : 1; // 0
uint32_t _15 : 1; // 0
uint32_t Rm : 5;
uint32_t _21 : 1; // 0
uint32_t _22 : 1; // 1
uint32_t a : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t U : 1;
uint32_t _30 : 1; // 1
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.a = static_cast<uint8_t>(enc.a);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.U = static_cast<uint8_t>(enc.U);
inst.iform = InstForm::FRECPS_ASISDSAMEFP16_ONLY;
inst.iclass = InstName::FRECPS;
return true;
}
static bool TryExtractFRECPS_ASISDSAME_ONLY(InstData &inst, uint32_t bits) {
// bits
// & 11111111101000001111110000000000
// --------------------------------
// 01011110001000001111110000000000
if ((bits & 0xffa0fc00U) != 0x5e20fc00U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t opcode : 5;
uint32_t Rm : 5;
uint32_t _21 : 1; // 1
uint32_t sz : 1;
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t U : 1;
uint32_t _30 : 1; // 1
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.sz = static_cast<uint8_t>(enc.sz);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.U = static_cast<uint8_t>(enc.U);
inst.iform = InstForm::FRECPS_ASISDSAME_ONLY;
inst.iclass = InstName::FRECPS;
return true;
}
static bool TryExtractFRECPS_ASIMDSAMEFP16_ONLY(InstData &inst, uint32_t bits) {
// bits
// & 10111111111000001111110000000000
// --------------------------------
// 00001110010000000011110000000000
if ((bits & 0xbfe0fc00U) != 0xe403c00U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t opcode : 3;
uint32_t _14 : 1; // 0
uint32_t _15 : 1; // 0
uint32_t Rm : 5;
uint32_t _21 : 1; // 0
uint32_t _22 : 1; // 1
uint32_t a : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.a = static_cast<uint8_t>(enc.a);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.U = static_cast<uint8_t>(enc.U);
inst.iform = InstForm::FRECPS_ASIMDSAMEFP16_ONLY;
inst.iclass = InstName::FRECPS;
return true;
}
static bool TryExtractFRECPS_ASIMDSAME_ONLY(InstData &inst, uint32_t bits) {
// bits
// & 10111111101000001111110000000000
// --------------------------------
// 00001110001000001111110000000000
if ((bits & 0xbfa0fc00U) != 0xe20fc00U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t opcode : 5;
uint32_t Rm : 5;
uint32_t _21 : 1; // 1
uint32_t sz : 1;
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.sz = static_cast<uint8_t>(enc.sz);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.U = static_cast<uint8_t>(enc.U);
inst.iform = InstForm::FRECPS_ASIMDSAME_ONLY;
inst.iclass = InstName::FRECPS;
return true;
}
static bool TryExtractSMLAL_ASIMDDIFF_L(InstData &inst, uint32_t bits) {
// bits
// & 10111111001000001111110000000000
// --------------------------------
// 00001110001000001000000000000000
if ((bits & 0xbf20fc00U) != 0xe208000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t _12 : 1; // 0
uint32_t o1 : 1;
uint32_t _14 : 1; // 0
uint32_t _15 : 1; // 1
uint32_t Rm : 5;
uint32_t _21 : 1; // 1
uint32_t size : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o1 = static_cast<uint8_t>(enc.o1);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::SMLAL_ASIMDDIFF_L;
inst.iclass = InstName::SMLAL;
return true;
}
static bool TryExtractLDSMINAH_32_MEMOP(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 01111000101000000101000000000000
if ((bits & 0xffe0fc00U) != 0x78a05000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t opc : 3;
uint32_t o3 : 1;
uint32_t Rs : 5;
uint32_t _21 : 1; // 1
uint32_t R : 1;
uint32_t A : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.A = static_cast<uint8_t>(enc.A);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.V = static_cast<uint8_t>(enc.V);
inst.R = static_cast<uint8_t>(enc.R);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o3 = static_cast<uint8_t>(enc.o3);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LDSMINAH_32_MEMOP;
inst.iclass = InstName::LDSMINAH;
return true;
}
static bool TryExtractLDSMINALH_32_MEMOP(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 01111000111000000101000000000000
if ((bits & 0xffe0fc00U) != 0x78e05000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t opc : 3;
uint32_t o3 : 1;
uint32_t Rs : 5;
uint32_t _21 : 1; // 1
uint32_t R : 1;
uint32_t A : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.A = static_cast<uint8_t>(enc.A);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.V = static_cast<uint8_t>(enc.V);
inst.R = static_cast<uint8_t>(enc.R);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o3 = static_cast<uint8_t>(enc.o3);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LDSMINALH_32_MEMOP;
inst.iclass = InstName::LDSMINALH;
return true;
}
static bool TryExtractLDSMINH_32_MEMOP(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 01111000001000000101000000000000
if ((bits & 0xffe0fc00U) != 0x78205000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t opc : 3;
uint32_t o3 : 1;
uint32_t Rs : 5;
uint32_t _21 : 1; // 1
uint32_t R : 1;
uint32_t A : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.A = static_cast<uint8_t>(enc.A);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.V = static_cast<uint8_t>(enc.V);
inst.R = static_cast<uint8_t>(enc.R);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o3 = static_cast<uint8_t>(enc.o3);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LDSMINH_32_MEMOP;
inst.iclass = InstName::LDSMINH;
return true;
}
static bool TryExtractLDSMINLH_32_MEMOP(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 01111000011000000101000000000000
if ((bits & 0xffe0fc00U) != 0x78605000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t opc : 3;
uint32_t o3 : 1;
uint32_t Rs : 5;
uint32_t _21 : 1; // 1
uint32_t R : 1;
uint32_t A : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.A = static_cast<uint8_t>(enc.A);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.V = static_cast<uint8_t>(enc.V);
inst.R = static_cast<uint8_t>(enc.R);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o3 = static_cast<uint8_t>(enc.o3);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LDSMINLH_32_MEMOP;
inst.iclass = InstName::LDSMINLH;
return true;
}
static bool TryExtractFRINTI_H_FLOATDP1(InstData &inst, uint32_t bits) {
// bits
// & 11111111111111111111110000000000
// --------------------------------
// 00011110111001111100000000000000
if ((bits & 0xfffffc00U) != 0x1ee7c000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t _12 : 1; // 0
uint32_t _13 : 1; // 0
uint32_t _14 : 1; // 1
uint32_t rmode : 3;
uint32_t _18 : 1; // 1
uint32_t _19 : 1; // 0
uint32_t _20 : 1; // 0
uint32_t _21 : 1; // 1
uint32_t type : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t _30 : 1; // 0
uint32_t M : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.M = static_cast<uint8_t>(enc.M);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.type = static_cast<uint8_t>(enc.type);
inst.rmode = static_cast<uint8_t>(enc.rmode);
inst.iform = InstForm::FRINTI_H_FLOATDP1;
inst.iclass = InstName::FRINTI;
return true;
}
static bool TryExtractFRINTI_S_FLOATDP1(InstData &inst, uint32_t bits) {
// bits
// & 11111111111111111111110000000000
// --------------------------------
// 00011110001001111100000000000000
if ((bits & 0xfffffc00U) != 0x1e27c000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t _12 : 1; // 0
uint32_t _13 : 1; // 0
uint32_t _14 : 1; // 1
uint32_t rmode : 3;
uint32_t _18 : 1; // 1
uint32_t _19 : 1; // 0
uint32_t _20 : 1; // 0
uint32_t _21 : 1; // 1
uint32_t type : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t _30 : 1; // 0
uint32_t M : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.M = static_cast<uint8_t>(enc.M);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.type = static_cast<uint8_t>(enc.type);
inst.rmode = static_cast<uint8_t>(enc.rmode);
inst.iform = InstForm::FRINTI_S_FLOATDP1;
inst.iclass = InstName::FRINTI;
return true;
}
static bool TryExtractFRINTI_D_FLOATDP1(InstData &inst, uint32_t bits) {
// bits
// & 11111111111111111111110000000000
// --------------------------------
// 00011110011001111100000000000000
if ((bits & 0xfffffc00U) != 0x1e67c000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t _12 : 1; // 0
uint32_t _13 : 1; // 0
uint32_t _14 : 1; // 1
uint32_t rmode : 3;
uint32_t _18 : 1; // 1
uint32_t _19 : 1; // 0
uint32_t _20 : 1; // 0
uint32_t _21 : 1; // 1
uint32_t type : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t _30 : 1; // 0
uint32_t M : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.M = static_cast<uint8_t>(enc.M);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.type = static_cast<uint8_t>(enc.type);
inst.rmode = static_cast<uint8_t>(enc.rmode);
inst.iform = InstForm::FRINTI_D_FLOATDP1;
inst.iclass = InstName::FRINTI;
return true;
}
static bool TryExtractSMULH_64_DP_3SRC(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 10011011010000000111110000000000
if ((bits & 0xffe0fc00U) != 0x9b407c00U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t Ra : 5;
uint32_t o0 : 1;
uint32_t Rm : 5;
uint32_t _21 : 1; // 0
uint32_t _22 : 1; // 1
uint32_t U : 1;
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t op54 : 2;
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.U = static_cast<uint8_t>(enc.U);
inst.Ra = static_cast<uint8_t>(enc.Ra);
inst.op54 = static_cast<uint8_t>(enc.op54);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.sf = static_cast<uint8_t>(enc.sf);
inst.o0 = static_cast<uint8_t>(enc.o0);
inst.iform = InstForm::SMULH_64_DP_3SRC;
inst.iclass = InstName::SMULH;
return true;
}
static bool TryExtractFMADD_H_FLOATDP3(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001000000000000000
// --------------------------------
// 00011111110000000000000000000000
if ((bits & 0xffe08000U) != 0x1fc00000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t Ra : 5;
uint32_t o0 : 1;
uint32_t Rm : 5;
uint32_t o1 : 1;
uint32_t type : 2;
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t _30 : 1; // 0
uint32_t M : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.M = static_cast<uint8_t>(enc.M);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.Ra = static_cast<uint8_t>(enc.Ra);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.type = static_cast<uint8_t>(enc.type);
inst.o1 = static_cast<uint8_t>(enc.o1);
inst.o0 = static_cast<uint8_t>(enc.o0);
inst.iform = InstForm::FMADD_H_FLOATDP3;
inst.iclass = InstName::FMADD;
return true;
}
static bool TryExtractFMADD_S_FLOATDP3(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001000000000000000
// --------------------------------
// 00011111000000000000000000000000
if ((bits & 0xffe08000U) != 0x1f000000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t Ra : 5;
uint32_t o0 : 1;
uint32_t Rm : 5;
uint32_t o1 : 1;
uint32_t type : 2;
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t _30 : 1; // 0
uint32_t M : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.M = static_cast<uint8_t>(enc.M);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.Ra = static_cast<uint8_t>(enc.Ra);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.type = static_cast<uint8_t>(enc.type);
inst.o1 = static_cast<uint8_t>(enc.o1);
inst.o0 = static_cast<uint8_t>(enc.o0);
inst.iform = InstForm::FMADD_S_FLOATDP3;
inst.iclass = InstName::FMADD;
return true;
}
static bool TryExtractFMADD_D_FLOATDP3(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001000000000000000
// --------------------------------
// 00011111010000000000000000000000
if ((bits & 0xffe08000U) != 0x1f400000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t Ra : 5;
uint32_t o0 : 1;
uint32_t Rm : 5;
uint32_t o1 : 1;
uint32_t type : 2;
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t _30 : 1; // 0
uint32_t M : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.M = static_cast<uint8_t>(enc.M);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.Ra = static_cast<uint8_t>(enc.Ra);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.type = static_cast<uint8_t>(enc.type);
inst.o1 = static_cast<uint8_t>(enc.o1);
inst.o0 = static_cast<uint8_t>(enc.o0);
inst.iform = InstForm::FMADD_D_FLOATDP3;
inst.iclass = InstName::FMADD;
return true;
}
static bool TryExtractCCMP_32_CONDCMP_REG(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000000000110000010000
// --------------------------------
// 01111010010000000000000000000000
if ((bits & 0xffe00c10U) != 0x7a400000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t nzcv : 4;
uint32_t o3 : 1;
uint32_t Rn : 5;
uint32_t o2 : 1;
uint32_t _11 : 1; // 0
uint32_t cond : 4;
uint32_t Rm : 5;
uint32_t _21 : 1; // 0
uint32_t _22 : 1; // 1
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t op : 1;
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.nzcv = static_cast<uint8_t>(enc.nzcv);
inst.sf = static_cast<uint8_t>(enc.sf);
inst.S = static_cast<uint8_t>(enc.S);
inst.cond = static_cast<uint8_t>(enc.cond);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o3 = static_cast<uint8_t>(enc.o3);
inst.o2 = static_cast<uint8_t>(enc.o2);
inst.op = static_cast<uint8_t>(enc.op);
inst.iform = InstForm::CCMP_32_CONDCMP_REG;
inst.iclass = InstName::CCMP;
return true;
}
static bool TryExtractCCMP_64_CONDCMP_REG(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000000000110000010000
// --------------------------------
// 11111010010000000000000000000000
if ((bits & 0xffe00c10U) != 0xfa400000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t nzcv : 4;
uint32_t o3 : 1;
uint32_t Rn : 5;
uint32_t o2 : 1;
uint32_t _11 : 1; // 0
uint32_t cond : 4;
uint32_t Rm : 5;
uint32_t _21 : 1; // 0
uint32_t _22 : 1; // 1
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t op : 1;
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.nzcv = static_cast<uint8_t>(enc.nzcv);
inst.sf = static_cast<uint8_t>(enc.sf);
inst.S = static_cast<uint8_t>(enc.S);
inst.cond = static_cast<uint8_t>(enc.cond);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o3 = static_cast<uint8_t>(enc.o3);
inst.o2 = static_cast<uint8_t>(enc.o2);
inst.op = static_cast<uint8_t>(enc.op);
inst.iform = InstForm::CCMP_64_CONDCMP_REG;
inst.iclass = InstName::CCMP;
return true;
}
static bool TryExtractSRSHL_ASISDSAME_ONLY(InstData &inst, uint32_t bits) {
// bits
// & 11111111001000001111110000000000
// --------------------------------
// 01011110001000000101010000000000
if ((bits & 0xff20fc00U) != 0x5e205400U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t S : 1;
uint32_t R : 1;
uint32_t _13 : 1; // 0
uint32_t _14 : 1; // 1
uint32_t _15 : 1; // 0
uint32_t Rm : 5;
uint32_t _21 : 1; // 1
uint32_t size : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t U : 1;
uint32_t _30 : 1; // 1
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.R = static_cast<uint8_t>(enc.R);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::SRSHL_ASISDSAME_ONLY;
inst.iclass = InstName::SRSHL;
return true;
}
static bool TryExtractSRSHL_ASIMDSAME_ONLY(InstData &inst, uint32_t bits) {
// bits
// & 10111111001000001111110000000000
// --------------------------------
// 00001110001000000101010000000000
if ((bits & 0xbf20fc00U) != 0xe205400U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t S : 1;
uint32_t R : 1;
uint32_t _13 : 1; // 0
uint32_t _14 : 1; // 1
uint32_t _15 : 1; // 0
uint32_t Rm : 5;
uint32_t _21 : 1; // 1
uint32_t size : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.R = static_cast<uint8_t>(enc.R);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::SRSHL_ASIMDSAME_ONLY;
inst.iclass = InstName::SRSHL;
return true;
}
static bool TryExtractFADD_H_FLOATDP2(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 00011110111000000010100000000000
if ((bits & 0xffe0fc00U) != 0x1ee02800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t op : 1;
uint32_t _13 : 1; // 1
uint32_t _14 : 1; // 0
uint32_t _15 : 1; // 0
uint32_t Rm : 5;
uint32_t _21 : 1; // 1
uint32_t type : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t _30 : 1; // 0
uint32_t M : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.M = static_cast<uint8_t>(enc.M);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.type = static_cast<uint8_t>(enc.type);
inst.op = static_cast<uint8_t>(enc.op);
inst.iform = InstForm::FADD_H_FLOATDP2;
inst.iclass = InstName::FADD;
return true;
}
static bool TryExtractFADD_S_FLOATDP2(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 00011110001000000010100000000000
if ((bits & 0xffe0fc00U) != 0x1e202800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t op : 1;
uint32_t _13 : 1; // 1
uint32_t _14 : 1; // 0
uint32_t _15 : 1; // 0
uint32_t Rm : 5;
uint32_t _21 : 1; // 1
uint32_t type : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t _30 : 1; // 0
uint32_t M : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.M = static_cast<uint8_t>(enc.M);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.type = static_cast<uint8_t>(enc.type);
inst.op = static_cast<uint8_t>(enc.op);
inst.iform = InstForm::FADD_S_FLOATDP2;
inst.iclass = InstName::FADD;
return true;
}
static bool TryExtractFADD_D_FLOATDP2(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 00011110011000000010100000000000
if ((bits & 0xffe0fc00U) != 0x1e602800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t op : 1;
uint32_t _13 : 1; // 1
uint32_t _14 : 1; // 0
uint32_t _15 : 1; // 0
uint32_t Rm : 5;
uint32_t _21 : 1; // 1
uint32_t type : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t _30 : 1; // 0
uint32_t M : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.M = static_cast<uint8_t>(enc.M);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.type = static_cast<uint8_t>(enc.type);
inst.op = static_cast<uint8_t>(enc.op);
inst.iform = InstForm::FADD_D_FLOATDP2;
inst.iclass = InstName::FADD;
return true;
}
static bool TryExtractFMULX_ASISDELEM_RH_H(InstData &inst, uint32_t bits) {
// bits
// & 11111111110000001111010000000000
// --------------------------------
// 01111111000000001001000000000000
if ((bits & 0xffc0f400U) != 0x7f009000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t H : 1;
uint32_t opcode : 4;
uint32_t Rm : 4;
uint32_t M : 1;
uint32_t L : 1;
uint32_t size : 2;
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t U : 1;
uint32_t _30 : 1; // 1
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.H = static_cast<uint8_t>(enc.H);
inst.M = static_cast<uint8_t>(enc.M);
inst.L = static_cast<uint8_t>(enc.L);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.U = static_cast<uint8_t>(enc.U);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::FMULX_ASISDELEM_RH_H;
inst.iclass = InstName::FMULX;
return true;
}
static bool TryExtractFMULX_ASISDELEM_R_SD(InstData &inst, uint32_t bits) {
// bits
// & 11111111100000001111010000000000
// --------------------------------
// 01111111100000001001000000000000
if ((bits & 0xff80f400U) != 0x7f809000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t H : 1;
uint32_t opcode : 4;
uint32_t Rm : 4;
uint32_t M : 1;
uint32_t L : 1;
uint32_t sz : 1;
uint32_t _23 : 1; // 1
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t U : 1;
uint32_t _30 : 1; // 1
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.sz = static_cast<uint8_t>(enc.sz);
inst.H = static_cast<uint8_t>(enc.H);
inst.M = static_cast<uint8_t>(enc.M);
inst.L = static_cast<uint8_t>(enc.L);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.U = static_cast<uint8_t>(enc.U);
inst.iform = InstForm::FMULX_ASISDELEM_R_SD;
inst.iclass = InstName::FMULX;
return true;
}
static bool TryExtractFMULX_ASIMDELEM_RH_H(InstData &inst, uint32_t bits) {
// bits
// & 10111111110000001111010000000000
// --------------------------------
// 00101111000000001001000000000000
if ((bits & 0xbfc0f400U) != 0x2f009000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t H : 1;
uint32_t opcode : 4;
uint32_t Rm : 4;
uint32_t M : 1;
uint32_t L : 1;
uint32_t size : 2;
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Q = static_cast<uint8_t>(enc.Q);
inst.H = static_cast<uint8_t>(enc.H);
inst.M = static_cast<uint8_t>(enc.M);
inst.L = static_cast<uint8_t>(enc.L);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.U = static_cast<uint8_t>(enc.U);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::FMULX_ASIMDELEM_RH_H;
inst.iclass = InstName::FMULX;
return true;
}
static bool TryExtractFMULX_ASIMDELEM_R_SD(InstData &inst, uint32_t bits) {
// bits
// & 10111111100000001111010000000000
// --------------------------------
// 00101111100000001001000000000000
if ((bits & 0xbf80f400U) != 0x2f809000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t H : 1;
uint32_t opcode : 4;
uint32_t Rm : 4;
uint32_t M : 1;
uint32_t L : 1;
uint32_t sz : 1;
uint32_t _23 : 1; // 1
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.sz = static_cast<uint8_t>(enc.sz);
inst.H = static_cast<uint8_t>(enc.H);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.M = static_cast<uint8_t>(enc.M);
inst.L = static_cast<uint8_t>(enc.L);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.U = static_cast<uint8_t>(enc.U);
inst.iform = InstForm::FMULX_ASIMDELEM_R_SD;
inst.iclass = InstName::FMULX;
return true;
}
static bool TryExtractBIC_ASIMDIMM_L_HL(InstData &inst, uint32_t bits) {
// bits
// & 10111111111110001101110000000000
// --------------------------------
// 00101111000000001001010000000000
if ((bits & 0xbff8dc00U) != 0x2f009400U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t h : 1;
uint32_t g : 1;
uint32_t f : 1;
uint32_t e : 1;
uint32_t d : 1;
uint32_t _10 : 1; // 1
uint32_t o2 : 1;
uint32_t cmode : 4;
uint32_t c : 1;
uint32_t b : 1;
uint32_t a : 1;
uint32_t _19 : 1; // 0
uint32_t _20 : 1; // 0
uint32_t _21 : 1; // 0
uint32_t _22 : 1; // 0
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t op : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.a = static_cast<uint8_t>(enc.a);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.c = static_cast<uint8_t>(enc.c);
inst.b = static_cast<uint8_t>(enc.b);
inst.e = static_cast<uint8_t>(enc.e);
inst.d = static_cast<uint8_t>(enc.d);
inst.g = static_cast<uint8_t>(enc.g);
inst.f = static_cast<uint8_t>(enc.f);
inst.h = static_cast<uint8_t>(enc.h);
inst.cmode = static_cast<uint8_t>(enc.cmode);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.o2 = static_cast<uint8_t>(enc.o2);
inst.op = static_cast<uint8_t>(enc.op);
inst.iform = InstForm::BIC_ASIMDIMM_L_HL;
inst.iclass = InstName::BIC;
return true;
}
static bool TryExtractBIC_ASIMDIMM_L_SL(InstData &inst, uint32_t bits) {
// bits
// & 10111111111110001001110000000000
// --------------------------------
// 00101111000000000001010000000000
if ((bits & 0xbff89c00U) != 0x2f001400U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t h : 1;
uint32_t g : 1;
uint32_t f : 1;
uint32_t e : 1;
uint32_t d : 1;
uint32_t _10 : 1; // 1
uint32_t o2 : 1;
uint32_t cmode : 4;
uint32_t c : 1;
uint32_t b : 1;
uint32_t a : 1;
uint32_t _19 : 1; // 0
uint32_t _20 : 1; // 0
uint32_t _21 : 1; // 0
uint32_t _22 : 1; // 0
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t op : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.a = static_cast<uint8_t>(enc.a);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.c = static_cast<uint8_t>(enc.c);
inst.b = static_cast<uint8_t>(enc.b);
inst.e = static_cast<uint8_t>(enc.e);
inst.d = static_cast<uint8_t>(enc.d);
inst.g = static_cast<uint8_t>(enc.g);
inst.f = static_cast<uint8_t>(enc.f);
inst.h = static_cast<uint8_t>(enc.h);
inst.cmode = static_cast<uint8_t>(enc.cmode);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.o2 = static_cast<uint8_t>(enc.o2);
inst.op = static_cast<uint8_t>(enc.op);
inst.iform = InstForm::BIC_ASIMDIMM_L_SL;
inst.iclass = InstName::BIC;
return true;
}
static bool TryExtractDC_SYS_CR_SYSTEM(InstData &inst, uint32_t bits) {
// bits
// & 11111111111110001111000000000000
// --------------------------------
// 11010101000010000111000000000000
if ((bits & 0xfff8f000U) != 0xd5087000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t op2 : 3;
uint32_t CRm : 4;
uint32_t CRn : 4;
uint32_t op1 : 3;
uint32_t op0 : 2;
uint32_t L : 1;
uint32_t _22 : 1; // 0
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 0
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 0
uint32_t _30 : 1; // 1
uint32_t _31 : 1; // 1
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.op0 = static_cast<uint8_t>(enc.op0);
inst.op1 = static_cast<uint8_t>(enc.op1);
inst.op2 = static_cast<uint8_t>(enc.op2);
inst.L = static_cast<uint8_t>(enc.L);
inst.CRn = static_cast<uint8_t>(enc.CRn);
inst.CRm = static_cast<uint8_t>(enc.CRm);
inst.iform = InstForm::DC_SYS_CR_SYSTEM;
inst.iclass = InstName::SYS;
return true;
}
static bool TryExtractPRFM_P_LDST_REGOFF(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000000000110000000000
// --------------------------------
// 11111000101000000000100000000000
if ((bits & 0xffe00c00U) != 0xf8a00800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t S : 1;
uint32_t option : 3;
uint32_t Rm : 5;
uint32_t _21 : 1; // 1
uint32_t opc : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.option = static_cast<uint8_t>(enc.option);
inst.V = static_cast<uint8_t>(enc.V);
inst.S = static_cast<uint8_t>(enc.S);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::PRFM_P_LDST_REGOFF;
inst.iclass = InstName::PRFM;
return true;
}
static bool TryExtractSTUMINH_32S_MEMOP(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000011111
// --------------------------------
// 01111000001000000111000000011111
if ((bits & 0xffe0fc1fU) != 0x7820701fU) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t opc : 3;
uint32_t o3 : 1;
uint32_t Rs : 5;
uint32_t _21 : 1; // 1
uint32_t R : 1;
uint32_t A : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.A = static_cast<uint8_t>(enc.A);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.V = static_cast<uint8_t>(enc.V);
inst.R = static_cast<uint8_t>(enc.R);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o3 = static_cast<uint8_t>(enc.o3);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::STUMINH_32S_MEMOP;
inst.iclass = InstName::STUMINH;
return true;
}
static bool TryExtractSTUMINLH_32S_MEMOP(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000011111
// --------------------------------
// 01111000011000000111000000011111
if ((bits & 0xffe0fc1fU) != 0x7860701fU) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t opc : 3;
uint32_t o3 : 1;
uint32_t Rs : 5;
uint32_t _21 : 1; // 1
uint32_t R : 1;
uint32_t A : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.A = static_cast<uint8_t>(enc.A);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.V = static_cast<uint8_t>(enc.V);
inst.R = static_cast<uint8_t>(enc.R);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o3 = static_cast<uint8_t>(enc.o3);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::STUMINLH_32S_MEMOP;
inst.iclass = InstName::STUMINLH;
return true;
}
static bool TryExtractORR_ASIMDIMM_L_HL(InstData &inst, uint32_t bits) {
// bits
// & 10111111111110001101110000000000
// --------------------------------
// 00001111000000001001010000000000
if ((bits & 0xbff8dc00U) != 0xf009400U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t h : 1;
uint32_t g : 1;
uint32_t f : 1;
uint32_t e : 1;
uint32_t d : 1;
uint32_t _10 : 1; // 1
uint32_t o2 : 1;
uint32_t cmode : 4;
uint32_t c : 1;
uint32_t b : 1;
uint32_t a : 1;
uint32_t _19 : 1; // 0
uint32_t _20 : 1; // 0
uint32_t _21 : 1; // 0
uint32_t _22 : 1; // 0
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t op : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.a = static_cast<uint8_t>(enc.a);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.c = static_cast<uint8_t>(enc.c);
inst.b = static_cast<uint8_t>(enc.b);
inst.e = static_cast<uint8_t>(enc.e);
inst.d = static_cast<uint8_t>(enc.d);
inst.g = static_cast<uint8_t>(enc.g);
inst.f = static_cast<uint8_t>(enc.f);
inst.h = static_cast<uint8_t>(enc.h);
inst.cmode = static_cast<uint8_t>(enc.cmode);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.o2 = static_cast<uint8_t>(enc.o2);
inst.op = static_cast<uint8_t>(enc.op);
inst.iform = InstForm::ORR_ASIMDIMM_L_HL;
inst.iclass = InstName::ORR;
return true;
}
static bool TryExtractORR_ASIMDIMM_L_SL(InstData &inst, uint32_t bits) {
// bits
// & 10111111111110001001110000000000
// --------------------------------
// 00001111000000000001010000000000
if ((bits & 0xbff89c00U) != 0xf001400U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t h : 1;
uint32_t g : 1;
uint32_t f : 1;
uint32_t e : 1;
uint32_t d : 1;
uint32_t _10 : 1; // 1
uint32_t o2 : 1;
uint32_t cmode : 4;
uint32_t c : 1;
uint32_t b : 1;
uint32_t a : 1;
uint32_t _19 : 1; // 0
uint32_t _20 : 1; // 0
uint32_t _21 : 1; // 0
uint32_t _22 : 1; // 0
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t op : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.a = static_cast<uint8_t>(enc.a);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.c = static_cast<uint8_t>(enc.c);
inst.b = static_cast<uint8_t>(enc.b);
inst.e = static_cast<uint8_t>(enc.e);
inst.d = static_cast<uint8_t>(enc.d);
inst.g = static_cast<uint8_t>(enc.g);
inst.f = static_cast<uint8_t>(enc.f);
inst.h = static_cast<uint8_t>(enc.h);
inst.cmode = static_cast<uint8_t>(enc.cmode);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.o2 = static_cast<uint8_t>(enc.o2);
inst.op = static_cast<uint8_t>(enc.op);
inst.iform = InstForm::ORR_ASIMDIMM_L_SL;
inst.iclass = InstName::ORR;
return true;
}
static bool TryExtractFCVTAU_32H_FLOAT2INT(InstData &inst, uint32_t bits) {
// bits
// & 11111111111111111111110000000000
// --------------------------------
// 00011110111001010000000000000000
if ((bits & 0xfffffc00U) != 0x1ee50000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t _12 : 1; // 0
uint32_t _13 : 1; // 0
uint32_t _14 : 1; // 0
uint32_t _15 : 1; // 0
uint32_t opcode : 3;
uint32_t rmode : 2;
uint32_t _21 : 1; // 1
uint32_t type : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t _30 : 1; // 0
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.sf = static_cast<uint8_t>(enc.sf);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.type = static_cast<uint8_t>(enc.type);
inst.rmode = static_cast<uint8_t>(enc.rmode);
inst.iform = InstForm::FCVTAU_32H_FLOAT2INT;
inst.iclass = InstName::FCVTAU;
return true;
}
static bool TryExtractFCVTAU_64H_FLOAT2INT(InstData &inst, uint32_t bits) {
// bits
// & 11111111111111111111110000000000
// --------------------------------
// 10011110111001010000000000000000
if ((bits & 0xfffffc00U) != 0x9ee50000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t _12 : 1; // 0
uint32_t _13 : 1; // 0
uint32_t _14 : 1; // 0
uint32_t _15 : 1; // 0
uint32_t opcode : 3;
uint32_t rmode : 2;
uint32_t _21 : 1; // 1
uint32_t type : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t _30 : 1; // 0
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.sf = static_cast<uint8_t>(enc.sf);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.type = static_cast<uint8_t>(enc.type);
inst.rmode = static_cast<uint8_t>(enc.rmode);
inst.iform = InstForm::FCVTAU_64H_FLOAT2INT;
inst.iclass = InstName::FCVTAU;
return true;
}
static bool TryExtractFCVTAU_32S_FLOAT2INT(InstData &inst, uint32_t bits) {
// bits
// & 11111111111111111111110000000000
// --------------------------------
// 00011110001001010000000000000000
if ((bits & 0xfffffc00U) != 0x1e250000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t _12 : 1; // 0
uint32_t _13 : 1; // 0
uint32_t _14 : 1; // 0
uint32_t _15 : 1; // 0
uint32_t opcode : 3;
uint32_t rmode : 2;
uint32_t _21 : 1; // 1
uint32_t type : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t _30 : 1; // 0
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.sf = static_cast<uint8_t>(enc.sf);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.type = static_cast<uint8_t>(enc.type);
inst.rmode = static_cast<uint8_t>(enc.rmode);
inst.iform = InstForm::FCVTAU_32S_FLOAT2INT;
inst.iclass = InstName::FCVTAU;
return true;
}
static bool TryExtractFCVTAU_64S_FLOAT2INT(InstData &inst, uint32_t bits) {
// bits
// & 11111111111111111111110000000000
// --------------------------------
// 10011110001001010000000000000000
if ((bits & 0xfffffc00U) != 0x9e250000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t _12 : 1; // 0
uint32_t _13 : 1; // 0
uint32_t _14 : 1; // 0
uint32_t _15 : 1; // 0
uint32_t opcode : 3;
uint32_t rmode : 2;
uint32_t _21 : 1; // 1
uint32_t type : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t _30 : 1; // 0
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.sf = static_cast<uint8_t>(enc.sf);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.type = static_cast<uint8_t>(enc.type);
inst.rmode = static_cast<uint8_t>(enc.rmode);
inst.iform = InstForm::FCVTAU_64S_FLOAT2INT;
inst.iclass = InstName::FCVTAU;
return true;
}
static bool TryExtractFCVTAU_32D_FLOAT2INT(InstData &inst, uint32_t bits) {
// bits
// & 11111111111111111111110000000000
// --------------------------------
// 00011110011001010000000000000000
if ((bits & 0xfffffc00U) != 0x1e650000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t _12 : 1; // 0
uint32_t _13 : 1; // 0
uint32_t _14 : 1; // 0
uint32_t _15 : 1; // 0
uint32_t opcode : 3;
uint32_t rmode : 2;
uint32_t _21 : 1; // 1
uint32_t type : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t _30 : 1; // 0
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.sf = static_cast<uint8_t>(enc.sf);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.type = static_cast<uint8_t>(enc.type);
inst.rmode = static_cast<uint8_t>(enc.rmode);
inst.iform = InstForm::FCVTAU_32D_FLOAT2INT;
inst.iclass = InstName::FCVTAU;
return true;
}
static bool TryExtractFCVTAU_64D_FLOAT2INT(InstData &inst, uint32_t bits) {
// bits
// & 11111111111111111111110000000000
// --------------------------------
// 10011110011001010000000000000000
if ((bits & 0xfffffc00U) != 0x9e650000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t _12 : 1; // 0
uint32_t _13 : 1; // 0
uint32_t _14 : 1; // 0
uint32_t _15 : 1; // 0
uint32_t opcode : 3;
uint32_t rmode : 2;
uint32_t _21 : 1; // 1
uint32_t type : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t _30 : 1; // 0
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.sf = static_cast<uint8_t>(enc.sf);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.type = static_cast<uint8_t>(enc.type);
inst.rmode = static_cast<uint8_t>(enc.rmode);
inst.iform = InstForm::FCVTAU_64D_FLOAT2INT;
inst.iclass = InstName::FCVTAU;
return true;
}
static bool TryExtractLDXR_LR32_LDSTEXCL(InstData &inst, uint32_t bits) {
// bits
// & 11111111111111111111110000000000
// --------------------------------
// 10001000010111110111110000000000
if ((bits & 0xfffffc00U) != 0x885f7c00U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t Rt2 : 5;
uint32_t o0 : 1;
uint32_t Rs : 5;
uint32_t o1 : 1;
uint32_t L : 1;
uint32_t o2 : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 0
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.L = static_cast<uint8_t>(enc.L);
inst.Rt2 = static_cast<uint8_t>(enc.Rt2);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.o2 = static_cast<uint8_t>(enc.o2);
inst.o1 = static_cast<uint8_t>(enc.o1);
inst.o0 = static_cast<uint8_t>(enc.o0);
inst.iform = InstForm::LDXR_LR32_LDSTEXCL;
inst.iclass = InstName::LDXR;
return true;
}
static bool TryExtractLDXR_LR64_LDSTEXCL(InstData &inst, uint32_t bits) {
// bits
// & 11111111111111111111110000000000
// --------------------------------
// 11001000010111110111110000000000
if ((bits & 0xfffffc00U) != 0xc85f7c00U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t Rt2 : 5;
uint32_t o0 : 1;
uint32_t Rs : 5;
uint32_t o1 : 1;
uint32_t L : 1;
uint32_t o2 : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 0
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.L = static_cast<uint8_t>(enc.L);
inst.Rt2 = static_cast<uint8_t>(enc.Rt2);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.o2 = static_cast<uint8_t>(enc.o2);
inst.o1 = static_cast<uint8_t>(enc.o1);
inst.o0 = static_cast<uint8_t>(enc.o0);
inst.iform = InstForm::LDXR_LR64_LDSTEXCL;
inst.iclass = InstName::LDXR;
return true;
}
static bool TryExtractTLBI_SYS_CR_SYSTEM(InstData &inst, uint32_t bits) {
// bits
// & 11111111111110001111000000000000
// --------------------------------
// 11010101000010001000000000000000
if ((bits & 0xfff8f000U) != 0xd5088000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t op2 : 3;
uint32_t CRm : 4;
uint32_t CRn : 4;
uint32_t op1 : 3;
uint32_t op0 : 2;
uint32_t L : 1;
uint32_t _22 : 1; // 0
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 0
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 0
uint32_t _30 : 1; // 1
uint32_t _31 : 1; // 1
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.op0 = static_cast<uint8_t>(enc.op0);
inst.op1 = static_cast<uint8_t>(enc.op1);
inst.op2 = static_cast<uint8_t>(enc.op2);
inst.L = static_cast<uint8_t>(enc.L);
inst.CRn = static_cast<uint8_t>(enc.CRn);
inst.CRm = static_cast<uint8_t>(enc.CRm);
inst.iform = InstForm::TLBI_SYS_CR_SYSTEM;
inst.iclass = InstName::SYS;
return true;
}
static bool TryExtractSVC_EX_EXCEPTION(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000000000000000011111
// --------------------------------
// 11010100000000000000000000000001
if ((bits & 0xffe0001fU) != 0xd4000001U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t LL : 2;
uint32_t op2 : 3;
uint32_t imm16 : 16;
uint32_t opc : 3;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 0
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 0
uint32_t _30 : 1; // 1
uint32_t _31 : 1; // 1
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.LL = static_cast<uint8_t>(enc.LL);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.op2 = static_cast<uint8_t>(enc.op2);
inst.imm16.uimm = static_cast<uint64_t>(enc.imm16);
inst.iform = InstForm::SVC_EX_EXCEPTION;
inst.iclass = InstName::SVC;
return true;
}
static bool TryExtractFCMPE_H_FLOATCMP(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000011111
// --------------------------------
// 00011110111000000010000000010000
if ((bits & 0xffe0fc1fU) != 0x1ee02010U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t _0 : 1; // 0
uint32_t _1 : 1; // 0
uint32_t _2 : 1; // 0
uint32_t opc : 2;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t _12 : 1; // 0
uint32_t _13 : 1; // 1
uint32_t op : 2;
uint32_t Rm : 5;
uint32_t _21 : 1; // 1
uint32_t type : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t _30 : 1; // 0
uint32_t M : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.M = static_cast<uint8_t>(enc.M);
inst.S = static_cast<uint8_t>(enc.S);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.type = static_cast<uint8_t>(enc.type);
inst.op = static_cast<uint8_t>(enc.op);
inst.iform = InstForm::FCMPE_H_FLOATCMP;
inst.iclass = InstName::FCMPE;
return true;
}
static bool TryExtractFCMPE_HZ_FLOATCMP(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000011111
// --------------------------------
// 00011110111000000010000000011000
if ((bits & 0xffe0fc1fU) != 0x1ee02018U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t _0 : 1; // 0
uint32_t _1 : 1; // 0
uint32_t _2 : 1; // 0
uint32_t opc : 2;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t _12 : 1; // 0
uint32_t _13 : 1; // 1
uint32_t op : 2;
uint32_t Rm : 5;
uint32_t _21 : 1; // 1
uint32_t type : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t _30 : 1; // 0
uint32_t M : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.M = static_cast<uint8_t>(enc.M);
inst.S = static_cast<uint8_t>(enc.S);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.type = static_cast<uint8_t>(enc.type);
inst.op = static_cast<uint8_t>(enc.op);
inst.iform = InstForm::FCMPE_HZ_FLOATCMP;
inst.iclass = InstName::FCMPE;
return true;
}
static bool TryExtractFCMPE_S_FLOATCMP(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000011111
// --------------------------------
// 00011110001000000010000000010000
if ((bits & 0xffe0fc1fU) != 0x1e202010U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t _0 : 1; // 0
uint32_t _1 : 1; // 0
uint32_t _2 : 1; // 0
uint32_t opc : 2;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t _12 : 1; // 0
uint32_t _13 : 1; // 1
uint32_t op : 2;
uint32_t Rm : 5;
uint32_t _21 : 1; // 1
uint32_t type : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t _30 : 1; // 0
uint32_t M : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.M = static_cast<uint8_t>(enc.M);
inst.S = static_cast<uint8_t>(enc.S);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.type = static_cast<uint8_t>(enc.type);
inst.op = static_cast<uint8_t>(enc.op);
inst.iform = InstForm::FCMPE_S_FLOATCMP;
inst.iclass = InstName::FCMPE;
return true;
}
static bool TryExtractFCMPE_SZ_FLOATCMP(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000011111
// --------------------------------
// 00011110001000000010000000011000
if ((bits & 0xffe0fc1fU) != 0x1e202018U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t _0 : 1; // 0
uint32_t _1 : 1; // 0
uint32_t _2 : 1; // 0
uint32_t opc : 2;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t _12 : 1; // 0
uint32_t _13 : 1; // 1
uint32_t op : 2;
uint32_t Rm : 5;
uint32_t _21 : 1; // 1
uint32_t type : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t _30 : 1; // 0
uint32_t M : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.M = static_cast<uint8_t>(enc.M);
inst.S = static_cast<uint8_t>(enc.S);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.type = static_cast<uint8_t>(enc.type);
inst.op = static_cast<uint8_t>(enc.op);
inst.iform = InstForm::FCMPE_SZ_FLOATCMP;
inst.iclass = InstName::FCMPE;
return true;
}
static bool TryExtractFCMPE_D_FLOATCMP(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000011111
// --------------------------------
// 00011110011000000010000000010000
if ((bits & 0xffe0fc1fU) != 0x1e602010U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t _0 : 1; // 0
uint32_t _1 : 1; // 0
uint32_t _2 : 1; // 0
uint32_t opc : 2;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t _12 : 1; // 0
uint32_t _13 : 1; // 1
uint32_t op : 2;
uint32_t Rm : 5;
uint32_t _21 : 1; // 1
uint32_t type : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t _30 : 1; // 0
uint32_t M : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.M = static_cast<uint8_t>(enc.M);
inst.S = static_cast<uint8_t>(enc.S);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.type = static_cast<uint8_t>(enc.type);
inst.op = static_cast<uint8_t>(enc.op);
inst.iform = InstForm::FCMPE_D_FLOATCMP;
inst.iclass = InstName::FCMPE;
return true;
}
static bool TryExtractFCMPE_DZ_FLOATCMP(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000011111
// --------------------------------
// 00011110011000000010000000011000
if ((bits & 0xffe0fc1fU) != 0x1e602018U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t _0 : 1; // 0
uint32_t _1 : 1; // 0
uint32_t _2 : 1; // 0
uint32_t opc : 2;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t _12 : 1; // 0
uint32_t _13 : 1; // 1
uint32_t op : 2;
uint32_t Rm : 5;
uint32_t _21 : 1; // 1
uint32_t type : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t _30 : 1; // 0
uint32_t M : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.M = static_cast<uint8_t>(enc.M);
inst.S = static_cast<uint8_t>(enc.S);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.type = static_cast<uint8_t>(enc.type);
inst.op = static_cast<uint8_t>(enc.op);
inst.iform = InstForm::FCMPE_DZ_FLOATCMP;
inst.iclass = InstName::FCMPE;
return true;
}
static bool TryExtractFRSQRTS_ASISDSAMEFP16_ONLY(InstData &inst,
uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 01011110110000000011110000000000
if ((bits & 0xffe0fc00U) != 0x5ec03c00U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t opcode : 3;
uint32_t _14 : 1; // 0
uint32_t _15 : 1; // 0
uint32_t Rm : 5;
uint32_t _21 : 1; // 0
uint32_t _22 : 1; // 1
uint32_t a : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t U : 1;
uint32_t _30 : 1; // 1
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.a = static_cast<uint8_t>(enc.a);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.U = static_cast<uint8_t>(enc.U);
inst.iform = InstForm::FRSQRTS_ASISDSAMEFP16_ONLY;
inst.iclass = InstName::FRSQRTS;
return true;
}
static bool TryExtractFRSQRTS_ASISDSAME_ONLY(InstData &inst, uint32_t bits) {
// bits
// & 11111111101000001111110000000000
// --------------------------------
// 01011110101000001111110000000000
if ((bits & 0xffa0fc00U) != 0x5ea0fc00U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t opcode : 5;
uint32_t Rm : 5;
uint32_t _21 : 1; // 1
uint32_t sz : 1;
uint32_t _23 : 1; // 1
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t U : 1;
uint32_t _30 : 1; // 1
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.sz = static_cast<uint8_t>(enc.sz);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.U = static_cast<uint8_t>(enc.U);
inst.iform = InstForm::FRSQRTS_ASISDSAME_ONLY;
inst.iclass = InstName::FRSQRTS;
return true;
}
static bool TryExtractFRSQRTS_ASIMDSAMEFP16_ONLY(InstData &inst,
uint32_t bits) {
// bits
// & 10111111111000001111110000000000
// --------------------------------
// 00001110110000000011110000000000
if ((bits & 0xbfe0fc00U) != 0xec03c00U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t opcode : 3;
uint32_t _14 : 1; // 0
uint32_t _15 : 1; // 0
uint32_t Rm : 5;
uint32_t _21 : 1; // 0
uint32_t _22 : 1; // 1
uint32_t a : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.a = static_cast<uint8_t>(enc.a);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.U = static_cast<uint8_t>(enc.U);
inst.iform = InstForm::FRSQRTS_ASIMDSAMEFP16_ONLY;
inst.iclass = InstName::FRSQRTS;
return true;
}
static bool TryExtractFRSQRTS_ASIMDSAME_ONLY(InstData &inst, uint32_t bits) {
// bits
// & 10111111101000001111110000000000
// --------------------------------
// 00001110101000001111110000000000
if ((bits & 0xbfa0fc00U) != 0xea0fc00U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t opcode : 5;
uint32_t Rm : 5;
uint32_t _21 : 1; // 1
uint32_t sz : 1;
uint32_t _23 : 1; // 1
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.sz = static_cast<uint8_t>(enc.sz);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.U = static_cast<uint8_t>(enc.U);
inst.iform = InstForm::FRSQRTS_ASIMDSAME_ONLY;
inst.iclass = InstName::FRSQRTS;
return true;
}
static bool TryExtractFRINTN_H_FLOATDP1(InstData &inst, uint32_t bits) {
// bits
// & 11111111111111111111110000000000
// --------------------------------
// 00011110111001000100000000000000
if ((bits & 0xfffffc00U) != 0x1ee44000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t _12 : 1; // 0
uint32_t _13 : 1; // 0
uint32_t _14 : 1; // 1
uint32_t rmode : 3;
uint32_t _18 : 1; // 1
uint32_t _19 : 1; // 0
uint32_t _20 : 1; // 0
uint32_t _21 : 1; // 1
uint32_t type : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t _30 : 1; // 0
uint32_t M : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.M = static_cast<uint8_t>(enc.M);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.type = static_cast<uint8_t>(enc.type);
inst.rmode = static_cast<uint8_t>(enc.rmode);
inst.iform = InstForm::FRINTN_H_FLOATDP1;
inst.iclass = InstName::FRINTN;
return true;
}
static bool TryExtractFRINTN_S_FLOATDP1(InstData &inst, uint32_t bits) {
// bits
// & 11111111111111111111110000000000
// --------------------------------
// 00011110001001000100000000000000
if ((bits & 0xfffffc00U) != 0x1e244000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t _12 : 1; // 0
uint32_t _13 : 1; // 0
uint32_t _14 : 1; // 1
uint32_t rmode : 3;
uint32_t _18 : 1; // 1
uint32_t _19 : 1; // 0
uint32_t _20 : 1; // 0
uint32_t _21 : 1; // 1
uint32_t type : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t _30 : 1; // 0
uint32_t M : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.M = static_cast<uint8_t>(enc.M);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.type = static_cast<uint8_t>(enc.type);
inst.rmode = static_cast<uint8_t>(enc.rmode);
inst.iform = InstForm::FRINTN_S_FLOATDP1;
inst.iclass = InstName::FRINTN;
return true;
}
static bool TryExtractFRINTN_D_FLOATDP1(InstData &inst, uint32_t bits) {
// bits
// & 11111111111111111111110000000000
// --------------------------------
// 00011110011001000100000000000000
if ((bits & 0xfffffc00U) != 0x1e644000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t _12 : 1; // 0
uint32_t _13 : 1; // 0
uint32_t _14 : 1; // 1
uint32_t rmode : 3;
uint32_t _18 : 1; // 1
uint32_t _19 : 1; // 0
uint32_t _20 : 1; // 0
uint32_t _21 : 1; // 1
uint32_t type : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t _30 : 1; // 0
uint32_t M : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.M = static_cast<uint8_t>(enc.M);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.type = static_cast<uint8_t>(enc.type);
inst.rmode = static_cast<uint8_t>(enc.rmode);
inst.iform = InstForm::FRINTN_D_FLOATDP1;
inst.iclass = InstName::FRINTN;
return true;
}
static bool TryExtractFMOV_H_FLOATIMM(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000000001111111100000
// --------------------------------
// 00011110111000000001000000000000
if ((bits & 0xffe01fe0U) != 0x1ee01000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t imm5 : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t _12 : 1; // 1
uint32_t imm8 : 8;
uint32_t _21 : 1; // 1
uint32_t type : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t _30 : 1; // 0
uint32_t M : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.type = static_cast<uint8_t>(enc.type);
inst.M = static_cast<uint8_t>(enc.M);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.imm8.uimm = static_cast<uint64_t>(enc.imm8);
inst.S = static_cast<uint8_t>(enc.S);
inst.imm5.uimm = static_cast<uint64_t>(enc.imm5);
inst.iform = InstForm::FMOV_H_FLOATIMM;
inst.iclass = InstName::FMOV;
return true;
}
static bool TryExtractFMOV_S_FLOATIMM(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000000001111111100000
// --------------------------------
// 00011110001000000001000000000000
if ((bits & 0xffe01fe0U) != 0x1e201000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t imm5 : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t _12 : 1; // 1
uint32_t imm8 : 8;
uint32_t _21 : 1; // 1
uint32_t type : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t _30 : 1; // 0
uint32_t M : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.type = static_cast<uint8_t>(enc.type);
inst.M = static_cast<uint8_t>(enc.M);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.imm8.uimm = static_cast<uint64_t>(enc.imm8);
inst.S = static_cast<uint8_t>(enc.S);
inst.imm5.uimm = static_cast<uint64_t>(enc.imm5);
inst.iform = InstForm::FMOV_S_FLOATIMM;
inst.iclass = InstName::FMOV;
return true;
}
static bool TryExtractFMOV_D_FLOATIMM(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000000001111111100000
// --------------------------------
// 00011110011000000001000000000000
if ((bits & 0xffe01fe0U) != 0x1e601000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t imm5 : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t _12 : 1; // 1
uint32_t imm8 : 8;
uint32_t _21 : 1; // 1
uint32_t type : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t _30 : 1; // 0
uint32_t M : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.type = static_cast<uint8_t>(enc.type);
inst.M = static_cast<uint8_t>(enc.M);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.imm8.uimm = static_cast<uint64_t>(enc.imm8);
inst.S = static_cast<uint8_t>(enc.S);
inst.imm5.uimm = static_cast<uint64_t>(enc.imm5);
inst.iform = InstForm::FMOV_D_FLOATIMM;
inst.iclass = InstName::FMOV;
return true;
}
static bool TryExtractEOR_32_LOG_IMM(InstData &inst, uint32_t bits) {
// bits
// & 11111111110000000000000000000000
// --------------------------------
// 01010010000000000000000000000000
if ((bits & 0xffc00000U) != 0x52000000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t imms : 6;
uint32_t immr : 6;
uint32_t N : 1;
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 0
uint32_t _28 : 1; // 1
uint32_t opc : 2;
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.sf = static_cast<uint8_t>(enc.sf);
inst.N = static_cast<uint8_t>(enc.N);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.immr.uimm = static_cast<uint64_t>(enc.immr);
inst.imms.uimm = static_cast<uint64_t>(enc.imms);
inst.iform = InstForm::EOR_32_LOG_IMM;
inst.iclass = InstName::EOR;
return true;
}
static bool TryExtractEOR_64_LOG_IMM(InstData &inst, uint32_t bits) {
// bits
// & 11111111100000000000000000000000
// --------------------------------
// 11010010000000000000000000000000
if ((bits & 0xff800000U) != 0xd2000000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t imms : 6;
uint32_t immr : 6;
uint32_t N : 1;
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 0
uint32_t _28 : 1; // 1
uint32_t opc : 2;
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.sf = static_cast<uint8_t>(enc.sf);
inst.N = static_cast<uint8_t>(enc.N);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.immr.uimm = static_cast<uint64_t>(enc.immr);
inst.imms.uimm = static_cast<uint64_t>(enc.imms);
inst.iform = InstForm::EOR_64_LOG_IMM;
inst.iclass = InstName::EOR;
return true;
}
static bool TryExtractMRS_RS_SYSTEM(InstData &inst, uint32_t bits) {
// bits
// & 11111111111100000000000000000000
// --------------------------------
// 11010101001100000000000000000000
if ((bits & 0xfff00000U) != 0xd5300000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t op2 : 3;
uint32_t CRm : 4;
uint32_t CRn : 4;
uint32_t op1 : 3;
uint32_t o0 : 1;
uint32_t _20 : 1; // 1
uint32_t L : 1;
uint32_t _22 : 1; // 0
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 0
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 0
uint32_t _30 : 1; // 1
uint32_t _31 : 1; // 1
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.op1 = static_cast<uint8_t>(enc.op1);
inst.op2 = static_cast<uint8_t>(enc.op2);
inst.L = static_cast<uint8_t>(enc.L);
inst.CRm = static_cast<uint8_t>(enc.CRm);
inst.CRn = static_cast<uint8_t>(enc.CRn);
inst.o0 = static_cast<uint8_t>(enc.o0);
inst.iform = InstForm::MRS_RS_SYSTEM;
inst.iclass = InstName::MRS;
return true;
}
static bool TryExtractESB_HI_SYSTEM(InstData &inst, uint32_t bits) {
// bits
// & 11111111111111111111111111111111
// --------------------------------
// 11010101000000110010001000011111
if ((bits & 0xffffffffU) != 0xd503221fU) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t op2 : 3;
uint32_t CRm : 4;
uint32_t CRn : 4;
uint32_t op1 : 3;
uint32_t op0 : 2;
uint32_t L : 1;
uint32_t _22 : 1; // 0
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 0
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 0
uint32_t _30 : 1; // 1
uint32_t _31 : 1; // 1
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.op0 = static_cast<uint8_t>(enc.op0);
inst.op1 = static_cast<uint8_t>(enc.op1);
inst.op2 = static_cast<uint8_t>(enc.op2);
inst.L = static_cast<uint8_t>(enc.L);
inst.CRn = static_cast<uint8_t>(enc.CRn);
inst.CRm = static_cast<uint8_t>(enc.CRm);
inst.iform = InstForm::ESB_HI_SYSTEM;
inst.iclass = InstName::ESB;
return true;
}
static bool TryExtractFCMLT_ASISDMISCFP16_FZ(InstData &inst, uint32_t bits) {
// bits
// & 11111111111111111111110000000000
// --------------------------------
// 01011110111110001110100000000000
if ((bits & 0xfffffc00U) != 0x5ef8e800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t opcode : 5;
uint32_t _17 : 1; // 0
uint32_t _18 : 1; // 0
uint32_t _19 : 1; // 1
uint32_t _20 : 1; // 1
uint32_t _21 : 1; // 1
uint32_t _22 : 1; // 1
uint32_t a : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t U : 1;
uint32_t _30 : 1; // 1
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.a = static_cast<uint8_t>(enc.a);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.U = static_cast<uint8_t>(enc.U);
inst.iform = InstForm::FCMLT_ASISDMISCFP16_FZ;
inst.iclass = InstName::FCMLT;
return true;
}
static bool TryExtractFCMLT_ASISDMISC_FZ(InstData &inst, uint32_t bits) {
// bits
// & 11111111101111111111110000000000
// --------------------------------
// 01011110101000001110100000000000
if ((bits & 0xffbffc00U) != 0x5ea0e800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t opcode : 5;
uint32_t _17 : 1; // 0
uint32_t _18 : 1; // 0
uint32_t _19 : 1; // 0
uint32_t _20 : 1; // 0
uint32_t _21 : 1; // 1
uint32_t sz : 1;
uint32_t _23 : 1; // 1
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t U : 1;
uint32_t _30 : 1; // 1
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.sz = static_cast<uint8_t>(enc.sz);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.U = static_cast<uint8_t>(enc.U);
inst.iform = InstForm::FCMLT_ASISDMISC_FZ;
inst.iclass = InstName::FCMLT;
return true;
}
static bool TryExtractFCMLT_ASIMDMISCFP16_FZ(InstData &inst, uint32_t bits) {
// bits
// & 10111111111111111111110000000000
// --------------------------------
// 00001110111110001110100000000000
if ((bits & 0xbffffc00U) != 0xef8e800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t opcode : 5;
uint32_t _17 : 1; // 0
uint32_t _18 : 1; // 0
uint32_t _19 : 1; // 1
uint32_t _20 : 1; // 1
uint32_t _21 : 1; // 1
uint32_t _22 : 1; // 1
uint32_t a : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.a = static_cast<uint8_t>(enc.a);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.iform = InstForm::FCMLT_ASIMDMISCFP16_FZ;
inst.iclass = InstName::FCMLT;
return true;
}
static bool TryExtractFCMLT_ASIMDMISC_FZ(InstData &inst, uint32_t bits) {
// bits
// & 10111111101111111111110000000000
// --------------------------------
// 00001110101000001110100000000000
if ((bits & 0xbfbffc00U) != 0xea0e800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t opcode : 5;
uint32_t _17 : 1; // 0
uint32_t _18 : 1; // 0
uint32_t _19 : 1; // 0
uint32_t _20 : 1; // 0
uint32_t _21 : 1; // 1
uint32_t sz : 1;
uint32_t _23 : 1; // 1
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.sz = static_cast<uint8_t>(enc.sz);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.U = static_cast<uint8_t>(enc.U);
inst.iform = InstForm::FCMLT_ASIMDMISC_FZ;
inst.iclass = InstName::FCMLT;
return true;
}
static bool TryExtractSQRDMULH_ASISDSAME_ONLY(InstData &inst, uint32_t bits) {
// bits
// & 11111111001000001111110000000000
// --------------------------------
// 01111110001000001011010000000000
if ((bits & 0xff20fc00U) != 0x7e20b400U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t opcode : 5;
uint32_t Rm : 5;
uint32_t _21 : 1; // 1
uint32_t size : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t U : 1;
uint32_t _30 : 1; // 1
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.U = static_cast<uint8_t>(enc.U);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::SQRDMULH_ASISDSAME_ONLY;
inst.iclass = InstName::SQRDMULH;
return true;
}
static bool TryExtractSQRDMULH_ASIMDSAME_ONLY(InstData &inst, uint32_t bits) {
// bits
// & 10111111001000001111110000000000
// --------------------------------
// 00101110001000001011010000000000
if ((bits & 0xbf20fc00U) != 0x2e20b400U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t opcode : 5;
uint32_t Rm : 5;
uint32_t _21 : 1; // 1
uint32_t size : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.U = static_cast<uint8_t>(enc.U);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::SQRDMULH_ASIMDSAME_ONLY;
inst.iclass = InstName::SQRDMULH;
return true;
}
static bool TryExtractSWPAH_32_MEMOP(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 01111000101000001000000000000000
if ((bits & 0xffe0fc00U) != 0x78a08000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t opc : 3;
uint32_t o3 : 1;
uint32_t Rs : 5;
uint32_t _21 : 1; // 1
uint32_t R : 1;
uint32_t A : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.A = static_cast<uint8_t>(enc.A);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.V = static_cast<uint8_t>(enc.V);
inst.R = static_cast<uint8_t>(enc.R);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o3 = static_cast<uint8_t>(enc.o3);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::SWPAH_32_MEMOP;
inst.iclass = InstName::SWPAH;
return true;
}
static bool TryExtractSWPALH_32_MEMOP(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 01111000111000001000000000000000
if ((bits & 0xffe0fc00U) != 0x78e08000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t opc : 3;
uint32_t o3 : 1;
uint32_t Rs : 5;
uint32_t _21 : 1; // 1
uint32_t R : 1;
uint32_t A : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.A = static_cast<uint8_t>(enc.A);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.V = static_cast<uint8_t>(enc.V);
inst.R = static_cast<uint8_t>(enc.R);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o3 = static_cast<uint8_t>(enc.o3);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::SWPALH_32_MEMOP;
inst.iclass = InstName::SWPALH;
return true;
}
static bool TryExtractSWPH_32_MEMOP(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 01111000001000001000000000000000
if ((bits & 0xffe0fc00U) != 0x78208000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t opc : 3;
uint32_t o3 : 1;
uint32_t Rs : 5;
uint32_t _21 : 1; // 1
uint32_t R : 1;
uint32_t A : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.A = static_cast<uint8_t>(enc.A);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.V = static_cast<uint8_t>(enc.V);
inst.R = static_cast<uint8_t>(enc.R);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o3 = static_cast<uint8_t>(enc.o3);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::SWPH_32_MEMOP;
inst.iclass = InstName::SWPH;
return true;
}
static bool TryExtractSWPLH_32_MEMOP(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 01111000011000001000000000000000
if ((bits & 0xffe0fc00U) != 0x78608000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t opc : 3;
uint32_t o3 : 1;
uint32_t Rs : 5;
uint32_t _21 : 1; // 1
uint32_t R : 1;
uint32_t A : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.A = static_cast<uint8_t>(enc.A);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.V = static_cast<uint8_t>(enc.V);
inst.R = static_cast<uint8_t>(enc.R);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o3 = static_cast<uint8_t>(enc.o3);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::SWPLH_32_MEMOP;
inst.iclass = InstName::SWPLH;
return true;
}
static bool TryExtractDUP_ASISDONE_ONLY(InstData &inst, uint32_t bits) {
if (false && TryExtractMOV_DUP_ASISDONE_ONLY(inst, bits))
return true;
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 01011110000000000000010000000000
if ((bits & 0xffe0fc00U) != 0x5e000400U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t imm4 : 4;
uint32_t _15 : 1; // 0
uint32_t imm5 : 5;
uint32_t _21 : 1; // 0
uint32_t _22 : 1; // 0
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t op : 1;
uint32_t _30 : 1; // 1
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.imm5.uimm = static_cast<uint64_t>(enc.imm5);
inst.imm4.uimm = static_cast<uint64_t>(enc.imm4);
inst.op = static_cast<uint8_t>(enc.op);
inst.iform = InstForm::DUP_ASISDONE_ONLY;
inst.iclass = InstName::DUP;
return true;
}
static bool TryExtractDUP_ASIMDINS_DV_V(InstData &inst, uint32_t bits) {
// bits
// & 10111111111000001111110000000000
// --------------------------------
// 00001110000000000000010000000000
if ((bits & 0xbfe0fc00U) != 0xe000400U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t imm4 : 4;
uint32_t _15 : 1; // 0
uint32_t imm5 : 5;
uint32_t _21 : 1; // 0
uint32_t _22 : 1; // 0
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t op : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.imm5.uimm = static_cast<uint64_t>(enc.imm5);
inst.imm4.uimm = static_cast<uint64_t>(enc.imm4);
inst.op = static_cast<uint8_t>(enc.op);
inst.iform = InstForm::DUP_ASIMDINS_DV_V;
inst.iclass = InstName::DUP;
return true;
}
static bool TryExtractSTLRH_SL32_LDSTEXCL(InstData &inst, uint32_t bits) {
// bits
// & 11111111111111111111110000000000
// --------------------------------
// 01001000100111111111110000000000
if ((bits & 0xfffffc00U) != 0x489ffc00U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t Rt2 : 5;
uint32_t o0 : 1;
uint32_t Rs : 5;
uint32_t o1 : 1;
uint32_t L : 1;
uint32_t o2 : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 0
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.L = static_cast<uint8_t>(enc.L);
inst.Rt2 = static_cast<uint8_t>(enc.Rt2);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.o2 = static_cast<uint8_t>(enc.o2);
inst.o1 = static_cast<uint8_t>(enc.o1);
inst.o0 = static_cast<uint8_t>(enc.o0);
inst.iform = InstForm::STLRH_SL32_LDSTEXCL;
inst.iclass = InstName::STLRH;
return true;
}
static bool TryExtractLDUMAXA_32_MEMOP(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 10111000101000000110000000000000
if ((bits & 0xffe0fc00U) != 0xb8a06000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t opc : 3;
uint32_t o3 : 1;
uint32_t Rs : 5;
uint32_t _21 : 1; // 1
uint32_t R : 1;
uint32_t A : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.A = static_cast<uint8_t>(enc.A);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.V = static_cast<uint8_t>(enc.V);
inst.R = static_cast<uint8_t>(enc.R);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o3 = static_cast<uint8_t>(enc.o3);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LDUMAXA_32_MEMOP;
inst.iclass = InstName::LDUMAXA;
return true;
}
static bool TryExtractLDUMAXAL_32_MEMOP(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 10111000111000000110000000000000
if ((bits & 0xffe0fc00U) != 0xb8e06000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t opc : 3;
uint32_t o3 : 1;
uint32_t Rs : 5;
uint32_t _21 : 1; // 1
uint32_t R : 1;
uint32_t A : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.A = static_cast<uint8_t>(enc.A);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.V = static_cast<uint8_t>(enc.V);
inst.R = static_cast<uint8_t>(enc.R);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o3 = static_cast<uint8_t>(enc.o3);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LDUMAXAL_32_MEMOP;
inst.iclass = InstName::LDUMAXAL;
return true;
}
static bool TryExtractLDUMAX_32_MEMOP(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 10111000001000000110000000000000
if ((bits & 0xffe0fc00U) != 0xb8206000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t opc : 3;
uint32_t o3 : 1;
uint32_t Rs : 5;
uint32_t _21 : 1; // 1
uint32_t R : 1;
uint32_t A : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.A = static_cast<uint8_t>(enc.A);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.V = static_cast<uint8_t>(enc.V);
inst.R = static_cast<uint8_t>(enc.R);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o3 = static_cast<uint8_t>(enc.o3);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LDUMAX_32_MEMOP;
inst.iclass = InstName::LDUMAX;
return true;
}
static bool TryExtractLDUMAXL_32_MEMOP(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 10111000011000000110000000000000
if ((bits & 0xffe0fc00U) != 0xb8606000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t opc : 3;
uint32_t o3 : 1;
uint32_t Rs : 5;
uint32_t _21 : 1; // 1
uint32_t R : 1;
uint32_t A : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.A = static_cast<uint8_t>(enc.A);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.V = static_cast<uint8_t>(enc.V);
inst.R = static_cast<uint8_t>(enc.R);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o3 = static_cast<uint8_t>(enc.o3);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LDUMAXL_32_MEMOP;
inst.iclass = InstName::LDUMAXL;
return true;
}
static bool TryExtractLDUMAXA_64_MEMOP(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 11111000101000000110000000000000
if ((bits & 0xffe0fc00U) != 0xf8a06000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t opc : 3;
uint32_t o3 : 1;
uint32_t Rs : 5;
uint32_t _21 : 1; // 1
uint32_t R : 1;
uint32_t A : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.A = static_cast<uint8_t>(enc.A);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.V = static_cast<uint8_t>(enc.V);
inst.R = static_cast<uint8_t>(enc.R);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o3 = static_cast<uint8_t>(enc.o3);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LDUMAXA_64_MEMOP;
inst.iclass = InstName::LDUMAXA;
return true;
}
static bool TryExtractLDUMAXAL_64_MEMOP(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 11111000111000000110000000000000
if ((bits & 0xffe0fc00U) != 0xf8e06000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t opc : 3;
uint32_t o3 : 1;
uint32_t Rs : 5;
uint32_t _21 : 1; // 1
uint32_t R : 1;
uint32_t A : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.A = static_cast<uint8_t>(enc.A);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.V = static_cast<uint8_t>(enc.V);
inst.R = static_cast<uint8_t>(enc.R);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o3 = static_cast<uint8_t>(enc.o3);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LDUMAXAL_64_MEMOP;
inst.iclass = InstName::LDUMAXAL;
return true;
}
static bool TryExtractLDUMAX_64_MEMOP(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 11111000001000000110000000000000
if ((bits & 0xffe0fc00U) != 0xf8206000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t opc : 3;
uint32_t o3 : 1;
uint32_t Rs : 5;
uint32_t _21 : 1; // 1
uint32_t R : 1;
uint32_t A : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.A = static_cast<uint8_t>(enc.A);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.V = static_cast<uint8_t>(enc.V);
inst.R = static_cast<uint8_t>(enc.R);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o3 = static_cast<uint8_t>(enc.o3);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LDUMAX_64_MEMOP;
inst.iclass = InstName::LDUMAX;
return true;
}
static bool TryExtractLDUMAXL_64_MEMOP(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 11111000011000000110000000000000
if ((bits & 0xffe0fc00U) != 0xf8606000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t opc : 3;
uint32_t o3 : 1;
uint32_t Rs : 5;
uint32_t _21 : 1; // 1
uint32_t R : 1;
uint32_t A : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.A = static_cast<uint8_t>(enc.A);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.V = static_cast<uint8_t>(enc.V);
inst.R = static_cast<uint8_t>(enc.R);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o3 = static_cast<uint8_t>(enc.o3);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LDUMAXL_64_MEMOP;
inst.iclass = InstName::LDUMAXL;
return true;
}
static bool TryExtractSQNEG_ASISDMISC_R(InstData &inst, uint32_t bits) {
// bits
// & 11111111001111111111110000000000
// --------------------------------
// 01111110001000000111100000000000
if ((bits & 0xff3ffc00U) != 0x7e207800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t opcode : 5;
uint32_t _17 : 1; // 0
uint32_t _18 : 1; // 0
uint32_t _19 : 1; // 0
uint32_t _20 : 1; // 0
uint32_t _21 : 1; // 1
uint32_t size : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t U : 1;
uint32_t _30 : 1; // 1
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::SQNEG_ASISDMISC_R;
inst.iclass = InstName::SQNEG;
return true;
}
static bool TryExtractSQNEG_ASIMDMISC_R(InstData &inst, uint32_t bits) {
// bits
// & 10111111001111111111110000000000
// --------------------------------
// 00101110001000000111100000000000
if ((bits & 0xbf3ffc00U) != 0x2e207800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t opcode : 5;
uint32_t _17 : 1; // 0
uint32_t _18 : 1; // 0
uint32_t _19 : 1; // 0
uint32_t _20 : 1; // 0
uint32_t _21 : 1; // 1
uint32_t size : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.U = static_cast<uint8_t>(enc.U);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::SQNEG_ASIMDMISC_R;
inst.iclass = InstName::SQNEG;
return true;
}
static bool TryExtractUHADD_ASIMDSAME_ONLY(InstData &inst, uint32_t bits) {
// bits
// & 10111111001000001111110000000000
// --------------------------------
// 00101110001000000000010000000000
if ((bits & 0xbf20fc00U) != 0x2e200400U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t opcode : 5;
uint32_t Rm : 5;
uint32_t _21 : 1; // 1
uint32_t size : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.U = static_cast<uint8_t>(enc.U);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::UHADD_ASIMDSAME_ONLY;
inst.iclass = InstName::UHADD;
return true;
}
static bool TryExtractCMP_SUBS_32S_ADDSUB_IMM(InstData &inst, uint32_t bits) {
// bits
// & 11111111000000000000000000011111
// --------------------------------
// 01110001000000000000000000011111
if ((bits & 0xff00001fU) != 0x7100001fU) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t imm12 : 12;
uint32_t shift : 2;
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 0
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t op : 1;
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.imm12.uimm = static_cast<uint64_t>(enc.imm12);
inst.shift = static_cast<uint8_t>(enc.shift);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.sf = static_cast<uint8_t>(enc.sf);
inst.op = static_cast<uint8_t>(enc.op);
inst.iform = InstForm::CMP_SUBS_32S_ADDSUB_IMM;
inst.iclass = InstName::SUBS;
return true;
}
static bool TryExtractCMP_SUBS_64S_ADDSUB_IMM(InstData &inst, uint32_t bits) {
// bits
// & 11111111000000000000000000011111
// --------------------------------
// 11110001000000000000000000011111
if ((bits & 0xff00001fU) != 0xf100001fU) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t imm12 : 12;
uint32_t shift : 2;
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 0
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t op : 1;
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.imm12.uimm = static_cast<uint64_t>(enc.imm12);
inst.shift = static_cast<uint8_t>(enc.shift);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.sf = static_cast<uint8_t>(enc.sf);
inst.op = static_cast<uint8_t>(enc.op);
inst.iform = InstForm::CMP_SUBS_64S_ADDSUB_IMM;
inst.iclass = InstName::SUBS;
return true;
}
static bool TryExtractCASAH_C32_LDSTEXCL(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 01001000111000000111110000000000
if ((bits & 0xffe0fc00U) != 0x48e07c00U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t Rt2 : 5;
uint32_t o0 : 1;
uint32_t Rs : 5;
uint32_t o1 : 1;
uint32_t L : 1;
uint32_t o2 : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 0
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.L = static_cast<uint8_t>(enc.L);
inst.Rt2 = static_cast<uint8_t>(enc.Rt2);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.o2 = static_cast<uint8_t>(enc.o2);
inst.o1 = static_cast<uint8_t>(enc.o1);
inst.o0 = static_cast<uint8_t>(enc.o0);
inst.iform = InstForm::CASAH_C32_LDSTEXCL;
inst.iclass = InstName::CASAH;
return true;
}
static bool TryExtractCASALH_C32_LDSTEXCL(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 01001000111000001111110000000000
if ((bits & 0xffe0fc00U) != 0x48e0fc00U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t Rt2 : 5;
uint32_t o0 : 1;
uint32_t Rs : 5;
uint32_t o1 : 1;
uint32_t L : 1;
uint32_t o2 : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 0
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.L = static_cast<uint8_t>(enc.L);
inst.Rt2 = static_cast<uint8_t>(enc.Rt2);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.o2 = static_cast<uint8_t>(enc.o2);
inst.o1 = static_cast<uint8_t>(enc.o1);
inst.o0 = static_cast<uint8_t>(enc.o0);
inst.iform = InstForm::CASALH_C32_LDSTEXCL;
inst.iclass = InstName::CASALH;
return true;
}
static bool TryExtractCASH_C32_LDSTEXCL(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 01001000101000000111110000000000
if ((bits & 0xffe0fc00U) != 0x48a07c00U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t Rt2 : 5;
uint32_t o0 : 1;
uint32_t Rs : 5;
uint32_t o1 : 1;
uint32_t L : 1;
uint32_t o2 : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 0
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.L = static_cast<uint8_t>(enc.L);
inst.Rt2 = static_cast<uint8_t>(enc.Rt2);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.o2 = static_cast<uint8_t>(enc.o2);
inst.o1 = static_cast<uint8_t>(enc.o1);
inst.o0 = static_cast<uint8_t>(enc.o0);
inst.iform = InstForm::CASH_C32_LDSTEXCL;
inst.iclass = InstName::CASH;
return true;
}
static bool TryExtractCASLH_C32_LDSTEXCL(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 01001000101000001111110000000000
if ((bits & 0xffe0fc00U) != 0x48a0fc00U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t Rt2 : 5;
uint32_t o0 : 1;
uint32_t Rs : 5;
uint32_t o1 : 1;
uint32_t L : 1;
uint32_t o2 : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 0
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.L = static_cast<uint8_t>(enc.L);
inst.Rt2 = static_cast<uint8_t>(enc.Rt2);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.o2 = static_cast<uint8_t>(enc.o2);
inst.o1 = static_cast<uint8_t>(enc.o1);
inst.o0 = static_cast<uint8_t>(enc.o0);
inst.iform = InstForm::CASLH_C32_LDSTEXCL;
inst.iclass = InstName::CASLH;
return true;
}
static bool TryExtractADCS_32_ADDSUB_CARRY(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 00111010000000000000000000000000
if ((bits & 0xffe0fc00U) != 0x3a000000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t opcode2 : 6;
uint32_t Rm : 5;
uint32_t _21 : 1; // 0
uint32_t _22 : 1; // 0
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t op : 1;
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.opcode2 = static_cast<uint8_t>(enc.opcode2);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.sf = static_cast<uint8_t>(enc.sf);
inst.op = static_cast<uint8_t>(enc.op);
inst.iform = InstForm::ADCS_32_ADDSUB_CARRY;
inst.iclass = InstName::ADCS;
return true;
}
static bool TryExtractADCS_64_ADDSUB_CARRY(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 10111010000000000000000000000000
if ((bits & 0xffe0fc00U) != 0xba000000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t opcode2 : 6;
uint32_t Rm : 5;
uint32_t _21 : 1; // 0
uint32_t _22 : 1; // 0
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t op : 1;
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.opcode2 = static_cast<uint8_t>(enc.opcode2);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.sf = static_cast<uint8_t>(enc.sf);
inst.op = static_cast<uint8_t>(enc.op);
inst.iform = InstForm::ADCS_64_ADDSUB_CARRY;
inst.iclass = InstName::ADCS;
return true;
}
static bool TryExtractFRINTZ_H_FLOATDP1(InstData &inst, uint32_t bits) {
// bits
// & 11111111111111111111110000000000
// --------------------------------
// 00011110111001011100000000000000
if ((bits & 0xfffffc00U) != 0x1ee5c000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t _12 : 1; // 0
uint32_t _13 : 1; // 0
uint32_t _14 : 1; // 1
uint32_t rmode : 3;
uint32_t _18 : 1; // 1
uint32_t _19 : 1; // 0
uint32_t _20 : 1; // 0
uint32_t _21 : 1; // 1
uint32_t type : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t _30 : 1; // 0
uint32_t M : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.M = static_cast<uint8_t>(enc.M);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.type = static_cast<uint8_t>(enc.type);
inst.rmode = static_cast<uint8_t>(enc.rmode);
inst.iform = InstForm::FRINTZ_H_FLOATDP1;
inst.iclass = InstName::FRINTZ;
return true;
}
static bool TryExtractFRINTZ_S_FLOATDP1(InstData &inst, uint32_t bits) {
// bits
// & 11111111111111111111110000000000
// --------------------------------
// 00011110001001011100000000000000
if ((bits & 0xfffffc00U) != 0x1e25c000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t _12 : 1; // 0
uint32_t _13 : 1; // 0
uint32_t _14 : 1; // 1
uint32_t rmode : 3;
uint32_t _18 : 1; // 1
uint32_t _19 : 1; // 0
uint32_t _20 : 1; // 0
uint32_t _21 : 1; // 1
uint32_t type : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t _30 : 1; // 0
uint32_t M : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.M = static_cast<uint8_t>(enc.M);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.type = static_cast<uint8_t>(enc.type);
inst.rmode = static_cast<uint8_t>(enc.rmode);
inst.iform = InstForm::FRINTZ_S_FLOATDP1;
inst.iclass = InstName::FRINTZ;
return true;
}
static bool TryExtractFRINTZ_D_FLOATDP1(InstData &inst, uint32_t bits) {
// bits
// & 11111111111111111111110000000000
// --------------------------------
// 00011110011001011100000000000000
if ((bits & 0xfffffc00U) != 0x1e65c000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t _12 : 1; // 0
uint32_t _13 : 1; // 0
uint32_t _14 : 1; // 1
uint32_t rmode : 3;
uint32_t _18 : 1; // 1
uint32_t _19 : 1; // 0
uint32_t _20 : 1; // 0
uint32_t _21 : 1; // 1
uint32_t type : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t _30 : 1; // 0
uint32_t M : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.M = static_cast<uint8_t>(enc.M);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.type = static_cast<uint8_t>(enc.type);
inst.rmode = static_cast<uint8_t>(enc.rmode);
inst.iform = InstForm::FRINTZ_D_FLOATDP1;
inst.iclass = InstName::FRINTZ;
return true;
}
static bool TryExtractSCVTF_H32_FLOAT2FIX(InstData &inst, uint32_t bits) {
// bits
// & 11111111111111110000000000000000
// --------------------------------
// 00011110110000100000000000000000
if ((bits & 0xffff0000U) != 0x1ec20000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t scale : 6;
uint32_t opcode : 3;
uint32_t rmode : 2;
uint32_t _21 : 1; // 0
uint32_t type : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t _30 : 1; // 0
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.scale = static_cast<uint8_t>(enc.scale);
inst.sf = static_cast<uint8_t>(enc.sf);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.type = static_cast<uint8_t>(enc.type);
inst.rmode = static_cast<uint8_t>(enc.rmode);
inst.iform = InstForm::SCVTF_H32_FLOAT2FIX;
inst.iclass = InstName::SCVTF;
return true;
}
static bool TryExtractSCVTF_S32_FLOAT2FIX(InstData &inst, uint32_t bits) {
// bits
// & 11111111111111110000000000000000
// --------------------------------
// 00011110000000100000000000000000
if ((bits & 0xffff0000U) != 0x1e020000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t scale : 6;
uint32_t opcode : 3;
uint32_t rmode : 2;
uint32_t _21 : 1; // 0
uint32_t type : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t _30 : 1; // 0
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.scale = static_cast<uint8_t>(enc.scale);
inst.sf = static_cast<uint8_t>(enc.sf);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.type = static_cast<uint8_t>(enc.type);
inst.rmode = static_cast<uint8_t>(enc.rmode);
inst.iform = InstForm::SCVTF_S32_FLOAT2FIX;
inst.iclass = InstName::SCVTF;
return true;
}
static bool TryExtractSCVTF_D32_FLOAT2FIX(InstData &inst, uint32_t bits) {
// bits
// & 11111111111111110000000000000000
// --------------------------------
// 00011110010000100000000000000000
if ((bits & 0xffff0000U) != 0x1e420000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t scale : 6;
uint32_t opcode : 3;
uint32_t rmode : 2;
uint32_t _21 : 1; // 0
uint32_t type : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t _30 : 1; // 0
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.scale = static_cast<uint8_t>(enc.scale);
inst.sf = static_cast<uint8_t>(enc.sf);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.type = static_cast<uint8_t>(enc.type);
inst.rmode = static_cast<uint8_t>(enc.rmode);
inst.iform = InstForm::SCVTF_D32_FLOAT2FIX;
inst.iclass = InstName::SCVTF;
return true;
}
static bool TryExtractSCVTF_H64_FLOAT2FIX(InstData &inst, uint32_t bits) {
// bits
// & 11111111111111110000000000000000
// --------------------------------
// 10011110110000100000000000000000
if ((bits & 0xffff0000U) != 0x9ec20000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t scale : 6;
uint32_t opcode : 3;
uint32_t rmode : 2;
uint32_t _21 : 1; // 0
uint32_t type : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t _30 : 1; // 0
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.scale = static_cast<uint8_t>(enc.scale);
inst.sf = static_cast<uint8_t>(enc.sf);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.type = static_cast<uint8_t>(enc.type);
inst.rmode = static_cast<uint8_t>(enc.rmode);
inst.iform = InstForm::SCVTF_H64_FLOAT2FIX;
inst.iclass = InstName::SCVTF;
return true;
}
static bool TryExtractSCVTF_S64_FLOAT2FIX(InstData &inst, uint32_t bits) {
// bits
// & 11111111111111110000000000000000
// --------------------------------
// 10011110000000100000000000000000
if ((bits & 0xffff0000U) != 0x9e020000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t scale : 6;
uint32_t opcode : 3;
uint32_t rmode : 2;
uint32_t _21 : 1; // 0
uint32_t type : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t _30 : 1; // 0
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.scale = static_cast<uint8_t>(enc.scale);
inst.sf = static_cast<uint8_t>(enc.sf);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.type = static_cast<uint8_t>(enc.type);
inst.rmode = static_cast<uint8_t>(enc.rmode);
inst.iform = InstForm::SCVTF_S64_FLOAT2FIX;
inst.iclass = InstName::SCVTF;
return true;
}
static bool TryExtractSCVTF_D64_FLOAT2FIX(InstData &inst, uint32_t bits) {
// bits
// & 11111111111111110000000000000000
// --------------------------------
// 10011110010000100000000000000000
if ((bits & 0xffff0000U) != 0x9e420000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t scale : 6;
uint32_t opcode : 3;
uint32_t rmode : 2;
uint32_t _21 : 1; // 0
uint32_t type : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t _30 : 1; // 0
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.scale = static_cast<uint8_t>(enc.scale);
inst.sf = static_cast<uint8_t>(enc.sf);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.type = static_cast<uint8_t>(enc.type);
inst.rmode = static_cast<uint8_t>(enc.rmode);
inst.iform = InstForm::SCVTF_D64_FLOAT2FIX;
inst.iclass = InstName::SCVTF;
return true;
}
static bool TryExtractCSETM_CSINV_32_CONDSEL(InstData &inst, uint32_t bits) {
// bits
// & 11111111111111110000111111100000
// --------------------------------
// 01011010100111110000001111100000
if ((bits & 0xffff0fe0U) != 0x5a9f03e0U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t o2 : 1;
uint32_t _11 : 1; // 0
uint32_t cond : 4;
uint32_t Rm : 5;
uint32_t _21 : 1; // 0
uint32_t _22 : 1; // 0
uint32_t _23 : 1; // 1
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t op : 1;
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.sf = static_cast<uint8_t>(enc.sf);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.cond = static_cast<uint8_t>(enc.cond);
if (!(inst.cond != 0xe))
return false;
if (!(inst.cond != 0xf))
return false;
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o2 = static_cast<uint8_t>(enc.o2);
inst.op = static_cast<uint8_t>(enc.op);
inst.iform = InstForm::CSETM_CSINV_32_CONDSEL;
inst.iclass = InstName::CSINV;
return true;
}
static bool TryExtractCSETM_CSINV_64_CONDSEL(InstData &inst, uint32_t bits) {
// bits
// & 11111111111111110000111111100000
// --------------------------------
// 11011010100111110000001111100000
if ((bits & 0xffff0fe0U) != 0xda9f03e0U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t o2 : 1;
uint32_t _11 : 1; // 0
uint32_t cond : 4;
uint32_t Rm : 5;
uint32_t _21 : 1; // 0
uint32_t _22 : 1; // 0
uint32_t _23 : 1; // 1
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t op : 1;
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.sf = static_cast<uint8_t>(enc.sf);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.cond = static_cast<uint8_t>(enc.cond);
if (!(inst.cond != 0xe))
return false;
if (!(inst.cond != 0xf))
return false;
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o2 = static_cast<uint8_t>(enc.o2);
inst.op = static_cast<uint8_t>(enc.op);
inst.iform = InstForm::CSETM_CSINV_64_CONDSEL;
inst.iclass = InstName::CSINV;
return true;
}
static bool TryExtractSQDMLAL_ASISDELEM_L(InstData &inst, uint32_t bits) {
// bits
// & 11111111000000001111010000000000
// --------------------------------
// 01011111000000000011000000000000
if ((bits & 0xff00f400U) != 0x5f003000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t H : 1;
uint32_t _12 : 1; // 1
uint32_t _13 : 1; // 1
uint32_t o2 : 1;
uint32_t _15 : 1; // 0
uint32_t Rm : 4;
uint32_t M : 1;
uint32_t L : 1;
uint32_t size : 2;
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t U : 1;
uint32_t _30 : 1; // 1
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.H = static_cast<uint8_t>(enc.H);
inst.M = static_cast<uint8_t>(enc.M);
inst.L = static_cast<uint8_t>(enc.L);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o2 = static_cast<uint8_t>(enc.o2);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::SQDMLAL_ASISDELEM_L;
inst.iclass = InstName::SQDMLAL;
return true;
}
static bool TryExtractSQDMLAL_ASIMDELEM_L(InstData &inst, uint32_t bits) {
// bits
// & 10111111000000001111010000000000
// --------------------------------
// 00001111000000000011000000000000
if ((bits & 0xbf00f400U) != 0xf003000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t H : 1;
uint32_t _12 : 1; // 1
uint32_t _13 : 1; // 1
uint32_t o2 : 1;
uint32_t _15 : 1; // 0
uint32_t Rm : 4;
uint32_t M : 1;
uint32_t L : 1;
uint32_t size : 2;
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Q = static_cast<uint8_t>(enc.Q);
inst.H = static_cast<uint8_t>(enc.H);
inst.M = static_cast<uint8_t>(enc.M);
inst.L = static_cast<uint8_t>(enc.L);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o2 = static_cast<uint8_t>(enc.o2);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::SQDMLAL_ASIMDELEM_L;
inst.iclass = InstName::SQDMLAL;
return true;
}
static bool TryExtractSHL_ASISDSHF_R(InstData &inst, uint32_t bits) {
// bits
// & 11111111100000001111110000000000
// --------------------------------
// 01011111000000000101010000000000
if ((bits & 0xff80fc00U) != 0x5f005400U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t opcode : 5;
uint32_t immb : 3;
uint32_t immh : 4;
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t U : 1;
uint32_t _30 : 1; // 1
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.immh.uimm = static_cast<uint64_t>(enc.immh);
if (!(inst.immh.uimm != 0x0))
return false;
inst.immb.uimm = static_cast<uint64_t>(enc.immb);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.iform = InstForm::SHL_ASISDSHF_R;
inst.iclass = InstName::SHL;
return true;
}
static bool TryExtractSHL_ASIMDSHF_R(InstData &inst, uint32_t bits) {
// bits
// & 10111111100000001111110000000000
// --------------------------------
// 00001111000000000101010000000000
if ((bits & 0xbf80fc00U) != 0xf005400U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t opcode : 5;
uint32_t immb : 3;
uint32_t immh : 4;
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.immh.uimm = static_cast<uint64_t>(enc.immh);
if (!(inst.immh.uimm != 0x0))
return false;
inst.immb.uimm = static_cast<uint64_t>(enc.immb);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.iform = InstForm::SHL_ASIMDSHF_R;
inst.iclass = InstName::SHL;
return true;
}
static bool TryExtractLD2_ASISDLSE_R2(InstData &inst, uint32_t bits) {
// bits
// & 10111111111111111111000000000000
// --------------------------------
// 00001100010000001000000000000000
if ((bits & 0xbffff000U) != 0xc408000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t size : 2;
uint32_t opcode : 4;
uint32_t _16 : 1; // 0
uint32_t _17 : 1; // 0
uint32_t _18 : 1; // 0
uint32_t _19 : 1; // 0
uint32_t _20 : 1; // 0
uint32_t _21 : 1; // 0
uint32_t L : 1;
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 0
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.L = static_cast<uint8_t>(enc.L);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LD2_ASISDLSE_R2;
inst.iclass = InstName::LD2;
return true;
}
static bool TryExtractLD2_ASISDLSEP_I2_I(InstData &inst, uint32_t bits) {
// bits
// & 10111111111111111111000000000000
// --------------------------------
// 00001100110111111000000000000000
if ((bits & 0xbffff000U) != 0xcdf8000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t size : 2;
uint32_t opcode : 4;
uint32_t Rm : 5;
uint32_t _21 : 1; // 0
uint32_t L : 1;
uint32_t _23 : 1; // 1
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 0
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.L = static_cast<uint8_t>(enc.L);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LD2_ASISDLSEP_I2_I;
inst.iclass = InstName::LD2;
return true;
}
static bool TryExtractLD2_ASISDLSEP_R2_R(InstData &inst, uint32_t bits) {
// bits
// & 10111111111000001111000000000000
// --------------------------------
// 00001100110000001000000000000000
if ((bits & 0xbfe0f000U) != 0xcc08000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t size : 2;
uint32_t opcode : 4;
uint32_t Rm : 5;
uint32_t _21 : 1; // 0
uint32_t L : 1;
uint32_t _23 : 1; // 1
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 0
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.L = static_cast<uint8_t>(enc.L);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LD2_ASISDLSEP_R2_R;
inst.iclass = InstName::LD2;
return true;
}
static bool TryExtractSBFM_32M_BITFIELD(InstData &inst, uint32_t bits) {
if (false && TryExtractSXTH_SBFM_32M_BITFIELD(inst, bits))
return true;
if (false && TryExtractSXTB_SBFM_32M_BITFIELD(inst, bits))
return true;
if (false && TryExtractASR_SBFM_32M_BITFIELD(inst, bits))
return true;
if (false && TryExtractSBFIZ_SBFM_32M_BITFIELD(inst, bits))
return true;
if (false && TryExtractSBFX_SBFM_32M_BITFIELD(inst, bits))
return true;
// bits
// & 11111111110000000000000000000000
// --------------------------------
// 00010011000000000000000000000000
if ((bits & 0xffc00000U) != 0x13000000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t imms : 6;
uint32_t immr : 6;
uint32_t N : 1;
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 0
uint32_t _28 : 1; // 1
uint32_t opc : 2;
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.sf = static_cast<uint8_t>(enc.sf);
inst.N = static_cast<uint8_t>(enc.N);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.immr.uimm = static_cast<uint64_t>(enc.immr);
inst.imms.uimm = static_cast<uint64_t>(enc.imms);
inst.iform = InstForm::SBFM_32M_BITFIELD;
inst.iclass = InstName::SBFM;
return true;
}
static bool TryExtractSBFM_64M_BITFIELD(InstData &inst, uint32_t bits) {
if (false && TryExtractSXTH_SBFM_64M_BITFIELD(inst, bits))
return true;
if (false && TryExtractSXTW_SBFM_64M_BITFIELD(inst, bits))
return true;
if (false && TryExtractSXTB_SBFM_64M_BITFIELD(inst, bits))
return true;
if (false && TryExtractASR_SBFM_64M_BITFIELD(inst, bits))
return true;
if (false && TryExtractSBFIZ_SBFM_64M_BITFIELD(inst, bits))
return true;
if (false && TryExtractSBFX_SBFM_64M_BITFIELD(inst, bits))
return true;
// bits
// & 11111111110000000000000000000000
// --------------------------------
// 10010011010000000000000000000000
if ((bits & 0xffc00000U) != 0x93400000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t imms : 6;
uint32_t immr : 6;
uint32_t N : 1;
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 0
uint32_t _28 : 1; // 1
uint32_t opc : 2;
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.sf = static_cast<uint8_t>(enc.sf);
inst.N = static_cast<uint8_t>(enc.N);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.immr.uimm = static_cast<uint64_t>(enc.immr);
inst.imms.uimm = static_cast<uint64_t>(enc.imms);
inst.iform = InstForm::SBFM_64M_BITFIELD;
inst.iclass = InstName::SBFM;
return true;
}
static bool TryExtractFMAXV_ASIMDALL_ONLY_H(InstData &inst, uint32_t bits) {
// bits
// & 10111111111111111111110000000000
// --------------------------------
// 00001110001100001111100000000000
if ((bits & 0xbffffc00U) != 0xe30f800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t opcode : 5;
uint32_t _17 : 1; // 0
uint32_t _18 : 1; // 0
uint32_t _19 : 1; // 0
uint32_t _20 : 1; // 1
uint32_t _21 : 1; // 1
uint32_t _22 : 1; // 0
uint32_t o1 : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.U = static_cast<uint8_t>(enc.U);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o1 = static_cast<uint8_t>(enc.o1);
inst.iform = InstForm::FMAXV_ASIMDALL_ONLY_H;
inst.iclass = InstName::FMAXV;
return true;
}
static bool TryExtractFMAXV_ASIMDALL_ONLY_SD(InstData &inst, uint32_t bits) {
// bits
// & 10111111101111111111110000000000
// --------------------------------
// 00101110001100001111100000000000
if ((bits & 0xbfbffc00U) != 0x2e30f800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t opcode : 5;
uint32_t _17 : 1; // 0
uint32_t _18 : 1; // 0
uint32_t _19 : 1; // 0
uint32_t _20 : 1; // 1
uint32_t _21 : 1; // 1
uint32_t sz : 1;
uint32_t o1 : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.sz = static_cast<uint8_t>(enc.sz);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o1 = static_cast<uint8_t>(enc.o1);
inst.iform = InstForm::FMAXV_ASIMDALL_ONLY_SD;
inst.iclass = InstName::FMAXV;
return true;
}
static bool TryExtractSTADDB_32S_MEMOP(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000011111
// --------------------------------
// 00111000001000000000000000011111
if ((bits & 0xffe0fc1fU) != 0x3820001fU) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t opc : 3;
uint32_t o3 : 1;
uint32_t Rs : 5;
uint32_t _21 : 1; // 1
uint32_t R : 1;
uint32_t A : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.A = static_cast<uint8_t>(enc.A);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.V = static_cast<uint8_t>(enc.V);
inst.R = static_cast<uint8_t>(enc.R);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o3 = static_cast<uint8_t>(enc.o3);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::STADDB_32S_MEMOP;
inst.iclass = InstName::STADDB;
return true;
}
static bool TryExtractSTADDLB_32S_MEMOP(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000011111
// --------------------------------
// 00111000011000000000000000011111
if ((bits & 0xffe0fc1fU) != 0x3860001fU) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t opc : 3;
uint32_t o3 : 1;
uint32_t Rs : 5;
uint32_t _21 : 1; // 1
uint32_t R : 1;
uint32_t A : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.A = static_cast<uint8_t>(enc.A);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.V = static_cast<uint8_t>(enc.V);
inst.R = static_cast<uint8_t>(enc.R);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o3 = static_cast<uint8_t>(enc.o3);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::STADDLB_32S_MEMOP;
inst.iclass = InstName::STADDLB;
return true;
}
static bool TryExtractSTUMAX_32S_MEMOP(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000011111
// --------------------------------
// 10111000001000000110000000011111
if ((bits & 0xffe0fc1fU) != 0xb820601fU) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t opc : 3;
uint32_t o3 : 1;
uint32_t Rs : 5;
uint32_t _21 : 1; // 1
uint32_t R : 1;
uint32_t A : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.A = static_cast<uint8_t>(enc.A);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.V = static_cast<uint8_t>(enc.V);
inst.R = static_cast<uint8_t>(enc.R);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o3 = static_cast<uint8_t>(enc.o3);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::STUMAX_32S_MEMOP;
inst.iclass = InstName::STUMAX;
return true;
}
static bool TryExtractSTUMAXL_32S_MEMOP(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000011111
// --------------------------------
// 10111000011000000110000000011111
if ((bits & 0xffe0fc1fU) != 0xb860601fU) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t opc : 3;
uint32_t o3 : 1;
uint32_t Rs : 5;
uint32_t _21 : 1; // 1
uint32_t R : 1;
uint32_t A : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.A = static_cast<uint8_t>(enc.A);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.V = static_cast<uint8_t>(enc.V);
inst.R = static_cast<uint8_t>(enc.R);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o3 = static_cast<uint8_t>(enc.o3);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::STUMAXL_32S_MEMOP;
inst.iclass = InstName::STUMAXL;
return true;
}
static bool TryExtractSTUMAX_64S_MEMOP(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000011111
// --------------------------------
// 11111000001000000110000000011111
if ((bits & 0xffe0fc1fU) != 0xf820601fU) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t opc : 3;
uint32_t o3 : 1;
uint32_t Rs : 5;
uint32_t _21 : 1; // 1
uint32_t R : 1;
uint32_t A : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.A = static_cast<uint8_t>(enc.A);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.V = static_cast<uint8_t>(enc.V);
inst.R = static_cast<uint8_t>(enc.R);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o3 = static_cast<uint8_t>(enc.o3);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::STUMAX_64S_MEMOP;
inst.iclass = InstName::STUMAX;
return true;
}
static bool TryExtractSTUMAXL_64S_MEMOP(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000011111
// --------------------------------
// 11111000011000000110000000011111
if ((bits & 0xffe0fc1fU) != 0xf860601fU) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t opc : 3;
uint32_t o3 : 1;
uint32_t Rs : 5;
uint32_t _21 : 1; // 1
uint32_t R : 1;
uint32_t A : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.A = static_cast<uint8_t>(enc.A);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.V = static_cast<uint8_t>(enc.V);
inst.R = static_cast<uint8_t>(enc.R);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o3 = static_cast<uint8_t>(enc.o3);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::STUMAXL_64S_MEMOP;
inst.iclass = InstName::STUMAXL;
return true;
}
static bool TryExtractSQDMULH_ASISDELEM_R(InstData &inst, uint32_t bits) {
// bits
// & 11111111000000001111010000000000
// --------------------------------
// 01011111000000001100000000000000
if ((bits & 0xff00f400U) != 0x5f00c000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t H : 1;
uint32_t op : 1;
uint32_t _13 : 1; // 0
uint32_t _14 : 1; // 1
uint32_t _15 : 1; // 1
uint32_t Rm : 4;
uint32_t M : 1;
uint32_t L : 1;
uint32_t size : 2;
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t U : 1;
uint32_t _30 : 1; // 1
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.H = static_cast<uint8_t>(enc.H);
inst.M = static_cast<uint8_t>(enc.M);
inst.L = static_cast<uint8_t>(enc.L);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.op = static_cast<uint8_t>(enc.op);
inst.iform = InstForm::SQDMULH_ASISDELEM_R;
inst.iclass = InstName::SQDMULH;
return true;
}
static bool TryExtractSQDMULH_ASIMDELEM_R(InstData &inst, uint32_t bits) {
// bits
// & 10111111000000001111010000000000
// --------------------------------
// 00001111000000001100000000000000
if ((bits & 0xbf00f400U) != 0xf00c000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t H : 1;
uint32_t op : 1;
uint32_t _13 : 1; // 0
uint32_t _14 : 1; // 1
uint32_t _15 : 1; // 1
uint32_t Rm : 4;
uint32_t M : 1;
uint32_t L : 1;
uint32_t size : 2;
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Q = static_cast<uint8_t>(enc.Q);
inst.H = static_cast<uint8_t>(enc.H);
inst.M = static_cast<uint8_t>(enc.M);
inst.L = static_cast<uint8_t>(enc.L);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.op = static_cast<uint8_t>(enc.op);
inst.iform = InstForm::SQDMULH_ASIMDELEM_R;
inst.iclass = InstName::SQDMULH;
return true;
}
static bool TryExtractFRSQRTE_ASISDMISCFP16_R(InstData &inst, uint32_t bits) {
// bits
// & 11111111111111111111110000000000
// --------------------------------
// 01111110111110011101100000000000
if ((bits & 0xfffffc00U) != 0x7ef9d800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t opcode : 5;
uint32_t _17 : 1; // 0
uint32_t _18 : 1; // 0
uint32_t _19 : 1; // 1
uint32_t _20 : 1; // 1
uint32_t _21 : 1; // 1
uint32_t _22 : 1; // 1
uint32_t a : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t U : 1;
uint32_t _30 : 1; // 1
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.a = static_cast<uint8_t>(enc.a);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.U = static_cast<uint8_t>(enc.U);
inst.iform = InstForm::FRSQRTE_ASISDMISCFP16_R;
inst.iclass = InstName::FRSQRTE;
return true;
}
static bool TryExtractFRSQRTE_ASISDMISC_R(InstData &inst, uint32_t bits) {
// bits
// & 11111111101111111111110000000000
// --------------------------------
// 01111110101000011101100000000000
if ((bits & 0xffbffc00U) != 0x7ea1d800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t opcode : 5;
uint32_t _17 : 1; // 0
uint32_t _18 : 1; // 0
uint32_t _19 : 1; // 0
uint32_t _20 : 1; // 0
uint32_t _21 : 1; // 1
uint32_t sz : 1;
uint32_t _23 : 1; // 1
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t U : 1;
uint32_t _30 : 1; // 1
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.sz = static_cast<uint8_t>(enc.sz);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.U = static_cast<uint8_t>(enc.U);
inst.iform = InstForm::FRSQRTE_ASISDMISC_R;
inst.iclass = InstName::FRSQRTE;
return true;
}
static bool TryExtractFRSQRTE_ASIMDMISCFP16_R(InstData &inst, uint32_t bits) {
// bits
// & 10111111111111111111110000000000
// --------------------------------
// 00101110111110011101100000000000
if ((bits & 0xbffffc00U) != 0x2ef9d800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t opcode : 5;
uint32_t _17 : 1; // 0
uint32_t _18 : 1; // 0
uint32_t _19 : 1; // 1
uint32_t _20 : 1; // 1
uint32_t _21 : 1; // 1
uint32_t _22 : 1; // 1
uint32_t a : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.a = static_cast<uint8_t>(enc.a);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.iform = InstForm::FRSQRTE_ASIMDMISCFP16_R;
inst.iclass = InstName::FRSQRTE;
return true;
}
static bool TryExtractFRSQRTE_ASIMDMISC_R(InstData &inst, uint32_t bits) {
// bits
// & 10111111101111111111110000000000
// --------------------------------
// 00101110101000011101100000000000
if ((bits & 0xbfbffc00U) != 0x2ea1d800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t opcode : 5;
uint32_t _17 : 1; // 0
uint32_t _18 : 1; // 0
uint32_t _19 : 1; // 0
uint32_t _20 : 1; // 0
uint32_t _21 : 1; // 1
uint32_t sz : 1;
uint32_t _23 : 1; // 1
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.sz = static_cast<uint8_t>(enc.sz);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.U = static_cast<uint8_t>(enc.U);
inst.iform = InstForm::FRSQRTE_ASIMDMISC_R;
inst.iclass = InstName::FRSQRTE;
return true;
}
static bool TryExtractADD_ASISDSAME_ONLY(InstData &inst, uint32_t bits) {
// bits
// & 11111111001000001111110000000000
// --------------------------------
// 01011110001000001000010000000000
if ((bits & 0xff20fc00U) != 0x5e208400U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t opcode : 5;
uint32_t Rm : 5;
uint32_t _21 : 1; // 1
uint32_t size : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t U : 1;
uint32_t _30 : 1; // 1
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.U = static_cast<uint8_t>(enc.U);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::ADD_ASISDSAME_ONLY;
inst.iclass = InstName::ADD;
return true;
}
static bool TryExtractADD_ASIMDSAME_ONLY(InstData &inst, uint32_t bits) {
// bits
// & 10111111001000001111110000000000
// --------------------------------
// 00001110001000001000010000000000
if ((bits & 0xbf20fc00U) != 0xe208400U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t opcode : 5;
uint32_t Rm : 5;
uint32_t _21 : 1; // 1
uint32_t size : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.U = static_cast<uint8_t>(enc.U);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::ADD_ASIMDSAME_ONLY;
inst.iclass = InstName::ADD;
return true;
}
static bool TryExtractSABDL_ASIMDDIFF_L(InstData &inst, uint32_t bits) {
// bits
// & 10111111001000001111110000000000
// --------------------------------
// 00001110001000000111000000000000
if ((bits & 0xbf20fc00U) != 0xe207000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t _12 : 1; // 1
uint32_t op : 1;
uint32_t _14 : 1; // 1
uint32_t _15 : 1; // 0
uint32_t Rm : 5;
uint32_t _21 : 1; // 1
uint32_t size : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.op = static_cast<uint8_t>(enc.op);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::SABDL_ASIMDDIFF_L;
inst.iclass = InstName::SABDL;
return true;
}
static bool TryExtractROR_RORV_32_DP_2SRC(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 00011010110000000010110000000000
if ((bits & 0xffe0fc00U) != 0x1ac02c00U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t op2 : 2;
uint32_t opcode2 : 4;
uint32_t Rm : 5;
uint32_t _21 : 1; // 0
uint32_t _22 : 1; // 1
uint32_t _23 : 1; // 1
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t op : 1;
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.opcode2 = static_cast<uint8_t>(enc.opcode2);
inst.op2 = static_cast<uint8_t>(enc.op2);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.sf = static_cast<uint8_t>(enc.sf);
inst.op = static_cast<uint8_t>(enc.op);
inst.iform = InstForm::ROR_RORV_32_DP_2SRC;
inst.iclass = InstName::RORV;
return true;
}
static bool TryExtractROR_RORV_64_DP_2SRC(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 10011010110000000010110000000000
if ((bits & 0xffe0fc00U) != 0x9ac02c00U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t op2 : 2;
uint32_t opcode2 : 4;
uint32_t Rm : 5;
uint32_t _21 : 1; // 0
uint32_t _22 : 1; // 1
uint32_t _23 : 1; // 1
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t op : 1;
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.opcode2 = static_cast<uint8_t>(enc.opcode2);
inst.op2 = static_cast<uint8_t>(enc.op2);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.sf = static_cast<uint8_t>(enc.sf);
inst.op = static_cast<uint8_t>(enc.op);
inst.iform = InstForm::ROR_RORV_64_DP_2SRC;
inst.iclass = InstName::RORV;
return true;
}
static bool TryExtractUCVTF_H32_FLOAT2INT(InstData &inst, uint32_t bits) {
// bits
// & 11111111111111111111110000000000
// --------------------------------
// 00011110111000110000000000000000
if ((bits & 0xfffffc00U) != 0x1ee30000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t _12 : 1; // 0
uint32_t _13 : 1; // 0
uint32_t _14 : 1; // 0
uint32_t _15 : 1; // 0
uint32_t opcode : 3;
uint32_t rmode : 2;
uint32_t _21 : 1; // 1
uint32_t type : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t _30 : 1; // 0
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.sf = static_cast<uint8_t>(enc.sf);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.type = static_cast<uint8_t>(enc.type);
inst.rmode = static_cast<uint8_t>(enc.rmode);
inst.iform = InstForm::UCVTF_H32_FLOAT2INT;
inst.iclass = InstName::UCVTF;
return true;
}
static bool TryExtractUCVTF_S32_FLOAT2INT(InstData &inst, uint32_t bits) {
// bits
// & 11111111111111111111110000000000
// --------------------------------
// 00011110001000110000000000000000
if ((bits & 0xfffffc00U) != 0x1e230000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t _12 : 1; // 0
uint32_t _13 : 1; // 0
uint32_t _14 : 1; // 0
uint32_t _15 : 1; // 0
uint32_t opcode : 3;
uint32_t rmode : 2;
uint32_t _21 : 1; // 1
uint32_t type : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t _30 : 1; // 0
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.sf = static_cast<uint8_t>(enc.sf);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.type = static_cast<uint8_t>(enc.type);
inst.rmode = static_cast<uint8_t>(enc.rmode);
inst.iform = InstForm::UCVTF_S32_FLOAT2INT;
inst.iclass = InstName::UCVTF;
return true;
}
static bool TryExtractUCVTF_D32_FLOAT2INT(InstData &inst, uint32_t bits) {
// bits
// & 11111111111111111111110000000000
// --------------------------------
// 00011110011000110000000000000000
if ((bits & 0xfffffc00U) != 0x1e630000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t _12 : 1; // 0
uint32_t _13 : 1; // 0
uint32_t _14 : 1; // 0
uint32_t _15 : 1; // 0
uint32_t opcode : 3;
uint32_t rmode : 2;
uint32_t _21 : 1; // 1
uint32_t type : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t _30 : 1; // 0
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.sf = static_cast<uint8_t>(enc.sf);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.type = static_cast<uint8_t>(enc.type);
inst.rmode = static_cast<uint8_t>(enc.rmode);
inst.iform = InstForm::UCVTF_D32_FLOAT2INT;
inst.iclass = InstName::UCVTF;
return true;
}
static bool TryExtractUCVTF_H64_FLOAT2INT(InstData &inst, uint32_t bits) {
// bits
// & 11111111111111111111110000000000
// --------------------------------
// 10011110111000110000000000000000
if ((bits & 0xfffffc00U) != 0x9ee30000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t _12 : 1; // 0
uint32_t _13 : 1; // 0
uint32_t _14 : 1; // 0
uint32_t _15 : 1; // 0
uint32_t opcode : 3;
uint32_t rmode : 2;
uint32_t _21 : 1; // 1
uint32_t type : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t _30 : 1; // 0
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.sf = static_cast<uint8_t>(enc.sf);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.type = static_cast<uint8_t>(enc.type);
inst.rmode = static_cast<uint8_t>(enc.rmode);
inst.iform = InstForm::UCVTF_H64_FLOAT2INT;
inst.iclass = InstName::UCVTF;
return true;
}
static bool TryExtractUCVTF_S64_FLOAT2INT(InstData &inst, uint32_t bits) {
// bits
// & 11111111111111111111110000000000
// --------------------------------
// 10011110001000110000000000000000
if ((bits & 0xfffffc00U) != 0x9e230000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t _12 : 1; // 0
uint32_t _13 : 1; // 0
uint32_t _14 : 1; // 0
uint32_t _15 : 1; // 0
uint32_t opcode : 3;
uint32_t rmode : 2;
uint32_t _21 : 1; // 1
uint32_t type : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t _30 : 1; // 0
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.sf = static_cast<uint8_t>(enc.sf);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.type = static_cast<uint8_t>(enc.type);
inst.rmode = static_cast<uint8_t>(enc.rmode);
inst.iform = InstForm::UCVTF_S64_FLOAT2INT;
inst.iclass = InstName::UCVTF;
return true;
}
static bool TryExtractUCVTF_D64_FLOAT2INT(InstData &inst, uint32_t bits) {
// bits
// & 11111111111111111111110000000000
// --------------------------------
// 10011110011000110000000000000000
if ((bits & 0xfffffc00U) != 0x9e630000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t _12 : 1; // 0
uint32_t _13 : 1; // 0
uint32_t _14 : 1; // 0
uint32_t _15 : 1; // 0
uint32_t opcode : 3;
uint32_t rmode : 2;
uint32_t _21 : 1; // 1
uint32_t type : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t _30 : 1; // 0
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.sf = static_cast<uint8_t>(enc.sf);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.type = static_cast<uint8_t>(enc.type);
inst.rmode = static_cast<uint8_t>(enc.rmode);
inst.iform = InstForm::UCVTF_D64_FLOAT2INT;
inst.iclass = InstName::UCVTF;
return true;
}
static bool TryExtractUCVTF_H32_FLOAT2FIX(InstData &inst, uint32_t bits) {
// bits
// & 11111111111111110000000000000000
// --------------------------------
// 00011110110000110000000000000000
if ((bits & 0xffff0000U) != 0x1ec30000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t scale : 6;
uint32_t opcode : 3;
uint32_t rmode : 2;
uint32_t _21 : 1; // 0
uint32_t type : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t _30 : 1; // 0
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.scale = static_cast<uint8_t>(enc.scale);
inst.sf = static_cast<uint8_t>(enc.sf);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.type = static_cast<uint8_t>(enc.type);
inst.rmode = static_cast<uint8_t>(enc.rmode);
inst.iform = InstForm::UCVTF_H32_FLOAT2FIX;
inst.iclass = InstName::UCVTF;
return true;
}
static bool TryExtractUCVTF_S32_FLOAT2FIX(InstData &inst, uint32_t bits) {
// bits
// & 11111111111111110000000000000000
// --------------------------------
// 00011110000000110000000000000000
if ((bits & 0xffff0000U) != 0x1e030000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t scale : 6;
uint32_t opcode : 3;
uint32_t rmode : 2;
uint32_t _21 : 1; // 0
uint32_t type : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t _30 : 1; // 0
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.scale = static_cast<uint8_t>(enc.scale);
inst.sf = static_cast<uint8_t>(enc.sf);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.type = static_cast<uint8_t>(enc.type);
inst.rmode = static_cast<uint8_t>(enc.rmode);
inst.iform = InstForm::UCVTF_S32_FLOAT2FIX;
inst.iclass = InstName::UCVTF;
return true;
}
static bool TryExtractUCVTF_D32_FLOAT2FIX(InstData &inst, uint32_t bits) {
// bits
// & 11111111111111110000000000000000
// --------------------------------
// 00011110010000110000000000000000
if ((bits & 0xffff0000U) != 0x1e430000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t scale : 6;
uint32_t opcode : 3;
uint32_t rmode : 2;
uint32_t _21 : 1; // 0
uint32_t type : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t _30 : 1; // 0
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.scale = static_cast<uint8_t>(enc.scale);
inst.sf = static_cast<uint8_t>(enc.sf);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.type = static_cast<uint8_t>(enc.type);
inst.rmode = static_cast<uint8_t>(enc.rmode);
inst.iform = InstForm::UCVTF_D32_FLOAT2FIX;
inst.iclass = InstName::UCVTF;
return true;
}
static bool TryExtractUCVTF_H64_FLOAT2FIX(InstData &inst, uint32_t bits) {
// bits
// & 11111111111111110000000000000000
// --------------------------------
// 10011110110000110000000000000000
if ((bits & 0xffff0000U) != 0x9ec30000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t scale : 6;
uint32_t opcode : 3;
uint32_t rmode : 2;
uint32_t _21 : 1; // 0
uint32_t type : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t _30 : 1; // 0
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.scale = static_cast<uint8_t>(enc.scale);
inst.sf = static_cast<uint8_t>(enc.sf);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.type = static_cast<uint8_t>(enc.type);
inst.rmode = static_cast<uint8_t>(enc.rmode);
inst.iform = InstForm::UCVTF_H64_FLOAT2FIX;
inst.iclass = InstName::UCVTF;
return true;
}
static bool TryExtractUCVTF_S64_FLOAT2FIX(InstData &inst, uint32_t bits) {
// bits
// & 11111111111111110000000000000000
// --------------------------------
// 10011110000000110000000000000000
if ((bits & 0xffff0000U) != 0x9e030000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t scale : 6;
uint32_t opcode : 3;
uint32_t rmode : 2;
uint32_t _21 : 1; // 0
uint32_t type : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t _30 : 1; // 0
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.scale = static_cast<uint8_t>(enc.scale);
inst.sf = static_cast<uint8_t>(enc.sf);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.type = static_cast<uint8_t>(enc.type);
inst.rmode = static_cast<uint8_t>(enc.rmode);
inst.iform = InstForm::UCVTF_S64_FLOAT2FIX;
inst.iclass = InstName::UCVTF;
return true;
}
static bool TryExtractUCVTF_D64_FLOAT2FIX(InstData &inst, uint32_t bits) {
// bits
// & 11111111111111110000000000000000
// --------------------------------
// 10011110010000110000000000000000
if ((bits & 0xffff0000U) != 0x9e430000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t scale : 6;
uint32_t opcode : 3;
uint32_t rmode : 2;
uint32_t _21 : 1; // 0
uint32_t type : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t _30 : 1; // 0
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.scale = static_cast<uint8_t>(enc.scale);
inst.sf = static_cast<uint8_t>(enc.sf);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.type = static_cast<uint8_t>(enc.type);
inst.rmode = static_cast<uint8_t>(enc.rmode);
inst.iform = InstForm::UCVTF_D64_FLOAT2FIX;
inst.iclass = InstName::UCVTF;
return true;
}
static bool TryExtractMOVI_ASIMDIMM_N_B(InstData &inst, uint32_t bits) {
// bits
// & 10111111111110001111110000000000
// --------------------------------
// 00001111000000001110010000000000
if ((bits & 0xbff8fc00U) != 0xf00e400U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t h : 1;
uint32_t g : 1;
uint32_t f : 1;
uint32_t e : 1;
uint32_t d : 1;
uint32_t _10 : 1; // 1
uint32_t o2 : 1;
uint32_t cmode : 4;
uint32_t c : 1;
uint32_t b : 1;
uint32_t a : 1;
uint32_t _19 : 1; // 0
uint32_t _20 : 1; // 0
uint32_t _21 : 1; // 0
uint32_t _22 : 1; // 0
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t op : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.a = static_cast<uint8_t>(enc.a);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.c = static_cast<uint8_t>(enc.c);
inst.b = static_cast<uint8_t>(enc.b);
inst.e = static_cast<uint8_t>(enc.e);
inst.d = static_cast<uint8_t>(enc.d);
inst.g = static_cast<uint8_t>(enc.g);
inst.f = static_cast<uint8_t>(enc.f);
inst.h = static_cast<uint8_t>(enc.h);
inst.cmode = static_cast<uint8_t>(enc.cmode);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.o2 = static_cast<uint8_t>(enc.o2);
inst.op = static_cast<uint8_t>(enc.op);
inst.iform = InstForm::MOVI_ASIMDIMM_N_B;
inst.iclass = InstName::MOVI;
return true;
}
static bool TryExtractMOVI_ASIMDIMM_L_HL(InstData &inst, uint32_t bits) {
// bits
// & 10111111111110001101110000000000
// --------------------------------
// 00001111000000001000010000000000
if ((bits & 0xbff8dc00U) != 0xf008400U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t h : 1;
uint32_t g : 1;
uint32_t f : 1;
uint32_t e : 1;
uint32_t d : 1;
uint32_t _10 : 1; // 1
uint32_t o2 : 1;
uint32_t cmode : 4;
uint32_t c : 1;
uint32_t b : 1;
uint32_t a : 1;
uint32_t _19 : 1; // 0
uint32_t _20 : 1; // 0
uint32_t _21 : 1; // 0
uint32_t _22 : 1; // 0
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t op : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.a = static_cast<uint8_t>(enc.a);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.c = static_cast<uint8_t>(enc.c);
inst.b = static_cast<uint8_t>(enc.b);
inst.e = static_cast<uint8_t>(enc.e);
inst.d = static_cast<uint8_t>(enc.d);
inst.g = static_cast<uint8_t>(enc.g);
inst.f = static_cast<uint8_t>(enc.f);
inst.h = static_cast<uint8_t>(enc.h);
inst.cmode = static_cast<uint8_t>(enc.cmode);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.o2 = static_cast<uint8_t>(enc.o2);
inst.op = static_cast<uint8_t>(enc.op);
inst.iform = InstForm::MOVI_ASIMDIMM_L_HL;
inst.iclass = InstName::MOVI;
return true;
}
static bool TryExtractMOVI_ASIMDIMM_L_SL(InstData &inst, uint32_t bits) {
// bits
// & 10111111111110001001110000000000
// --------------------------------
// 00001111000000000000010000000000
if ((bits & 0xbff89c00U) != 0xf000400U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t h : 1;
uint32_t g : 1;
uint32_t f : 1;
uint32_t e : 1;
uint32_t d : 1;
uint32_t _10 : 1; // 1
uint32_t o2 : 1;
uint32_t cmode : 4;
uint32_t c : 1;
uint32_t b : 1;
uint32_t a : 1;
uint32_t _19 : 1; // 0
uint32_t _20 : 1; // 0
uint32_t _21 : 1; // 0
uint32_t _22 : 1; // 0
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t op : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.a = static_cast<uint8_t>(enc.a);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.c = static_cast<uint8_t>(enc.c);
inst.b = static_cast<uint8_t>(enc.b);
inst.e = static_cast<uint8_t>(enc.e);
inst.d = static_cast<uint8_t>(enc.d);
inst.g = static_cast<uint8_t>(enc.g);
inst.f = static_cast<uint8_t>(enc.f);
inst.h = static_cast<uint8_t>(enc.h);
inst.cmode = static_cast<uint8_t>(enc.cmode);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.o2 = static_cast<uint8_t>(enc.o2);
inst.op = static_cast<uint8_t>(enc.op);
inst.iform = InstForm::MOVI_ASIMDIMM_L_SL;
inst.iclass = InstName::MOVI;
return true;
}
static bool TryExtractMOVI_ASIMDIMM_M_SM(InstData &inst, uint32_t bits) {
// bits
// & 10111111111110001110110000000000
// --------------------------------
// 00001111000000001100010000000000
if ((bits & 0xbff8ec00U) != 0xf00c400U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t h : 1;
uint32_t g : 1;
uint32_t f : 1;
uint32_t e : 1;
uint32_t d : 1;
uint32_t _10 : 1; // 1
uint32_t o2 : 1;
uint32_t cmode : 4;
uint32_t c : 1;
uint32_t b : 1;
uint32_t a : 1;
uint32_t _19 : 1; // 0
uint32_t _20 : 1; // 0
uint32_t _21 : 1; // 0
uint32_t _22 : 1; // 0
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t op : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.a = static_cast<uint8_t>(enc.a);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.c = static_cast<uint8_t>(enc.c);
inst.b = static_cast<uint8_t>(enc.b);
inst.e = static_cast<uint8_t>(enc.e);
inst.d = static_cast<uint8_t>(enc.d);
inst.g = static_cast<uint8_t>(enc.g);
inst.f = static_cast<uint8_t>(enc.f);
inst.h = static_cast<uint8_t>(enc.h);
inst.cmode = static_cast<uint8_t>(enc.cmode);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.o2 = static_cast<uint8_t>(enc.o2);
inst.op = static_cast<uint8_t>(enc.op);
inst.iform = InstForm::MOVI_ASIMDIMM_M_SM;
inst.iclass = InstName::MOVI;
return true;
}
static bool TryExtractMOVI_ASIMDIMM_D_DS(InstData &inst, uint32_t bits) {
// bits
// & 11111111111110001111110000000000
// --------------------------------
// 00101111000000001110010000000000
if ((bits & 0xfff8fc00U) != 0x2f00e400U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t h : 1;
uint32_t g : 1;
uint32_t f : 1;
uint32_t e : 1;
uint32_t d : 1;
uint32_t _10 : 1; // 1
uint32_t o2 : 1;
uint32_t cmode : 4;
uint32_t c : 1;
uint32_t b : 1;
uint32_t a : 1;
uint32_t _19 : 1; // 0
uint32_t _20 : 1; // 0
uint32_t _21 : 1; // 0
uint32_t _22 : 1; // 0
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t op : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.a = static_cast<uint8_t>(enc.a);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.c = static_cast<uint8_t>(enc.c);
inst.b = static_cast<uint8_t>(enc.b);
inst.e = static_cast<uint8_t>(enc.e);
inst.d = static_cast<uint8_t>(enc.d);
inst.g = static_cast<uint8_t>(enc.g);
inst.f = static_cast<uint8_t>(enc.f);
inst.h = static_cast<uint8_t>(enc.h);
inst.cmode = static_cast<uint8_t>(enc.cmode);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.o2 = static_cast<uint8_t>(enc.o2);
inst.op = static_cast<uint8_t>(enc.op);
inst.iform = InstForm::MOVI_ASIMDIMM_D_DS;
inst.iclass = InstName::MOVI;
return true;
}
static bool TryExtractMOVI_ASIMDIMM_D2_D(InstData &inst, uint32_t bits) {
// bits
// & 11111111111110001111110000000000
// --------------------------------
// 01101111000000001110010000000000
if ((bits & 0xfff8fc00U) != 0x6f00e400U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t h : 1;
uint32_t g : 1;
uint32_t f : 1;
uint32_t e : 1;
uint32_t d : 1;
uint32_t _10 : 1; // 1
uint32_t o2 : 1;
uint32_t cmode : 4;
uint32_t c : 1;
uint32_t b : 1;
uint32_t a : 1;
uint32_t _19 : 1; // 0
uint32_t _20 : 1; // 0
uint32_t _21 : 1; // 0
uint32_t _22 : 1; // 0
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t op : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.a = static_cast<uint8_t>(enc.a);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.c = static_cast<uint8_t>(enc.c);
inst.b = static_cast<uint8_t>(enc.b);
inst.e = static_cast<uint8_t>(enc.e);
inst.d = static_cast<uint8_t>(enc.d);
inst.g = static_cast<uint8_t>(enc.g);
inst.f = static_cast<uint8_t>(enc.f);
inst.h = static_cast<uint8_t>(enc.h);
inst.cmode = static_cast<uint8_t>(enc.cmode);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.o2 = static_cast<uint8_t>(enc.o2);
inst.op = static_cast<uint8_t>(enc.op);
inst.iform = InstForm::MOVI_ASIMDIMM_D2_D;
inst.iclass = InstName::MOVI;
return true;
}
static bool TryExtractREV16_32_DP_1SRC(InstData &inst, uint32_t bits) {
// bits
// & 11111111111111111111110000000000
// --------------------------------
// 01011010110000000000010000000000
if ((bits & 0xfffffc00U) != 0x5ac00400U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t opc : 2;
uint32_t opcode : 4;
uint32_t opcode2 : 5;
uint32_t _21 : 1; // 0
uint32_t _22 : 1; // 1
uint32_t _23 : 1; // 1
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t _30 : 1; // 1
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.opcode2 = static_cast<uint8_t>(enc.opcode2);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.sf = static_cast<uint8_t>(enc.sf);
inst.iform = InstForm::REV16_32_DP_1SRC;
inst.iclass = InstName::REV16;
return true;
}
static bool TryExtractREV16_64_DP_1SRC(InstData &inst, uint32_t bits) {
// bits
// & 11111111111111111111110000000000
// --------------------------------
// 11011010110000000000010000000000
if ((bits & 0xfffffc00U) != 0xdac00400U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t opc : 2;
uint32_t opcode : 4;
uint32_t opcode2 : 5;
uint32_t _21 : 1; // 0
uint32_t _22 : 1; // 1
uint32_t _23 : 1; // 1
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t _30 : 1; // 1
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.opcode2 = static_cast<uint8_t>(enc.opcode2);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.sf = static_cast<uint8_t>(enc.sf);
inst.iform = InstForm::REV16_64_DP_1SRC;
inst.iclass = InstName::REV16;
return true;
}
static bool TryExtractSQRDMLAH_ASISDELEM_R(InstData &inst, uint32_t bits) {
// bits
// & 11111111000000001111010000000000
// --------------------------------
// 01111111000000001101000000000000
if ((bits & 0xff00f400U) != 0x7f00d000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t H : 1;
uint32_t _12 : 1; // 1
uint32_t S : 1;
uint32_t _14 : 1; // 1
uint32_t _15 : 1; // 1
uint32_t Rm : 4;
uint32_t M : 1;
uint32_t L : 1;
uint32_t size : 2;
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t U : 1;
uint32_t _30 : 1; // 1
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.H = static_cast<uint8_t>(enc.H);
inst.M = static_cast<uint8_t>(enc.M);
inst.L = static_cast<uint8_t>(enc.L);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::SQRDMLAH_ASISDELEM_R;
inst.iclass = InstName::SQRDMLAH;
return true;
}
static bool TryExtractSQRDMLAH_ASIMDELEM_R(InstData &inst, uint32_t bits) {
// bits
// & 10111111000000001111010000000000
// --------------------------------
// 00101111000000001101000000000000
if ((bits & 0xbf00f400U) != 0x2f00d000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t H : 1;
uint32_t _12 : 1; // 1
uint32_t S : 1;
uint32_t _14 : 1; // 1
uint32_t _15 : 1; // 1
uint32_t Rm : 4;
uint32_t M : 1;
uint32_t L : 1;
uint32_t size : 2;
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Q = static_cast<uint8_t>(enc.Q);
inst.H = static_cast<uint8_t>(enc.H);
inst.M = static_cast<uint8_t>(enc.M);
inst.L = static_cast<uint8_t>(enc.L);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::SQRDMLAH_ASIMDELEM_R;
inst.iclass = InstName::SQRDMLAH;
return true;
}
static bool TryExtractFMAXP_ASISDPAIR_ONLY_H(InstData &inst, uint32_t bits) {
// bits
// & 11111111111111111111110000000000
// --------------------------------
// 01011110001100001111100000000000
if ((bits & 0xfffffc00U) != 0x5e30f800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t opcode : 5;
uint32_t _17 : 1; // 0
uint32_t _18 : 1; // 0
uint32_t _19 : 1; // 0
uint32_t _20 : 1; // 1
uint32_t _21 : 1; // 1
uint32_t sz : 1;
uint32_t o1 : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t U : 1;
uint32_t _30 : 1; // 1
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.sz = static_cast<uint8_t>(enc.sz);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o1 = static_cast<uint8_t>(enc.o1);
inst.iform = InstForm::FMAXP_ASISDPAIR_ONLY_H;
inst.iclass = InstName::FMAXP;
return true;
}
static bool TryExtractFMAXP_ASISDPAIR_ONLY_SD(InstData &inst, uint32_t bits) {
// bits
// & 11111111101111111111110000000000
// --------------------------------
// 01111110001100001111100000000000
if ((bits & 0xffbffc00U) != 0x7e30f800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t opcode : 5;
uint32_t _17 : 1; // 0
uint32_t _18 : 1; // 0
uint32_t _19 : 1; // 0
uint32_t _20 : 1; // 1
uint32_t _21 : 1; // 1
uint32_t sz : 1;
uint32_t o1 : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t U : 1;
uint32_t _30 : 1; // 1
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.sz = static_cast<uint8_t>(enc.sz);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o1 = static_cast<uint8_t>(enc.o1);
inst.iform = InstForm::FMAXP_ASISDPAIR_ONLY_SD;
inst.iclass = InstName::FMAXP;
return true;
}
static bool TryExtractBIF_ASIMDSAME_ONLY(InstData &inst, uint32_t bits) {
// bits
// & 10111111111000001111110000000000
// --------------------------------
// 00101110111000000001110000000000
if ((bits & 0xbfe0fc00U) != 0x2ee01c00U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t opcode : 5;
uint32_t Rm : 5;
uint32_t _21 : 1; // 1
uint32_t opc2 : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Q = static_cast<uint8_t>(enc.Q);
inst.opc2 = static_cast<uint8_t>(enc.opc2);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.U = static_cast<uint8_t>(enc.U);
inst.iform = InstForm::BIF_ASIMDSAME_ONLY;
inst.iclass = InstName::BIF;
return true;
}
static bool TryExtractFCMLE_ASISDMISCFP16_FZ(InstData &inst, uint32_t bits) {
// bits
// & 11111111111111111111110000000000
// --------------------------------
// 01111110111110001101100000000000
if ((bits & 0xfffffc00U) != 0x7ef8d800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t op : 1;
uint32_t _13 : 1; // 0
uint32_t _14 : 1; // 1
uint32_t _15 : 1; // 1
uint32_t _16 : 1; // 0
uint32_t _17 : 1; // 0
uint32_t _18 : 1; // 0
uint32_t _19 : 1; // 1
uint32_t _20 : 1; // 1
uint32_t _21 : 1; // 1
uint32_t _22 : 1; // 1
uint32_t a : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t U : 1;
uint32_t _30 : 1; // 1
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.a = static_cast<uint8_t>(enc.a);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.U = static_cast<uint8_t>(enc.U);
inst.op = static_cast<uint8_t>(enc.op);
inst.iform = InstForm::FCMLE_ASISDMISCFP16_FZ;
inst.iclass = InstName::FCMLE;
return true;
}
static bool TryExtractFCMLE_ASISDMISC_FZ(InstData &inst, uint32_t bits) {
// bits
// & 11111111101111111111110000000000
// --------------------------------
// 01111110101000001101100000000000
if ((bits & 0xffbffc00U) != 0x7ea0d800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t op : 1;
uint32_t _13 : 1; // 0
uint32_t _14 : 1; // 1
uint32_t _15 : 1; // 1
uint32_t _16 : 1; // 0
uint32_t _17 : 1; // 0
uint32_t _18 : 1; // 0
uint32_t _19 : 1; // 0
uint32_t _20 : 1; // 0
uint32_t _21 : 1; // 1
uint32_t sz : 1;
uint32_t _23 : 1; // 1
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t U : 1;
uint32_t _30 : 1; // 1
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.sz = static_cast<uint8_t>(enc.sz);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.U = static_cast<uint8_t>(enc.U);
inst.op = static_cast<uint8_t>(enc.op);
inst.iform = InstForm::FCMLE_ASISDMISC_FZ;
inst.iclass = InstName::FCMLE;
return true;
}
static bool TryExtractFCMLE_ASIMDMISCFP16_FZ(InstData &inst, uint32_t bits) {
// bits
// & 10111111111111111111110000000000
// --------------------------------
// 00101110111110001101100000000000
if ((bits & 0xbffffc00U) != 0x2ef8d800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t op : 1;
uint32_t _13 : 1; // 0
uint32_t _14 : 1; // 1
uint32_t _15 : 1; // 1
uint32_t _16 : 1; // 0
uint32_t _17 : 1; // 0
uint32_t _18 : 1; // 0
uint32_t _19 : 1; // 1
uint32_t _20 : 1; // 1
uint32_t _21 : 1; // 1
uint32_t _22 : 1; // 1
uint32_t a : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.a = static_cast<uint8_t>(enc.a);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.op = static_cast<uint8_t>(enc.op);
inst.iform = InstForm::FCMLE_ASIMDMISCFP16_FZ;
inst.iclass = InstName::FCMLE;
return true;
}
static bool TryExtractFCMLE_ASIMDMISC_FZ(InstData &inst, uint32_t bits) {
// bits
// & 10111111101111111111110000000000
// --------------------------------
// 00101110101000001101100000000000
if ((bits & 0xbfbffc00U) != 0x2ea0d800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t op : 1;
uint32_t _13 : 1; // 0
uint32_t _14 : 1; // 1
uint32_t _15 : 1; // 1
uint32_t _16 : 1; // 0
uint32_t _17 : 1; // 0
uint32_t _18 : 1; // 0
uint32_t _19 : 1; // 0
uint32_t _20 : 1; // 0
uint32_t _21 : 1; // 1
uint32_t sz : 1;
uint32_t _23 : 1; // 1
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.sz = static_cast<uint8_t>(enc.sz);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.op = static_cast<uint8_t>(enc.op);
inst.iform = InstForm::FCMLE_ASIMDMISC_FZ;
inst.iclass = InstName::FCMLE;
return true;
}
static bool TryExtractDRPS_64E_BRANCH_REG(InstData &inst, uint32_t bits) {
// bits
// & 11111111111111111111111111111111
// --------------------------------
// 11010110101111110000001111100000
if ((bits & 0xffffffffU) != 0xd6bf03e0U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t op4 : 5;
uint32_t Rt : 5;
uint32_t op3 : 6;
uint32_t op2 : 5;
uint32_t opc : 4;
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 0
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 0
uint32_t _30 : 1; // 1
uint32_t _31 : 1; // 1
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.op4 = static_cast<uint8_t>(enc.op4);
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.op2 = static_cast<uint8_t>(enc.op2);
inst.op3 = static_cast<uint8_t>(enc.op3);
inst.iform = InstForm::DRPS_64E_BRANCH_REG;
inst.iclass = InstName::DRPS;
return true;
}
static bool TryExtractSLI_ASISDSHF_R(InstData &inst, uint32_t bits) {
// bits
// & 11111111100000001111110000000000
// --------------------------------
// 01111111000000000101010000000000
if ((bits & 0xff80fc00U) != 0x7f005400U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t opcode : 5;
uint32_t immb : 3;
uint32_t immh : 4;
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t U : 1;
uint32_t _30 : 1; // 1
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.immh.uimm = static_cast<uint64_t>(enc.immh);
if (!(inst.immh.uimm != 0x0))
return false;
inst.immb.uimm = static_cast<uint64_t>(enc.immb);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.iform = InstForm::SLI_ASISDSHF_R;
inst.iclass = InstName::SLI;
return true;
}
static bool TryExtractSLI_ASIMDSHF_R(InstData &inst, uint32_t bits) {
// bits
// & 10111111100000001111110000000000
// --------------------------------
// 00101111000000000101010000000000
if ((bits & 0xbf80fc00U) != 0x2f005400U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t opcode : 5;
uint32_t immb : 3;
uint32_t immh : 4;
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.immh.uimm = static_cast<uint64_t>(enc.immh);
if (!(inst.immh.uimm != 0x0))
return false;
inst.immb.uimm = static_cast<uint64_t>(enc.immb);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.iform = InstForm::SLI_ASIMDSHF_R;
inst.iclass = InstName::SLI;
return true;
}
static bool TryExtractLDAXRH_LR32_LDSTEXCL(InstData &inst, uint32_t bits) {
// bits
// & 11111111111111111111110000000000
// --------------------------------
// 01001000010111111111110000000000
if ((bits & 0xfffffc00U) != 0x485ffc00U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t Rt2 : 5;
uint32_t o0 : 1;
uint32_t Rs : 5;
uint32_t o1 : 1;
uint32_t L : 1;
uint32_t o2 : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 0
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.L = static_cast<uint8_t>(enc.L);
inst.Rt2 = static_cast<uint8_t>(enc.Rt2);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.o2 = static_cast<uint8_t>(enc.o2);
inst.o1 = static_cast<uint8_t>(enc.o1);
inst.o0 = static_cast<uint8_t>(enc.o0);
inst.iform = InstForm::LDAXRH_LR32_LDSTEXCL;
inst.iclass = InstName::LDAXRH;
return true;
}
static bool TryExtractBFI_BFM_32M_BITFIELD(InstData &inst, uint32_t bits) {
// bits
// & 11111111110000000000000000000000
// --------------------------------
// 00110011000000000000000000000000
if ((bits & 0xffc00000U) != 0x33000000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t imms : 6;
uint32_t immr : 6;
uint32_t N : 1;
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 0
uint32_t _28 : 1; // 1
uint32_t opc : 2;
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.sf = static_cast<uint8_t>(enc.sf);
inst.N = static_cast<uint8_t>(enc.N);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
if (!(inst.Rn != 0x1f))
return false;
inst.immr.uimm = static_cast<uint64_t>(enc.immr);
inst.imms.uimm = static_cast<uint64_t>(enc.imms);
inst.iform = InstForm::BFI_BFM_32M_BITFIELD;
inst.iclass = InstName::BFM;
return true;
}
static bool TryExtractBFI_BFM_64M_BITFIELD(InstData &inst, uint32_t bits) {
// bits
// & 11111111110000000000000000000000
// --------------------------------
// 10110011010000000000000000000000
if ((bits & 0xffc00000U) != 0xb3400000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t imms : 6;
uint32_t immr : 6;
uint32_t N : 1;
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 0
uint32_t _28 : 1; // 1
uint32_t opc : 2;
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.sf = static_cast<uint8_t>(enc.sf);
inst.N = static_cast<uint8_t>(enc.N);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
if (!(inst.Rn != 0x1f))
return false;
inst.immr.uimm = static_cast<uint64_t>(enc.immr);
inst.imms.uimm = static_cast<uint64_t>(enc.imms);
inst.iform = InstForm::BFI_BFM_64M_BITFIELD;
inst.iclass = InstName::BFM;
return true;
}
static bool TryExtractLDADDAB_32_MEMOP(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 00111000101000000000000000000000
if ((bits & 0xffe0fc00U) != 0x38a00000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t opc : 3;
uint32_t o3 : 1;
uint32_t Rs : 5;
uint32_t _21 : 1; // 1
uint32_t R : 1;
uint32_t A : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.A = static_cast<uint8_t>(enc.A);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.V = static_cast<uint8_t>(enc.V);
inst.R = static_cast<uint8_t>(enc.R);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o3 = static_cast<uint8_t>(enc.o3);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LDADDAB_32_MEMOP;
inst.iclass = InstName::LDADDAB;
return true;
}
static bool TryExtractLDADDALB_32_MEMOP(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 00111000111000000000000000000000
if ((bits & 0xffe0fc00U) != 0x38e00000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t opc : 3;
uint32_t o3 : 1;
uint32_t Rs : 5;
uint32_t _21 : 1; // 1
uint32_t R : 1;
uint32_t A : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.A = static_cast<uint8_t>(enc.A);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.V = static_cast<uint8_t>(enc.V);
inst.R = static_cast<uint8_t>(enc.R);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o3 = static_cast<uint8_t>(enc.o3);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LDADDALB_32_MEMOP;
inst.iclass = InstName::LDADDALB;
return true;
}
static bool TryExtractLDADDB_32_MEMOP(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 00111000001000000000000000000000
if ((bits & 0xffe0fc00U) != 0x38200000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t opc : 3;
uint32_t o3 : 1;
uint32_t Rs : 5;
uint32_t _21 : 1; // 1
uint32_t R : 1;
uint32_t A : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.A = static_cast<uint8_t>(enc.A);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.V = static_cast<uint8_t>(enc.V);
inst.R = static_cast<uint8_t>(enc.R);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o3 = static_cast<uint8_t>(enc.o3);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LDADDB_32_MEMOP;
inst.iclass = InstName::LDADDB;
return true;
}
static bool TryExtractLDADDLB_32_MEMOP(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 00111000011000000000000000000000
if ((bits & 0xffe0fc00U) != 0x38600000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t opc : 3;
uint32_t o3 : 1;
uint32_t Rs : 5;
uint32_t _21 : 1; // 1
uint32_t R : 1;
uint32_t A : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.A = static_cast<uint8_t>(enc.A);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.V = static_cast<uint8_t>(enc.V);
inst.R = static_cast<uint8_t>(enc.R);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o3 = static_cast<uint8_t>(enc.o3);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LDADDLB_32_MEMOP;
inst.iclass = InstName::LDADDLB;
return true;
}
static bool TryExtractLDRH_32_LDST_IMMPOST(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000000000110000000000
// --------------------------------
// 01111000010000000000010000000000
if ((bits & 0xffe00c00U) != 0x78400400U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t _11 : 1; // 0
uint32_t imm9 : 9;
uint32_t _21 : 1; // 0
uint32_t opc : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.imm9.uimm = static_cast<uint64_t>(enc.imm9);
inst.V = static_cast<uint8_t>(enc.V);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LDRH_32_LDST_IMMPOST;
inst.iclass = InstName::LDRH;
return true;
}
static bool TryExtractLDRH_32_LDST_IMMPRE(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000000000110000000000
// --------------------------------
// 01111000010000000000110000000000
if ((bits & 0xffe00c00U) != 0x78400c00U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t _11 : 1; // 1
uint32_t imm9 : 9;
uint32_t _21 : 1; // 0
uint32_t opc : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.imm9.uimm = static_cast<uint64_t>(enc.imm9);
inst.V = static_cast<uint8_t>(enc.V);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LDRH_32_LDST_IMMPRE;
inst.iclass = InstName::LDRH;
return true;
}
static bool TryExtractLDRH_32_LDST_POS(InstData &inst, uint32_t bits) {
// bits
// & 11111111110000000000000000000000
// --------------------------------
// 01111001010000000000000000000000
if ((bits & 0xffc00000U) != 0x79400000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t imm12 : 12;
uint32_t opc : 2;
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.imm12.uimm = static_cast<uint64_t>(enc.imm12);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.V = static_cast<uint8_t>(enc.V);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LDRH_32_LDST_POS;
inst.iclass = InstName::LDRH;
return true;
}
static bool TryExtractSXTB_SBFM_32M_BITFIELD(InstData &inst, uint32_t bits) {
// bits
// & 11111111111111111111110000000000
// --------------------------------
// 00010011000000000001110000000000
if ((bits & 0xfffffc00U) != 0x13001c00U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t imms : 6;
uint32_t immr : 6;
uint32_t N : 1;
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 0
uint32_t _28 : 1; // 1
uint32_t opc : 2;
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.sf = static_cast<uint8_t>(enc.sf);
inst.N = static_cast<uint8_t>(enc.N);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.immr.uimm = static_cast<uint64_t>(enc.immr);
inst.imms.uimm = static_cast<uint64_t>(enc.imms);
inst.iform = InstForm::SXTB_SBFM_32M_BITFIELD;
inst.iclass = InstName::SBFM;
return true;
}
static bool TryExtractSXTB_SBFM_64M_BITFIELD(InstData &inst, uint32_t bits) {
// bits
// & 11111111111111111111110000000000
// --------------------------------
// 10010011010000000001110000000000
if ((bits & 0xfffffc00U) != 0x93401c00U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t imms : 6;
uint32_t immr : 6;
uint32_t N : 1;
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 0
uint32_t _28 : 1; // 1
uint32_t opc : 2;
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.sf = static_cast<uint8_t>(enc.sf);
inst.N = static_cast<uint8_t>(enc.N);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.immr.uimm = static_cast<uint64_t>(enc.immr);
inst.imms.uimm = static_cast<uint64_t>(enc.imms);
inst.iform = InstForm::SXTB_SBFM_64M_BITFIELD;
inst.iclass = InstName::SBFM;
return true;
}
static bool TryExtractERET_64E_BRANCH_REG(InstData &inst, uint32_t bits) {
// bits
// & 11111111111111111111111111111111
// --------------------------------
// 11010110100111110000001111100000
if ((bits & 0xffffffffU) != 0xd69f03e0U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t op4 : 5;
uint32_t Rt : 5;
uint32_t op3 : 6;
uint32_t op2 : 5;
uint32_t opc : 4;
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 0
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 0
uint32_t _30 : 1; // 1
uint32_t _31 : 1; // 1
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.op4 = static_cast<uint8_t>(enc.op4);
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.op2 = static_cast<uint8_t>(enc.op2);
inst.op3 = static_cast<uint8_t>(enc.op3);
inst.iform = InstForm::ERET_64E_BRANCH_REG;
inst.iclass = InstName::ERET;
return true;
}
static bool TryExtractSTUMIN_32S_MEMOP(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000011111
// --------------------------------
// 10111000001000000111000000011111
if ((bits & 0xffe0fc1fU) != 0xb820701fU) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t opc : 3;
uint32_t o3 : 1;
uint32_t Rs : 5;
uint32_t _21 : 1; // 1
uint32_t R : 1;
uint32_t A : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.A = static_cast<uint8_t>(enc.A);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.V = static_cast<uint8_t>(enc.V);
inst.R = static_cast<uint8_t>(enc.R);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o3 = static_cast<uint8_t>(enc.o3);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::STUMIN_32S_MEMOP;
inst.iclass = InstName::STUMIN;
return true;
}
static bool TryExtractSTUMINL_32S_MEMOP(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000011111
// --------------------------------
// 10111000011000000111000000011111
if ((bits & 0xffe0fc1fU) != 0xb860701fU) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t opc : 3;
uint32_t o3 : 1;
uint32_t Rs : 5;
uint32_t _21 : 1; // 1
uint32_t R : 1;
uint32_t A : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.A = static_cast<uint8_t>(enc.A);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.V = static_cast<uint8_t>(enc.V);
inst.R = static_cast<uint8_t>(enc.R);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o3 = static_cast<uint8_t>(enc.o3);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::STUMINL_32S_MEMOP;
inst.iclass = InstName::STUMINL;
return true;
}
static bool TryExtractSTUMIN_64S_MEMOP(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000011111
// --------------------------------
// 11111000001000000111000000011111
if ((bits & 0xffe0fc1fU) != 0xf820701fU) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t opc : 3;
uint32_t o3 : 1;
uint32_t Rs : 5;
uint32_t _21 : 1; // 1
uint32_t R : 1;
uint32_t A : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.A = static_cast<uint8_t>(enc.A);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.V = static_cast<uint8_t>(enc.V);
inst.R = static_cast<uint8_t>(enc.R);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o3 = static_cast<uint8_t>(enc.o3);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::STUMIN_64S_MEMOP;
inst.iclass = InstName::STUMIN;
return true;
}
static bool TryExtractSTUMINL_64S_MEMOP(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000011111
// --------------------------------
// 11111000011000000111000000011111
if ((bits & 0xffe0fc1fU) != 0xf860701fU) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t opc : 3;
uint32_t o3 : 1;
uint32_t Rs : 5;
uint32_t _21 : 1; // 1
uint32_t R : 1;
uint32_t A : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.A = static_cast<uint8_t>(enc.A);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.V = static_cast<uint8_t>(enc.V);
inst.R = static_cast<uint8_t>(enc.R);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o3 = static_cast<uint8_t>(enc.o3);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::STUMINL_64S_MEMOP;
inst.iclass = InstName::STUMINL;
return true;
}
static bool TryExtractSHA1SU1_VV_CRYPTOSHA2(InstData &inst, uint32_t bits) {
// bits
// & 11111111111111111111110000000000
// --------------------------------
// 01011110001010000001100000000000
if ((bits & 0xfffffc00U) != 0x5e281800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t opcode : 5;
uint32_t _17 : 1; // 0
uint32_t _18 : 1; // 0
uint32_t _19 : 1; // 1
uint32_t _20 : 1; // 0
uint32_t _21 : 1; // 1
uint32_t size : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 0
uint32_t _30 : 1; // 1
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::SHA1SU1_VV_CRYPTOSHA2;
inst.iclass = InstName::SHA1SU1;
return true;
}
static bool TryExtractLD1_ASISDLSE_R1_1V(InstData &inst, uint32_t bits) {
// bits
// & 10111111111111111111000000000000
// --------------------------------
// 00001100010000000111000000000000
if ((bits & 0xbffff000U) != 0xc407000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t size : 2;
uint32_t opcode : 4;
uint32_t _16 : 1; // 0
uint32_t _17 : 1; // 0
uint32_t _18 : 1; // 0
uint32_t _19 : 1; // 0
uint32_t _20 : 1; // 0
uint32_t _21 : 1; // 0
uint32_t L : 1;
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 0
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.L = static_cast<uint8_t>(enc.L);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LD1_ASISDLSE_R1_1V;
inst.iclass = InstName::LD1;
return true;
}
static bool TryExtractLD1_ASISDLSE_R2_2V(InstData &inst, uint32_t bits) {
// bits
// & 10111111111111111111000000000000
// --------------------------------
// 00001100010000001010000000000000
if ((bits & 0xbffff000U) != 0xc40a000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t size : 2;
uint32_t opcode : 4;
uint32_t _16 : 1; // 0
uint32_t _17 : 1; // 0
uint32_t _18 : 1; // 0
uint32_t _19 : 1; // 0
uint32_t _20 : 1; // 0
uint32_t _21 : 1; // 0
uint32_t L : 1;
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 0
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.L = static_cast<uint8_t>(enc.L);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LD1_ASISDLSE_R2_2V;
inst.iclass = InstName::LD1;
return true;
}
static bool TryExtractLD1_ASISDLSE_R3_3V(InstData &inst, uint32_t bits) {
// bits
// & 10111111111111111111000000000000
// --------------------------------
// 00001100010000000110000000000000
if ((bits & 0xbffff000U) != 0xc406000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t size : 2;
uint32_t opcode : 4;
uint32_t _16 : 1; // 0
uint32_t _17 : 1; // 0
uint32_t _18 : 1; // 0
uint32_t _19 : 1; // 0
uint32_t _20 : 1; // 0
uint32_t _21 : 1; // 0
uint32_t L : 1;
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 0
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.L = static_cast<uint8_t>(enc.L);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LD1_ASISDLSE_R3_3V;
inst.iclass = InstName::LD1;
return true;
}
static bool TryExtractLD1_ASISDLSE_R4_4V(InstData &inst, uint32_t bits) {
// bits
// & 10111111111111111111000000000000
// --------------------------------
// 00001100010000000010000000000000
if ((bits & 0xbffff000U) != 0xc402000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t size : 2;
uint32_t opcode : 4;
uint32_t _16 : 1; // 0
uint32_t _17 : 1; // 0
uint32_t _18 : 1; // 0
uint32_t _19 : 1; // 0
uint32_t _20 : 1; // 0
uint32_t _21 : 1; // 0
uint32_t L : 1;
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 0
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.L = static_cast<uint8_t>(enc.L);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LD1_ASISDLSE_R4_4V;
inst.iclass = InstName::LD1;
return true;
}
static bool TryExtractLD1_ASISDLSEP_I1_I1(InstData &inst, uint32_t bits) {
// bits
// & 10111111111111111111000000000000
// --------------------------------
// 00001100110111110111000000000000
if ((bits & 0xbffff000U) != 0xcdf7000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t size : 2;
uint32_t opcode : 4;
uint32_t Rm : 5;
uint32_t _21 : 1; // 0
uint32_t L : 1;
uint32_t _23 : 1; // 1
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 0
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.L = static_cast<uint8_t>(enc.L);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LD1_ASISDLSEP_I1_I1;
inst.iclass = InstName::LD1;
return true;
}
static bool TryExtractLD1_ASISDLSEP_R1_R1(InstData &inst, uint32_t bits) {
// bits
// & 10111111111000001111000000000000
// --------------------------------
// 00001100110000000111000000000000
if ((bits & 0xbfe0f000U) != 0xcc07000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t size : 2;
uint32_t opcode : 4;
uint32_t Rm : 5;
uint32_t _21 : 1; // 0
uint32_t L : 1;
uint32_t _23 : 1; // 1
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 0
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.L = static_cast<uint8_t>(enc.L);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LD1_ASISDLSEP_R1_R1;
inst.iclass = InstName::LD1;
return true;
}
static bool TryExtractLD1_ASISDLSEP_I2_I2(InstData &inst, uint32_t bits) {
// bits
// & 10111111111111111111000000000000
// --------------------------------
// 00001100110111111010000000000000
if ((bits & 0xbffff000U) != 0xcdfa000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t size : 2;
uint32_t opcode : 4;
uint32_t Rm : 5;
uint32_t _21 : 1; // 0
uint32_t L : 1;
uint32_t _23 : 1; // 1
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 0
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.L = static_cast<uint8_t>(enc.L);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LD1_ASISDLSEP_I2_I2;
inst.iclass = InstName::LD1;
return true;
}
static bool TryExtractLD1_ASISDLSEP_R2_R2(InstData &inst, uint32_t bits) {
// bits
// & 10111111111000001111000000000000
// --------------------------------
// 00001100110000001010000000000000
if ((bits & 0xbfe0f000U) != 0xcc0a000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t size : 2;
uint32_t opcode : 4;
uint32_t Rm : 5;
uint32_t _21 : 1; // 0
uint32_t L : 1;
uint32_t _23 : 1; // 1
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 0
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.L = static_cast<uint8_t>(enc.L);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LD1_ASISDLSEP_R2_R2;
inst.iclass = InstName::LD1;
return true;
}
static bool TryExtractLD1_ASISDLSEP_I3_I3(InstData &inst, uint32_t bits) {
// bits
// & 10111111111111111111000000000000
// --------------------------------
// 00001100110111110110000000000000
if ((bits & 0xbffff000U) != 0xcdf6000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t size : 2;
uint32_t opcode : 4;
uint32_t Rm : 5;
uint32_t _21 : 1; // 0
uint32_t L : 1;
uint32_t _23 : 1; // 1
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 0
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.L = static_cast<uint8_t>(enc.L);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LD1_ASISDLSEP_I3_I3;
inst.iclass = InstName::LD1;
return true;
}
static bool TryExtractLD1_ASISDLSEP_R3_R3(InstData &inst, uint32_t bits) {
// bits
// & 10111111111000001111000000000000
// --------------------------------
// 00001100110000000110000000000000
if ((bits & 0xbfe0f000U) != 0xcc06000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t size : 2;
uint32_t opcode : 4;
uint32_t Rm : 5;
uint32_t _21 : 1; // 0
uint32_t L : 1;
uint32_t _23 : 1; // 1
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 0
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.L = static_cast<uint8_t>(enc.L);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LD1_ASISDLSEP_R3_R3;
inst.iclass = InstName::LD1;
return true;
}
static bool TryExtractLD1_ASISDLSEP_I4_I4(InstData &inst, uint32_t bits) {
// bits
// & 10111111111111111111000000000000
// --------------------------------
// 00001100110111110010000000000000
if ((bits & 0xbffff000U) != 0xcdf2000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t size : 2;
uint32_t opcode : 4;
uint32_t Rm : 5;
uint32_t _21 : 1; // 0
uint32_t L : 1;
uint32_t _23 : 1; // 1
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 0
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.L = static_cast<uint8_t>(enc.L);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LD1_ASISDLSEP_I4_I4;
inst.iclass = InstName::LD1;
return true;
}
static bool TryExtractLD1_ASISDLSEP_R4_R4(InstData &inst, uint32_t bits) {
// bits
// & 10111111111000001111000000000000
// --------------------------------
// 00001100110000000010000000000000
if ((bits & 0xbfe0f000U) != 0xcc02000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t size : 2;
uint32_t opcode : 4;
uint32_t Rm : 5;
uint32_t _21 : 1; // 0
uint32_t L : 1;
uint32_t _23 : 1; // 1
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 0
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.L = static_cast<uint8_t>(enc.L);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LD1_ASISDLSEP_R4_R4;
inst.iclass = InstName::LD1;
return true;
}
static bool TryExtractSHA1H_SS_CRYPTOSHA2(InstData &inst, uint32_t bits) {
// bits
// & 11111111111111111111110000000000
// --------------------------------
// 01011110001010000000100000000000
if ((bits & 0xfffffc00U) != 0x5e280800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t opcode : 5;
uint32_t _17 : 1; // 0
uint32_t _18 : 1; // 0
uint32_t _19 : 1; // 1
uint32_t _20 : 1; // 0
uint32_t _21 : 1; // 1
uint32_t size : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 0
uint32_t _30 : 1; // 1
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::SHA1H_SS_CRYPTOSHA2;
inst.iclass = InstName::SHA1H;
return true;
}
static bool TryExtractFRINTM_ASIMDMISCFP16_R(InstData &inst, uint32_t bits) {
// bits
// & 10111111111111111111110000000000
// --------------------------------
// 00001110011110011001100000000000
if ((bits & 0xbffffc00U) != 0xe799800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t o1 : 1;
uint32_t _13 : 1; // 0
uint32_t _14 : 1; // 0
uint32_t _15 : 1; // 1
uint32_t _16 : 1; // 1
uint32_t _17 : 1; // 0
uint32_t _18 : 1; // 0
uint32_t _19 : 1; // 1
uint32_t _20 : 1; // 1
uint32_t _21 : 1; // 1
uint32_t _22 : 1; // 1
uint32_t o2 : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o2 = static_cast<uint8_t>(enc.o2);
inst.o1 = static_cast<uint8_t>(enc.o1);
inst.iform = InstForm::FRINTM_ASIMDMISCFP16_R;
inst.iclass = InstName::FRINTM;
return true;
}
static bool TryExtractFRINTM_ASIMDMISC_R(InstData &inst, uint32_t bits) {
// bits
// & 10111111101111111111110000000000
// --------------------------------
// 00001110001000011001100000000000
if ((bits & 0xbfbffc00U) != 0xe219800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t o1 : 1;
uint32_t _13 : 1; // 0
uint32_t _14 : 1; // 0
uint32_t _15 : 1; // 1
uint32_t _16 : 1; // 1
uint32_t _17 : 1; // 0
uint32_t _18 : 1; // 0
uint32_t _19 : 1; // 0
uint32_t _20 : 1; // 0
uint32_t _21 : 1; // 1
uint32_t sz : 1;
uint32_t o2 : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.sz = static_cast<uint8_t>(enc.sz);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o2 = static_cast<uint8_t>(enc.o2);
inst.o1 = static_cast<uint8_t>(enc.o1);
inst.iform = InstForm::FRINTM_ASIMDMISC_R;
inst.iclass = InstName::FRINTM;
return true;
}
static bool TryExtractSTURH_32_LDST_UNSCALED(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000000000110000000000
// --------------------------------
// 01111000000000000000000000000000
if ((bits & 0xffe00c00U) != 0x78000000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t imm9 : 9;
uint32_t _21 : 1; // 0
uint32_t opc : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.imm9.uimm = static_cast<uint64_t>(enc.imm9);
inst.V = static_cast<uint8_t>(enc.V);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::STURH_32_LDST_UNSCALED;
inst.iclass = InstName::STURH;
return true;
}
static bool TryExtractSQSHLU_ASISDSHF_R(InstData &inst, uint32_t bits) {
// bits
// & 11111111100000001111110000000000
// --------------------------------
// 01111111000000000110010000000000
if ((bits & 0xff80fc00U) != 0x7f006400U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t _11 : 1; // 0
uint32_t op : 1;
uint32_t _13 : 1; // 1
uint32_t _14 : 1; // 1
uint32_t _15 : 1; // 0
uint32_t immb : 3;
uint32_t immh : 4;
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t U : 1;
uint32_t _30 : 1; // 1
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.immh.uimm = static_cast<uint64_t>(enc.immh);
if (!(inst.immh.uimm != 0x0))
return false;
inst.immb.uimm = static_cast<uint64_t>(enc.immb);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.op = static_cast<uint8_t>(enc.op);
inst.iform = InstForm::SQSHLU_ASISDSHF_R;
inst.iclass = InstName::SQSHLU;
return true;
}
static bool TryExtractSQSHLU_ASIMDSHF_R(InstData &inst, uint32_t bits) {
// bits
// & 10111111100000001111110000000000
// --------------------------------
// 00101111000000000110010000000000
if ((bits & 0xbf80fc00U) != 0x2f006400U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t _11 : 1; // 0
uint32_t op : 1;
uint32_t _13 : 1; // 1
uint32_t _14 : 1; // 1
uint32_t _15 : 1; // 0
uint32_t immb : 3;
uint32_t immh : 4;
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.immh.uimm = static_cast<uint64_t>(enc.immh);
if (!(inst.immh.uimm != 0x0))
return false;
inst.immb.uimm = static_cast<uint64_t>(enc.immb);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.op = static_cast<uint8_t>(enc.op);
inst.iform = InstForm::SQSHLU_ASIMDSHF_R;
inst.iclass = InstName::SQSHLU;
return true;
}
static bool TryExtractUMULL_ASIMDELEM_L(InstData &inst, uint32_t bits) {
// bits
// & 10111111000000001111010000000000
// --------------------------------
// 00101111000000001010000000000000
if ((bits & 0xbf00f400U) != 0x2f00a000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t H : 1;
uint32_t opcode : 4;
uint32_t Rm : 4;
uint32_t M : 1;
uint32_t L : 1;
uint32_t size : 2;
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Q = static_cast<uint8_t>(enc.Q);
inst.H = static_cast<uint8_t>(enc.H);
inst.M = static_cast<uint8_t>(enc.M);
inst.L = static_cast<uint8_t>(enc.L);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.U = static_cast<uint8_t>(enc.U);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::UMULL_ASIMDELEM_L;
inst.iclass = InstName::UMULL;
return true;
}
static bool TryExtractNOT_ASIMDMISC_R(InstData &inst, uint32_t bits) {
if (false && TryExtractMVN_NOT_ASIMDMISC_R(inst, bits))
return true;
// bits
// & 10111111111111111111110000000000
// --------------------------------
// 00101110001000000101100000000000
if ((bits & 0xbffffc00U) != 0x2e205800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t opcode : 5;
uint32_t _17 : 1; // 0
uint32_t _18 : 1; // 0
uint32_t _19 : 1; // 0
uint32_t _20 : 1; // 0
uint32_t _21 : 1; // 1
uint32_t size : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.U = static_cast<uint8_t>(enc.U);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::NOT_ASIMDMISC_R;
inst.iclass = InstName::NOT;
return true;
}
static bool TryExtractLDR_B_LDST_IMMPOST(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000000000110000000000
// --------------------------------
// 00111100010000000000010000000000
if ((bits & 0xffe00c00U) != 0x3c400400U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t _11 : 1; // 0
uint32_t imm9 : 9;
uint32_t _21 : 1; // 0
uint32_t opc : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.imm9.uimm = static_cast<uint64_t>(enc.imm9);
inst.V = static_cast<uint8_t>(enc.V);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LDR_B_LDST_IMMPOST;
inst.iclass = InstName::LDR;
return true;
}
static bool TryExtractLDR_H_LDST_IMMPOST(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000000000110000000000
// --------------------------------
// 01111100010000000000010000000000
if ((bits & 0xffe00c00U) != 0x7c400400U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t _11 : 1; // 0
uint32_t imm9 : 9;
uint32_t _21 : 1; // 0
uint32_t opc : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.imm9.uimm = static_cast<uint64_t>(enc.imm9);
inst.V = static_cast<uint8_t>(enc.V);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LDR_H_LDST_IMMPOST;
inst.iclass = InstName::LDR;
return true;
}
static bool TryExtractLDR_S_LDST_IMMPOST(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000000000110000000000
// --------------------------------
// 10111100010000000000010000000000
if ((bits & 0xffe00c00U) != 0xbc400400U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t _11 : 1; // 0
uint32_t imm9 : 9;
uint32_t _21 : 1; // 0
uint32_t opc : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.imm9.uimm = static_cast<uint64_t>(enc.imm9);
inst.V = static_cast<uint8_t>(enc.V);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LDR_S_LDST_IMMPOST;
inst.iclass = InstName::LDR;
return true;
}
static bool TryExtractLDR_D_LDST_IMMPOST(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000000000110000000000
// --------------------------------
// 11111100010000000000010000000000
if ((bits & 0xffe00c00U) != 0xfc400400U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t _11 : 1; // 0
uint32_t imm9 : 9;
uint32_t _21 : 1; // 0
uint32_t opc : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.imm9.uimm = static_cast<uint64_t>(enc.imm9);
inst.V = static_cast<uint8_t>(enc.V);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LDR_D_LDST_IMMPOST;
inst.iclass = InstName::LDR;
return true;
}
static bool TryExtractLDR_Q_LDST_IMMPOST(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000000000110000000000
// --------------------------------
// 00111100110000000000010000000000
if ((bits & 0xffe00c00U) != 0x3cc00400U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t _11 : 1; // 0
uint32_t imm9 : 9;
uint32_t _21 : 1; // 0
uint32_t opc : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.imm9.uimm = static_cast<uint64_t>(enc.imm9);
inst.V = static_cast<uint8_t>(enc.V);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LDR_Q_LDST_IMMPOST;
inst.iclass = InstName::LDR;
return true;
}
static bool TryExtractLDR_B_LDST_IMMPRE(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000000000110000000000
// --------------------------------
// 00111100010000000000110000000000
if ((bits & 0xffe00c00U) != 0x3c400c00U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t _11 : 1; // 1
uint32_t imm9 : 9;
uint32_t _21 : 1; // 0
uint32_t opc : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.imm9.uimm = static_cast<uint64_t>(enc.imm9);
inst.V = static_cast<uint8_t>(enc.V);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LDR_B_LDST_IMMPRE;
inst.iclass = InstName::LDR;
return true;
}
static bool TryExtractLDR_H_LDST_IMMPRE(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000000000110000000000
// --------------------------------
// 01111100010000000000110000000000
if ((bits & 0xffe00c00U) != 0x7c400c00U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t _11 : 1; // 1
uint32_t imm9 : 9;
uint32_t _21 : 1; // 0
uint32_t opc : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.imm9.uimm = static_cast<uint64_t>(enc.imm9);
inst.V = static_cast<uint8_t>(enc.V);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LDR_H_LDST_IMMPRE;
inst.iclass = InstName::LDR;
return true;
}
static bool TryExtractLDR_S_LDST_IMMPRE(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000000000110000000000
// --------------------------------
// 10111100010000000000110000000000
if ((bits & 0xffe00c00U) != 0xbc400c00U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t _11 : 1; // 1
uint32_t imm9 : 9;
uint32_t _21 : 1; // 0
uint32_t opc : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.imm9.uimm = static_cast<uint64_t>(enc.imm9);
inst.V = static_cast<uint8_t>(enc.V);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LDR_S_LDST_IMMPRE;
inst.iclass = InstName::LDR;
return true;
}
static bool TryExtractLDR_D_LDST_IMMPRE(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000000000110000000000
// --------------------------------
// 11111100010000000000110000000000
if ((bits & 0xffe00c00U) != 0xfc400c00U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t _11 : 1; // 1
uint32_t imm9 : 9;
uint32_t _21 : 1; // 0
uint32_t opc : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.imm9.uimm = static_cast<uint64_t>(enc.imm9);
inst.V = static_cast<uint8_t>(enc.V);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LDR_D_LDST_IMMPRE;
inst.iclass = InstName::LDR;
return true;
}
static bool TryExtractLDR_Q_LDST_IMMPRE(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000000000110000000000
// --------------------------------
// 00111100110000000000110000000000
if ((bits & 0xffe00c00U) != 0x3cc00c00U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t _11 : 1; // 1
uint32_t imm9 : 9;
uint32_t _21 : 1; // 0
uint32_t opc : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.imm9.uimm = static_cast<uint64_t>(enc.imm9);
inst.V = static_cast<uint8_t>(enc.V);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LDR_Q_LDST_IMMPRE;
inst.iclass = InstName::LDR;
return true;
}
static bool TryExtractLDR_B_LDST_POS(InstData &inst, uint32_t bits) {
// bits
// & 11111111110000000000000000000000
// --------------------------------
// 00111101010000000000000000000000
if ((bits & 0xffc00000U) != 0x3d400000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t imm12 : 12;
uint32_t opc : 2;
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.imm12.uimm = static_cast<uint64_t>(enc.imm12);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.V = static_cast<uint8_t>(enc.V);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LDR_B_LDST_POS;
inst.iclass = InstName::LDR;
return true;
}
static bool TryExtractLDR_H_LDST_POS(InstData &inst, uint32_t bits) {
// bits
// & 11111111110000000000000000000000
// --------------------------------
// 01111101010000000000000000000000
if ((bits & 0xffc00000U) != 0x7d400000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t imm12 : 12;
uint32_t opc : 2;
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.imm12.uimm = static_cast<uint64_t>(enc.imm12);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.V = static_cast<uint8_t>(enc.V);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LDR_H_LDST_POS;
inst.iclass = InstName::LDR;
return true;
}
static bool TryExtractLDR_S_LDST_POS(InstData &inst, uint32_t bits) {
// bits
// & 11111111110000000000000000000000
// --------------------------------
// 10111101010000000000000000000000
if ((bits & 0xffc00000U) != 0xbd400000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t imm12 : 12;
uint32_t opc : 2;
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.imm12.uimm = static_cast<uint64_t>(enc.imm12);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.V = static_cast<uint8_t>(enc.V);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LDR_S_LDST_POS;
inst.iclass = InstName::LDR;
return true;
}
static bool TryExtractLDR_D_LDST_POS(InstData &inst, uint32_t bits) {
// bits
// & 11111111110000000000000000000000
// --------------------------------
// 11111101010000000000000000000000
if ((bits & 0xffc00000U) != 0xfd400000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t imm12 : 12;
uint32_t opc : 2;
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.imm12.uimm = static_cast<uint64_t>(enc.imm12);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.V = static_cast<uint8_t>(enc.V);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LDR_D_LDST_POS;
inst.iclass = InstName::LDR;
return true;
}
static bool TryExtractLDR_Q_LDST_POS(InstData &inst, uint32_t bits) {
// bits
// & 11111111110000000000000000000000
// --------------------------------
// 00111101110000000000000000000000
if ((bits & 0xffc00000U) != 0x3dc00000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t imm12 : 12;
uint32_t opc : 2;
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.imm12.uimm = static_cast<uint64_t>(enc.imm12);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.V = static_cast<uint8_t>(enc.V);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LDR_Q_LDST_POS;
inst.iclass = InstName::LDR;
return true;
}
static bool TryExtractSWPAB_32_MEMOP(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 00111000101000001000000000000000
if ((bits & 0xffe0fc00U) != 0x38a08000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t opc : 3;
uint32_t o3 : 1;
uint32_t Rs : 5;
uint32_t _21 : 1; // 1
uint32_t R : 1;
uint32_t A : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.A = static_cast<uint8_t>(enc.A);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.V = static_cast<uint8_t>(enc.V);
inst.R = static_cast<uint8_t>(enc.R);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o3 = static_cast<uint8_t>(enc.o3);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::SWPAB_32_MEMOP;
inst.iclass = InstName::SWPAB;
return true;
}
static bool TryExtractSWPALB_32_MEMOP(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 00111000111000001000000000000000
if ((bits & 0xffe0fc00U) != 0x38e08000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t opc : 3;
uint32_t o3 : 1;
uint32_t Rs : 5;
uint32_t _21 : 1; // 1
uint32_t R : 1;
uint32_t A : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.A = static_cast<uint8_t>(enc.A);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.V = static_cast<uint8_t>(enc.V);
inst.R = static_cast<uint8_t>(enc.R);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o3 = static_cast<uint8_t>(enc.o3);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::SWPALB_32_MEMOP;
inst.iclass = InstName::SWPALB;
return true;
}
static bool TryExtractSWPB_32_MEMOP(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 00111000001000001000000000000000
if ((bits & 0xffe0fc00U) != 0x38208000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t opc : 3;
uint32_t o3 : 1;
uint32_t Rs : 5;
uint32_t _21 : 1; // 1
uint32_t R : 1;
uint32_t A : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.A = static_cast<uint8_t>(enc.A);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.V = static_cast<uint8_t>(enc.V);
inst.R = static_cast<uint8_t>(enc.R);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o3 = static_cast<uint8_t>(enc.o3);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::SWPB_32_MEMOP;
inst.iclass = InstName::SWPB;
return true;
}
static bool TryExtractSWPLB_32_MEMOP(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 00111000011000001000000000000000
if ((bits & 0xffe0fc00U) != 0x38608000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t opc : 3;
uint32_t o3 : 1;
uint32_t Rs : 5;
uint32_t _21 : 1; // 1
uint32_t R : 1;
uint32_t A : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.A = static_cast<uint8_t>(enc.A);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.V = static_cast<uint8_t>(enc.V);
inst.R = static_cast<uint8_t>(enc.R);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o3 = static_cast<uint8_t>(enc.o3);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::SWPLB_32_MEMOP;
inst.iclass = InstName::SWPLB;
return true;
}
static bool TryExtractFMOV_ASIMDIMM_H_H(InstData &inst, uint32_t bits) {
// bits
// & 10111111111110001111110000000000
// --------------------------------
// 00001111000000001111110000000000
if ((bits & 0xbff8fc00U) != 0xf00fc00U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t h : 1;
uint32_t g : 1;
uint32_t f : 1;
uint32_t e : 1;
uint32_t d : 1;
uint32_t _10 : 1; // 1
uint32_t o2 : 1;
uint32_t cmode : 4;
uint32_t c : 1;
uint32_t b : 1;
uint32_t a : 1;
uint32_t _19 : 1; // 0
uint32_t _20 : 1; // 0
uint32_t _21 : 1; // 0
uint32_t _22 : 1; // 0
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t op : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.a = static_cast<uint8_t>(enc.a);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.c = static_cast<uint8_t>(enc.c);
inst.b = static_cast<uint8_t>(enc.b);
inst.e = static_cast<uint8_t>(enc.e);
inst.d = static_cast<uint8_t>(enc.d);
inst.g = static_cast<uint8_t>(enc.g);
inst.f = static_cast<uint8_t>(enc.f);
inst.h = static_cast<uint8_t>(enc.h);
inst.cmode = static_cast<uint8_t>(enc.cmode);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.o2 = static_cast<uint8_t>(enc.o2);
inst.op = static_cast<uint8_t>(enc.op);
inst.iform = InstForm::FMOV_ASIMDIMM_H_H;
inst.iclass = InstName::FMOV;
return true;
}
static bool TryExtractFMOV_ASIMDIMM_S_S(InstData &inst, uint32_t bits) {
// bits
// & 10111111111110001111110000000000
// --------------------------------
// 00001111000000001111010000000000
if ((bits & 0xbff8fc00U) != 0xf00f400U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t h : 1;
uint32_t g : 1;
uint32_t f : 1;
uint32_t e : 1;
uint32_t d : 1;
uint32_t _10 : 1; // 1
uint32_t o2 : 1;
uint32_t cmode : 4;
uint32_t c : 1;
uint32_t b : 1;
uint32_t a : 1;
uint32_t _19 : 1; // 0
uint32_t _20 : 1; // 0
uint32_t _21 : 1; // 0
uint32_t _22 : 1; // 0
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t op : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.a = static_cast<uint8_t>(enc.a);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.c = static_cast<uint8_t>(enc.c);
inst.b = static_cast<uint8_t>(enc.b);
inst.e = static_cast<uint8_t>(enc.e);
inst.d = static_cast<uint8_t>(enc.d);
inst.g = static_cast<uint8_t>(enc.g);
inst.f = static_cast<uint8_t>(enc.f);
inst.h = static_cast<uint8_t>(enc.h);
inst.cmode = static_cast<uint8_t>(enc.cmode);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.o2 = static_cast<uint8_t>(enc.o2);
inst.op = static_cast<uint8_t>(enc.op);
inst.iform = InstForm::FMOV_ASIMDIMM_S_S;
inst.iclass = InstName::FMOV;
return true;
}
static bool TryExtractFMOV_ASIMDIMM_D2_D(InstData &inst, uint32_t bits) {
// bits
// & 11111111111110001111110000000000
// --------------------------------
// 01101111000000001111010000000000
if ((bits & 0xfff8fc00U) != 0x6f00f400U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t h : 1;
uint32_t g : 1;
uint32_t f : 1;
uint32_t e : 1;
uint32_t d : 1;
uint32_t _10 : 1; // 1
uint32_t o2 : 1;
uint32_t cmode : 4;
uint32_t c : 1;
uint32_t b : 1;
uint32_t a : 1;
uint32_t _19 : 1; // 0
uint32_t _20 : 1; // 0
uint32_t _21 : 1; // 0
uint32_t _22 : 1; // 0
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t op : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.a = static_cast<uint8_t>(enc.a);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.c = static_cast<uint8_t>(enc.c);
inst.b = static_cast<uint8_t>(enc.b);
inst.e = static_cast<uint8_t>(enc.e);
inst.d = static_cast<uint8_t>(enc.d);
inst.g = static_cast<uint8_t>(enc.g);
inst.f = static_cast<uint8_t>(enc.f);
inst.h = static_cast<uint8_t>(enc.h);
inst.cmode = static_cast<uint8_t>(enc.cmode);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.o2 = static_cast<uint8_t>(enc.o2);
inst.op = static_cast<uint8_t>(enc.op);
inst.iform = InstForm::FMOV_ASIMDIMM_D2_D;
inst.iclass = InstName::FMOV;
return true;
}
static bool TryExtractFMIN_ASIMDSAMEFP16_ONLY(InstData &inst, uint32_t bits) {
// bits
// & 10111111111000001111110000000000
// --------------------------------
// 00001110110000000011010000000000
if ((bits & 0xbfe0fc00U) != 0xec03400U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t opcode : 3;
uint32_t _14 : 1; // 0
uint32_t _15 : 1; // 0
uint32_t Rm : 5;
uint32_t _21 : 1; // 0
uint32_t _22 : 1; // 1
uint32_t o1 : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.U = static_cast<uint8_t>(enc.U);
inst.o1 = static_cast<uint8_t>(enc.o1);
inst.iform = InstForm::FMIN_ASIMDSAMEFP16_ONLY;
inst.iclass = InstName::FMIN;
return true;
}
static bool TryExtractFMIN_ASIMDSAME_ONLY(InstData &inst, uint32_t bits) {
// bits
// & 10111111101000001111110000000000
// --------------------------------
// 00001110101000001111010000000000
if ((bits & 0xbfa0fc00U) != 0xea0f400U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t opcode : 5;
uint32_t Rm : 5;
uint32_t _21 : 1; // 1
uint32_t sz : 1;
uint32_t o1 : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.sz = static_cast<uint8_t>(enc.sz);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.U = static_cast<uint8_t>(enc.U);
inst.o1 = static_cast<uint8_t>(enc.o1);
inst.iform = InstForm::FMIN_ASIMDSAME_ONLY;
inst.iclass = InstName::FMIN;
return true;
}
static bool TryExtractSQXTUN_ASISDMISC_N(InstData &inst, uint32_t bits) {
// bits
// & 11111111001111111111110000000000
// --------------------------------
// 01111110001000010010100000000000
if ((bits & 0xff3ffc00U) != 0x7e212800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t opcode : 5;
uint32_t _17 : 1; // 0
uint32_t _18 : 1; // 0
uint32_t _19 : 1; // 0
uint32_t _20 : 1; // 0
uint32_t _21 : 1; // 1
uint32_t size : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t U : 1;
uint32_t _30 : 1; // 1
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::SQXTUN_ASISDMISC_N;
inst.iclass = InstName::SQXTUN;
return true;
}
static bool TryExtractSQXTUN_ASIMDMISC_N(InstData &inst, uint32_t bits) {
// bits
// & 10111111001111111111110000000000
// --------------------------------
// 00101110001000010010100000000000
if ((bits & 0xbf3ffc00U) != 0x2e212800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t opcode : 5;
uint32_t _17 : 1; // 0
uint32_t _18 : 1; // 0
uint32_t _19 : 1; // 0
uint32_t _20 : 1; // 0
uint32_t _21 : 1; // 1
uint32_t size : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.U = static_cast<uint8_t>(enc.U);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::SQXTUN_ASIMDMISC_N;
inst.iclass = InstName::SQXTUN;
return true;
}
static bool TryExtractLDEORAB_32_MEMOP(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 00111000101000000010000000000000
if ((bits & 0xffe0fc00U) != 0x38a02000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t opc : 3;
uint32_t o3 : 1;
uint32_t Rs : 5;
uint32_t _21 : 1; // 1
uint32_t R : 1;
uint32_t A : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.A = static_cast<uint8_t>(enc.A);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.V = static_cast<uint8_t>(enc.V);
inst.R = static_cast<uint8_t>(enc.R);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o3 = static_cast<uint8_t>(enc.o3);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LDEORAB_32_MEMOP;
inst.iclass = InstName::LDEORAB;
return true;
}
static bool TryExtractLDEORALB_32_MEMOP(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 00111000111000000010000000000000
if ((bits & 0xffe0fc00U) != 0x38e02000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t opc : 3;
uint32_t o3 : 1;
uint32_t Rs : 5;
uint32_t _21 : 1; // 1
uint32_t R : 1;
uint32_t A : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.A = static_cast<uint8_t>(enc.A);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.V = static_cast<uint8_t>(enc.V);
inst.R = static_cast<uint8_t>(enc.R);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o3 = static_cast<uint8_t>(enc.o3);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LDEORALB_32_MEMOP;
inst.iclass = InstName::LDEORALB;
return true;
}
static bool TryExtractLDEORB_32_MEMOP(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 00111000001000000010000000000000
if ((bits & 0xffe0fc00U) != 0x38202000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t opc : 3;
uint32_t o3 : 1;
uint32_t Rs : 5;
uint32_t _21 : 1; // 1
uint32_t R : 1;
uint32_t A : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.A = static_cast<uint8_t>(enc.A);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.V = static_cast<uint8_t>(enc.V);
inst.R = static_cast<uint8_t>(enc.R);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o3 = static_cast<uint8_t>(enc.o3);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LDEORB_32_MEMOP;
inst.iclass = InstName::LDEORB;
return true;
}
static bool TryExtractLDEORLB_32_MEMOP(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 00111000011000000010000000000000
if ((bits & 0xffe0fc00U) != 0x38602000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t opc : 3;
uint32_t o3 : 1;
uint32_t Rs : 5;
uint32_t _21 : 1; // 1
uint32_t R : 1;
uint32_t A : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.A = static_cast<uint8_t>(enc.A);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.V = static_cast<uint8_t>(enc.V);
inst.R = static_cast<uint8_t>(enc.R);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o3 = static_cast<uint8_t>(enc.o3);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LDEORLB_32_MEMOP;
inst.iclass = InstName::LDEORLB;
return true;
}
static bool TryExtractFCVTPS_ASISDMISCFP16_R(InstData &inst, uint32_t bits) {
// bits
// & 11111111111111111111110000000000
// --------------------------------
// 01011110111110011010100000000000
if ((bits & 0xfffffc00U) != 0x5ef9a800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t o1 : 1;
uint32_t _13 : 1; // 1
uint32_t _14 : 1; // 0
uint32_t _15 : 1; // 1
uint32_t _16 : 1; // 1
uint32_t _17 : 1; // 0
uint32_t _18 : 1; // 0
uint32_t _19 : 1; // 1
uint32_t _20 : 1; // 1
uint32_t _21 : 1; // 1
uint32_t _22 : 1; // 1
uint32_t o2 : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t U : 1;
uint32_t _30 : 1; // 1
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.U = static_cast<uint8_t>(enc.U);
inst.o2 = static_cast<uint8_t>(enc.o2);
inst.o1 = static_cast<uint8_t>(enc.o1);
inst.iform = InstForm::FCVTPS_ASISDMISCFP16_R;
inst.iclass = InstName::FCVTPS;
return true;
}
static bool TryExtractFCVTPS_ASISDMISC_R(InstData &inst, uint32_t bits) {
// bits
// & 11111111101111111111110000000000
// --------------------------------
// 01011110101000011010100000000000
if ((bits & 0xffbffc00U) != 0x5ea1a800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t o1 : 1;
uint32_t _13 : 1; // 1
uint32_t _14 : 1; // 0
uint32_t _15 : 1; // 1
uint32_t _16 : 1; // 1
uint32_t _17 : 1; // 0
uint32_t _18 : 1; // 0
uint32_t _19 : 1; // 0
uint32_t _20 : 1; // 0
uint32_t _21 : 1; // 1
uint32_t sz : 1;
uint32_t o2 : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t U : 1;
uint32_t _30 : 1; // 1
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.sz = static_cast<uint8_t>(enc.sz);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o2 = static_cast<uint8_t>(enc.o2);
inst.o1 = static_cast<uint8_t>(enc.o1);
inst.iform = InstForm::FCVTPS_ASISDMISC_R;
inst.iclass = InstName::FCVTPS;
return true;
}
static bool TryExtractFCVTPS_ASIMDMISCFP16_R(InstData &inst, uint32_t bits) {
// bits
// & 10111111111111111111110000000000
// --------------------------------
// 00001110111110011010100000000000
if ((bits & 0xbffffc00U) != 0xef9a800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t o1 : 1;
uint32_t _13 : 1; // 1
uint32_t _14 : 1; // 0
uint32_t _15 : 1; // 1
uint32_t _16 : 1; // 1
uint32_t _17 : 1; // 0
uint32_t _18 : 1; // 0
uint32_t _19 : 1; // 1
uint32_t _20 : 1; // 1
uint32_t _21 : 1; // 1
uint32_t _22 : 1; // 1
uint32_t o2 : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o2 = static_cast<uint8_t>(enc.o2);
inst.o1 = static_cast<uint8_t>(enc.o1);
inst.iform = InstForm::FCVTPS_ASIMDMISCFP16_R;
inst.iclass = InstName::FCVTPS;
return true;
}
static bool TryExtractFCVTPS_ASIMDMISC_R(InstData &inst, uint32_t bits) {
// bits
// & 10111111101111111111110000000000
// --------------------------------
// 00001110101000011010100000000000
if ((bits & 0xbfbffc00U) != 0xea1a800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t o1 : 1;
uint32_t _13 : 1; // 1
uint32_t _14 : 1; // 0
uint32_t _15 : 1; // 1
uint32_t _16 : 1; // 1
uint32_t _17 : 1; // 0
uint32_t _18 : 1; // 0
uint32_t _19 : 1; // 0
uint32_t _20 : 1; // 0
uint32_t _21 : 1; // 1
uint32_t sz : 1;
uint32_t o2 : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.sz = static_cast<uint8_t>(enc.sz);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o2 = static_cast<uint8_t>(enc.o2);
inst.o1 = static_cast<uint8_t>(enc.o1);
inst.iform = InstForm::FCVTPS_ASIMDMISC_R;
inst.iclass = InstName::FCVTPS;
return true;
}
static bool TryExtractLDR_S_LOADLIT(InstData &inst, uint32_t bits) {
// bits
// & 11111111000000000000000000000000
// --------------------------------
// 00011100000000000000000000000000
if ((bits & 0xff000000U) != 0x1c000000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t imm19 : 19;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 0
uint32_t opc : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.imm19.uimm = static_cast<uint64_t>(enc.imm19);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.V = static_cast<uint8_t>(enc.V);
inst.iform = InstForm::LDR_S_LOADLIT;
inst.iclass = InstName::LDR;
return true;
}
static bool TryExtractLDR_D_LOADLIT(InstData &inst, uint32_t bits) {
// bits
// & 11111111000000000000000000000000
// --------------------------------
// 01011100000000000000000000000000
if ((bits & 0xff000000U) != 0x5c000000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t imm19 : 19;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 0
uint32_t opc : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.imm19.uimm = static_cast<uint64_t>(enc.imm19);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.V = static_cast<uint8_t>(enc.V);
inst.iform = InstForm::LDR_D_LOADLIT;
inst.iclass = InstName::LDR;
return true;
}
static bool TryExtractLDR_Q_LOADLIT(InstData &inst, uint32_t bits) {
// bits
// & 11111111000000000000000000000000
// --------------------------------
// 10011100000000000000000000000000
if ((bits & 0xff000000U) != 0x9c000000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t imm19 : 19;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 0
uint32_t opc : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.imm19.uimm = static_cast<uint64_t>(enc.imm19);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.V = static_cast<uint8_t>(enc.V);
inst.iform = InstForm::LDR_Q_LOADLIT;
inst.iclass = InstName::LDR;
return true;
}
static bool TryExtractFRINTP_ASIMDMISCFP16_R(InstData &inst, uint32_t bits) {
// bits
// & 10111111111111111111110000000000
// --------------------------------
// 00001110111110011000100000000000
if ((bits & 0xbffffc00U) != 0xef98800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t o1 : 1;
uint32_t _13 : 1; // 0
uint32_t _14 : 1; // 0
uint32_t _15 : 1; // 1
uint32_t _16 : 1; // 1
uint32_t _17 : 1; // 0
uint32_t _18 : 1; // 0
uint32_t _19 : 1; // 1
uint32_t _20 : 1; // 1
uint32_t _21 : 1; // 1
uint32_t _22 : 1; // 1
uint32_t o2 : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o2 = static_cast<uint8_t>(enc.o2);
inst.o1 = static_cast<uint8_t>(enc.o1);
inst.iform = InstForm::FRINTP_ASIMDMISCFP16_R;
inst.iclass = InstName::FRINTP;
return true;
}
static bool TryExtractFRINTP_ASIMDMISC_R(InstData &inst, uint32_t bits) {
// bits
// & 10111111101111111111110000000000
// --------------------------------
// 00001110101000011000100000000000
if ((bits & 0xbfbffc00U) != 0xea18800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t o1 : 1;
uint32_t _13 : 1; // 0
uint32_t _14 : 1; // 0
uint32_t _15 : 1; // 1
uint32_t _16 : 1; // 1
uint32_t _17 : 1; // 0
uint32_t _18 : 1; // 0
uint32_t _19 : 1; // 0
uint32_t _20 : 1; // 0
uint32_t _21 : 1; // 1
uint32_t sz : 1;
uint32_t o2 : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.sz = static_cast<uint8_t>(enc.sz);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o2 = static_cast<uint8_t>(enc.o2);
inst.o1 = static_cast<uint8_t>(enc.o1);
inst.iform = InstForm::FRINTP_ASIMDMISC_R;
inst.iclass = InstName::FRINTP;
return true;
}
static bool TryExtractLDLARB_LR32_LDSTEXCL(InstData &inst, uint32_t bits) {
// bits
// & 11111111111111111111110000000000
// --------------------------------
// 00001000110111110111110000000000
if ((bits & 0xfffffc00U) != 0x8df7c00U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t Rt2 : 5;
uint32_t o0 : 1;
uint32_t Rs : 5;
uint32_t o1 : 1;
uint32_t L : 1;
uint32_t o2 : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 0
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.L = static_cast<uint8_t>(enc.L);
inst.Rt2 = static_cast<uint8_t>(enc.Rt2);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.o2 = static_cast<uint8_t>(enc.o2);
inst.o1 = static_cast<uint8_t>(enc.o1);
inst.o0 = static_cast<uint8_t>(enc.o0);
inst.iform = InstForm::LDLARB_LR32_LDSTEXCL;
inst.iclass = InstName::LDLARB;
return true;
}
static bool TryExtractFNEG_ASIMDMISCFP16_R(InstData &inst, uint32_t bits) {
// bits
// & 10111111111111111111110000000000
// --------------------------------
// 00101110111110001111100000000000
if ((bits & 0xbffffc00U) != 0x2ef8f800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t opcode : 5;
uint32_t _17 : 1; // 0
uint32_t _18 : 1; // 0
uint32_t _19 : 1; // 1
uint32_t _20 : 1; // 1
uint32_t _21 : 1; // 1
uint32_t _22 : 1; // 1
uint32_t a : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.a = static_cast<uint8_t>(enc.a);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.iform = InstForm::FNEG_ASIMDMISCFP16_R;
inst.iclass = InstName::FNEG;
return true;
}
static bool TryExtractFNEG_ASIMDMISC_R(InstData &inst, uint32_t bits) {
// bits
// & 10111111101111111111110000000000
// --------------------------------
// 00101110101000001111100000000000
if ((bits & 0xbfbffc00U) != 0x2ea0f800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t opcode : 5;
uint32_t _17 : 1; // 0
uint32_t _18 : 1; // 0
uint32_t _19 : 1; // 0
uint32_t _20 : 1; // 0
uint32_t _21 : 1; // 1
uint32_t sz : 1;
uint32_t _23 : 1; // 1
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.sz = static_cast<uint8_t>(enc.sz);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.U = static_cast<uint8_t>(enc.U);
inst.iform = InstForm::FNEG_ASIMDMISC_R;
inst.iclass = InstName::FNEG;
return true;
}
static bool TryExtractADDHN_ASIMDDIFF_N(InstData &inst, uint32_t bits) {
// bits
// & 10111111001000001111110000000000
// --------------------------------
// 00001110001000000100000000000000
if ((bits & 0xbf20fc00U) != 0xe204000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t _12 : 1; // 0
uint32_t o1 : 1;
uint32_t _14 : 1; // 1
uint32_t _15 : 1; // 0
uint32_t Rm : 5;
uint32_t _21 : 1; // 1
uint32_t size : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o1 = static_cast<uint8_t>(enc.o1);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::ADDHN_ASIMDDIFF_N;
inst.iclass = InstName::ADDHN;
return true;
}
static bool TryExtractLDNP_32_LDSTNAPAIR_OFFS(InstData &inst, uint32_t bits) {
// bits
// & 11111111110000000000000000000000
// --------------------------------
// 00101000010000000000000000000000
if ((bits & 0xffc00000U) != 0x28400000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t Rt2 : 5;
uint32_t imm7 : 7;
uint32_t L : 1;
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 1
uint32_t opc : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rt2 = static_cast<uint8_t>(enc.Rt2);
inst.L = static_cast<uint8_t>(enc.L);
inst.V = static_cast<uint8_t>(enc.V);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.imm7.uimm = static_cast<uint64_t>(enc.imm7);
inst.iform = InstForm::LDNP_32_LDSTNAPAIR_OFFS;
inst.iclass = InstName::LDNP;
return true;
}
static bool TryExtractLDNP_64_LDSTNAPAIR_OFFS(InstData &inst, uint32_t bits) {
// bits
// & 11111111110000000000000000000000
// --------------------------------
// 10101000010000000000000000000000
if ((bits & 0xffc00000U) != 0xa8400000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t Rt2 : 5;
uint32_t imm7 : 7;
uint32_t L : 1;
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 1
uint32_t opc : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rt2 = static_cast<uint8_t>(enc.Rt2);
inst.L = static_cast<uint8_t>(enc.L);
inst.V = static_cast<uint8_t>(enc.V);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.imm7.uimm = static_cast<uint64_t>(enc.imm7);
inst.iform = InstForm::LDNP_64_LDSTNAPAIR_OFFS;
inst.iclass = InstName::LDNP;
return true;
}
static bool TryExtractSQRSHRN_ASISDSHF_N(InstData &inst, uint32_t bits) {
// bits
// & 11111111100000001111110000000000
// --------------------------------
// 01011111000000001001110000000000
if ((bits & 0xff80fc00U) != 0x5f009c00U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t op : 1;
uint32_t _12 : 1; // 1
uint32_t _13 : 1; // 0
uint32_t _14 : 1; // 0
uint32_t _15 : 1; // 1
uint32_t immb : 3;
uint32_t immh : 4;
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t U : 1;
uint32_t _30 : 1; // 1
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.immh.uimm = static_cast<uint64_t>(enc.immh);
if (!(inst.immh.uimm != 0x0))
return false;
inst.immb.uimm = static_cast<uint64_t>(enc.immb);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.op = static_cast<uint8_t>(enc.op);
inst.iform = InstForm::SQRSHRN_ASISDSHF_N;
inst.iclass = InstName::SQRSHRN;
return true;
}
static bool TryExtractSQRSHRN_ASIMDSHF_N(InstData &inst, uint32_t bits) {
// bits
// & 10111111100000001111110000000000
// --------------------------------
// 00001111000000001001110000000000
if ((bits & 0xbf80fc00U) != 0xf009c00U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t op : 1;
uint32_t _12 : 1; // 1
uint32_t _13 : 1; // 0
uint32_t _14 : 1; // 0
uint32_t _15 : 1; // 1
uint32_t immb : 3;
uint32_t immh : 4;
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.immh.uimm = static_cast<uint64_t>(enc.immh);
if (!(inst.immh.uimm != 0x0))
return false;
inst.immb.uimm = static_cast<uint64_t>(enc.immb);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.op = static_cast<uint8_t>(enc.op);
inst.iform = InstForm::SQRSHRN_ASIMDSHF_N;
inst.iclass = InstName::SQRSHRN;
return true;
}
static bool TryExtractCMGT_ASISDSAME_ONLY(InstData &inst, uint32_t bits) {
// bits
// & 11111111001000001111110000000000
// --------------------------------
// 01011110001000000011010000000000
if ((bits & 0xff20fc00U) != 0x5e203400U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t eq : 1;
uint32_t _12 : 1; // 1
uint32_t _13 : 1; // 1
uint32_t _14 : 1; // 0
uint32_t _15 : 1; // 0
uint32_t Rm : 5;
uint32_t _21 : 1; // 1
uint32_t size : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t U : 1;
uint32_t _30 : 1; // 1
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.eq = static_cast<uint8_t>(enc.eq);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::CMGT_ASISDSAME_ONLY;
inst.iclass = InstName::CMGT;
return true;
}
static bool TryExtractCMGT_ASIMDSAME_ONLY(InstData &inst, uint32_t bits) {
// bits
// & 10111111001000001111110000000000
// --------------------------------
// 00001110001000000011010000000000
if ((bits & 0xbf20fc00U) != 0xe203400U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t eq : 1;
uint32_t _12 : 1; // 1
uint32_t _13 : 1; // 1
uint32_t _14 : 1; // 0
uint32_t _15 : 1; // 0
uint32_t Rm : 5;
uint32_t _21 : 1; // 1
uint32_t size : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.eq = static_cast<uint8_t>(enc.eq);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::CMGT_ASIMDSAME_ONLY;
inst.iclass = InstName::CMGT;
return true;
}
static bool TryExtractST4_ASISDLSE_R4(InstData &inst, uint32_t bits) {
// bits
// & 10111111111111111111000000000000
// --------------------------------
// 00001100000000000000000000000000
if ((bits & 0xbffff000U) != 0xc000000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t size : 2;
uint32_t opcode : 4;
uint32_t _16 : 1; // 0
uint32_t _17 : 1; // 0
uint32_t _18 : 1; // 0
uint32_t _19 : 1; // 0
uint32_t _20 : 1; // 0
uint32_t _21 : 1; // 0
uint32_t L : 1;
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 0
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.L = static_cast<uint8_t>(enc.L);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::ST4_ASISDLSE_R4;
inst.iclass = InstName::ST4;
return true;
}
static bool TryExtractST4_ASISDLSEP_I4_I(InstData &inst, uint32_t bits) {
// bits
// & 10111111111111111111000000000000
// --------------------------------
// 00001100100111110000000000000000
if ((bits & 0xbffff000U) != 0xc9f0000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t size : 2;
uint32_t opcode : 4;
uint32_t Rm : 5;
uint32_t _21 : 1; // 0
uint32_t L : 1;
uint32_t _23 : 1; // 1
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 0
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.L = static_cast<uint8_t>(enc.L);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::ST4_ASISDLSEP_I4_I;
inst.iclass = InstName::ST4;
return true;
}
static bool TryExtractST4_ASISDLSEP_R4_R(InstData &inst, uint32_t bits) {
// bits
// & 10111111111000001111000000000000
// --------------------------------
// 00001100100000000000000000000000
if ((bits & 0xbfe0f000U) != 0xc800000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t size : 2;
uint32_t opcode : 4;
uint32_t Rm : 5;
uint32_t _21 : 1; // 0
uint32_t L : 1;
uint32_t _23 : 1; // 1
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 0
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.L = static_cast<uint8_t>(enc.L);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::ST4_ASISDLSEP_R4_R;
inst.iclass = InstName::ST4;
return true;
}
static bool TryExtractASRV_32_DP_2SRC(InstData &inst, uint32_t bits) {
if (false && TryExtractASR_ASRV_32_DP_2SRC(inst, bits))
return true;
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 00011010110000000010100000000000
if ((bits & 0xffe0fc00U) != 0x1ac02800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t op2 : 2;
uint32_t opcode2 : 4;
uint32_t Rm : 5;
uint32_t _21 : 1; // 0
uint32_t _22 : 1; // 1
uint32_t _23 : 1; // 1
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t op : 1;
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.opcode2 = static_cast<uint8_t>(enc.opcode2);
inst.op2 = static_cast<uint8_t>(enc.op2);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.sf = static_cast<uint8_t>(enc.sf);
inst.op = static_cast<uint8_t>(enc.op);
inst.iform = InstForm::ASRV_32_DP_2SRC;
inst.iclass = InstName::ASRV;
return true;
}
static bool TryExtractASRV_64_DP_2SRC(InstData &inst, uint32_t bits) {
if (false && TryExtractASR_ASRV_64_DP_2SRC(inst, bits))
return true;
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 10011010110000000010100000000000
if ((bits & 0xffe0fc00U) != 0x9ac02800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t op2 : 2;
uint32_t opcode2 : 4;
uint32_t Rm : 5;
uint32_t _21 : 1; // 0
uint32_t _22 : 1; // 1
uint32_t _23 : 1; // 1
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t op : 1;
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.opcode2 = static_cast<uint8_t>(enc.opcode2);
inst.op2 = static_cast<uint8_t>(enc.op2);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.sf = static_cast<uint8_t>(enc.sf);
inst.op = static_cast<uint8_t>(enc.op);
inst.iform = InstForm::ASRV_64_DP_2SRC;
inst.iclass = InstName::ASRV;
return true;
}
static bool TryExtractUHSUB_ASIMDSAME_ONLY(InstData &inst, uint32_t bits) {
// bits
// & 10111111001000001111110000000000
// --------------------------------
// 00101110001000000010010000000000
if ((bits & 0xbf20fc00U) != 0x2e202400U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t opcode : 5;
uint32_t Rm : 5;
uint32_t _21 : 1; // 1
uint32_t size : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.U = static_cast<uint8_t>(enc.U);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::UHSUB_ASIMDSAME_ONLY;
inst.iclass = InstName::UHSUB;
return true;
}
static bool TryExtractCMHS_ASISDSAME_ONLY(InstData &inst, uint32_t bits) {
// bits
// & 11111111001000001111110000000000
// --------------------------------
// 01111110001000000011110000000000
if ((bits & 0xff20fc00U) != 0x7e203c00U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t eq : 1;
uint32_t _12 : 1; // 1
uint32_t _13 : 1; // 1
uint32_t _14 : 1; // 0
uint32_t _15 : 1; // 0
uint32_t Rm : 5;
uint32_t _21 : 1; // 1
uint32_t size : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t U : 1;
uint32_t _30 : 1; // 1
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.eq = static_cast<uint8_t>(enc.eq);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::CMHS_ASISDSAME_ONLY;
inst.iclass = InstName::CMHS;
return true;
}
static bool TryExtractCMHS_ASIMDSAME_ONLY(InstData &inst, uint32_t bits) {
// bits
// & 10111111001000001111110000000000
// --------------------------------
// 00101110001000000011110000000000
if ((bits & 0xbf20fc00U) != 0x2e203c00U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t eq : 1;
uint32_t _12 : 1; // 1
uint32_t _13 : 1; // 1
uint32_t _14 : 1; // 0
uint32_t _15 : 1; // 0
uint32_t Rm : 5;
uint32_t _21 : 1; // 1
uint32_t size : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.eq = static_cast<uint8_t>(enc.eq);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::CMHS_ASIMDSAME_ONLY;
inst.iclass = InstName::CMHS;
return true;
}
static bool TryExtractMOVZ_32_MOVEWIDE(InstData &inst, uint32_t bits) {
if (false && TryExtractMOV_MOVZ_32_MOVEWIDE(inst, bits))
return true;
// bits
// & 11111111100000000000000000000000
// --------------------------------
// 01010010100000000000000000000000
if ((bits & 0xff800000U) != 0x52800000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t imm16 : 16;
uint32_t hw : 2;
uint32_t _23 : 1; // 1
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 0
uint32_t _28 : 1; // 1
uint32_t opc : 2;
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.sf = static_cast<uint8_t>(enc.sf);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.hw = static_cast<uint8_t>(enc.hw);
inst.imm16.uimm = static_cast<uint64_t>(enc.imm16);
inst.iform = InstForm::MOVZ_32_MOVEWIDE;
inst.iclass = InstName::MOVZ;
return true;
}
static bool TryExtractMOVZ_64_MOVEWIDE(InstData &inst, uint32_t bits) {
if (false && TryExtractMOV_MOVZ_64_MOVEWIDE(inst, bits))
return true;
// bits
// & 11111111100000000000000000000000
// --------------------------------
// 11010010100000000000000000000000
if ((bits & 0xff800000U) != 0xd2800000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t imm16 : 16;
uint32_t hw : 2;
uint32_t _23 : 1; // 1
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 0
uint32_t _28 : 1; // 1
uint32_t opc : 2;
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.sf = static_cast<uint8_t>(enc.sf);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.hw = static_cast<uint8_t>(enc.hw);
inst.imm16.uimm = static_cast<uint64_t>(enc.imm16);
inst.iform = InstForm::MOVZ_64_MOVEWIDE;
inst.iclass = InstName::MOVZ;
return true;
}
static bool TryExtractSADDW_ASIMDDIFF_W(InstData &inst, uint32_t bits) {
// bits
// & 10111111001000001111110000000000
// --------------------------------
// 00001110001000000001000000000000
if ((bits & 0xbf20fc00U) != 0xe201000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t _12 : 1; // 1
uint32_t o1 : 1;
uint32_t _14 : 1; // 0
uint32_t _15 : 1; // 0
uint32_t Rm : 5;
uint32_t _21 : 1; // 1
uint32_t size : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o1 = static_cast<uint8_t>(enc.o1);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::SADDW_ASIMDDIFF_W;
inst.iclass = InstName::SADDW;
return true;
}
static bool TryExtractSADDLP_ASIMDMISC_P(InstData &inst, uint32_t bits) {
// bits
// & 10111111001111111111110000000000
// --------------------------------
// 00001110001000000010100000000000
if ((bits & 0xbf3ffc00U) != 0xe202800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t _12 : 1; // 0
uint32_t _13 : 1; // 1
uint32_t op : 1;
uint32_t _15 : 1; // 0
uint32_t _16 : 1; // 0
uint32_t _17 : 1; // 0
uint32_t _18 : 1; // 0
uint32_t _19 : 1; // 0
uint32_t _20 : 1; // 0
uint32_t _21 : 1; // 1
uint32_t size : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.op = static_cast<uint8_t>(enc.op);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::SADDLP_ASIMDMISC_P;
inst.iclass = InstName::SADDLP;
return true;
}
static bool TryExtractUMNEGL_UMSUBL_64WA_DP_3SRC(InstData &inst,
uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 10011011101000001111110000000000
if ((bits & 0xffe0fc00U) != 0x9ba0fc00U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t Ra : 5;
uint32_t o0 : 1;
uint32_t Rm : 5;
uint32_t _21 : 1; // 1
uint32_t _22 : 1; // 0
uint32_t U : 1;
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t op54 : 2;
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.U = static_cast<uint8_t>(enc.U);
inst.Ra = static_cast<uint8_t>(enc.Ra);
inst.op54 = static_cast<uint8_t>(enc.op54);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.sf = static_cast<uint8_t>(enc.sf);
inst.o0 = static_cast<uint8_t>(enc.o0);
inst.iform = InstForm::UMNEGL_UMSUBL_64WA_DP_3SRC;
inst.iclass = InstName::UMSUBL;
return true;
}
static bool TryExtractST2_ASISDLSE_R2(InstData &inst, uint32_t bits) {
// bits
// & 10111111111111111111000000000000
// --------------------------------
// 00001100000000001000000000000000
if ((bits & 0xbffff000U) != 0xc008000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t size : 2;
uint32_t opcode : 4;
uint32_t _16 : 1; // 0
uint32_t _17 : 1; // 0
uint32_t _18 : 1; // 0
uint32_t _19 : 1; // 0
uint32_t _20 : 1; // 0
uint32_t _21 : 1; // 0
uint32_t L : 1;
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 0
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.L = static_cast<uint8_t>(enc.L);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::ST2_ASISDLSE_R2;
inst.iclass = InstName::ST2;
return true;
}
static bool TryExtractST2_ASISDLSEP_I2_I(InstData &inst, uint32_t bits) {
// bits
// & 10111111111111111111000000000000
// --------------------------------
// 00001100100111111000000000000000
if ((bits & 0xbffff000U) != 0xc9f8000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t size : 2;
uint32_t opcode : 4;
uint32_t Rm : 5;
uint32_t _21 : 1; // 0
uint32_t L : 1;
uint32_t _23 : 1; // 1
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 0
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.L = static_cast<uint8_t>(enc.L);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::ST2_ASISDLSEP_I2_I;
inst.iclass = InstName::ST2;
return true;
}
static bool TryExtractST2_ASISDLSEP_R2_R(InstData &inst, uint32_t bits) {
// bits
// & 10111111111000001111000000000000
// --------------------------------
// 00001100100000001000000000000000
if ((bits & 0xbfe0f000U) != 0xc808000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t size : 2;
uint32_t opcode : 4;
uint32_t Rm : 5;
uint32_t _21 : 1; // 0
uint32_t L : 1;
uint32_t _23 : 1; // 1
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 0
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.L = static_cast<uint8_t>(enc.L);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::ST2_ASISDLSEP_R2_R;
inst.iclass = InstName::ST2;
return true;
}
static bool TryExtractUXTL_USHLL_ASIMDSHF_L(InstData &inst, uint32_t bits) {
// bits
// & 10111111100001111111110000000000
// --------------------------------
// 00101111000000001010010000000000
if ((bits & 0xbf87fc00U) != 0x2f00a400U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t opcode : 5;
uint32_t immb : 3;
uint32_t immh : 4;
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.immh.uimm = static_cast<uint64_t>(enc.immh);
if (!(inst.immh.uimm != 0x0))
return false;
inst.immb.uimm = static_cast<uint64_t>(enc.immb);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.iform = InstForm::UXTL_USHLL_ASIMDSHF_L;
inst.iclass = InstName::USHLL;
return true;
}
static bool TryExtractLDSMINA_32_MEMOP(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 10111000101000000101000000000000
if ((bits & 0xffe0fc00U) != 0xb8a05000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t opc : 3;
uint32_t o3 : 1;
uint32_t Rs : 5;
uint32_t _21 : 1; // 1
uint32_t R : 1;
uint32_t A : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.A = static_cast<uint8_t>(enc.A);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.V = static_cast<uint8_t>(enc.V);
inst.R = static_cast<uint8_t>(enc.R);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o3 = static_cast<uint8_t>(enc.o3);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LDSMINA_32_MEMOP;
inst.iclass = InstName::LDSMINA;
return true;
}
static bool TryExtractLDSMINAL_32_MEMOP(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 10111000111000000101000000000000
if ((bits & 0xffe0fc00U) != 0xb8e05000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t opc : 3;
uint32_t o3 : 1;
uint32_t Rs : 5;
uint32_t _21 : 1; // 1
uint32_t R : 1;
uint32_t A : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.A = static_cast<uint8_t>(enc.A);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.V = static_cast<uint8_t>(enc.V);
inst.R = static_cast<uint8_t>(enc.R);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o3 = static_cast<uint8_t>(enc.o3);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LDSMINAL_32_MEMOP;
inst.iclass = InstName::LDSMINAL;
return true;
}
static bool TryExtractLDSMIN_32_MEMOP(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 10111000001000000101000000000000
if ((bits & 0xffe0fc00U) != 0xb8205000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t opc : 3;
uint32_t o3 : 1;
uint32_t Rs : 5;
uint32_t _21 : 1; // 1
uint32_t R : 1;
uint32_t A : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.A = static_cast<uint8_t>(enc.A);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.V = static_cast<uint8_t>(enc.V);
inst.R = static_cast<uint8_t>(enc.R);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o3 = static_cast<uint8_t>(enc.o3);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LDSMIN_32_MEMOP;
inst.iclass = InstName::LDSMIN;
return true;
}
static bool TryExtractLDSMINL_32_MEMOP(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 10111000011000000101000000000000
if ((bits & 0xffe0fc00U) != 0xb8605000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t opc : 3;
uint32_t o3 : 1;
uint32_t Rs : 5;
uint32_t _21 : 1; // 1
uint32_t R : 1;
uint32_t A : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.A = static_cast<uint8_t>(enc.A);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.V = static_cast<uint8_t>(enc.V);
inst.R = static_cast<uint8_t>(enc.R);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o3 = static_cast<uint8_t>(enc.o3);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LDSMINL_32_MEMOP;
inst.iclass = InstName::LDSMINL;
return true;
}
static bool TryExtractLDSMINA_64_MEMOP(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 11111000101000000101000000000000
if ((bits & 0xffe0fc00U) != 0xf8a05000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t opc : 3;
uint32_t o3 : 1;
uint32_t Rs : 5;
uint32_t _21 : 1; // 1
uint32_t R : 1;
uint32_t A : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.A = static_cast<uint8_t>(enc.A);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.V = static_cast<uint8_t>(enc.V);
inst.R = static_cast<uint8_t>(enc.R);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o3 = static_cast<uint8_t>(enc.o3);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LDSMINA_64_MEMOP;
inst.iclass = InstName::LDSMINA;
return true;
}
static bool TryExtractLDSMINAL_64_MEMOP(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 11111000111000000101000000000000
if ((bits & 0xffe0fc00U) != 0xf8e05000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t opc : 3;
uint32_t o3 : 1;
uint32_t Rs : 5;
uint32_t _21 : 1; // 1
uint32_t R : 1;
uint32_t A : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.A = static_cast<uint8_t>(enc.A);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.V = static_cast<uint8_t>(enc.V);
inst.R = static_cast<uint8_t>(enc.R);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o3 = static_cast<uint8_t>(enc.o3);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LDSMINAL_64_MEMOP;
inst.iclass = InstName::LDSMINAL;
return true;
}
static bool TryExtractLDSMIN_64_MEMOP(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 11111000001000000101000000000000
if ((bits & 0xffe0fc00U) != 0xf8205000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t opc : 3;
uint32_t o3 : 1;
uint32_t Rs : 5;
uint32_t _21 : 1; // 1
uint32_t R : 1;
uint32_t A : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.A = static_cast<uint8_t>(enc.A);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.V = static_cast<uint8_t>(enc.V);
inst.R = static_cast<uint8_t>(enc.R);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o3 = static_cast<uint8_t>(enc.o3);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LDSMIN_64_MEMOP;
inst.iclass = InstName::LDSMIN;
return true;
}
static bool TryExtractLDSMINL_64_MEMOP(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 11111000011000000101000000000000
if ((bits & 0xffe0fc00U) != 0xf8605000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t opc : 3;
uint32_t o3 : 1;
uint32_t Rs : 5;
uint32_t _21 : 1; // 1
uint32_t R : 1;
uint32_t A : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.A = static_cast<uint8_t>(enc.A);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.V = static_cast<uint8_t>(enc.V);
inst.R = static_cast<uint8_t>(enc.R);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o3 = static_cast<uint8_t>(enc.o3);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LDSMINL_64_MEMOP;
inst.iclass = InstName::LDSMINL;
return true;
}
static bool TryExtractPSB_HC_SYSTEM(InstData &inst, uint32_t bits) {
// bits
// & 11111111111111111111111111111111
// --------------------------------
// 11010101000000110010001000111111
if ((bits & 0xffffffffU) != 0xd503223fU) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t op2 : 3;
uint32_t CRm : 4;
uint32_t CRn : 4;
uint32_t op1 : 3;
uint32_t op0 : 2;
uint32_t L : 1;
uint32_t _22 : 1; // 0
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 0
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 0
uint32_t _30 : 1; // 1
uint32_t _31 : 1; // 1
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.op0 = static_cast<uint8_t>(enc.op0);
inst.op1 = static_cast<uint8_t>(enc.op1);
inst.op2 = static_cast<uint8_t>(enc.op2);
inst.L = static_cast<uint8_t>(enc.L);
inst.CRn = static_cast<uint8_t>(enc.CRn);
inst.CRm = static_cast<uint8_t>(enc.CRm);
inst.iform = InstForm::PSB_HC_SYSTEM;
inst.iclass = InstName::PSB;
return true;
}
static bool TryExtractFMUL_ASISDELEM_RH_H(InstData &inst, uint32_t bits) {
// bits
// & 11111111110000001111010000000000
// --------------------------------
// 01011111000000001001000000000000
if ((bits & 0xffc0f400U) != 0x5f009000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t H : 1;
uint32_t opcode : 4;
uint32_t Rm : 4;
uint32_t M : 1;
uint32_t L : 1;
uint32_t size : 2;
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t U : 1;
uint32_t _30 : 1; // 1
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.H = static_cast<uint8_t>(enc.H);
inst.M = static_cast<uint8_t>(enc.M);
inst.L = static_cast<uint8_t>(enc.L);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.U = static_cast<uint8_t>(enc.U);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::FMUL_ASISDELEM_RH_H;
inst.iclass = InstName::FMUL;
return true;
}
static bool TryExtractFMUL_ASISDELEM_R_SD(InstData &inst, uint32_t bits) {
// bits
// & 11111111100000001111010000000000
// --------------------------------
// 01011111100000001001000000000000
if ((bits & 0xff80f400U) != 0x5f809000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t H : 1;
uint32_t opcode : 4;
uint32_t Rm : 4;
uint32_t M : 1;
uint32_t L : 1;
uint32_t sz : 1;
uint32_t _23 : 1; // 1
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t U : 1;
uint32_t _30 : 1; // 1
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.sz = static_cast<uint8_t>(enc.sz);
inst.H = static_cast<uint8_t>(enc.H);
inst.M = static_cast<uint8_t>(enc.M);
inst.L = static_cast<uint8_t>(enc.L);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.U = static_cast<uint8_t>(enc.U);
inst.iform = InstForm::FMUL_ASISDELEM_R_SD;
inst.iclass = InstName::FMUL;
return true;
}
static bool TryExtractFMUL_ASIMDELEM_RH_H(InstData &inst, uint32_t bits) {
// bits
// & 10111111110000001111010000000000
// --------------------------------
// 00001111000000001001000000000000
if ((bits & 0xbfc0f400U) != 0xf009000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t H : 1;
uint32_t opcode : 4;
uint32_t Rm : 4;
uint32_t M : 1;
uint32_t L : 1;
uint32_t size : 2;
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Q = static_cast<uint8_t>(enc.Q);
inst.H = static_cast<uint8_t>(enc.H);
inst.M = static_cast<uint8_t>(enc.M);
inst.L = static_cast<uint8_t>(enc.L);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.U = static_cast<uint8_t>(enc.U);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::FMUL_ASIMDELEM_RH_H;
inst.iclass = InstName::FMUL;
return true;
}
static bool TryExtractFMUL_ASIMDELEM_R_SD(InstData &inst, uint32_t bits) {
// bits
// & 10111111100000001111010000000000
// --------------------------------
// 00001111100000001001000000000000
if ((bits & 0xbf80f400U) != 0xf809000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t H : 1;
uint32_t opcode : 4;
uint32_t Rm : 4;
uint32_t M : 1;
uint32_t L : 1;
uint32_t sz : 1;
uint32_t _23 : 1; // 1
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.sz = static_cast<uint8_t>(enc.sz);
inst.H = static_cast<uint8_t>(enc.H);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.M = static_cast<uint8_t>(enc.M);
inst.L = static_cast<uint8_t>(enc.L);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.U = static_cast<uint8_t>(enc.U);
inst.iform = InstForm::FMUL_ASIMDELEM_R_SD;
inst.iclass = InstName::FMUL;
return true;
}
static bool TryExtractSHADD_ASIMDSAME_ONLY(InstData &inst, uint32_t bits) {
// bits
// & 10111111001000001111110000000000
// --------------------------------
// 00001110001000000000010000000000
if ((bits & 0xbf20fc00U) != 0xe200400U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t opcode : 5;
uint32_t Rm : 5;
uint32_t _21 : 1; // 1
uint32_t size : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.U = static_cast<uint8_t>(enc.U);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::SHADD_ASIMDSAME_ONLY;
inst.iclass = InstName::SHADD;
return true;
}
static bool TryExtractFMINP_ASISDPAIR_ONLY_H(InstData &inst, uint32_t bits) {
// bits
// & 11111111111111111111110000000000
// --------------------------------
// 01011110101100001111100000000000
if ((bits & 0xfffffc00U) != 0x5eb0f800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t opcode : 5;
uint32_t _17 : 1; // 0
uint32_t _18 : 1; // 0
uint32_t _19 : 1; // 0
uint32_t _20 : 1; // 1
uint32_t _21 : 1; // 1
uint32_t sz : 1;
uint32_t o1 : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t U : 1;
uint32_t _30 : 1; // 1
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.sz = static_cast<uint8_t>(enc.sz);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o1 = static_cast<uint8_t>(enc.o1);
inst.iform = InstForm::FMINP_ASISDPAIR_ONLY_H;
inst.iclass = InstName::FMINP;
return true;
}
static bool TryExtractFMINP_ASISDPAIR_ONLY_SD(InstData &inst, uint32_t bits) {
// bits
// & 11111111101111111111110000000000
// --------------------------------
// 01111110101100001111100000000000
if ((bits & 0xffbffc00U) != 0x7eb0f800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t opcode : 5;
uint32_t _17 : 1; // 0
uint32_t _18 : 1; // 0
uint32_t _19 : 1; // 0
uint32_t _20 : 1; // 1
uint32_t _21 : 1; // 1
uint32_t sz : 1;
uint32_t o1 : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t U : 1;
uint32_t _30 : 1; // 1
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.sz = static_cast<uint8_t>(enc.sz);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o1 = static_cast<uint8_t>(enc.o1);
inst.iform = InstForm::FMINP_ASISDPAIR_ONLY_SD;
inst.iclass = InstName::FMINP;
return true;
}
static bool TryExtractREV64_ASIMDMISC_R(InstData &inst, uint32_t bits) {
// bits
// & 10111111001111111111110000000000
// --------------------------------
// 00001110001000000000100000000000
if ((bits & 0xbf3ffc00U) != 0xe200800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t o0 : 1;
uint32_t _13 : 1; // 0
uint32_t _14 : 1; // 0
uint32_t _15 : 1; // 0
uint32_t _16 : 1; // 0
uint32_t _17 : 1; // 0
uint32_t _18 : 1; // 0
uint32_t _19 : 1; // 0
uint32_t _20 : 1; // 0
uint32_t _21 : 1; // 1
uint32_t size : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o0 = static_cast<uint8_t>(enc.o0);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::REV64_ASIMDMISC_R;
inst.iclass = InstName::REV64;
return true;
}
static bool TryExtractSSUBW_ASIMDDIFF_W(InstData &inst, uint32_t bits) {
// bits
// & 10111111001000001111110000000000
// --------------------------------
// 00001110001000000011000000000000
if ((bits & 0xbf20fc00U) != 0xe203000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t _12 : 1; // 1
uint32_t o1 : 1;
uint32_t _14 : 1; // 0
uint32_t _15 : 1; // 0
uint32_t Rm : 5;
uint32_t _21 : 1; // 1
uint32_t size : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o1 = static_cast<uint8_t>(enc.o1);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::SSUBW_ASIMDDIFF_W;
inst.iclass = InstName::SSUBW;
return true;
}
static bool TryExtractMOV_UMOV_ASIMDINS_W_W(InstData &inst, uint32_t bits) {
// bits
// & 11111111111001111111110000000000
// --------------------------------
// 00001110000001000011110000000000
if ((bits & 0xffe7fc00U) != 0xe043c00U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t imm4 : 4;
uint32_t _15 : 1; // 0
uint32_t imm5 : 5;
uint32_t _21 : 1; // 0
uint32_t _22 : 1; // 0
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t op : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.imm5.uimm = static_cast<uint64_t>(enc.imm5);
inst.imm4.uimm = static_cast<uint64_t>(enc.imm4);
inst.op = static_cast<uint8_t>(enc.op);
inst.iform = InstForm::MOV_UMOV_ASIMDINS_W_W;
inst.iclass = InstName::UMOV;
return true;
}
static bool TryExtractMOV_UMOV_ASIMDINS_X_X(InstData &inst, uint32_t bits) {
// bits
// & 11111111111011111111110000000000
// --------------------------------
// 01001110000010000011110000000000
if ((bits & 0xffeffc00U) != 0x4e083c00U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t imm4 : 4;
uint32_t _15 : 1; // 0
uint32_t imm5 : 5;
uint32_t _21 : 1; // 0
uint32_t _22 : 1; // 0
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t op : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.imm5.uimm = static_cast<uint64_t>(enc.imm5);
inst.imm4.uimm = static_cast<uint64_t>(enc.imm4);
inst.op = static_cast<uint8_t>(enc.op);
inst.iform = InstForm::MOV_UMOV_ASIMDINS_X_X;
inst.iclass = InstName::UMOV;
return true;
}
static bool TryExtractMLS_ASIMDELEM_R(InstData &inst, uint32_t bits) {
// bits
// & 10111111000000001111010000000000
// --------------------------------
// 00101111000000000100000000000000
if ((bits & 0xbf00f400U) != 0x2f004000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t H : 1;
uint32_t _12 : 1; // 0
uint32_t _13 : 1; // 0
uint32_t o2 : 1;
uint32_t _15 : 1; // 0
uint32_t Rm : 4;
uint32_t M : 1;
uint32_t L : 1;
uint32_t size : 2;
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Q = static_cast<uint8_t>(enc.Q);
inst.H = static_cast<uint8_t>(enc.H);
inst.M = static_cast<uint8_t>(enc.M);
inst.L = static_cast<uint8_t>(enc.L);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o2 = static_cast<uint8_t>(enc.o2);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::MLS_ASIMDELEM_R;
inst.iclass = InstName::MLS;
return true;
}
static bool TryExtractSQDMLSL_ASISDELEM_L(InstData &inst, uint32_t bits) {
// bits
// & 11111111000000001111010000000000
// --------------------------------
// 01011111000000000111000000000000
if ((bits & 0xff00f400U) != 0x5f007000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t H : 1;
uint32_t _12 : 1; // 1
uint32_t _13 : 1; // 1
uint32_t o2 : 1;
uint32_t _15 : 1; // 0
uint32_t Rm : 4;
uint32_t M : 1;
uint32_t L : 1;
uint32_t size : 2;
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t U : 1;
uint32_t _30 : 1; // 1
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.H = static_cast<uint8_t>(enc.H);
inst.M = static_cast<uint8_t>(enc.M);
inst.L = static_cast<uint8_t>(enc.L);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o2 = static_cast<uint8_t>(enc.o2);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::SQDMLSL_ASISDELEM_L;
inst.iclass = InstName::SQDMLSL;
return true;
}
static bool TryExtractSQDMLSL_ASIMDELEM_L(InstData &inst, uint32_t bits) {
// bits
// & 10111111000000001111010000000000
// --------------------------------
// 00001111000000000111000000000000
if ((bits & 0xbf00f400U) != 0xf007000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t H : 1;
uint32_t _12 : 1; // 1
uint32_t _13 : 1; // 1
uint32_t o2 : 1;
uint32_t _15 : 1; // 0
uint32_t Rm : 4;
uint32_t M : 1;
uint32_t L : 1;
uint32_t size : 2;
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Q = static_cast<uint8_t>(enc.Q);
inst.H = static_cast<uint8_t>(enc.H);
inst.M = static_cast<uint8_t>(enc.M);
inst.L = static_cast<uint8_t>(enc.L);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o2 = static_cast<uint8_t>(enc.o2);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::SQDMLSL_ASIMDELEM_L;
inst.iclass = InstName::SQDMLSL;
return true;
}
static bool TryExtractCINC_CSINC_32_CONDSEL(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000000000110000000000
// --------------------------------
// 00011010100000000000010000000000
if ((bits & 0xffe00c00U) != 0x1a800400U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t o2 : 1;
uint32_t _11 : 1; // 0
uint32_t cond : 4;
uint32_t Rm : 5;
uint32_t _21 : 1; // 0
uint32_t _22 : 1; // 0
uint32_t _23 : 1; // 1
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t op : 1;
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.sf = static_cast<uint8_t>(enc.sf);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.cond = static_cast<uint8_t>(enc.cond);
if (!(inst.cond != 0xe))
return false;
if (!(inst.cond != 0xf))
return false;
inst.Rm = static_cast<uint8_t>(enc.Rm);
if (!(inst.Rm != 0x1f))
return false;
inst.Rn = static_cast<uint8_t>(enc.Rn);
if (!(inst.Rn != 0x1f))
return false;
inst.o2 = static_cast<uint8_t>(enc.o2);
inst.op = static_cast<uint8_t>(enc.op);
inst.iform = InstForm::CINC_CSINC_32_CONDSEL;
inst.iclass = InstName::CSINC;
return true;
}
static bool TryExtractCINC_CSINC_64_CONDSEL(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000000000110000000000
// --------------------------------
// 10011010100000000000010000000000
if ((bits & 0xffe00c00U) != 0x9a800400U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t o2 : 1;
uint32_t _11 : 1; // 0
uint32_t cond : 4;
uint32_t Rm : 5;
uint32_t _21 : 1; // 0
uint32_t _22 : 1; // 0
uint32_t _23 : 1; // 1
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t op : 1;
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.sf = static_cast<uint8_t>(enc.sf);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.cond = static_cast<uint8_t>(enc.cond);
if (!(inst.cond != 0xe))
return false;
if (!(inst.cond != 0xf))
return false;
inst.Rm = static_cast<uint8_t>(enc.Rm);
if (!(inst.Rm != 0x1f))
return false;
inst.Rn = static_cast<uint8_t>(enc.Rn);
if (!(inst.Rn != 0x1f))
return false;
inst.o2 = static_cast<uint8_t>(enc.o2);
inst.op = static_cast<uint8_t>(enc.op);
inst.iform = InstForm::CINC_CSINC_64_CONDSEL;
inst.iclass = InstName::CSINC;
return true;
}
static bool TryExtractCSINV_32_CONDSEL(InstData &inst, uint32_t bits) {
if (false && TryExtractCSETM_CSINV_32_CONDSEL(inst, bits))
return true;
if (false && TryExtractCINV_CSINV_32_CONDSEL(inst, bits))
return true;
// bits
// & 11111111111000000000110000000000
// --------------------------------
// 01011010100000000000000000000000
if ((bits & 0xffe00c00U) != 0x5a800000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t o2 : 1;
uint32_t _11 : 1; // 0
uint32_t cond : 4;
uint32_t Rm : 5;
uint32_t _21 : 1; // 0
uint32_t _22 : 1; // 0
uint32_t _23 : 1; // 1
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t op : 1;
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.sf = static_cast<uint8_t>(enc.sf);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.cond = static_cast<uint8_t>(enc.cond);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o2 = static_cast<uint8_t>(enc.o2);
inst.op = static_cast<uint8_t>(enc.op);
inst.iform = InstForm::CSINV_32_CONDSEL;
inst.iclass = InstName::CSINV;
return true;
}
static bool TryExtractCSINV_64_CONDSEL(InstData &inst, uint32_t bits) {
if (false && TryExtractCSETM_CSINV_64_CONDSEL(inst, bits))
return true;
if (false && TryExtractCINV_CSINV_64_CONDSEL(inst, bits))
return true;
// bits
// & 11111111111000000000110000000000
// --------------------------------
// 11011010100000000000000000000000
if ((bits & 0xffe00c00U) != 0xda800000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t o2 : 1;
uint32_t _11 : 1; // 0
uint32_t cond : 4;
uint32_t Rm : 5;
uint32_t _21 : 1; // 0
uint32_t _22 : 1; // 0
uint32_t _23 : 1; // 1
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t op : 1;
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.sf = static_cast<uint8_t>(enc.sf);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.cond = static_cast<uint8_t>(enc.cond);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o2 = static_cast<uint8_t>(enc.o2);
inst.op = static_cast<uint8_t>(enc.op);
inst.iform = InstForm::CSINV_64_CONDSEL;
inst.iclass = InstName::CSINV;
return true;
}
static bool TryExtractFCVTZU_ASISDSHF_C(InstData &inst, uint32_t bits) {
// bits
// & 11111111100000001111110000000000
// --------------------------------
// 01111111000000001111110000000000
if ((bits & 0xff80fc00U) != 0x7f00fc00U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t opcode : 5;
uint32_t immb : 3;
uint32_t immh : 4;
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t U : 1;
uint32_t _30 : 1; // 1
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.immh.uimm = static_cast<uint64_t>(enc.immh);
if (!(inst.immh.uimm != 0x0))
return false;
inst.immb.uimm = static_cast<uint64_t>(enc.immb);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.iform = InstForm::FCVTZU_ASISDSHF_C;
inst.iclass = InstName::FCVTZU;
return true;
}
static bool TryExtractFCVTZU_ASIMDSHF_C(InstData &inst, uint32_t bits) {
// bits
// & 10111111100000001111110000000000
// --------------------------------
// 00101111000000001111110000000000
if ((bits & 0xbf80fc00U) != 0x2f00fc00U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t opcode : 5;
uint32_t immb : 3;
uint32_t immh : 4;
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.immh.uimm = static_cast<uint64_t>(enc.immh);
if (!(inst.immh.uimm != 0x0))
return false;
inst.immb.uimm = static_cast<uint64_t>(enc.immb);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.iform = InstForm::FCVTZU_ASIMDSHF_C;
inst.iclass = InstName::FCVTZU;
return true;
}
static bool TryExtractSSHL_ASISDSAME_ONLY(InstData &inst, uint32_t bits) {
// bits
// & 11111111001000001111110000000000
// --------------------------------
// 01011110001000000100010000000000
if ((bits & 0xff20fc00U) != 0x5e204400U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t S : 1;
uint32_t R : 1;
uint32_t _13 : 1; // 0
uint32_t _14 : 1; // 1
uint32_t _15 : 1; // 0
uint32_t Rm : 5;
uint32_t _21 : 1; // 1
uint32_t size : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t U : 1;
uint32_t _30 : 1; // 1
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.R = static_cast<uint8_t>(enc.R);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::SSHL_ASISDSAME_ONLY;
inst.iclass = InstName::SSHL;
return true;
}
static bool TryExtractSSHL_ASIMDSAME_ONLY(InstData &inst, uint32_t bits) {
// bits
// & 10111111001000001111110000000000
// --------------------------------
// 00001110001000000100010000000000
if ((bits & 0xbf20fc00U) != 0xe204400U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t S : 1;
uint32_t R : 1;
uint32_t _13 : 1; // 0
uint32_t _14 : 1; // 1
uint32_t _15 : 1; // 0
uint32_t Rm : 5;
uint32_t _21 : 1; // 1
uint32_t size : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.R = static_cast<uint8_t>(enc.R);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::SSHL_ASIMDSAME_ONLY;
inst.iclass = InstName::SSHL;
return true;
}
static bool TryExtractUXTB_UBFM_32M_BITFIELD(InstData &inst, uint32_t bits) {
// bits
// & 11111111111111111111110000000000
// --------------------------------
// 01010011000000000001110000000000
if ((bits & 0xfffffc00U) != 0x53001c00U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t imms : 6;
uint32_t immr : 6;
uint32_t N : 1;
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 0
uint32_t _28 : 1; // 1
uint32_t opc : 2;
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.sf = static_cast<uint8_t>(enc.sf);
inst.N = static_cast<uint8_t>(enc.N);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.immr.uimm = static_cast<uint64_t>(enc.immr);
inst.imms.uimm = static_cast<uint64_t>(enc.imms);
inst.iform = InstForm::UXTB_UBFM_32M_BITFIELD;
inst.iclass = InstName::UBFM;
return true;
}
static bool TryExtractSSRA_ASISDSHF_R(InstData &inst, uint32_t bits) {
// bits
// & 11111111100000001111110000000000
// --------------------------------
// 01011111000000000001010000000000
if ((bits & 0xff80fc00U) != 0x5f001400U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t _11 : 1; // 0
uint32_t o0 : 1;
uint32_t o1 : 1;
uint32_t _14 : 1; // 0
uint32_t _15 : 1; // 0
uint32_t immb : 3;
uint32_t immh : 4;
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t U : 1;
uint32_t _30 : 1; // 1
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.immh.uimm = static_cast<uint64_t>(enc.immh);
if (!(inst.immh.uimm != 0x0))
return false;
inst.immb.uimm = static_cast<uint64_t>(enc.immb);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o1 = static_cast<uint8_t>(enc.o1);
inst.o0 = static_cast<uint8_t>(enc.o0);
inst.iform = InstForm::SSRA_ASISDSHF_R;
inst.iclass = InstName::SSRA;
return true;
}
static bool TryExtractSSRA_ASIMDSHF_R(InstData &inst, uint32_t bits) {
// bits
// & 10111111100000001111110000000000
// --------------------------------
// 00001111000000000001010000000000
if ((bits & 0xbf80fc00U) != 0xf001400U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t _11 : 1; // 0
uint32_t o0 : 1;
uint32_t o1 : 1;
uint32_t _14 : 1; // 0
uint32_t _15 : 1; // 0
uint32_t immb : 3;
uint32_t immh : 4;
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.immh.uimm = static_cast<uint64_t>(enc.immh);
if (!(inst.immh.uimm != 0x0))
return false;
inst.immb.uimm = static_cast<uint64_t>(enc.immb);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o1 = static_cast<uint8_t>(enc.o1);
inst.o0 = static_cast<uint8_t>(enc.o0);
inst.iform = InstForm::SSRA_ASIMDSHF_R;
inst.iclass = InstName::SSRA;
return true;
}
static bool TryExtractLDRSW_64_LDST_REGOFF(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000000000110000000000
// --------------------------------
// 10111000101000000000100000000000
if ((bits & 0xffe00c00U) != 0xb8a00800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t S : 1;
uint32_t option : 3;
uint32_t Rm : 5;
uint32_t _21 : 1; // 1
uint32_t opc : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.option = static_cast<uint8_t>(enc.option);
inst.V = static_cast<uint8_t>(enc.V);
inst.S = static_cast<uint8_t>(enc.S);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LDRSW_64_LDST_REGOFF;
inst.iclass = InstName::LDRSW;
return true;
}
static bool TryExtractSQSHL_ASISDSAME_ONLY(InstData &inst, uint32_t bits) {
// bits
// & 11111111001000001111110000000000
// --------------------------------
// 01011110001000000100110000000000
if ((bits & 0xff20fc00U) != 0x5e204c00U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t S : 1;
uint32_t R : 1;
uint32_t _13 : 1; // 0
uint32_t _14 : 1; // 1
uint32_t _15 : 1; // 0
uint32_t Rm : 5;
uint32_t _21 : 1; // 1
uint32_t size : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t U : 1;
uint32_t _30 : 1; // 1
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.R = static_cast<uint8_t>(enc.R);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::SQSHL_ASISDSAME_ONLY;
inst.iclass = InstName::SQSHL;
return true;
}
static bool TryExtractSQSHL_ASIMDSAME_ONLY(InstData &inst, uint32_t bits) {
// bits
// & 10111111001000001111110000000000
// --------------------------------
// 00001110001000000100110000000000
if ((bits & 0xbf20fc00U) != 0xe204c00U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t S : 1;
uint32_t R : 1;
uint32_t _13 : 1; // 0
uint32_t _14 : 1; // 1
uint32_t _15 : 1; // 0
uint32_t Rm : 5;
uint32_t _21 : 1; // 1
uint32_t size : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.R = static_cast<uint8_t>(enc.R);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::SQSHL_ASIMDSAME_ONLY;
inst.iclass = InstName::SQSHL;
return true;
}
static bool TryExtractADDV_ASIMDALL_ONLY(InstData &inst, uint32_t bits) {
// bits
// & 10111111001111111111110000000000
// --------------------------------
// 00001110001100011011100000000000
if ((bits & 0xbf3ffc00U) != 0xe31b800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t opcode : 5;
uint32_t _17 : 1; // 0
uint32_t _18 : 1; // 0
uint32_t _19 : 1; // 0
uint32_t _20 : 1; // 1
uint32_t _21 : 1; // 1
uint32_t size : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.U = static_cast<uint8_t>(enc.U);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::ADDV_ASIMDALL_ONLY;
inst.iclass = InstName::ADDV;
return true;
}
static bool TryExtractPMUL_ASIMDSAME_ONLY(InstData &inst, uint32_t bits) {
// bits
// & 10111111001000001111110000000000
// --------------------------------
// 00101110001000001001110000000000
if ((bits & 0xbf20fc00U) != 0x2e209c00U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t opcode : 5;
uint32_t Rm : 5;
uint32_t _21 : 1; // 1
uint32_t size : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.U = static_cast<uint8_t>(enc.U);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::PMUL_ASIMDSAME_ONLY;
inst.iclass = InstName::PMUL;
return true;
}
static bool TryExtractSMLSL_ASIMDELEM_L(InstData &inst, uint32_t bits) {
// bits
// & 10111111000000001111010000000000
// --------------------------------
// 00001111000000000110000000000000
if ((bits & 0xbf00f400U) != 0xf006000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t H : 1;
uint32_t _12 : 1; // 0
uint32_t _13 : 1; // 1
uint32_t o2 : 1;
uint32_t _15 : 1; // 0
uint32_t Rm : 4;
uint32_t M : 1;
uint32_t L : 1;
uint32_t size : 2;
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Q = static_cast<uint8_t>(enc.Q);
inst.H = static_cast<uint8_t>(enc.H);
inst.M = static_cast<uint8_t>(enc.M);
inst.L = static_cast<uint8_t>(enc.L);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o2 = static_cast<uint8_t>(enc.o2);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::SMLSL_ASIMDELEM_L;
inst.iclass = InstName::SMLSL;
return true;
}
static bool TryExtractNEG_SUB_32_ADDSUB_SHIFT(InstData &inst, uint32_t bits) {
// bits
// & 11111111001000000000001111100000
// --------------------------------
// 01001011000000000000001111100000
if ((bits & 0xff2003e0U) != 0x4b0003e0U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t imm6 : 6;
uint32_t Rm : 5;
uint32_t _21 : 1; // 0
uint32_t shift : 2;
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t S : 1;
uint32_t op : 1;
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.shift = static_cast<uint8_t>(enc.shift);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.op = static_cast<uint8_t>(enc.op);
inst.sf = static_cast<uint8_t>(enc.sf);
inst.imm6.uimm = static_cast<uint64_t>(enc.imm6);
inst.iform = InstForm::NEG_SUB_32_ADDSUB_SHIFT;
inst.iclass = InstName::SUB;
return true;
}
static bool TryExtractNEG_SUB_64_ADDSUB_SHIFT(InstData &inst, uint32_t bits) {
// bits
// & 11111111001000000000001111100000
// --------------------------------
// 11001011000000000000001111100000
if ((bits & 0xff2003e0U) != 0xcb0003e0U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t imm6 : 6;
uint32_t Rm : 5;
uint32_t _21 : 1; // 0
uint32_t shift : 2;
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t S : 1;
uint32_t op : 1;
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.shift = static_cast<uint8_t>(enc.shift);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.op = static_cast<uint8_t>(enc.op);
inst.sf = static_cast<uint8_t>(enc.sf);
inst.imm6.uimm = static_cast<uint64_t>(enc.imm6);
inst.iform = InstForm::NEG_SUB_64_ADDSUB_SHIFT;
inst.iclass = InstName::SUB;
return true;
}
static bool TryExtractFCMP_H_FLOATCMP(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000011111
// --------------------------------
// 00011110111000000010000000000000
if ((bits & 0xffe0fc1fU) != 0x1ee02000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t _0 : 1; // 0
uint32_t _1 : 1; // 0
uint32_t _2 : 1; // 0
uint32_t opc : 2;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t _12 : 1; // 0
uint32_t _13 : 1; // 1
uint32_t op : 2;
uint32_t Rm : 5;
uint32_t _21 : 1; // 1
uint32_t type : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t _30 : 1; // 0
uint32_t M : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.M = static_cast<uint8_t>(enc.M);
inst.S = static_cast<uint8_t>(enc.S);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.type = static_cast<uint8_t>(enc.type);
inst.op = static_cast<uint8_t>(enc.op);
inst.iform = InstForm::FCMP_H_FLOATCMP;
inst.iclass = InstName::FCMP;
return true;
}
static bool TryExtractFCMP_HZ_FLOATCMP(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000011111
// --------------------------------
// 00011110111000000010000000001000
if ((bits & 0xffe0fc1fU) != 0x1ee02008U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t _0 : 1; // 0
uint32_t _1 : 1; // 0
uint32_t _2 : 1; // 0
uint32_t opc : 2;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t _12 : 1; // 0
uint32_t _13 : 1; // 1
uint32_t op : 2;
uint32_t Rm : 5;
uint32_t _21 : 1; // 1
uint32_t type : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t _30 : 1; // 0
uint32_t M : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.M = static_cast<uint8_t>(enc.M);
inst.S = static_cast<uint8_t>(enc.S);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.type = static_cast<uint8_t>(enc.type);
inst.op = static_cast<uint8_t>(enc.op);
inst.iform = InstForm::FCMP_HZ_FLOATCMP;
inst.iclass = InstName::FCMP;
return true;
}
static bool TryExtractFCMP_S_FLOATCMP(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000011111
// --------------------------------
// 00011110001000000010000000000000
if ((bits & 0xffe0fc1fU) != 0x1e202000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t _0 : 1; // 0
uint32_t _1 : 1; // 0
uint32_t _2 : 1; // 0
uint32_t opc : 2;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t _12 : 1; // 0
uint32_t _13 : 1; // 1
uint32_t op : 2;
uint32_t Rm : 5;
uint32_t _21 : 1; // 1
uint32_t type : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t _30 : 1; // 0
uint32_t M : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.M = static_cast<uint8_t>(enc.M);
inst.S = static_cast<uint8_t>(enc.S);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.type = static_cast<uint8_t>(enc.type);
inst.op = static_cast<uint8_t>(enc.op);
inst.iform = InstForm::FCMP_S_FLOATCMP;
inst.iclass = InstName::FCMP;
return true;
}
static bool TryExtractFCMP_SZ_FLOATCMP(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000011111
// --------------------------------
// 00011110001000000010000000001000
if ((bits & 0xffe0fc1fU) != 0x1e202008U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t _0 : 1; // 0
uint32_t _1 : 1; // 0
uint32_t _2 : 1; // 0
uint32_t opc : 2;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t _12 : 1; // 0
uint32_t _13 : 1; // 1
uint32_t op : 2;
uint32_t Rm : 5;
uint32_t _21 : 1; // 1
uint32_t type : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t _30 : 1; // 0
uint32_t M : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.M = static_cast<uint8_t>(enc.M);
inst.S = static_cast<uint8_t>(enc.S);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.type = static_cast<uint8_t>(enc.type);
inst.op = static_cast<uint8_t>(enc.op);
inst.iform = InstForm::FCMP_SZ_FLOATCMP;
inst.iclass = InstName::FCMP;
return true;
}
static bool TryExtractFCMP_D_FLOATCMP(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000011111
// --------------------------------
// 00011110011000000010000000000000
if ((bits & 0xffe0fc1fU) != 0x1e602000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t _0 : 1; // 0
uint32_t _1 : 1; // 0
uint32_t _2 : 1; // 0
uint32_t opc : 2;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t _12 : 1; // 0
uint32_t _13 : 1; // 1
uint32_t op : 2;
uint32_t Rm : 5;
uint32_t _21 : 1; // 1
uint32_t type : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t _30 : 1; // 0
uint32_t M : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.M = static_cast<uint8_t>(enc.M);
inst.S = static_cast<uint8_t>(enc.S);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.type = static_cast<uint8_t>(enc.type);
inst.op = static_cast<uint8_t>(enc.op);
inst.iform = InstForm::FCMP_D_FLOATCMP;
inst.iclass = InstName::FCMP;
return true;
}
static bool TryExtractFCMP_DZ_FLOATCMP(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000011111
// --------------------------------
// 00011110011000000010000000001000
if ((bits & 0xffe0fc1fU) != 0x1e602008U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t _0 : 1; // 0
uint32_t _1 : 1; // 0
uint32_t _2 : 1; // 0
uint32_t opc : 2;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t _12 : 1; // 0
uint32_t _13 : 1; // 1
uint32_t op : 2;
uint32_t Rm : 5;
uint32_t _21 : 1; // 1
uint32_t type : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t _30 : 1; // 0
uint32_t M : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.M = static_cast<uint8_t>(enc.M);
inst.S = static_cast<uint8_t>(enc.S);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.type = static_cast<uint8_t>(enc.type);
inst.op = static_cast<uint8_t>(enc.op);
inst.iform = InstForm::FCMP_DZ_FLOATCMP;
inst.iclass = InstName::FCMP;
return true;
}
static bool TryExtractORR_32_LOG_SHIFT(InstData &inst, uint32_t bits) {
if (false && TryExtractMOV_ORR_32_LOG_SHIFT(inst, bits))
return true;
// bits
// & 11111111001000000000000000000000
// --------------------------------
// 00101010000000000000000000000000
if ((bits & 0xff200000U) != 0x2a000000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t imm6 : 6;
uint32_t Rm : 5;
uint32_t N : 1;
uint32_t shift : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t opc : 2;
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.shift = static_cast<uint8_t>(enc.shift);
inst.N = static_cast<uint8_t>(enc.N);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.sf = static_cast<uint8_t>(enc.sf);
inst.imm6.uimm = static_cast<uint64_t>(enc.imm6);
inst.iform = InstForm::ORR_32_LOG_SHIFT;
inst.iclass = InstName::ORR;
return true;
}
static bool TryExtractORR_64_LOG_SHIFT(InstData &inst, uint32_t bits) {
if (false && TryExtractMOV_ORR_64_LOG_SHIFT(inst, bits))
return true;
// bits
// & 11111111001000000000000000000000
// --------------------------------
// 10101010000000000000000000000000
if ((bits & 0xff200000U) != 0xaa000000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t imm6 : 6;
uint32_t Rm : 5;
uint32_t N : 1;
uint32_t shift : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t opc : 2;
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.shift = static_cast<uint8_t>(enc.shift);
inst.N = static_cast<uint8_t>(enc.N);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.sf = static_cast<uint8_t>(enc.sf);
inst.imm6.uimm = static_cast<uint64_t>(enc.imm6);
inst.iform = InstForm::ORR_64_LOG_SHIFT;
inst.iclass = InstName::ORR;
return true;
}
static bool TryExtractSHA1SU0_VVV_CRYPTOSHA3(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 01011110000000000011000000000000
if ((bits & 0xffe0fc00U) != 0x5e003000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t opcode : 3;
uint32_t _15 : 1; // 0
uint32_t Rm : 5;
uint32_t _21 : 1; // 0
uint32_t size : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 0
uint32_t _30 : 1; // 1
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::SHA1SU0_VVV_CRYPTOSHA3;
inst.iclass = InstName::SHA1SU0;
return true;
}
static bool TryExtractSTSET_32S_MEMOP(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000011111
// --------------------------------
// 10111000001000000011000000011111
if ((bits & 0xffe0fc1fU) != 0xb820301fU) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t opc : 3;
uint32_t o3 : 1;
uint32_t Rs : 5;
uint32_t _21 : 1; // 1
uint32_t R : 1;
uint32_t A : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.A = static_cast<uint8_t>(enc.A);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.V = static_cast<uint8_t>(enc.V);
inst.R = static_cast<uint8_t>(enc.R);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o3 = static_cast<uint8_t>(enc.o3);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::STSET_32S_MEMOP;
inst.iclass = InstName::STSET;
return true;
}
static bool TryExtractSTSETL_32S_MEMOP(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000011111
// --------------------------------
// 10111000011000000011000000011111
if ((bits & 0xffe0fc1fU) != 0xb860301fU) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t opc : 3;
uint32_t o3 : 1;
uint32_t Rs : 5;
uint32_t _21 : 1; // 1
uint32_t R : 1;
uint32_t A : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.A = static_cast<uint8_t>(enc.A);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.V = static_cast<uint8_t>(enc.V);
inst.R = static_cast<uint8_t>(enc.R);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o3 = static_cast<uint8_t>(enc.o3);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::STSETL_32S_MEMOP;
inst.iclass = InstName::STSETL;
return true;
}
static bool TryExtractSTSET_64S_MEMOP(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000011111
// --------------------------------
// 11111000001000000011000000011111
if ((bits & 0xffe0fc1fU) != 0xf820301fU) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t opc : 3;
uint32_t o3 : 1;
uint32_t Rs : 5;
uint32_t _21 : 1; // 1
uint32_t R : 1;
uint32_t A : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.A = static_cast<uint8_t>(enc.A);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.V = static_cast<uint8_t>(enc.V);
inst.R = static_cast<uint8_t>(enc.R);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o3 = static_cast<uint8_t>(enc.o3);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::STSET_64S_MEMOP;
inst.iclass = InstName::STSET;
return true;
}
static bool TryExtractSTSETL_64S_MEMOP(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000011111
// --------------------------------
// 11111000011000000011000000011111
if ((bits & 0xffe0fc1fU) != 0xf860301fU) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t opc : 3;
uint32_t o3 : 1;
uint32_t Rs : 5;
uint32_t _21 : 1; // 1
uint32_t R : 1;
uint32_t A : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.A = static_cast<uint8_t>(enc.A);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.V = static_cast<uint8_t>(enc.V);
inst.R = static_cast<uint8_t>(enc.R);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o3 = static_cast<uint8_t>(enc.o3);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::STSETL_64S_MEMOP;
inst.iclass = InstName::STSETL;
return true;
}
static bool TryExtractMLA_ASIMDSAME_ONLY(InstData &inst, uint32_t bits) {
// bits
// & 10111111001000001111110000000000
// --------------------------------
// 00001110001000001001010000000000
if ((bits & 0xbf20fc00U) != 0xe209400U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t opcode : 5;
uint32_t Rm : 5;
uint32_t _21 : 1; // 1
uint32_t size : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.U = static_cast<uint8_t>(enc.U);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::MLA_ASIMDSAME_ONLY;
inst.iclass = InstName::MLA;
return true;
}
static bool TryExtractADDS_32_ADDSUB_SHIFT(InstData &inst, uint32_t bits) {
if (false && TryExtractCMN_ADDS_32_ADDSUB_SHIFT(inst, bits))
return true;
// bits
// & 11111111001000000000000000000000
// --------------------------------
// 00101011000000000000000000000000
if ((bits & 0xff200000U) != 0x2b000000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t imm6 : 6;
uint32_t Rm : 5;
uint32_t _21 : 1; // 0
uint32_t shift : 2;
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t S : 1;
uint32_t op : 1;
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.shift = static_cast<uint8_t>(enc.shift);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.op = static_cast<uint8_t>(enc.op);
inst.sf = static_cast<uint8_t>(enc.sf);
inst.imm6.uimm = static_cast<uint64_t>(enc.imm6);
inst.iform = InstForm::ADDS_32_ADDSUB_SHIFT;
inst.iclass = InstName::ADDS;
return true;
}
static bool TryExtractADDS_64_ADDSUB_SHIFT(InstData &inst, uint32_t bits) {
if (false && TryExtractCMN_ADDS_64_ADDSUB_SHIFT(inst, bits))
return true;
// bits
// & 11111111001000000000000000000000
// --------------------------------
// 10101011000000000000000000000000
if ((bits & 0xff200000U) != 0xab000000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t imm6 : 6;
uint32_t Rm : 5;
uint32_t _21 : 1; // 0
uint32_t shift : 2;
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t S : 1;
uint32_t op : 1;
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.shift = static_cast<uint8_t>(enc.shift);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.op = static_cast<uint8_t>(enc.op);
inst.sf = static_cast<uint8_t>(enc.sf);
inst.imm6.uimm = static_cast<uint64_t>(enc.imm6);
inst.iform = InstForm::ADDS_64_ADDSUB_SHIFT;
inst.iclass = InstName::ADDS;
return true;
}
static bool TryExtractLD3R_ASISDLSO_R3(InstData &inst, uint32_t bits) {
// bits
// & 10111111111111111111000000000000
// --------------------------------
// 00001101010000001110000000000000
if ((bits & 0xbffff000U) != 0xd40e000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t size : 2;
uint32_t S : 1;
uint32_t opcode : 3;
uint32_t _16 : 1; // 0
uint32_t _17 : 1; // 0
uint32_t _18 : 1; // 0
uint32_t _19 : 1; // 0
uint32_t _20 : 1; // 0
uint32_t R : 1;
uint32_t L : 1;
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 0
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.L = static_cast<uint8_t>(enc.L);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.S = static_cast<uint8_t>(enc.S);
inst.R = static_cast<uint8_t>(enc.R);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LD3R_ASISDLSO_R3;
inst.iclass = InstName::LD3R;
return true;
}
static bool TryExtractLD3R_ASISDLSOP_R3_I(InstData &inst, uint32_t bits) {
// bits
// & 10111111111111111111000000000000
// --------------------------------
// 00001101110111111110000000000000
if ((bits & 0xbffff000U) != 0xddfe000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t size : 2;
uint32_t S : 1;
uint32_t opcode : 3;
uint32_t Rm : 5;
uint32_t R : 1;
uint32_t L : 1;
uint32_t _23 : 1; // 1
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 0
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.L = static_cast<uint8_t>(enc.L);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.S = static_cast<uint8_t>(enc.S);
inst.R = static_cast<uint8_t>(enc.R);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LD3R_ASISDLSOP_R3_I;
inst.iclass = InstName::LD3R;
return true;
}
static bool TryExtractLD3R_ASISDLSOP_RX3_R(InstData &inst, uint32_t bits) {
// bits
// & 10111111111000001111000000000000
// --------------------------------
// 00001101110000001110000000000000
if ((bits & 0xbfe0f000U) != 0xdc0e000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t size : 2;
uint32_t S : 1;
uint32_t opcode : 3;
uint32_t Rm : 5;
uint32_t R : 1;
uint32_t L : 1;
uint32_t _23 : 1; // 1
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 0
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.L = static_cast<uint8_t>(enc.L);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.S = static_cast<uint8_t>(enc.S);
inst.R = static_cast<uint8_t>(enc.R);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LD3R_ASISDLSOP_RX3_R;
inst.iclass = InstName::LD3R;
return true;
}
static bool TryExtractPRFM_P_LOADLIT(InstData &inst, uint32_t bits) {
// bits
// & 11111111000000000000000000000000
// --------------------------------
// 11011000000000000000000000000000
if ((bits & 0xff000000U) != 0xd8000000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t imm19 : 19;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 0
uint32_t opc : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.imm19.uimm = static_cast<uint64_t>(enc.imm19);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.V = static_cast<uint8_t>(enc.V);
inst.iform = InstForm::PRFM_P_LOADLIT;
inst.iclass = InstName::PRFM;
return true;
}
static bool TryExtractCASAB_C32_LDSTEXCL(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 00001000111000000111110000000000
if ((bits & 0xffe0fc00U) != 0x8e07c00U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t Rt2 : 5;
uint32_t o0 : 1;
uint32_t Rs : 5;
uint32_t o1 : 1;
uint32_t L : 1;
uint32_t o2 : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 0
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.L = static_cast<uint8_t>(enc.L);
inst.Rt2 = static_cast<uint8_t>(enc.Rt2);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.o2 = static_cast<uint8_t>(enc.o2);
inst.o1 = static_cast<uint8_t>(enc.o1);
inst.o0 = static_cast<uint8_t>(enc.o0);
inst.iform = InstForm::CASAB_C32_LDSTEXCL;
inst.iclass = InstName::CASAB;
return true;
}
static bool TryExtractCASALB_C32_LDSTEXCL(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 00001000111000001111110000000000
if ((bits & 0xffe0fc00U) != 0x8e0fc00U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t Rt2 : 5;
uint32_t o0 : 1;
uint32_t Rs : 5;
uint32_t o1 : 1;
uint32_t L : 1;
uint32_t o2 : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 0
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.L = static_cast<uint8_t>(enc.L);
inst.Rt2 = static_cast<uint8_t>(enc.Rt2);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.o2 = static_cast<uint8_t>(enc.o2);
inst.o1 = static_cast<uint8_t>(enc.o1);
inst.o0 = static_cast<uint8_t>(enc.o0);
inst.iform = InstForm::CASALB_C32_LDSTEXCL;
inst.iclass = InstName::CASALB;
return true;
}
static bool TryExtractCASB_C32_LDSTEXCL(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 00001000101000000111110000000000
if ((bits & 0xffe0fc00U) != 0x8a07c00U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t Rt2 : 5;
uint32_t o0 : 1;
uint32_t Rs : 5;
uint32_t o1 : 1;
uint32_t L : 1;
uint32_t o2 : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 0
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.L = static_cast<uint8_t>(enc.L);
inst.Rt2 = static_cast<uint8_t>(enc.Rt2);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.o2 = static_cast<uint8_t>(enc.o2);
inst.o1 = static_cast<uint8_t>(enc.o1);
inst.o0 = static_cast<uint8_t>(enc.o0);
inst.iform = InstForm::CASB_C32_LDSTEXCL;
inst.iclass = InstName::CASB;
return true;
}
static bool TryExtractCASLB_C32_LDSTEXCL(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 00001000101000001111110000000000
if ((bits & 0xffe0fc00U) != 0x8a0fc00U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t Rt2 : 5;
uint32_t o0 : 1;
uint32_t Rs : 5;
uint32_t o1 : 1;
uint32_t L : 1;
uint32_t o2 : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 0
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.L = static_cast<uint8_t>(enc.L);
inst.Rt2 = static_cast<uint8_t>(enc.Rt2);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.o2 = static_cast<uint8_t>(enc.o2);
inst.o1 = static_cast<uint8_t>(enc.o1);
inst.o0 = static_cast<uint8_t>(enc.o0);
inst.iform = InstForm::CASLB_C32_LDSTEXCL;
inst.iclass = InstName::CASLB;
return true;
}
static bool TryExtractNEGS_SUBS_32_ADDSUB_SHIFT(InstData &inst, uint32_t bits) {
// bits
// & 11111111001000000000001111100000
// --------------------------------
// 01101011000000000000001111100000
if ((bits & 0xff2003e0U) != 0x6b0003e0U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t imm6 : 6;
uint32_t Rm : 5;
uint32_t _21 : 1; // 0
uint32_t shift : 2;
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t S : 1;
uint32_t op : 1;
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.shift = static_cast<uint8_t>(enc.shift);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.op = static_cast<uint8_t>(enc.op);
inst.sf = static_cast<uint8_t>(enc.sf);
inst.imm6.uimm = static_cast<uint64_t>(enc.imm6);
inst.iform = InstForm::NEGS_SUBS_32_ADDSUB_SHIFT;
inst.iclass = InstName::SUBS;
return true;
}
static bool TryExtractNEGS_SUBS_64_ADDSUB_SHIFT(InstData &inst, uint32_t bits) {
// bits
// & 11111111001000000000001111100000
// --------------------------------
// 11101011000000000000001111100000
if ((bits & 0xff2003e0U) != 0xeb0003e0U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t imm6 : 6;
uint32_t Rm : 5;
uint32_t _21 : 1; // 0
uint32_t shift : 2;
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t S : 1;
uint32_t op : 1;
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.shift = static_cast<uint8_t>(enc.shift);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.op = static_cast<uint8_t>(enc.op);
inst.sf = static_cast<uint8_t>(enc.sf);
inst.imm6.uimm = static_cast<uint64_t>(enc.imm6);
inst.iform = InstForm::NEGS_SUBS_64_ADDSUB_SHIFT;
inst.iclass = InstName::SUBS;
return true;
}
static bool TryExtractLDSMAXAH_32_MEMOP(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 01111000101000000100000000000000
if ((bits & 0xffe0fc00U) != 0x78a04000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t opc : 3;
uint32_t o3 : 1;
uint32_t Rs : 5;
uint32_t _21 : 1; // 1
uint32_t R : 1;
uint32_t A : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.A = static_cast<uint8_t>(enc.A);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.V = static_cast<uint8_t>(enc.V);
inst.R = static_cast<uint8_t>(enc.R);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o3 = static_cast<uint8_t>(enc.o3);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LDSMAXAH_32_MEMOP;
inst.iclass = InstName::LDSMAXAH;
return true;
}
static bool TryExtractLDSMAXALH_32_MEMOP(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 01111000111000000100000000000000
if ((bits & 0xffe0fc00U) != 0x78e04000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t opc : 3;
uint32_t o3 : 1;
uint32_t Rs : 5;
uint32_t _21 : 1; // 1
uint32_t R : 1;
uint32_t A : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.A = static_cast<uint8_t>(enc.A);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.V = static_cast<uint8_t>(enc.V);
inst.R = static_cast<uint8_t>(enc.R);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o3 = static_cast<uint8_t>(enc.o3);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LDSMAXALH_32_MEMOP;
inst.iclass = InstName::LDSMAXALH;
return true;
}
static bool TryExtractLDSMAXH_32_MEMOP(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 01111000001000000100000000000000
if ((bits & 0xffe0fc00U) != 0x78204000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t opc : 3;
uint32_t o3 : 1;
uint32_t Rs : 5;
uint32_t _21 : 1; // 1
uint32_t R : 1;
uint32_t A : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.A = static_cast<uint8_t>(enc.A);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.V = static_cast<uint8_t>(enc.V);
inst.R = static_cast<uint8_t>(enc.R);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o3 = static_cast<uint8_t>(enc.o3);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LDSMAXH_32_MEMOP;
inst.iclass = InstName::LDSMAXH;
return true;
}
static bool TryExtractLDSMAXLH_32_MEMOP(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 01111000011000000100000000000000
if ((bits & 0xffe0fc00U) != 0x78604000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t opc : 3;
uint32_t o3 : 1;
uint32_t Rs : 5;
uint32_t _21 : 1; // 1
uint32_t R : 1;
uint32_t A : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.A = static_cast<uint8_t>(enc.A);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.V = static_cast<uint8_t>(enc.V);
inst.R = static_cast<uint8_t>(enc.R);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o3 = static_cast<uint8_t>(enc.o3);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LDSMAXLH_32_MEMOP;
inst.iclass = InstName::LDSMAXLH;
return true;
}
static bool TryExtractMSUB_32A_DP_3SRC(InstData &inst, uint32_t bits) {
if (false && TryExtractMNEG_MSUB_32A_DP_3SRC(inst, bits))
return true;
// bits
// & 11111111111000001000000000000000
// --------------------------------
// 00011011000000001000000000000000
if ((bits & 0xffe08000U) != 0x1b008000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t Ra : 5;
uint32_t o0 : 1;
uint32_t Rm : 5;
uint32_t op31 : 3;
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t op54 : 2;
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.Ra = static_cast<uint8_t>(enc.Ra);
inst.op54 = static_cast<uint8_t>(enc.op54);
inst.op31 = static_cast<uint8_t>(enc.op31);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.sf = static_cast<uint8_t>(enc.sf);
inst.o0 = static_cast<uint8_t>(enc.o0);
inst.iform = InstForm::MSUB_32A_DP_3SRC;
inst.iclass = InstName::MSUB;
return true;
}
static bool TryExtractMSUB_64A_DP_3SRC(InstData &inst, uint32_t bits) {
if (false && TryExtractMNEG_MSUB_64A_DP_3SRC(inst, bits))
return true;
// bits
// & 11111111111000001000000000000000
// --------------------------------
// 10011011000000001000000000000000
if ((bits & 0xffe08000U) != 0x9b008000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t Ra : 5;
uint32_t o0 : 1;
uint32_t Rm : 5;
uint32_t op31 : 3;
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t op54 : 2;
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.Ra = static_cast<uint8_t>(enc.Ra);
inst.op54 = static_cast<uint8_t>(enc.op54);
inst.op31 = static_cast<uint8_t>(enc.op31);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.sf = static_cast<uint8_t>(enc.sf);
inst.o0 = static_cast<uint8_t>(enc.o0);
inst.iform = InstForm::MSUB_64A_DP_3SRC;
inst.iclass = InstName::MSUB;
return true;
}
static bool TryExtractLD4_ASISDLSE_R4(InstData &inst, uint32_t bits) {
// bits
// & 10111111111111111111000000000000
// --------------------------------
// 00001100010000000000000000000000
if ((bits & 0xbffff000U) != 0xc400000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t size : 2;
uint32_t opcode : 4;
uint32_t _16 : 1; // 0
uint32_t _17 : 1; // 0
uint32_t _18 : 1; // 0
uint32_t _19 : 1; // 0
uint32_t _20 : 1; // 0
uint32_t _21 : 1; // 0
uint32_t L : 1;
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 0
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.L = static_cast<uint8_t>(enc.L);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LD4_ASISDLSE_R4;
inst.iclass = InstName::LD4;
return true;
}
static bool TryExtractLD4_ASISDLSEP_I4_I(InstData &inst, uint32_t bits) {
// bits
// & 10111111111111111111000000000000
// --------------------------------
// 00001100110111110000000000000000
if ((bits & 0xbffff000U) != 0xcdf0000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t size : 2;
uint32_t opcode : 4;
uint32_t Rm : 5;
uint32_t _21 : 1; // 0
uint32_t L : 1;
uint32_t _23 : 1; // 1
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 0
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.L = static_cast<uint8_t>(enc.L);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LD4_ASISDLSEP_I4_I;
inst.iclass = InstName::LD4;
return true;
}
static bool TryExtractLD4_ASISDLSEP_R4_R(InstData &inst, uint32_t bits) {
// bits
// & 10111111111000001111000000000000
// --------------------------------
// 00001100110000000000000000000000
if ((bits & 0xbfe0f000U) != 0xcc00000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t size : 2;
uint32_t opcode : 4;
uint32_t Rm : 5;
uint32_t _21 : 1; // 0
uint32_t L : 1;
uint32_t _23 : 1; // 1
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 0
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.L = static_cast<uint8_t>(enc.L);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LD4_ASISDLSEP_R4_R;
inst.iclass = InstName::LD4;
return true;
}
static bool TryExtractUQXTN_ASISDMISC_N(InstData &inst, uint32_t bits) {
// bits
// & 11111111001111111111110000000000
// --------------------------------
// 01111110001000010100100000000000
if ((bits & 0xff3ffc00U) != 0x7e214800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t opcode : 5;
uint32_t _17 : 1; // 0
uint32_t _18 : 1; // 0
uint32_t _19 : 1; // 0
uint32_t _20 : 1; // 0
uint32_t _21 : 1; // 1
uint32_t size : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t U : 1;
uint32_t _30 : 1; // 1
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::UQXTN_ASISDMISC_N;
inst.iclass = InstName::UQXTN;
return true;
}
static bool TryExtractUQXTN_ASIMDMISC_N(InstData &inst, uint32_t bits) {
// bits
// & 10111111001111111111110000000000
// --------------------------------
// 00101110001000010100100000000000
if ((bits & 0xbf3ffc00U) != 0x2e214800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t opcode : 5;
uint32_t _17 : 1; // 0
uint32_t _18 : 1; // 0
uint32_t _19 : 1; // 0
uint32_t _20 : 1; // 0
uint32_t _21 : 1; // 1
uint32_t size : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.U = static_cast<uint8_t>(enc.U);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::UQXTN_ASIMDMISC_N;
inst.iclass = InstName::UQXTN;
return true;
}
static bool TryExtractTBZ_ONLY_TESTBRANCH(InstData &inst, uint32_t bits) {
// bits
// & 01111111000000000000000000000000
// --------------------------------
// 00110110000000000000000000000000
if ((bits & 0x7f000000U) != 0x36000000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t imm14 : 14;
uint32_t b40 : 5;
uint32_t op : 1;
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 0
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t _30 : 1; // 0
uint32_t b5 : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.b5 = static_cast<uint8_t>(enc.b5);
inst.op = static_cast<uint8_t>(enc.op);
inst.imm14.uimm = static_cast<uint64_t>(enc.imm14);
inst.b40 = static_cast<uint8_t>(enc.b40);
inst.iform = InstForm::TBZ_ONLY_TESTBRANCH;
inst.iclass = InstName::TBZ;
return true;
}
static bool TryExtractFMINNMV_ASIMDALL_ONLY_H(InstData &inst, uint32_t bits) {
// bits
// & 10111111111111111111110000000000
// --------------------------------
// 00001110101100001100100000000000
if ((bits & 0xbffffc00U) != 0xeb0c800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t opcode : 5;
uint32_t _17 : 1; // 0
uint32_t _18 : 1; // 0
uint32_t _19 : 1; // 0
uint32_t _20 : 1; // 1
uint32_t _21 : 1; // 1
uint32_t _22 : 1; // 0
uint32_t o1 : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.U = static_cast<uint8_t>(enc.U);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o1 = static_cast<uint8_t>(enc.o1);
inst.iform = InstForm::FMINNMV_ASIMDALL_ONLY_H;
inst.iclass = InstName::FMINNMV;
return true;
}
static bool TryExtractFMINNMV_ASIMDALL_ONLY_SD(InstData &inst, uint32_t bits) {
// bits
// & 10111111101111111111110000000000
// --------------------------------
// 00101110101100001100100000000000
if ((bits & 0xbfbffc00U) != 0x2eb0c800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t opcode : 5;
uint32_t _17 : 1; // 0
uint32_t _18 : 1; // 0
uint32_t _19 : 1; // 0
uint32_t _20 : 1; // 1
uint32_t _21 : 1; // 1
uint32_t sz : 1;
uint32_t o1 : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.sz = static_cast<uint8_t>(enc.sz);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o1 = static_cast<uint8_t>(enc.o1);
inst.iform = InstForm::FMINNMV_ASIMDALL_ONLY_SD;
inst.iclass = InstName::FMINNMV;
return true;
}
static bool TryExtractFCVTZS_ASISDMISCFP16_R(InstData &inst, uint32_t bits) {
// bits
// & 11111111111111111111110000000000
// --------------------------------
// 01011110111110011011100000000000
if ((bits & 0xfffffc00U) != 0x5ef9b800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t o1 : 1;
uint32_t _13 : 1; // 1
uint32_t _14 : 1; // 0
uint32_t _15 : 1; // 1
uint32_t _16 : 1; // 1
uint32_t _17 : 1; // 0
uint32_t _18 : 1; // 0
uint32_t _19 : 1; // 1
uint32_t _20 : 1; // 1
uint32_t _21 : 1; // 1
uint32_t _22 : 1; // 1
uint32_t o2 : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t U : 1;
uint32_t _30 : 1; // 1
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.U = static_cast<uint8_t>(enc.U);
inst.o2 = static_cast<uint8_t>(enc.o2);
inst.o1 = static_cast<uint8_t>(enc.o1);
inst.iform = InstForm::FCVTZS_ASISDMISCFP16_R;
inst.iclass = InstName::FCVTZS;
return true;
}
static bool TryExtractFCVTZS_ASISDMISC_R(InstData &inst, uint32_t bits) {
// bits
// & 11111111101111111111110000000000
// --------------------------------
// 01011110101000011011100000000000
if ((bits & 0xffbffc00U) != 0x5ea1b800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t o1 : 1;
uint32_t _13 : 1; // 1
uint32_t _14 : 1; // 0
uint32_t _15 : 1; // 1
uint32_t _16 : 1; // 1
uint32_t _17 : 1; // 0
uint32_t _18 : 1; // 0
uint32_t _19 : 1; // 0
uint32_t _20 : 1; // 0
uint32_t _21 : 1; // 1
uint32_t sz : 1;
uint32_t o2 : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t U : 1;
uint32_t _30 : 1; // 1
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.sz = static_cast<uint8_t>(enc.sz);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o2 = static_cast<uint8_t>(enc.o2);
inst.o1 = static_cast<uint8_t>(enc.o1);
inst.iform = InstForm::FCVTZS_ASISDMISC_R;
inst.iclass = InstName::FCVTZS;
return true;
}
static bool TryExtractFCVTZS_ASIMDMISCFP16_R(InstData &inst, uint32_t bits) {
// bits
// & 10111111111111111111110000000000
// --------------------------------
// 00001110111110011011100000000000
if ((bits & 0xbffffc00U) != 0xef9b800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t o1 : 1;
uint32_t _13 : 1; // 1
uint32_t _14 : 1; // 0
uint32_t _15 : 1; // 1
uint32_t _16 : 1; // 1
uint32_t _17 : 1; // 0
uint32_t _18 : 1; // 0
uint32_t _19 : 1; // 1
uint32_t _20 : 1; // 1
uint32_t _21 : 1; // 1
uint32_t _22 : 1; // 1
uint32_t o2 : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o2 = static_cast<uint8_t>(enc.o2);
inst.o1 = static_cast<uint8_t>(enc.o1);
inst.iform = InstForm::FCVTZS_ASIMDMISCFP16_R;
inst.iclass = InstName::FCVTZS;
return true;
}
static bool TryExtractFCVTZS_ASIMDMISC_R(InstData &inst, uint32_t bits) {
// bits
// & 10111111101111111111110000000000
// --------------------------------
// 00001110101000011011100000000000
if ((bits & 0xbfbffc00U) != 0xea1b800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t o1 : 1;
uint32_t _13 : 1; // 1
uint32_t _14 : 1; // 0
uint32_t _15 : 1; // 1
uint32_t _16 : 1; // 1
uint32_t _17 : 1; // 0
uint32_t _18 : 1; // 0
uint32_t _19 : 1; // 0
uint32_t _20 : 1; // 0
uint32_t _21 : 1; // 1
uint32_t sz : 1;
uint32_t o2 : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.sz = static_cast<uint8_t>(enc.sz);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o2 = static_cast<uint8_t>(enc.o2);
inst.o1 = static_cast<uint8_t>(enc.o1);
inst.iform = InstForm::FCVTZS_ASIMDMISC_R;
inst.iclass = InstName::FCVTZS;
return true;
}
static bool TryExtractFMAXNM_H_FLOATDP2(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 00011110111000000110100000000000
if ((bits & 0xffe0fc00U) != 0x1ee06800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t op : 2;
uint32_t _14 : 1; // 1
uint32_t _15 : 1; // 0
uint32_t Rm : 5;
uint32_t _21 : 1; // 1
uint32_t type : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t _30 : 1; // 0
uint32_t M : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.M = static_cast<uint8_t>(enc.M);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.type = static_cast<uint8_t>(enc.type);
inst.op = static_cast<uint8_t>(enc.op);
inst.iform = InstForm::FMAXNM_H_FLOATDP2;
inst.iclass = InstName::FMAXNM;
return true;
}
static bool TryExtractFMAXNM_S_FLOATDP2(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 00011110001000000110100000000000
if ((bits & 0xffe0fc00U) != 0x1e206800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t op : 2;
uint32_t _14 : 1; // 1
uint32_t _15 : 1; // 0
uint32_t Rm : 5;
uint32_t _21 : 1; // 1
uint32_t type : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t _30 : 1; // 0
uint32_t M : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.M = static_cast<uint8_t>(enc.M);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.type = static_cast<uint8_t>(enc.type);
inst.op = static_cast<uint8_t>(enc.op);
inst.iform = InstForm::FMAXNM_S_FLOATDP2;
inst.iclass = InstName::FMAXNM;
return true;
}
static bool TryExtractFMAXNM_D_FLOATDP2(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 00011110011000000110100000000000
if ((bits & 0xffe0fc00U) != 0x1e606800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t op : 2;
uint32_t _14 : 1; // 1
uint32_t _15 : 1; // 0
uint32_t Rm : 5;
uint32_t _21 : 1; // 1
uint32_t type : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t _30 : 1; // 0
uint32_t M : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.M = static_cast<uint8_t>(enc.M);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.type = static_cast<uint8_t>(enc.type);
inst.op = static_cast<uint8_t>(enc.op);
inst.iform = InstForm::FMAXNM_D_FLOATDP2;
inst.iclass = InstName::FMAXNM;
return true;
}
static bool TryExtractLDR_32_LDST_IMMPOST(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000000000110000000000
// --------------------------------
// 10111000010000000000010000000000
if ((bits & 0xffe00c00U) != 0xb8400400U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t _11 : 1; // 0
uint32_t imm9 : 9;
uint32_t _21 : 1; // 0
uint32_t opc : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.imm9.uimm = static_cast<uint64_t>(enc.imm9);
inst.V = static_cast<uint8_t>(enc.V);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LDR_32_LDST_IMMPOST;
inst.iclass = InstName::LDR;
return true;
}
static bool TryExtractLDR_64_LDST_IMMPOST(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000000000110000000000
// --------------------------------
// 11111000010000000000010000000000
if ((bits & 0xffe00c00U) != 0xf8400400U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t _11 : 1; // 0
uint32_t imm9 : 9;
uint32_t _21 : 1; // 0
uint32_t opc : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.imm9.uimm = static_cast<uint64_t>(enc.imm9);
inst.V = static_cast<uint8_t>(enc.V);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LDR_64_LDST_IMMPOST;
inst.iclass = InstName::LDR;
return true;
}
static bool TryExtractLDR_32_LDST_IMMPRE(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000000000110000000000
// --------------------------------
// 10111000010000000000110000000000
if ((bits & 0xffe00c00U) != 0xb8400c00U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t _11 : 1; // 1
uint32_t imm9 : 9;
uint32_t _21 : 1; // 0
uint32_t opc : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.imm9.uimm = static_cast<uint64_t>(enc.imm9);
inst.V = static_cast<uint8_t>(enc.V);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LDR_32_LDST_IMMPRE;
inst.iclass = InstName::LDR;
return true;
}
static bool TryExtractLDR_64_LDST_IMMPRE(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000000000110000000000
// --------------------------------
// 11111000010000000000110000000000
if ((bits & 0xffe00c00U) != 0xf8400c00U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t _11 : 1; // 1
uint32_t imm9 : 9;
uint32_t _21 : 1; // 0
uint32_t opc : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.imm9.uimm = static_cast<uint64_t>(enc.imm9);
inst.V = static_cast<uint8_t>(enc.V);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LDR_64_LDST_IMMPRE;
inst.iclass = InstName::LDR;
return true;
}
static bool TryExtractLDR_32_LDST_POS(InstData &inst, uint32_t bits) {
// bits
// & 11111111110000000000000000000000
// --------------------------------
// 10111001010000000000000000000000
if ((bits & 0xffc00000U) != 0xb9400000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t imm12 : 12;
uint32_t opc : 2;
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.imm12.uimm = static_cast<uint64_t>(enc.imm12);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.V = static_cast<uint8_t>(enc.V);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LDR_32_LDST_POS;
inst.iclass = InstName::LDR;
return true;
}
static bool TryExtractLDR_64_LDST_POS(InstData &inst, uint32_t bits) {
// bits
// & 11111111110000000000000000000000
// --------------------------------
// 11111001010000000000000000000000
if ((bits & 0xffc00000U) != 0xf9400000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t imm12 : 12;
uint32_t opc : 2;
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.imm12.uimm = static_cast<uint64_t>(enc.imm12);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.V = static_cast<uint8_t>(enc.V);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LDR_64_LDST_POS;
inst.iclass = InstName::LDR;
return true;
}
static bool TryExtractCNT_ASIMDMISC_R(InstData &inst, uint32_t bits) {
// bits
// & 10111111001111111111110000000000
// --------------------------------
// 00001110001000000101100000000000
if ((bits & 0xbf3ffc00U) != 0xe205800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t opcode : 5;
uint32_t _17 : 1; // 0
uint32_t _18 : 1; // 0
uint32_t _19 : 1; // 0
uint32_t _20 : 1; // 0
uint32_t _21 : 1; // 1
uint32_t size : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.U = static_cast<uint8_t>(enc.U);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::CNT_ASIMDMISC_R;
inst.iclass = InstName::CNT;
return true;
}
static bool TryExtractSQSHL_ASISDSHF_R(InstData &inst, uint32_t bits) {
// bits
// & 11111111100000001111110000000000
// --------------------------------
// 01011111000000000111010000000000
if ((bits & 0xff80fc00U) != 0x5f007400U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t _11 : 1; // 0
uint32_t op : 1;
uint32_t _13 : 1; // 1
uint32_t _14 : 1; // 1
uint32_t _15 : 1; // 0
uint32_t immb : 3;
uint32_t immh : 4;
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t U : 1;
uint32_t _30 : 1; // 1
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.immh.uimm = static_cast<uint64_t>(enc.immh);
if (!(inst.immh.uimm != 0x0))
return false;
inst.immb.uimm = static_cast<uint64_t>(enc.immb);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.op = static_cast<uint8_t>(enc.op);
inst.iform = InstForm::SQSHL_ASISDSHF_R;
inst.iclass = InstName::SQSHL;
return true;
}
static bool TryExtractSQSHL_ASIMDSHF_R(InstData &inst, uint32_t bits) {
// bits
// & 10111111100000001111110000000000
// --------------------------------
// 00001111000000000111010000000000
if ((bits & 0xbf80fc00U) != 0xf007400U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t _11 : 1; // 0
uint32_t op : 1;
uint32_t _13 : 1; // 1
uint32_t _14 : 1; // 1
uint32_t _15 : 1; // 0
uint32_t immb : 3;
uint32_t immh : 4;
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.immh.uimm = static_cast<uint64_t>(enc.immh);
if (!(inst.immh.uimm != 0x0))
return false;
inst.immb.uimm = static_cast<uint64_t>(enc.immb);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.op = static_cast<uint8_t>(enc.op);
inst.iform = InstForm::SQSHL_ASIMDSHF_R;
inst.iclass = InstName::SQSHL;
return true;
}
static bool TryExtractLDTR_32_LDST_UNPRIV(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000000000110000000000
// --------------------------------
// 10111000010000000000100000000000
if ((bits & 0xffe00c00U) != 0xb8400800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t imm9 : 9;
uint32_t _21 : 1; // 0
uint32_t opc : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.imm9.uimm = static_cast<uint64_t>(enc.imm9);
inst.V = static_cast<uint8_t>(enc.V);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LDTR_32_LDST_UNPRIV;
inst.iclass = InstName::LDTR;
return true;
}
static bool TryExtractLDTR_64_LDST_UNPRIV(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000000000110000000000
// --------------------------------
// 11111000010000000000100000000000
if ((bits & 0xffe00c00U) != 0xf8400800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t imm9 : 9;
uint32_t _21 : 1; // 0
uint32_t opc : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.imm9.uimm = static_cast<uint64_t>(enc.imm9);
inst.V = static_cast<uint8_t>(enc.V);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LDTR_64_LDST_UNPRIV;
inst.iclass = InstName::LDTR;
return true;
}
static bool TryExtractCCMP_32_CONDCMP_IMM(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000000000110000010000
// --------------------------------
// 01111010010000000000100000000000
if ((bits & 0xffe00c10U) != 0x7a400800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t nzcv : 4;
uint32_t o3 : 1;
uint32_t Rn : 5;
uint32_t o2 : 1;
uint32_t _11 : 1; // 1
uint32_t cond : 4;
uint32_t imm5 : 5;
uint32_t _21 : 1; // 0
uint32_t _22 : 1; // 1
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t op : 1;
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.imm5.uimm = static_cast<uint64_t>(enc.imm5);
inst.nzcv = static_cast<uint8_t>(enc.nzcv);
inst.sf = static_cast<uint8_t>(enc.sf);
inst.S = static_cast<uint8_t>(enc.S);
inst.cond = static_cast<uint8_t>(enc.cond);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o3 = static_cast<uint8_t>(enc.o3);
inst.o2 = static_cast<uint8_t>(enc.o2);
inst.op = static_cast<uint8_t>(enc.op);
inst.iform = InstForm::CCMP_32_CONDCMP_IMM;
inst.iclass = InstName::CCMP;
return true;
}
static bool TryExtractCCMP_64_CONDCMP_IMM(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000000000110000010000
// --------------------------------
// 11111010010000000000100000000000
if ((bits & 0xffe00c10U) != 0xfa400800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t nzcv : 4;
uint32_t o3 : 1;
uint32_t Rn : 5;
uint32_t o2 : 1;
uint32_t _11 : 1; // 1
uint32_t cond : 4;
uint32_t imm5 : 5;
uint32_t _21 : 1; // 0
uint32_t _22 : 1; // 1
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t op : 1;
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.imm5.uimm = static_cast<uint64_t>(enc.imm5);
inst.nzcv = static_cast<uint8_t>(enc.nzcv);
inst.sf = static_cast<uint8_t>(enc.sf);
inst.S = static_cast<uint8_t>(enc.S);
inst.cond = static_cast<uint8_t>(enc.cond);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o3 = static_cast<uint8_t>(enc.o3);
inst.o2 = static_cast<uint8_t>(enc.o2);
inst.op = static_cast<uint8_t>(enc.op);
inst.iform = InstForm::CCMP_64_CONDCMP_IMM;
inst.iclass = InstName::CCMP;
return true;
}
static bool TryExtractUZP2_ASIMDPERM_ONLY(InstData &inst, uint32_t bits) {
// bits
// & 10111111001000001111110000000000
// --------------------------------
// 00001110000000000101100000000000
if ((bits & 0xbf20fc00U) != 0xe005800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t _12 : 1; // 1
uint32_t _13 : 1; // 0
uint32_t op : 1;
uint32_t _15 : 1; // 0
uint32_t Rm : 5;
uint32_t _21 : 1; // 0
uint32_t size : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 0
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.op = static_cast<uint8_t>(enc.op);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::UZP2_ASIMDPERM_ONLY;
inst.iclass = InstName::UZP2;
return true;
}
static bool TryExtractLDURB_32_LDST_UNSCALED(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000000000110000000000
// --------------------------------
// 00111000010000000000000000000000
if ((bits & 0xffe00c00U) != 0x38400000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t imm9 : 9;
uint32_t _21 : 1; // 0
uint32_t opc : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.imm9.uimm = static_cast<uint64_t>(enc.imm9);
inst.V = static_cast<uint8_t>(enc.V);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LDURB_32_LDST_UNSCALED;
inst.iclass = InstName::LDURB;
return true;
}
static bool TryExtractSQRDMLSH_ASISDSAME2_ONLY(InstData &inst, uint32_t bits) {
// bits
// & 11111111001000001111110000000000
// --------------------------------
// 01111110000000001000110000000000
if ((bits & 0xff20fc00U) != 0x7e008c00U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t S : 1;
uint32_t _12 : 1; // 0
uint32_t _13 : 1; // 0
uint32_t _14 : 1; // 0
uint32_t _15 : 1; // 1
uint32_t Rm : 5;
uint32_t _21 : 1; // 0
uint32_t size : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t U : 1;
uint32_t _30 : 1; // 1
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::SQRDMLSH_ASISDSAME2_ONLY;
inst.iclass = InstName::SQRDMLSH;
return true;
}
static bool TryExtractSQRDMLSH_ASIMDSAME2_ONLY(InstData &inst, uint32_t bits) {
// bits
// & 10111111001000001111110000000000
// --------------------------------
// 00101110000000001000110000000000
if ((bits & 0xbf20fc00U) != 0x2e008c00U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t S : 1;
uint32_t _12 : 1; // 0
uint32_t _13 : 1; // 0
uint32_t _14 : 1; // 0
uint32_t _15 : 1; // 1
uint32_t Rm : 5;
uint32_t _21 : 1; // 0
uint32_t size : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::SQRDMLSH_ASIMDSAME2_ONLY;
inst.iclass = InstName::SQRDMLSH;
return true;
}
static bool TryExtractMOV_INS_ASIMDINS_IR_R(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 01001110000000000001110000000000
if ((bits & 0xffe0fc00U) != 0x4e001c00U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t imm4 : 4;
uint32_t _15 : 1; // 0
uint32_t imm5 : 5;
uint32_t _21 : 1; // 0
uint32_t _22 : 1; // 0
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t op : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.imm5.uimm = static_cast<uint64_t>(enc.imm5);
inst.imm4.uimm = static_cast<uint64_t>(enc.imm4);
inst.op = static_cast<uint8_t>(enc.op);
inst.iform = InstForm::MOV_INS_ASIMDINS_IR_R;
inst.iclass = InstName::INS;
return true;
}
static bool TryExtractLDTRSB_32_LDST_UNPRIV(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000000000110000000000
// --------------------------------
// 00111000110000000000100000000000
if ((bits & 0xffe00c00U) != 0x38c00800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t imm9 : 9;
uint32_t _21 : 1; // 0
uint32_t opc : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.imm9.uimm = static_cast<uint64_t>(enc.imm9);
inst.V = static_cast<uint8_t>(enc.V);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LDTRSB_32_LDST_UNPRIV;
inst.iclass = InstName::LDTRSB;
return true;
}
static bool TryExtractLDTRSB_64_LDST_UNPRIV(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000000000110000000000
// --------------------------------
// 00111000100000000000100000000000
if ((bits & 0xffe00c00U) != 0x38800800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t imm9 : 9;
uint32_t _21 : 1; // 0
uint32_t opc : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.imm9.uimm = static_cast<uint64_t>(enc.imm9);
inst.V = static_cast<uint8_t>(enc.V);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LDTRSB_64_LDST_UNPRIV;
inst.iclass = InstName::LDTRSB;
return true;
}
static bool TryExtractSMINV_ASIMDALL_ONLY(InstData &inst, uint32_t bits) {
// bits
// & 10111111001111111111110000000000
// --------------------------------
// 00001110001100011010100000000000
if ((bits & 0xbf3ffc00U) != 0xe31a800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t _12 : 1; // 0
uint32_t _13 : 1; // 1
uint32_t _14 : 1; // 0
uint32_t _15 : 1; // 1
uint32_t op : 1;
uint32_t _17 : 1; // 0
uint32_t _18 : 1; // 0
uint32_t _19 : 1; // 0
uint32_t _20 : 1; // 1
uint32_t _21 : 1; // 1
uint32_t size : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.op = static_cast<uint8_t>(enc.op);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::SMINV_ASIMDALL_ONLY;
inst.iclass = InstName::SMINV;
return true;
}
static bool TryExtractURHADD_ASIMDSAME_ONLY(InstData &inst, uint32_t bits) {
// bits
// & 10111111001000001111110000000000
// --------------------------------
// 00101110001000000001010000000000
if ((bits & 0xbf20fc00U) != 0x2e201400U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t opcode : 5;
uint32_t Rm : 5;
uint32_t _21 : 1; // 1
uint32_t size : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.U = static_cast<uint8_t>(enc.U);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::URHADD_ASIMDSAME_ONLY;
inst.iclass = InstName::URHADD;
return true;
}
static bool TryExtractAND_32_LOG_IMM(InstData &inst, uint32_t bits) {
// bits
// & 11111111110000000000000000000000
// --------------------------------
// 00010010000000000000000000000000
if ((bits & 0xffc00000U) != 0x12000000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t imms : 6;
uint32_t immr : 6;
uint32_t N : 1;
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 0
uint32_t _28 : 1; // 1
uint32_t opc : 2;
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.sf = static_cast<uint8_t>(enc.sf);
inst.N = static_cast<uint8_t>(enc.N);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.immr.uimm = static_cast<uint64_t>(enc.immr);
inst.imms.uimm = static_cast<uint64_t>(enc.imms);
inst.iform = InstForm::AND_32_LOG_IMM;
inst.iclass = InstName::AND;
return true;
}
static bool TryExtractAND_64_LOG_IMM(InstData &inst, uint32_t bits) {
// bits
// & 11111111100000000000000000000000
// --------------------------------
// 10010010000000000000000000000000
if ((bits & 0xff800000U) != 0x92000000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t imms : 6;
uint32_t immr : 6;
uint32_t N : 1;
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 0
uint32_t _28 : 1; // 1
uint32_t opc : 2;
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.sf = static_cast<uint8_t>(enc.sf);
inst.N = static_cast<uint8_t>(enc.N);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.immr.uimm = static_cast<uint64_t>(enc.immr);
inst.imms.uimm = static_cast<uint64_t>(enc.imms);
inst.iform = InstForm::AND_64_LOG_IMM;
inst.iclass = InstName::AND;
return true;
}
static bool TryExtractSABD_ASIMDSAME_ONLY(InstData &inst, uint32_t bits) {
// bits
// & 10111111001000001111110000000000
// --------------------------------
// 00001110001000000111010000000000
if ((bits & 0xbf20fc00U) != 0xe207400U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t ac : 1;
uint32_t _12 : 1; // 1
uint32_t _13 : 1; // 1
uint32_t _14 : 1; // 1
uint32_t _15 : 1; // 0
uint32_t Rm : 5;
uint32_t _21 : 1; // 1
uint32_t size : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Q = static_cast<uint8_t>(enc.Q);
inst.ac = static_cast<uint8_t>(enc.ac);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::SABD_ASIMDSAME_ONLY;
inst.iclass = InstName::SABD;
return true;
}
static bool TryExtractFCMGE_ASISDSAMEFP16_ONLY(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 01111110010000000010010000000000
if ((bits & 0xffe0fc00U) != 0x7e402400U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t ac : 1;
uint32_t _12 : 1; // 0
uint32_t _13 : 1; // 1
uint32_t _14 : 1; // 0
uint32_t _15 : 1; // 0
uint32_t Rm : 5;
uint32_t _21 : 1; // 0
uint32_t _22 : 1; // 1
uint32_t E : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t U : 1;
uint32_t _30 : 1; // 1
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.ac = static_cast<uint8_t>(enc.ac);
inst.E = static_cast<uint8_t>(enc.E);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.iform = InstForm::FCMGE_ASISDSAMEFP16_ONLY;
inst.iclass = InstName::FCMGE;
return true;
}
static bool TryExtractFCMGE_ASISDSAME_ONLY(InstData &inst, uint32_t bits) {
// bits
// & 11111111101000001111110000000000
// --------------------------------
// 01111110001000001110010000000000
if ((bits & 0xffa0fc00U) != 0x7e20e400U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t ac : 1;
uint32_t _12 : 1; // 0
uint32_t _13 : 1; // 1
uint32_t _14 : 1; // 1
uint32_t _15 : 1; // 1
uint32_t Rm : 5;
uint32_t _21 : 1; // 1
uint32_t sz : 1;
uint32_t E : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t U : 1;
uint32_t _30 : 1; // 1
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.sz = static_cast<uint8_t>(enc.sz);
inst.ac = static_cast<uint8_t>(enc.ac);
inst.E = static_cast<uint8_t>(enc.E);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.iform = InstForm::FCMGE_ASISDSAME_ONLY;
inst.iclass = InstName::FCMGE;
return true;
}
static bool TryExtractFCMGE_ASIMDSAMEFP16_ONLY(InstData &inst, uint32_t bits) {
// bits
// & 10111111111000001111110000000000
// --------------------------------
// 00101110010000000010010000000000
if ((bits & 0xbfe0fc00U) != 0x2e402400U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t ac : 1;
uint32_t _12 : 1; // 0
uint32_t _13 : 1; // 1
uint32_t _14 : 1; // 0
uint32_t _15 : 1; // 0
uint32_t Rm : 5;
uint32_t _21 : 1; // 0
uint32_t _22 : 1; // 1
uint32_t E : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Q = static_cast<uint8_t>(enc.Q);
inst.ac = static_cast<uint8_t>(enc.ac);
inst.E = static_cast<uint8_t>(enc.E);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.iform = InstForm::FCMGE_ASIMDSAMEFP16_ONLY;
inst.iclass = InstName::FCMGE;
return true;
}
static bool TryExtractFCMGE_ASIMDSAME_ONLY(InstData &inst, uint32_t bits) {
// bits
// & 10111111101000001111110000000000
// --------------------------------
// 00101110001000001110010000000000
if ((bits & 0xbfa0fc00U) != 0x2e20e400U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t ac : 1;
uint32_t _12 : 1; // 0
uint32_t _13 : 1; // 1
uint32_t _14 : 1; // 1
uint32_t _15 : 1; // 1
uint32_t Rm : 5;
uint32_t _21 : 1; // 1
uint32_t sz : 1;
uint32_t E : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.sz = static_cast<uint8_t>(enc.sz);
inst.ac = static_cast<uint8_t>(enc.ac);
inst.E = static_cast<uint8_t>(enc.E);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.iform = InstForm::FCMGE_ASIMDSAME_ONLY;
inst.iclass = InstName::FCMGE;
return true;
}
static bool TryExtractMVN_NOT_ASIMDMISC_R(InstData &inst, uint32_t bits) {
// bits
// & 10111111111111111111110000000000
// --------------------------------
// 00101110001000000101100000000000
if ((bits & 0xbffffc00U) != 0x2e205800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t opcode : 5;
uint32_t _17 : 1; // 0
uint32_t _18 : 1; // 0
uint32_t _19 : 1; // 0
uint32_t _20 : 1; // 0
uint32_t _21 : 1; // 1
uint32_t size : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.U = static_cast<uint8_t>(enc.U);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::MVN_NOT_ASIMDMISC_R;
inst.iclass = InstName::NOT;
return true;
}
static bool TryExtractSTSMIN_32S_MEMOP(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000011111
// --------------------------------
// 10111000001000000101000000011111
if ((bits & 0xffe0fc1fU) != 0xb820501fU) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t opc : 3;
uint32_t o3 : 1;
uint32_t Rs : 5;
uint32_t _21 : 1; // 1
uint32_t R : 1;
uint32_t A : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.A = static_cast<uint8_t>(enc.A);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.V = static_cast<uint8_t>(enc.V);
inst.R = static_cast<uint8_t>(enc.R);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o3 = static_cast<uint8_t>(enc.o3);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::STSMIN_32S_MEMOP;
inst.iclass = InstName::STSMIN;
return true;
}
static bool TryExtractSTSMINL_32S_MEMOP(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000011111
// --------------------------------
// 10111000011000000101000000011111
if ((bits & 0xffe0fc1fU) != 0xb860501fU) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t opc : 3;
uint32_t o3 : 1;
uint32_t Rs : 5;
uint32_t _21 : 1; // 1
uint32_t R : 1;
uint32_t A : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.A = static_cast<uint8_t>(enc.A);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.V = static_cast<uint8_t>(enc.V);
inst.R = static_cast<uint8_t>(enc.R);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o3 = static_cast<uint8_t>(enc.o3);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::STSMINL_32S_MEMOP;
inst.iclass = InstName::STSMINL;
return true;
}
static bool TryExtractSTSMIN_64S_MEMOP(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000011111
// --------------------------------
// 11111000001000000101000000011111
if ((bits & 0xffe0fc1fU) != 0xf820501fU) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t opc : 3;
uint32_t o3 : 1;
uint32_t Rs : 5;
uint32_t _21 : 1; // 1
uint32_t R : 1;
uint32_t A : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.A = static_cast<uint8_t>(enc.A);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.V = static_cast<uint8_t>(enc.V);
inst.R = static_cast<uint8_t>(enc.R);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o3 = static_cast<uint8_t>(enc.o3);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::STSMIN_64S_MEMOP;
inst.iclass = InstName::STSMIN;
return true;
}
static bool TryExtractSTSMINL_64S_MEMOP(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000011111
// --------------------------------
// 11111000011000000101000000011111
if ((bits & 0xffe0fc1fU) != 0xf860501fU) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t opc : 3;
uint32_t o3 : 1;
uint32_t Rs : 5;
uint32_t _21 : 1; // 1
uint32_t R : 1;
uint32_t A : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.A = static_cast<uint8_t>(enc.A);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.V = static_cast<uint8_t>(enc.V);
inst.R = static_cast<uint8_t>(enc.R);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o3 = static_cast<uint8_t>(enc.o3);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::STSMINL_64S_MEMOP;
inst.iclass = InstName::STSMINL;
return true;
}
static bool TryExtractTRN1_ASIMDPERM_ONLY(InstData &inst, uint32_t bits) {
// bits
// & 10111111001000001111110000000000
// --------------------------------
// 00001110000000000010100000000000
if ((bits & 0xbf20fc00U) != 0xe002800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t _12 : 1; // 0
uint32_t _13 : 1; // 1
uint32_t op : 1;
uint32_t _15 : 1; // 0
uint32_t Rm : 5;
uint32_t _21 : 1; // 0
uint32_t size : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 0
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.op = static_cast<uint8_t>(enc.op);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::TRN1_ASIMDPERM_ONLY;
inst.iclass = InstName::TRN1;
return true;
}
static bool TryExtractSBCS_32_ADDSUB_CARRY(InstData &inst, uint32_t bits) {
if (false && TryExtractNGCS_SBCS_32_ADDSUB_CARRY(inst, bits))
return true;
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 01111010000000000000000000000000
if ((bits & 0xffe0fc00U) != 0x7a000000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t opcode2 : 6;
uint32_t Rm : 5;
uint32_t _21 : 1; // 0
uint32_t _22 : 1; // 0
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t op : 1;
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.opcode2 = static_cast<uint8_t>(enc.opcode2);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.sf = static_cast<uint8_t>(enc.sf);
inst.op = static_cast<uint8_t>(enc.op);
inst.iform = InstForm::SBCS_32_ADDSUB_CARRY;
inst.iclass = InstName::SBCS;
return true;
}
static bool TryExtractSBCS_64_ADDSUB_CARRY(InstData &inst, uint32_t bits) {
if (false && TryExtractNGCS_SBCS_64_ADDSUB_CARRY(inst, bits))
return true;
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 11111010000000000000000000000000
if ((bits & 0xffe0fc00U) != 0xfa000000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t opcode2 : 6;
uint32_t Rm : 5;
uint32_t _21 : 1; // 0
uint32_t _22 : 1; // 0
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t op : 1;
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.opcode2 = static_cast<uint8_t>(enc.opcode2);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.sf = static_cast<uint8_t>(enc.sf);
inst.op = static_cast<uint8_t>(enc.op);
inst.iform = InstForm::SBCS_64_ADDSUB_CARRY;
inst.iclass = InstName::SBCS;
return true;
}
static bool TryExtractSMULL_ASIMDDIFF_L(InstData &inst, uint32_t bits) {
// bits
// & 10111111001000001111110000000000
// --------------------------------
// 00001110001000001100000000000000
if ((bits & 0xbf20fc00U) != 0xe20c000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t opcode : 4;
uint32_t Rm : 5;
uint32_t _21 : 1; // 1
uint32_t size : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.U = static_cast<uint8_t>(enc.U);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::SMULL_ASIMDDIFF_L;
inst.iclass = InstName::SMULL;
return true;
}
static bool TryExtractLSRV_32_DP_2SRC(InstData &inst, uint32_t bits) {
if (false && TryExtractLSR_LSRV_32_DP_2SRC(inst, bits))
return true;
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 00011010110000000010010000000000
if ((bits & 0xffe0fc00U) != 0x1ac02400U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t op2 : 2;
uint32_t opcode2 : 4;
uint32_t Rm : 5;
uint32_t _21 : 1; // 0
uint32_t _22 : 1; // 1
uint32_t _23 : 1; // 1
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t op : 1;
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.opcode2 = static_cast<uint8_t>(enc.opcode2);
inst.op2 = static_cast<uint8_t>(enc.op2);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.sf = static_cast<uint8_t>(enc.sf);
inst.op = static_cast<uint8_t>(enc.op);
inst.iform = InstForm::LSRV_32_DP_2SRC;
inst.iclass = InstName::LSRV;
return true;
}
static bool TryExtractLSRV_64_DP_2SRC(InstData &inst, uint32_t bits) {
if (false && TryExtractLSR_LSRV_64_DP_2SRC(inst, bits))
return true;
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 10011010110000000010010000000000
if ((bits & 0xffe0fc00U) != 0x9ac02400U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t op2 : 2;
uint32_t opcode2 : 4;
uint32_t Rm : 5;
uint32_t _21 : 1; // 0
uint32_t _22 : 1; // 1
uint32_t _23 : 1; // 1
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t op : 1;
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.opcode2 = static_cast<uint8_t>(enc.opcode2);
inst.op2 = static_cast<uint8_t>(enc.op2);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.sf = static_cast<uint8_t>(enc.sf);
inst.op = static_cast<uint8_t>(enc.op);
inst.iform = InstForm::LSRV_64_DP_2SRC;
inst.iclass = InstName::LSRV;
return true;
}
static bool TryExtractURSQRTE_ASIMDMISC_R(InstData &inst, uint32_t bits) {
// bits
// & 10111111101111111111110000000000
// --------------------------------
// 00101110101000011100100000000000
if ((bits & 0xbfbffc00U) != 0x2ea1c800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t opcode : 5;
uint32_t _17 : 1; // 0
uint32_t _18 : 1; // 0
uint32_t _19 : 1; // 0
uint32_t _20 : 1; // 0
uint32_t _21 : 1; // 1
uint32_t sz : 1;
uint32_t _23 : 1; // 1
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.sz = static_cast<uint8_t>(enc.sz);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.U = static_cast<uint8_t>(enc.U);
inst.iform = InstForm::URSQRTE_ASIMDMISC_R;
inst.iclass = InstName::URSQRTE;
return true;
}
static bool TryExtractFCCMPE_H_FLOATCCMP(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000000000110000010000
// --------------------------------
// 00011110111000000000010000010000
if ((bits & 0xffe00c10U) != 0x1ee00410U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t nzcv : 4;
uint32_t op : 1;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t _11 : 1; // 0
uint32_t cond : 4;
uint32_t Rm : 5;
uint32_t _21 : 1; // 1
uint32_t type : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t _30 : 1; // 0
uint32_t M : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.nzcv = static_cast<uint8_t>(enc.nzcv);
inst.M = static_cast<uint8_t>(enc.M);
inst.S = static_cast<uint8_t>(enc.S);
inst.cond = static_cast<uint8_t>(enc.cond);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.type = static_cast<uint8_t>(enc.type);
inst.op = static_cast<uint8_t>(enc.op);
inst.iform = InstForm::FCCMPE_H_FLOATCCMP;
inst.iclass = InstName::FCCMPE;
return true;
}
static bool TryExtractFCCMPE_S_FLOATCCMP(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000000000110000010000
// --------------------------------
// 00011110001000000000010000010000
if ((bits & 0xffe00c10U) != 0x1e200410U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t nzcv : 4;
uint32_t op : 1;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t _11 : 1; // 0
uint32_t cond : 4;
uint32_t Rm : 5;
uint32_t _21 : 1; // 1
uint32_t type : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t _30 : 1; // 0
uint32_t M : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.nzcv = static_cast<uint8_t>(enc.nzcv);
inst.M = static_cast<uint8_t>(enc.M);
inst.S = static_cast<uint8_t>(enc.S);
inst.cond = static_cast<uint8_t>(enc.cond);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.type = static_cast<uint8_t>(enc.type);
inst.op = static_cast<uint8_t>(enc.op);
inst.iform = InstForm::FCCMPE_S_FLOATCCMP;
inst.iclass = InstName::FCCMPE;
return true;
}
static bool TryExtractFCCMPE_D_FLOATCCMP(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000000000110000010000
// --------------------------------
// 00011110011000000000010000010000
if ((bits & 0xffe00c10U) != 0x1e600410U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t nzcv : 4;
uint32_t op : 1;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t _11 : 1; // 0
uint32_t cond : 4;
uint32_t Rm : 5;
uint32_t _21 : 1; // 1
uint32_t type : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t _30 : 1; // 0
uint32_t M : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.nzcv = static_cast<uint8_t>(enc.nzcv);
inst.M = static_cast<uint8_t>(enc.M);
inst.S = static_cast<uint8_t>(enc.S);
inst.cond = static_cast<uint8_t>(enc.cond);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.type = static_cast<uint8_t>(enc.type);
inst.op = static_cast<uint8_t>(enc.op);
inst.iform = InstForm::FCCMPE_D_FLOATCCMP;
inst.iclass = InstName::FCCMPE;
return true;
}
static bool TryExtractFMAXP_ASIMDSAMEFP16_ONLY(InstData &inst, uint32_t bits) {
// bits
// & 10111111111000001111110000000000
// --------------------------------
// 00101110010000000011010000000000
if ((bits & 0xbfe0fc00U) != 0x2e403400U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t opcode : 3;
uint32_t _14 : 1; // 0
uint32_t _15 : 1; // 0
uint32_t Rm : 5;
uint32_t _21 : 1; // 0
uint32_t _22 : 1; // 1
uint32_t o1 : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.U = static_cast<uint8_t>(enc.U);
inst.o1 = static_cast<uint8_t>(enc.o1);
inst.iform = InstForm::FMAXP_ASIMDSAMEFP16_ONLY;
inst.iclass = InstName::FMAXP;
return true;
}
static bool TryExtractFMAXP_ASIMDSAME_ONLY(InstData &inst, uint32_t bits) {
// bits
// & 10111111101000001111110000000000
// --------------------------------
// 00101110001000001111010000000000
if ((bits & 0xbfa0fc00U) != 0x2e20f400U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t opcode : 5;
uint32_t Rm : 5;
uint32_t _21 : 1; // 1
uint32_t sz : 1;
uint32_t o1 : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.sz = static_cast<uint8_t>(enc.sz);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.U = static_cast<uint8_t>(enc.U);
inst.o1 = static_cast<uint8_t>(enc.o1);
inst.iform = InstForm::FMAXP_ASIMDSAME_ONLY;
inst.iclass = InstName::FMAXP;
return true;
}
static bool TryExtractMUL_MADD_32A_DP_3SRC(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 00011011000000000111110000000000
if ((bits & 0xffe0fc00U) != 0x1b007c00U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t Ra : 5;
uint32_t o0 : 1;
uint32_t Rm : 5;
uint32_t op31 : 3;
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t op54 : 2;
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.Ra = static_cast<uint8_t>(enc.Ra);
inst.op54 = static_cast<uint8_t>(enc.op54);
inst.op31 = static_cast<uint8_t>(enc.op31);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.sf = static_cast<uint8_t>(enc.sf);
inst.o0 = static_cast<uint8_t>(enc.o0);
inst.iform = InstForm::MUL_MADD_32A_DP_3SRC;
inst.iclass = InstName::MADD;
return true;
}
static bool TryExtractMUL_MADD_64A_DP_3SRC(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 10011011000000000111110000000000
if ((bits & 0xffe0fc00U) != 0x9b007c00U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t Ra : 5;
uint32_t o0 : 1;
uint32_t Rm : 5;
uint32_t op31 : 3;
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t op54 : 2;
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.Ra = static_cast<uint8_t>(enc.Ra);
inst.op54 = static_cast<uint8_t>(enc.op54);
inst.op31 = static_cast<uint8_t>(enc.op31);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.sf = static_cast<uint8_t>(enc.sf);
inst.o0 = static_cast<uint8_t>(enc.o0);
inst.iform = InstForm::MUL_MADD_64A_DP_3SRC;
inst.iclass = InstName::MADD;
return true;
}
static bool TryExtractSTTR_32_LDST_UNPRIV(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000000000110000000000
// --------------------------------
// 10111000000000000000100000000000
if ((bits & 0xffe00c00U) != 0xb8000800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t imm9 : 9;
uint32_t _21 : 1; // 0
uint32_t opc : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.imm9.uimm = static_cast<uint64_t>(enc.imm9);
inst.V = static_cast<uint8_t>(enc.V);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::STTR_32_LDST_UNPRIV;
inst.iclass = InstName::STTR;
return true;
}
static bool TryExtractSTTR_64_LDST_UNPRIV(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000000000110000000000
// --------------------------------
// 11111000000000000000100000000000
if ((bits & 0xffe00c00U) != 0xf8000800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t imm9 : 9;
uint32_t _21 : 1; // 0
uint32_t opc : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.imm9.uimm = static_cast<uint64_t>(enc.imm9);
inst.V = static_cast<uint8_t>(enc.V);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::STTR_64_LDST_UNPRIV;
inst.iclass = InstName::STTR;
return true;
}
static bool TryExtractFCMGT_ASISDMISCFP16_FZ(InstData &inst, uint32_t bits) {
// bits
// & 11111111111111111111110000000000
// --------------------------------
// 01011110111110001100100000000000
if ((bits & 0xfffffc00U) != 0x5ef8c800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t op : 1;
uint32_t _13 : 1; // 0
uint32_t _14 : 1; // 1
uint32_t _15 : 1; // 1
uint32_t _16 : 1; // 0
uint32_t _17 : 1; // 0
uint32_t _18 : 1; // 0
uint32_t _19 : 1; // 1
uint32_t _20 : 1; // 1
uint32_t _21 : 1; // 1
uint32_t _22 : 1; // 1
uint32_t a : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t U : 1;
uint32_t _30 : 1; // 1
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.a = static_cast<uint8_t>(enc.a);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.U = static_cast<uint8_t>(enc.U);
inst.op = static_cast<uint8_t>(enc.op);
inst.iform = InstForm::FCMGT_ASISDMISCFP16_FZ;
inst.iclass = InstName::FCMGT;
return true;
}
static bool TryExtractFCMGT_ASISDMISC_FZ(InstData &inst, uint32_t bits) {
// bits
// & 11111111101111111111110000000000
// --------------------------------
// 01011110101000001100100000000000
if ((bits & 0xffbffc00U) != 0x5ea0c800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t op : 1;
uint32_t _13 : 1; // 0
uint32_t _14 : 1; // 1
uint32_t _15 : 1; // 1
uint32_t _16 : 1; // 0
uint32_t _17 : 1; // 0
uint32_t _18 : 1; // 0
uint32_t _19 : 1; // 0
uint32_t _20 : 1; // 0
uint32_t _21 : 1; // 1
uint32_t sz : 1;
uint32_t _23 : 1; // 1
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t U : 1;
uint32_t _30 : 1; // 1
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.sz = static_cast<uint8_t>(enc.sz);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.U = static_cast<uint8_t>(enc.U);
inst.op = static_cast<uint8_t>(enc.op);
inst.iform = InstForm::FCMGT_ASISDMISC_FZ;
inst.iclass = InstName::FCMGT;
return true;
}
static bool TryExtractFCMGT_ASIMDMISCFP16_FZ(InstData &inst, uint32_t bits) {
// bits
// & 10111111111111111111110000000000
// --------------------------------
// 00001110111110001100100000000000
if ((bits & 0xbffffc00U) != 0xef8c800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t op : 1;
uint32_t _13 : 1; // 0
uint32_t _14 : 1; // 1
uint32_t _15 : 1; // 1
uint32_t _16 : 1; // 0
uint32_t _17 : 1; // 0
uint32_t _18 : 1; // 0
uint32_t _19 : 1; // 1
uint32_t _20 : 1; // 1
uint32_t _21 : 1; // 1
uint32_t _22 : 1; // 1
uint32_t a : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.a = static_cast<uint8_t>(enc.a);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.op = static_cast<uint8_t>(enc.op);
inst.iform = InstForm::FCMGT_ASIMDMISCFP16_FZ;
inst.iclass = InstName::FCMGT;
return true;
}
static bool TryExtractFCMGT_ASIMDMISC_FZ(InstData &inst, uint32_t bits) {
// bits
// & 10111111101111111111110000000000
// --------------------------------
// 00001110101000001100100000000000
if ((bits & 0xbfbffc00U) != 0xea0c800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t op : 1;
uint32_t _13 : 1; // 0
uint32_t _14 : 1; // 1
uint32_t _15 : 1; // 1
uint32_t _16 : 1; // 0
uint32_t _17 : 1; // 0
uint32_t _18 : 1; // 0
uint32_t _19 : 1; // 0
uint32_t _20 : 1; // 0
uint32_t _21 : 1; // 1
uint32_t sz : 1;
uint32_t _23 : 1; // 1
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.sz = static_cast<uint8_t>(enc.sz);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.op = static_cast<uint8_t>(enc.op);
inst.iform = InstForm::FCMGT_ASIMDMISC_FZ;
inst.iclass = InstName::FCMGT;
return true;
}
static bool TryExtractBSL_ASIMDSAME_ONLY(InstData &inst, uint32_t bits) {
// bits
// & 10111111111000001111110000000000
// --------------------------------
// 00101110011000000001110000000000
if ((bits & 0xbfe0fc00U) != 0x2e601c00U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t opcode : 5;
uint32_t Rm : 5;
uint32_t _21 : 1; // 1
uint32_t opc2 : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Q = static_cast<uint8_t>(enc.Q);
inst.opc2 = static_cast<uint8_t>(enc.opc2);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.U = static_cast<uint8_t>(enc.U);
inst.iform = InstForm::BSL_ASIMDSAME_ONLY;
inst.iclass = InstName::BSL;
return true;
}
static bool TryExtractUQSUB_ASISDSAME_ONLY(InstData &inst, uint32_t bits) {
// bits
// & 11111111001000001111110000000000
// --------------------------------
// 01111110001000000010110000000000
if ((bits & 0xff20fc00U) != 0x7e202c00U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t opcode : 5;
uint32_t Rm : 5;
uint32_t _21 : 1; // 1
uint32_t size : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t U : 1;
uint32_t _30 : 1; // 1
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.U = static_cast<uint8_t>(enc.U);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::UQSUB_ASISDSAME_ONLY;
inst.iclass = InstName::UQSUB;
return true;
}
static bool TryExtractUQSUB_ASIMDSAME_ONLY(InstData &inst, uint32_t bits) {
// bits
// & 10111111001000001111110000000000
// --------------------------------
// 00101110001000000010110000000000
if ((bits & 0xbf20fc00U) != 0x2e202c00U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t opcode : 5;
uint32_t Rm : 5;
uint32_t _21 : 1; // 1
uint32_t size : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.U = static_cast<uint8_t>(enc.U);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::UQSUB_ASIMDSAME_ONLY;
inst.iclass = InstName::UQSUB;
return true;
}
static bool TryExtractWFI_HI_SYSTEM(InstData &inst, uint32_t bits) {
// bits
// & 11111111111111111111111111111111
// --------------------------------
// 11010101000000110010000001111111
if ((bits & 0xffffffffU) != 0xd503207fU) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t op2 : 3;
uint32_t CRm : 4;
uint32_t CRn : 4;
uint32_t op1 : 3;
uint32_t op0 : 2;
uint32_t L : 1;
uint32_t _22 : 1; // 0
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 0
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 0
uint32_t _30 : 1; // 1
uint32_t _31 : 1; // 1
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.op0 = static_cast<uint8_t>(enc.op0);
inst.op1 = static_cast<uint8_t>(enc.op1);
inst.op2 = static_cast<uint8_t>(enc.op2);
inst.L = static_cast<uint8_t>(enc.L);
inst.CRn = static_cast<uint8_t>(enc.CRn);
inst.CRm = static_cast<uint8_t>(enc.CRm);
inst.iform = InstForm::WFI_HI_SYSTEM;
inst.iclass = InstName::WFI;
return true;
}
static bool TryExtractLDXRH_LR32_LDSTEXCL(InstData &inst, uint32_t bits) {
// bits
// & 11111111111111111111110000000000
// --------------------------------
// 01001000010111110111110000000000
if ((bits & 0xfffffc00U) != 0x485f7c00U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t Rt2 : 5;
uint32_t o0 : 1;
uint32_t Rs : 5;
uint32_t o1 : 1;
uint32_t L : 1;
uint32_t o2 : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 0
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.L = static_cast<uint8_t>(enc.L);
inst.Rt2 = static_cast<uint8_t>(enc.Rt2);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.o2 = static_cast<uint8_t>(enc.o2);
inst.o1 = static_cast<uint8_t>(enc.o1);
inst.o0 = static_cast<uint8_t>(enc.o0);
inst.iform = InstForm::LDXRH_LR32_LDSTEXCL;
inst.iclass = InstName::LDXRH;
return true;
}
static bool TryExtractFMAXNMV_ASIMDALL_ONLY_H(InstData &inst, uint32_t bits) {
// bits
// & 10111111111111111111110000000000
// --------------------------------
// 00001110001100001100100000000000
if ((bits & 0xbffffc00U) != 0xe30c800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t opcode : 5;
uint32_t _17 : 1; // 0
uint32_t _18 : 1; // 0
uint32_t _19 : 1; // 0
uint32_t _20 : 1; // 1
uint32_t _21 : 1; // 1
uint32_t _22 : 1; // 0
uint32_t o1 : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.U = static_cast<uint8_t>(enc.U);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o1 = static_cast<uint8_t>(enc.o1);
inst.iform = InstForm::FMAXNMV_ASIMDALL_ONLY_H;
inst.iclass = InstName::FMAXNMV;
return true;
}
static bool TryExtractFMAXNMV_ASIMDALL_ONLY_SD(InstData &inst, uint32_t bits) {
// bits
// & 10111111101111111111110000000000
// --------------------------------
// 00101110001100001100100000000000
if ((bits & 0xbfbffc00U) != 0x2e30c800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t opcode : 5;
uint32_t _17 : 1; // 0
uint32_t _18 : 1; // 0
uint32_t _19 : 1; // 0
uint32_t _20 : 1; // 1
uint32_t _21 : 1; // 1
uint32_t sz : 1;
uint32_t o1 : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.sz = static_cast<uint8_t>(enc.sz);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o1 = static_cast<uint8_t>(enc.o1);
inst.iform = InstForm::FMAXNMV_ASIMDALL_ONLY_SD;
inst.iclass = InstName::FMAXNMV;
return true;
}
static bool TryExtractSTLXR_SR32_LDSTEXCL(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 10001000000000001111110000000000
if ((bits & 0xffe0fc00U) != 0x8800fc00U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t Rt2 : 5;
uint32_t o0 : 1;
uint32_t Rs : 5;
uint32_t o1 : 1;
uint32_t L : 1;
uint32_t o2 : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 0
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.L = static_cast<uint8_t>(enc.L);
inst.Rt2 = static_cast<uint8_t>(enc.Rt2);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.o2 = static_cast<uint8_t>(enc.o2);
inst.o1 = static_cast<uint8_t>(enc.o1);
inst.o0 = static_cast<uint8_t>(enc.o0);
inst.iform = InstForm::STLXR_SR32_LDSTEXCL;
inst.iclass = InstName::STLXR;
return true;
}
static bool TryExtractSTLXR_SR64_LDSTEXCL(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 11001000000000001111110000000000
if ((bits & 0xffe0fc00U) != 0xc800fc00U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t Rt2 : 5;
uint32_t o0 : 1;
uint32_t Rs : 5;
uint32_t o1 : 1;
uint32_t L : 1;
uint32_t o2 : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 0
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.L = static_cast<uint8_t>(enc.L);
inst.Rt2 = static_cast<uint8_t>(enc.Rt2);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.o2 = static_cast<uint8_t>(enc.o2);
inst.o1 = static_cast<uint8_t>(enc.o1);
inst.o0 = static_cast<uint8_t>(enc.o0);
inst.iform = InstForm::STLXR_SR64_LDSTEXCL;
inst.iclass = InstName::STLXR;
return true;
}
static bool TryExtractSTLRB_SL32_LDSTEXCL(InstData &inst, uint32_t bits) {
// bits
// & 11111111111111111111110000000000
// --------------------------------
// 00001000100111111111110000000000
if ((bits & 0xfffffc00U) != 0x89ffc00U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t Rt2 : 5;
uint32_t o0 : 1;
uint32_t Rs : 5;
uint32_t o1 : 1;
uint32_t L : 1;
uint32_t o2 : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 0
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.L = static_cast<uint8_t>(enc.L);
inst.Rt2 = static_cast<uint8_t>(enc.Rt2);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.o2 = static_cast<uint8_t>(enc.o2);
inst.o1 = static_cast<uint8_t>(enc.o1);
inst.o0 = static_cast<uint8_t>(enc.o0);
inst.iform = InstForm::STLRB_SL32_LDSTEXCL;
inst.iclass = InstName::STLRB;
return true;
}
static bool TryExtractST3_ASISDLSE_R3(InstData &inst, uint32_t bits) {
// bits
// & 10111111111111111111000000000000
// --------------------------------
// 00001100000000000100000000000000
if ((bits & 0xbffff000U) != 0xc004000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t size : 2;
uint32_t opcode : 4;
uint32_t _16 : 1; // 0
uint32_t _17 : 1; // 0
uint32_t _18 : 1; // 0
uint32_t _19 : 1; // 0
uint32_t _20 : 1; // 0
uint32_t _21 : 1; // 0
uint32_t L : 1;
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 0
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.L = static_cast<uint8_t>(enc.L);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::ST3_ASISDLSE_R3;
inst.iclass = InstName::ST3;
return true;
}
static bool TryExtractST3_ASISDLSEP_I3_I(InstData &inst, uint32_t bits) {
// bits
// & 10111111111111111111000000000000
// --------------------------------
// 00001100100111110100000000000000
if ((bits & 0xbffff000U) != 0xc9f4000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t size : 2;
uint32_t opcode : 4;
uint32_t Rm : 5;
uint32_t _21 : 1; // 0
uint32_t L : 1;
uint32_t _23 : 1; // 1
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 0
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.L = static_cast<uint8_t>(enc.L);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::ST3_ASISDLSEP_I3_I;
inst.iclass = InstName::ST3;
return true;
}
static bool TryExtractST3_ASISDLSEP_R3_R(InstData &inst, uint32_t bits) {
// bits
// & 10111111111000001111000000000000
// --------------------------------
// 00001100100000000100000000000000
if ((bits & 0xbfe0f000U) != 0xc804000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t size : 2;
uint32_t opcode : 4;
uint32_t Rm : 5;
uint32_t _21 : 1; // 0
uint32_t L : 1;
uint32_t _23 : 1; // 1
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 0
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.L = static_cast<uint8_t>(enc.L);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::ST3_ASISDLSEP_R3_R;
inst.iclass = InstName::ST3;
return true;
}
static bool TryExtractSQRDMULH_ASISDELEM_R(InstData &inst, uint32_t bits) {
// bits
// & 11111111000000001111010000000000
// --------------------------------
// 01011111000000001101000000000000
if ((bits & 0xff00f400U) != 0x5f00d000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t H : 1;
uint32_t op : 1;
uint32_t _13 : 1; // 0
uint32_t _14 : 1; // 1
uint32_t _15 : 1; // 1
uint32_t Rm : 4;
uint32_t M : 1;
uint32_t L : 1;
uint32_t size : 2;
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t U : 1;
uint32_t _30 : 1; // 1
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.H = static_cast<uint8_t>(enc.H);
inst.M = static_cast<uint8_t>(enc.M);
inst.L = static_cast<uint8_t>(enc.L);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.op = static_cast<uint8_t>(enc.op);
inst.iform = InstForm::SQRDMULH_ASISDELEM_R;
inst.iclass = InstName::SQRDMULH;
return true;
}
static bool TryExtractSQRDMULH_ASIMDELEM_R(InstData &inst, uint32_t bits) {
// bits
// & 10111111000000001111010000000000
// --------------------------------
// 00001111000000001101000000000000
if ((bits & 0xbf00f400U) != 0xf00d000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t H : 1;
uint32_t op : 1;
uint32_t _13 : 1; // 0
uint32_t _14 : 1; // 1
uint32_t _15 : 1; // 1
uint32_t Rm : 4;
uint32_t M : 1;
uint32_t L : 1;
uint32_t size : 2;
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Q = static_cast<uint8_t>(enc.Q);
inst.H = static_cast<uint8_t>(enc.H);
inst.M = static_cast<uint8_t>(enc.M);
inst.L = static_cast<uint8_t>(enc.L);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.op = static_cast<uint8_t>(enc.op);
inst.iform = InstForm::SQRDMULH_ASIMDELEM_R;
inst.iclass = InstName::SQRDMULH;
return true;
}
static bool TryExtractSXTW_SBFM_64M_BITFIELD(InstData &inst, uint32_t bits) {
// bits
// & 11111111111111111111110000000000
// --------------------------------
// 10010011010000000111110000000000
if ((bits & 0xfffffc00U) != 0x93407c00U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t imms : 6;
uint32_t immr : 6;
uint32_t N : 1;
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 0
uint32_t _28 : 1; // 1
uint32_t opc : 2;
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.sf = static_cast<uint8_t>(enc.sf);
inst.N = static_cast<uint8_t>(enc.N);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.immr.uimm = static_cast<uint64_t>(enc.immr);
inst.imms.uimm = static_cast<uint64_t>(enc.imms);
inst.iform = InstForm::SXTW_SBFM_64M_BITFIELD;
inst.iclass = InstName::SBFM;
return true;
}
static bool TryExtractUSHR_ASISDSHF_R(InstData &inst, uint32_t bits) {
// bits
// & 11111111100000001111110000000000
// --------------------------------
// 01111111000000000000010000000000
if ((bits & 0xff80fc00U) != 0x7f000400U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t _11 : 1; // 0
uint32_t o0 : 1;
uint32_t o1 : 1;
uint32_t _14 : 1; // 0
uint32_t _15 : 1; // 0
uint32_t immb : 3;
uint32_t immh : 4;
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t U : 1;
uint32_t _30 : 1; // 1
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.immh.uimm = static_cast<uint64_t>(enc.immh);
if (!(inst.immh.uimm != 0x0))
return false;
inst.immb.uimm = static_cast<uint64_t>(enc.immb);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o1 = static_cast<uint8_t>(enc.o1);
inst.o0 = static_cast<uint8_t>(enc.o0);
inst.iform = InstForm::USHR_ASISDSHF_R;
inst.iclass = InstName::USHR;
return true;
}
static bool TryExtractUSHR_ASIMDSHF_R(InstData &inst, uint32_t bits) {
// bits
// & 10111111100000001111110000000000
// --------------------------------
// 00101111000000000000010000000000
if ((bits & 0xbf80fc00U) != 0x2f000400U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t _11 : 1; // 0
uint32_t o0 : 1;
uint32_t o1 : 1;
uint32_t _14 : 1; // 0
uint32_t _15 : 1; // 0
uint32_t immb : 3;
uint32_t immh : 4;
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.immh.uimm = static_cast<uint64_t>(enc.immh);
if (!(inst.immh.uimm != 0x0))
return false;
inst.immb.uimm = static_cast<uint64_t>(enc.immb);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o1 = static_cast<uint8_t>(enc.o1);
inst.o0 = static_cast<uint8_t>(enc.o0);
inst.iform = InstForm::USHR_ASIMDSHF_R;
inst.iclass = InstName::USHR;
return true;
}
static bool TryExtractB_ONLY_BRANCH_IMM(InstData &inst, uint32_t bits) {
// bits
// & 11111100000000000000000000000000
// --------------------------------
// 00010100000000000000000000000000
if ((bits & 0xfc000000U) != 0x14000000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t imm26 : 26;
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 0
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 0
uint32_t _30 : 1; // 0
uint32_t op : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.imm26.uimm = static_cast<uint64_t>(enc.imm26);
inst.op = static_cast<uint8_t>(enc.op);
inst.iform = InstForm::B_ONLY_BRANCH_IMM;
inst.iclass = InstName::B;
return true;
}
static bool TryExtractFCMEQ_ASISDMISCFP16_FZ(InstData &inst, uint32_t bits) {
// bits
// & 11111111111111111111110000000000
// --------------------------------
// 01011110111110001101100000000000
if ((bits & 0xfffffc00U) != 0x5ef8d800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t op : 1;
uint32_t _13 : 1; // 0
uint32_t _14 : 1; // 1
uint32_t _15 : 1; // 1
uint32_t _16 : 1; // 0
uint32_t _17 : 1; // 0
uint32_t _18 : 1; // 0
uint32_t _19 : 1; // 1
uint32_t _20 : 1; // 1
uint32_t _21 : 1; // 1
uint32_t _22 : 1; // 1
uint32_t a : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t U : 1;
uint32_t _30 : 1; // 1
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.a = static_cast<uint8_t>(enc.a);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.U = static_cast<uint8_t>(enc.U);
inst.op = static_cast<uint8_t>(enc.op);
inst.iform = InstForm::FCMEQ_ASISDMISCFP16_FZ;
inst.iclass = InstName::FCMEQ;
return true;
}
static bool TryExtractFCMEQ_ASISDMISC_FZ(InstData &inst, uint32_t bits) {
// bits
// & 11111111101111111111110000000000
// --------------------------------
// 01011110101000001101100000000000
if ((bits & 0xffbffc00U) != 0x5ea0d800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t op : 1;
uint32_t _13 : 1; // 0
uint32_t _14 : 1; // 1
uint32_t _15 : 1; // 1
uint32_t _16 : 1; // 0
uint32_t _17 : 1; // 0
uint32_t _18 : 1; // 0
uint32_t _19 : 1; // 0
uint32_t _20 : 1; // 0
uint32_t _21 : 1; // 1
uint32_t sz : 1;
uint32_t _23 : 1; // 1
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t U : 1;
uint32_t _30 : 1; // 1
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.sz = static_cast<uint8_t>(enc.sz);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.U = static_cast<uint8_t>(enc.U);
inst.op = static_cast<uint8_t>(enc.op);
inst.iform = InstForm::FCMEQ_ASISDMISC_FZ;
inst.iclass = InstName::FCMEQ;
return true;
}
static bool TryExtractFCMEQ_ASIMDMISCFP16_FZ(InstData &inst, uint32_t bits) {
// bits
// & 10111111111111111111110000000000
// --------------------------------
// 00001110111110001101100000000000
if ((bits & 0xbffffc00U) != 0xef8d800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t op : 1;
uint32_t _13 : 1; // 0
uint32_t _14 : 1; // 1
uint32_t _15 : 1; // 1
uint32_t _16 : 1; // 0
uint32_t _17 : 1; // 0
uint32_t _18 : 1; // 0
uint32_t _19 : 1; // 1
uint32_t _20 : 1; // 1
uint32_t _21 : 1; // 1
uint32_t _22 : 1; // 1
uint32_t a : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.a = static_cast<uint8_t>(enc.a);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.op = static_cast<uint8_t>(enc.op);
inst.iform = InstForm::FCMEQ_ASIMDMISCFP16_FZ;
inst.iclass = InstName::FCMEQ;
return true;
}
static bool TryExtractFCMEQ_ASIMDMISC_FZ(InstData &inst, uint32_t bits) {
// bits
// & 10111111101111111111110000000000
// --------------------------------
// 00001110101000001101100000000000
if ((bits & 0xbfbffc00U) != 0xea0d800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t op : 1;
uint32_t _13 : 1; // 0
uint32_t _14 : 1; // 1
uint32_t _15 : 1; // 1
uint32_t _16 : 1; // 0
uint32_t _17 : 1; // 0
uint32_t _18 : 1; // 0
uint32_t _19 : 1; // 0
uint32_t _20 : 1; // 0
uint32_t _21 : 1; // 1
uint32_t sz : 1;
uint32_t _23 : 1; // 1
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.sz = static_cast<uint8_t>(enc.sz);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.op = static_cast<uint8_t>(enc.op);
inst.iform = InstForm::FCMEQ_ASIMDMISC_FZ;
inst.iclass = InstName::FCMEQ;
return true;
}
static bool TryExtractFACGE_ASISDSAMEFP16_ONLY(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 01111110010000000010110000000000
if ((bits & 0xffe0fc00U) != 0x7e402c00U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t ac : 1;
uint32_t _12 : 1; // 0
uint32_t _13 : 1; // 1
uint32_t _14 : 1; // 0
uint32_t _15 : 1; // 0
uint32_t Rm : 5;
uint32_t _21 : 1; // 0
uint32_t _22 : 1; // 1
uint32_t E : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t U : 1;
uint32_t _30 : 1; // 1
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.ac = static_cast<uint8_t>(enc.ac);
inst.E = static_cast<uint8_t>(enc.E);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.iform = InstForm::FACGE_ASISDSAMEFP16_ONLY;
inst.iclass = InstName::FACGE;
return true;
}
static bool TryExtractFACGE_ASISDSAME_ONLY(InstData &inst, uint32_t bits) {
// bits
// & 11111111101000001111110000000000
// --------------------------------
// 01111110001000001110110000000000
if ((bits & 0xffa0fc00U) != 0x7e20ec00U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t ac : 1;
uint32_t _12 : 1; // 0
uint32_t _13 : 1; // 1
uint32_t _14 : 1; // 1
uint32_t _15 : 1; // 1
uint32_t Rm : 5;
uint32_t _21 : 1; // 1
uint32_t sz : 1;
uint32_t E : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t U : 1;
uint32_t _30 : 1; // 1
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.sz = static_cast<uint8_t>(enc.sz);
inst.ac = static_cast<uint8_t>(enc.ac);
inst.E = static_cast<uint8_t>(enc.E);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.iform = InstForm::FACGE_ASISDSAME_ONLY;
inst.iclass = InstName::FACGE;
return true;
}
static bool TryExtractFACGE_ASIMDSAMEFP16_ONLY(InstData &inst, uint32_t bits) {
// bits
// & 10111111111000001111110000000000
// --------------------------------
// 00101110010000000010110000000000
if ((bits & 0xbfe0fc00U) != 0x2e402c00U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t ac : 1;
uint32_t _12 : 1; // 0
uint32_t _13 : 1; // 1
uint32_t _14 : 1; // 0
uint32_t _15 : 1; // 0
uint32_t Rm : 5;
uint32_t _21 : 1; // 0
uint32_t _22 : 1; // 1
uint32_t E : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Q = static_cast<uint8_t>(enc.Q);
inst.ac = static_cast<uint8_t>(enc.ac);
inst.E = static_cast<uint8_t>(enc.E);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.iform = InstForm::FACGE_ASIMDSAMEFP16_ONLY;
inst.iclass = InstName::FACGE;
return true;
}
static bool TryExtractFACGE_ASIMDSAME_ONLY(InstData &inst, uint32_t bits) {
// bits
// & 10111111101000001111110000000000
// --------------------------------
// 00101110001000001110110000000000
if ((bits & 0xbfa0fc00U) != 0x2e20ec00U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t ac : 1;
uint32_t _12 : 1; // 0
uint32_t _13 : 1; // 1
uint32_t _14 : 1; // 1
uint32_t _15 : 1; // 1
uint32_t Rm : 5;
uint32_t _21 : 1; // 1
uint32_t sz : 1;
uint32_t E : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.sz = static_cast<uint8_t>(enc.sz);
inst.ac = static_cast<uint8_t>(enc.ac);
inst.E = static_cast<uint8_t>(enc.E);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.iform = InstForm::FACGE_ASIMDSAME_ONLY;
inst.iclass = InstName::FACGE;
return true;
}
static bool TryExtractCSEL_32_CONDSEL(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000000000110000000000
// --------------------------------
// 00011010100000000000000000000000
if ((bits & 0xffe00c00U) != 0x1a800000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t o2 : 1;
uint32_t _11 : 1; // 0
uint32_t cond : 4;
uint32_t Rm : 5;
uint32_t _21 : 1; // 0
uint32_t _22 : 1; // 0
uint32_t _23 : 1; // 1
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t op : 1;
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.sf = static_cast<uint8_t>(enc.sf);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.cond = static_cast<uint8_t>(enc.cond);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o2 = static_cast<uint8_t>(enc.o2);
inst.op = static_cast<uint8_t>(enc.op);
inst.iform = InstForm::CSEL_32_CONDSEL;
inst.iclass = InstName::CSEL;
return true;
}
static bool TryExtractCSEL_64_CONDSEL(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000000000110000000000
// --------------------------------
// 10011010100000000000000000000000
if ((bits & 0xffe00c00U) != 0x9a800000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t o2 : 1;
uint32_t _11 : 1; // 0
uint32_t cond : 4;
uint32_t Rm : 5;
uint32_t _21 : 1; // 0
uint32_t _22 : 1; // 0
uint32_t _23 : 1; // 1
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t op : 1;
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.sf = static_cast<uint8_t>(enc.sf);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.cond = static_cast<uint8_t>(enc.cond);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o2 = static_cast<uint8_t>(enc.o2);
inst.op = static_cast<uint8_t>(enc.op);
inst.iform = InstForm::CSEL_64_CONDSEL;
inst.iclass = InstName::CSEL;
return true;
}
static bool TryExtractFCVTAS_32H_FLOAT2INT(InstData &inst, uint32_t bits) {
// bits
// & 11111111111111111111110000000000
// --------------------------------
// 00011110111001000000000000000000
if ((bits & 0xfffffc00U) != 0x1ee40000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t _12 : 1; // 0
uint32_t _13 : 1; // 0
uint32_t _14 : 1; // 0
uint32_t _15 : 1; // 0
uint32_t opcode : 3;
uint32_t rmode : 2;
uint32_t _21 : 1; // 1
uint32_t type : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t _30 : 1; // 0
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.sf = static_cast<uint8_t>(enc.sf);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.type = static_cast<uint8_t>(enc.type);
inst.rmode = static_cast<uint8_t>(enc.rmode);
inst.iform = InstForm::FCVTAS_32H_FLOAT2INT;
inst.iclass = InstName::FCVTAS;
return true;
}
static bool TryExtractFCVTAS_64H_FLOAT2INT(InstData &inst, uint32_t bits) {
// bits
// & 11111111111111111111110000000000
// --------------------------------
// 10011110111001000000000000000000
if ((bits & 0xfffffc00U) != 0x9ee40000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t _12 : 1; // 0
uint32_t _13 : 1; // 0
uint32_t _14 : 1; // 0
uint32_t _15 : 1; // 0
uint32_t opcode : 3;
uint32_t rmode : 2;
uint32_t _21 : 1; // 1
uint32_t type : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t _30 : 1; // 0
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.sf = static_cast<uint8_t>(enc.sf);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.type = static_cast<uint8_t>(enc.type);
inst.rmode = static_cast<uint8_t>(enc.rmode);
inst.iform = InstForm::FCVTAS_64H_FLOAT2INT;
inst.iclass = InstName::FCVTAS;
return true;
}
static bool TryExtractFCVTAS_32S_FLOAT2INT(InstData &inst, uint32_t bits) {
// bits
// & 11111111111111111111110000000000
// --------------------------------
// 00011110001001000000000000000000
if ((bits & 0xfffffc00U) != 0x1e240000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t _12 : 1; // 0
uint32_t _13 : 1; // 0
uint32_t _14 : 1; // 0
uint32_t _15 : 1; // 0
uint32_t opcode : 3;
uint32_t rmode : 2;
uint32_t _21 : 1; // 1
uint32_t type : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t _30 : 1; // 0
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.sf = static_cast<uint8_t>(enc.sf);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.type = static_cast<uint8_t>(enc.type);
inst.rmode = static_cast<uint8_t>(enc.rmode);
inst.iform = InstForm::FCVTAS_32S_FLOAT2INT;
inst.iclass = InstName::FCVTAS;
return true;
}
static bool TryExtractFCVTAS_64S_FLOAT2INT(InstData &inst, uint32_t bits) {
// bits
// & 11111111111111111111110000000000
// --------------------------------
// 10011110001001000000000000000000
if ((bits & 0xfffffc00U) != 0x9e240000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t _12 : 1; // 0
uint32_t _13 : 1; // 0
uint32_t _14 : 1; // 0
uint32_t _15 : 1; // 0
uint32_t opcode : 3;
uint32_t rmode : 2;
uint32_t _21 : 1; // 1
uint32_t type : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t _30 : 1; // 0
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.sf = static_cast<uint8_t>(enc.sf);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.type = static_cast<uint8_t>(enc.type);
inst.rmode = static_cast<uint8_t>(enc.rmode);
inst.iform = InstForm::FCVTAS_64S_FLOAT2INT;
inst.iclass = InstName::FCVTAS;
return true;
}
static bool TryExtractFCVTAS_32D_FLOAT2INT(InstData &inst, uint32_t bits) {
// bits
// & 11111111111111111111110000000000
// --------------------------------
// 00011110011001000000000000000000
if ((bits & 0xfffffc00U) != 0x1e640000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t _12 : 1; // 0
uint32_t _13 : 1; // 0
uint32_t _14 : 1; // 0
uint32_t _15 : 1; // 0
uint32_t opcode : 3;
uint32_t rmode : 2;
uint32_t _21 : 1; // 1
uint32_t type : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t _30 : 1; // 0
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.sf = static_cast<uint8_t>(enc.sf);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.type = static_cast<uint8_t>(enc.type);
inst.rmode = static_cast<uint8_t>(enc.rmode);
inst.iform = InstForm::FCVTAS_32D_FLOAT2INT;
inst.iclass = InstName::FCVTAS;
return true;
}
static bool TryExtractFCVTAS_64D_FLOAT2INT(InstData &inst, uint32_t bits) {
// bits
// & 11111111111111111111110000000000
// --------------------------------
// 10011110011001000000000000000000
if ((bits & 0xfffffc00U) != 0x9e640000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t _12 : 1; // 0
uint32_t _13 : 1; // 0
uint32_t _14 : 1; // 0
uint32_t _15 : 1; // 0
uint32_t opcode : 3;
uint32_t rmode : 2;
uint32_t _21 : 1; // 1
uint32_t type : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t _30 : 1; // 0
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.sf = static_cast<uint8_t>(enc.sf);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.type = static_cast<uint8_t>(enc.type);
inst.rmode = static_cast<uint8_t>(enc.rmode);
inst.iform = InstForm::FCVTAS_64D_FLOAT2INT;
inst.iclass = InstName::FCVTAS;
return true;
}
static bool TryExtractLDURSH_32_LDST_UNSCALED(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000000000110000000000
// --------------------------------
// 01111000110000000000000000000000
if ((bits & 0xffe00c00U) != 0x78c00000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t imm9 : 9;
uint32_t _21 : 1; // 0
uint32_t opc : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.imm9.uimm = static_cast<uint64_t>(enc.imm9);
inst.V = static_cast<uint8_t>(enc.V);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LDURSH_32_LDST_UNSCALED;
inst.iclass = InstName::LDURSH;
return true;
}
static bool TryExtractLDURSH_64_LDST_UNSCALED(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000000000110000000000
// --------------------------------
// 01111000100000000000000000000000
if ((bits & 0xffe00c00U) != 0x78800000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t imm9 : 9;
uint32_t _21 : 1; // 0
uint32_t opc : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.imm9.uimm = static_cast<uint64_t>(enc.imm9);
inst.V = static_cast<uint8_t>(enc.V);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LDURSH_64_LDST_UNSCALED;
inst.iclass = InstName::LDURSH;
return true;
}
static bool TryExtractLDURSW_64_LDST_UNSCALED(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000000000110000000000
// --------------------------------
// 10111000100000000000000000000000
if ((bits & 0xffe00c00U) != 0xb8800000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t imm9 : 9;
uint32_t _21 : 1; // 0
uint32_t opc : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.imm9.uimm = static_cast<uint64_t>(enc.imm9);
inst.V = static_cast<uint8_t>(enc.V);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LDURSW_64_LDST_UNSCALED;
inst.iclass = InstName::LDURSW;
return true;
}
static bool TryExtractMOVN_32_MOVEWIDE(InstData &inst, uint32_t bits) {
if (false && TryExtractMOV_MOVN_32_MOVEWIDE(inst, bits))
return true;
// bits
// & 11111111100000000000000000000000
// --------------------------------
// 00010010100000000000000000000000
if ((bits & 0xff800000U) != 0x12800000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t imm16 : 16;
uint32_t hw : 2;
uint32_t _23 : 1; // 1
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 0
uint32_t _28 : 1; // 1
uint32_t opc : 2;
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.sf = static_cast<uint8_t>(enc.sf);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.hw = static_cast<uint8_t>(enc.hw);
inst.imm16.uimm = static_cast<uint64_t>(enc.imm16);
inst.iform = InstForm::MOVN_32_MOVEWIDE;
inst.iclass = InstName::MOVN;
return true;
}
static bool TryExtractMOVN_64_MOVEWIDE(InstData &inst, uint32_t bits) {
if (false && TryExtractMOV_MOVN_64_MOVEWIDE(inst, bits))
return true;
// bits
// & 11111111100000000000000000000000
// --------------------------------
// 10010010100000000000000000000000
if ((bits & 0xff800000U) != 0x92800000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t imm16 : 16;
uint32_t hw : 2;
uint32_t _23 : 1; // 1
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 0
uint32_t _28 : 1; // 1
uint32_t opc : 2;
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.sf = static_cast<uint8_t>(enc.sf);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.hw = static_cast<uint8_t>(enc.hw);
inst.imm16.uimm = static_cast<uint64_t>(enc.imm16);
inst.iform = InstForm::MOVN_64_MOVEWIDE;
inst.iclass = InstName::MOVN;
return true;
}
static bool TryExtractSXTL_SSHLL_ASIMDSHF_L(InstData &inst, uint32_t bits) {
// bits
// & 10111111100001111111110000000000
// --------------------------------
// 00001111000000001010010000000000
if ((bits & 0xbf87fc00U) != 0xf00a400U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t opcode : 5;
uint32_t immb : 3;
uint32_t immh : 4;
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.immh.uimm = static_cast<uint64_t>(enc.immh);
if (!(inst.immh.uimm != 0x0))
return false;
inst.immb.uimm = static_cast<uint64_t>(enc.immb);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.iform = InstForm::SXTL_SSHLL_ASIMDSHF_L;
inst.iclass = InstName::SSHLL;
return true;
}
static bool TryExtractST1_ASISDLSO_B1_1B(InstData &inst, uint32_t bits) {
// bits
// & 10111111111111111110000000000000
// --------------------------------
// 00001101000000000000000000000000
if ((bits & 0xbfffe000U) != 0xd000000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t size : 2;
uint32_t S : 1;
uint32_t opcode : 3;
uint32_t _16 : 1; // 0
uint32_t _17 : 1; // 0
uint32_t _18 : 1; // 0
uint32_t _19 : 1; // 0
uint32_t _20 : 1; // 0
uint32_t R : 1;
uint32_t L : 1;
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 0
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.L = static_cast<uint8_t>(enc.L);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.S = static_cast<uint8_t>(enc.S);
inst.R = static_cast<uint8_t>(enc.R);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::ST1_ASISDLSO_B1_1B;
inst.iclass = InstName::ST1;
return true;
}
static bool TryExtractST1_ASISDLSO_H1_1H(InstData &inst, uint32_t bits) {
// bits
// & 10111111111111111110010000000000
// --------------------------------
// 00001101000000000100000000000000
if ((bits & 0xbfffe400U) != 0xd004000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t size : 2;
uint32_t S : 1;
uint32_t opcode : 3;
uint32_t _16 : 1; // 0
uint32_t _17 : 1; // 0
uint32_t _18 : 1; // 0
uint32_t _19 : 1; // 0
uint32_t _20 : 1; // 0
uint32_t R : 1;
uint32_t L : 1;
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 0
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.L = static_cast<uint8_t>(enc.L);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.S = static_cast<uint8_t>(enc.S);
inst.R = static_cast<uint8_t>(enc.R);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::ST1_ASISDLSO_H1_1H;
inst.iclass = InstName::ST1;
return true;
}
static bool TryExtractST1_ASISDLSO_S1_1S(InstData &inst, uint32_t bits) {
// bits
// & 10111111111111111110110000000000
// --------------------------------
// 00001101000000001000000000000000
if ((bits & 0xbfffec00U) != 0xd008000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t size : 2;
uint32_t S : 1;
uint32_t opcode : 3;
uint32_t _16 : 1; // 0
uint32_t _17 : 1; // 0
uint32_t _18 : 1; // 0
uint32_t _19 : 1; // 0
uint32_t _20 : 1; // 0
uint32_t R : 1;
uint32_t L : 1;
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 0
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.L = static_cast<uint8_t>(enc.L);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.S = static_cast<uint8_t>(enc.S);
inst.R = static_cast<uint8_t>(enc.R);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::ST1_ASISDLSO_S1_1S;
inst.iclass = InstName::ST1;
return true;
}
static bool TryExtractST1_ASISDLSO_D1_1D(InstData &inst, uint32_t bits) {
// bits
// & 10111111111111111111110000000000
// --------------------------------
// 00001101000000001000010000000000
if ((bits & 0xbffffc00U) != 0xd008400U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t size : 2;
uint32_t S : 1;
uint32_t opcode : 3;
uint32_t _16 : 1; // 0
uint32_t _17 : 1; // 0
uint32_t _18 : 1; // 0
uint32_t _19 : 1; // 0
uint32_t _20 : 1; // 0
uint32_t R : 1;
uint32_t L : 1;
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 0
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.L = static_cast<uint8_t>(enc.L);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.S = static_cast<uint8_t>(enc.S);
inst.R = static_cast<uint8_t>(enc.R);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::ST1_ASISDLSO_D1_1D;
inst.iclass = InstName::ST1;
return true;
}
static bool TryExtractST1_ASISDLSOP_B1_I1B(InstData &inst, uint32_t bits) {
// bits
// & 10111111111111111110000000000000
// --------------------------------
// 00001101100111110000000000000000
if ((bits & 0xbfffe000U) != 0xd9f0000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t size : 2;
uint32_t S : 1;
uint32_t opcode : 3;
uint32_t Rm : 5;
uint32_t R : 1;
uint32_t L : 1;
uint32_t _23 : 1; // 1
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 0
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.L = static_cast<uint8_t>(enc.L);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.S = static_cast<uint8_t>(enc.S);
inst.R = static_cast<uint8_t>(enc.R);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::ST1_ASISDLSOP_B1_I1B;
inst.iclass = InstName::ST1;
return true;
}
static bool TryExtractST1_ASISDLSOP_BX1_R1B(InstData &inst, uint32_t bits) {
// bits
// & 10111111111000001110000000000000
// --------------------------------
// 00001101100000000000000000000000
if ((bits & 0xbfe0e000U) != 0xd800000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t size : 2;
uint32_t S : 1;
uint32_t opcode : 3;
uint32_t Rm : 5;
uint32_t R : 1;
uint32_t L : 1;
uint32_t _23 : 1; // 1
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 0
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.L = static_cast<uint8_t>(enc.L);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.S = static_cast<uint8_t>(enc.S);
inst.R = static_cast<uint8_t>(enc.R);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::ST1_ASISDLSOP_BX1_R1B;
inst.iclass = InstName::ST1;
return true;
}
static bool TryExtractST1_ASISDLSOP_H1_I1H(InstData &inst, uint32_t bits) {
// bits
// & 10111111111111111110010000000000
// --------------------------------
// 00001101100111110100000000000000
if ((bits & 0xbfffe400U) != 0xd9f4000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t size : 2;
uint32_t S : 1;
uint32_t opcode : 3;
uint32_t Rm : 5;
uint32_t R : 1;
uint32_t L : 1;
uint32_t _23 : 1; // 1
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 0
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.L = static_cast<uint8_t>(enc.L);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.S = static_cast<uint8_t>(enc.S);
inst.R = static_cast<uint8_t>(enc.R);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::ST1_ASISDLSOP_H1_I1H;
inst.iclass = InstName::ST1;
return true;
}
static bool TryExtractST1_ASISDLSOP_HX1_R1H(InstData &inst, uint32_t bits) {
// bits
// & 10111111111000001110010000000000
// --------------------------------
// 00001101100000000100000000000000
if ((bits & 0xbfe0e400U) != 0xd804000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t size : 2;
uint32_t S : 1;
uint32_t opcode : 3;
uint32_t Rm : 5;
uint32_t R : 1;
uint32_t L : 1;
uint32_t _23 : 1; // 1
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 0
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.L = static_cast<uint8_t>(enc.L);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.S = static_cast<uint8_t>(enc.S);
inst.R = static_cast<uint8_t>(enc.R);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::ST1_ASISDLSOP_HX1_R1H;
inst.iclass = InstName::ST1;
return true;
}
static bool TryExtractST1_ASISDLSOP_S1_I1S(InstData &inst, uint32_t bits) {
// bits
// & 10111111111111111110110000000000
// --------------------------------
// 00001101100111111000000000000000
if ((bits & 0xbfffec00U) != 0xd9f8000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t size : 2;
uint32_t S : 1;
uint32_t opcode : 3;
uint32_t Rm : 5;
uint32_t R : 1;
uint32_t L : 1;
uint32_t _23 : 1; // 1
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 0
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.L = static_cast<uint8_t>(enc.L);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.S = static_cast<uint8_t>(enc.S);
inst.R = static_cast<uint8_t>(enc.R);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::ST1_ASISDLSOP_S1_I1S;
inst.iclass = InstName::ST1;
return true;
}
static bool TryExtractST1_ASISDLSOP_SX1_R1S(InstData &inst, uint32_t bits) {
// bits
// & 10111111111000001110110000000000
// --------------------------------
// 00001101100000001000000000000000
if ((bits & 0xbfe0ec00U) != 0xd808000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t size : 2;
uint32_t S : 1;
uint32_t opcode : 3;
uint32_t Rm : 5;
uint32_t R : 1;
uint32_t L : 1;
uint32_t _23 : 1; // 1
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 0
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.L = static_cast<uint8_t>(enc.L);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.S = static_cast<uint8_t>(enc.S);
inst.R = static_cast<uint8_t>(enc.R);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::ST1_ASISDLSOP_SX1_R1S;
inst.iclass = InstName::ST1;
return true;
}
static bool TryExtractST1_ASISDLSOP_D1_I1D(InstData &inst, uint32_t bits) {
// bits
// & 10111111111111111111110000000000
// --------------------------------
// 00001101100111111000010000000000
if ((bits & 0xbffffc00U) != 0xd9f8400U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t size : 2;
uint32_t S : 1;
uint32_t opcode : 3;
uint32_t Rm : 5;
uint32_t R : 1;
uint32_t L : 1;
uint32_t _23 : 1; // 1
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 0
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.L = static_cast<uint8_t>(enc.L);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.S = static_cast<uint8_t>(enc.S);
inst.R = static_cast<uint8_t>(enc.R);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::ST1_ASISDLSOP_D1_I1D;
inst.iclass = InstName::ST1;
return true;
}
static bool TryExtractST1_ASISDLSOP_DX1_R1D(InstData &inst, uint32_t bits) {
// bits
// & 10111111111000001111110000000000
// --------------------------------
// 00001101100000001000010000000000
if ((bits & 0xbfe0fc00U) != 0xd808400U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t size : 2;
uint32_t S : 1;
uint32_t opcode : 3;
uint32_t Rm : 5;
uint32_t R : 1;
uint32_t L : 1;
uint32_t _23 : 1; // 1
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 0
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.L = static_cast<uint8_t>(enc.L);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.S = static_cast<uint8_t>(enc.S);
inst.R = static_cast<uint8_t>(enc.R);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::ST1_ASISDLSOP_DX1_R1D;
inst.iclass = InstName::ST1;
return true;
}
static bool TryExtractUZP1_ASIMDPERM_ONLY(InstData &inst, uint32_t bits) {
// bits
// & 10111111001000001111110000000000
// --------------------------------
// 00001110000000000001100000000000
if ((bits & 0xbf20fc00U) != 0xe001800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t _12 : 1; // 1
uint32_t _13 : 1; // 0
uint32_t op : 1;
uint32_t _15 : 1; // 0
uint32_t Rm : 5;
uint32_t _21 : 1; // 0
uint32_t size : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 0
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.op = static_cast<uint8_t>(enc.op);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::UZP1_ASIMDPERM_ONLY;
inst.iclass = InstName::UZP1;
return true;
}
static bool TryExtractSTUR_B_LDST_UNSCALED(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000000000110000000000
// --------------------------------
// 00111100000000000000000000000000
if ((bits & 0xffe00c00U) != 0x3c000000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t imm9 : 9;
uint32_t _21 : 1; // 0
uint32_t opc : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.imm9.uimm = static_cast<uint64_t>(enc.imm9);
inst.V = static_cast<uint8_t>(enc.V);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::STUR_B_LDST_UNSCALED;
inst.iclass = InstName::STUR;
return true;
}
static bool TryExtractSTUR_H_LDST_UNSCALED(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000000000110000000000
// --------------------------------
// 01111100000000000000000000000000
if ((bits & 0xffe00c00U) != 0x7c000000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t imm9 : 9;
uint32_t _21 : 1; // 0
uint32_t opc : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.imm9.uimm = static_cast<uint64_t>(enc.imm9);
inst.V = static_cast<uint8_t>(enc.V);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::STUR_H_LDST_UNSCALED;
inst.iclass = InstName::STUR;
return true;
}
static bool TryExtractSTUR_S_LDST_UNSCALED(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000000000110000000000
// --------------------------------
// 10111100000000000000000000000000
if ((bits & 0xffe00c00U) != 0xbc000000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t imm9 : 9;
uint32_t _21 : 1; // 0
uint32_t opc : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.imm9.uimm = static_cast<uint64_t>(enc.imm9);
inst.V = static_cast<uint8_t>(enc.V);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::STUR_S_LDST_UNSCALED;
inst.iclass = InstName::STUR;
return true;
}
static bool TryExtractSTUR_D_LDST_UNSCALED(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000000000110000000000
// --------------------------------
// 11111100000000000000000000000000
if ((bits & 0xffe00c00U) != 0xfc000000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t imm9 : 9;
uint32_t _21 : 1; // 0
uint32_t opc : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.imm9.uimm = static_cast<uint64_t>(enc.imm9);
inst.V = static_cast<uint8_t>(enc.V);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::STUR_D_LDST_UNSCALED;
inst.iclass = InstName::STUR;
return true;
}
static bool TryExtractSTUR_Q_LDST_UNSCALED(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000000000110000000000
// --------------------------------
// 00111100100000000000000000000000
if ((bits & 0xffe00c00U) != 0x3c800000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t imm9 : 9;
uint32_t _21 : 1; // 0
uint32_t opc : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.imm9.uimm = static_cast<uint64_t>(enc.imm9);
inst.V = static_cast<uint8_t>(enc.V);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::STUR_Q_LDST_UNSCALED;
inst.iclass = InstName::STUR;
return true;
}
static bool TryExtractMLA_ASIMDELEM_R(InstData &inst, uint32_t bits) {
// bits
// & 10111111000000001111010000000000
// --------------------------------
// 00101111000000000000000000000000
if ((bits & 0xbf00f400U) != 0x2f000000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t H : 1;
uint32_t _12 : 1; // 0
uint32_t _13 : 1; // 0
uint32_t o2 : 1;
uint32_t _15 : 1; // 0
uint32_t Rm : 4;
uint32_t M : 1;
uint32_t L : 1;
uint32_t size : 2;
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Q = static_cast<uint8_t>(enc.Q);
inst.H = static_cast<uint8_t>(enc.H);
inst.M = static_cast<uint8_t>(enc.M);
inst.L = static_cast<uint8_t>(enc.L);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o2 = static_cast<uint8_t>(enc.o2);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::MLA_ASIMDELEM_R;
inst.iclass = InstName::MLA;
return true;
}
static bool TryExtractFCVTPU_32H_FLOAT2INT(InstData &inst, uint32_t bits) {
// bits
// & 11111111111111111111110000000000
// --------------------------------
// 00011110111010010000000000000000
if ((bits & 0xfffffc00U) != 0x1ee90000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t _12 : 1; // 0
uint32_t _13 : 1; // 0
uint32_t _14 : 1; // 0
uint32_t _15 : 1; // 0
uint32_t opcode : 3;
uint32_t rmode : 2;
uint32_t _21 : 1; // 1
uint32_t type : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t _30 : 1; // 0
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.sf = static_cast<uint8_t>(enc.sf);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.type = static_cast<uint8_t>(enc.type);
inst.rmode = static_cast<uint8_t>(enc.rmode);
inst.iform = InstForm::FCVTPU_32H_FLOAT2INT;
inst.iclass = InstName::FCVTPU;
return true;
}
static bool TryExtractFCVTPU_64H_FLOAT2INT(InstData &inst, uint32_t bits) {
// bits
// & 11111111111111111111110000000000
// --------------------------------
// 10011110111010010000000000000000
if ((bits & 0xfffffc00U) != 0x9ee90000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t _12 : 1; // 0
uint32_t _13 : 1; // 0
uint32_t _14 : 1; // 0
uint32_t _15 : 1; // 0
uint32_t opcode : 3;
uint32_t rmode : 2;
uint32_t _21 : 1; // 1
uint32_t type : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t _30 : 1; // 0
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.sf = static_cast<uint8_t>(enc.sf);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.type = static_cast<uint8_t>(enc.type);
inst.rmode = static_cast<uint8_t>(enc.rmode);
inst.iform = InstForm::FCVTPU_64H_FLOAT2INT;
inst.iclass = InstName::FCVTPU;
return true;
}
static bool TryExtractFCVTPU_32S_FLOAT2INT(InstData &inst, uint32_t bits) {
// bits
// & 11111111111111111111110000000000
// --------------------------------
// 00011110001010010000000000000000
if ((bits & 0xfffffc00U) != 0x1e290000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t _12 : 1; // 0
uint32_t _13 : 1; // 0
uint32_t _14 : 1; // 0
uint32_t _15 : 1; // 0
uint32_t opcode : 3;
uint32_t rmode : 2;
uint32_t _21 : 1; // 1
uint32_t type : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t _30 : 1; // 0
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.sf = static_cast<uint8_t>(enc.sf);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.type = static_cast<uint8_t>(enc.type);
inst.rmode = static_cast<uint8_t>(enc.rmode);
inst.iform = InstForm::FCVTPU_32S_FLOAT2INT;
inst.iclass = InstName::FCVTPU;
return true;
}
static bool TryExtractFCVTPU_64S_FLOAT2INT(InstData &inst, uint32_t bits) {
// bits
// & 11111111111111111111110000000000
// --------------------------------
// 10011110001010010000000000000000
if ((bits & 0xfffffc00U) != 0x9e290000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t _12 : 1; // 0
uint32_t _13 : 1; // 0
uint32_t _14 : 1; // 0
uint32_t _15 : 1; // 0
uint32_t opcode : 3;
uint32_t rmode : 2;
uint32_t _21 : 1; // 1
uint32_t type : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t _30 : 1; // 0
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.sf = static_cast<uint8_t>(enc.sf);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.type = static_cast<uint8_t>(enc.type);
inst.rmode = static_cast<uint8_t>(enc.rmode);
inst.iform = InstForm::FCVTPU_64S_FLOAT2INT;
inst.iclass = InstName::FCVTPU;
return true;
}
static bool TryExtractFCVTPU_32D_FLOAT2INT(InstData &inst, uint32_t bits) {
// bits
// & 11111111111111111111110000000000
// --------------------------------
// 00011110011010010000000000000000
if ((bits & 0xfffffc00U) != 0x1e690000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t _12 : 1; // 0
uint32_t _13 : 1; // 0
uint32_t _14 : 1; // 0
uint32_t _15 : 1; // 0
uint32_t opcode : 3;
uint32_t rmode : 2;
uint32_t _21 : 1; // 1
uint32_t type : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t _30 : 1; // 0
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.sf = static_cast<uint8_t>(enc.sf);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.type = static_cast<uint8_t>(enc.type);
inst.rmode = static_cast<uint8_t>(enc.rmode);
inst.iform = InstForm::FCVTPU_32D_FLOAT2INT;
inst.iclass = InstName::FCVTPU;
return true;
}
static bool TryExtractFCVTPU_64D_FLOAT2INT(InstData &inst, uint32_t bits) {
// bits
// & 11111111111111111111110000000000
// --------------------------------
// 10011110011010010000000000000000
if ((bits & 0xfffffc00U) != 0x9e690000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t _12 : 1; // 0
uint32_t _13 : 1; // 0
uint32_t _14 : 1; // 0
uint32_t _15 : 1; // 0
uint32_t opcode : 3;
uint32_t rmode : 2;
uint32_t _21 : 1; // 1
uint32_t type : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t _30 : 1; // 0
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.sf = static_cast<uint8_t>(enc.sf);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.type = static_cast<uint8_t>(enc.type);
inst.rmode = static_cast<uint8_t>(enc.rmode);
inst.iform = InstForm::FCVTPU_64D_FLOAT2INT;
inst.iclass = InstName::FCVTPU;
return true;
}
static bool TryExtractSTSETH_32S_MEMOP(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000011111
// --------------------------------
// 01111000001000000011000000011111
if ((bits & 0xffe0fc1fU) != 0x7820301fU) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t opc : 3;
uint32_t o3 : 1;
uint32_t Rs : 5;
uint32_t _21 : 1; // 1
uint32_t R : 1;
uint32_t A : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.A = static_cast<uint8_t>(enc.A);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.V = static_cast<uint8_t>(enc.V);
inst.R = static_cast<uint8_t>(enc.R);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o3 = static_cast<uint8_t>(enc.o3);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::STSETH_32S_MEMOP;
inst.iclass = InstName::STSETH;
return true;
}
static bool TryExtractSTSETLH_32S_MEMOP(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000011111
// --------------------------------
// 01111000011000000011000000011111
if ((bits & 0xffe0fc1fU) != 0x7860301fU) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t opc : 3;
uint32_t o3 : 1;
uint32_t Rs : 5;
uint32_t _21 : 1; // 1
uint32_t R : 1;
uint32_t A : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.A = static_cast<uint8_t>(enc.A);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.V = static_cast<uint8_t>(enc.V);
inst.R = static_cast<uint8_t>(enc.R);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o3 = static_cast<uint8_t>(enc.o3);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::STSETLH_32S_MEMOP;
inst.iclass = InstName::STSETLH;
return true;
}
static bool TryExtractFMINV_ASIMDALL_ONLY_H(InstData &inst, uint32_t bits) {
// bits
// & 10111111111111111111110000000000
// --------------------------------
// 00001110101100001111100000000000
if ((bits & 0xbffffc00U) != 0xeb0f800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t opcode : 5;
uint32_t _17 : 1; // 0
uint32_t _18 : 1; // 0
uint32_t _19 : 1; // 0
uint32_t _20 : 1; // 1
uint32_t _21 : 1; // 1
uint32_t _22 : 1; // 0
uint32_t o1 : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.U = static_cast<uint8_t>(enc.U);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o1 = static_cast<uint8_t>(enc.o1);
inst.iform = InstForm::FMINV_ASIMDALL_ONLY_H;
inst.iclass = InstName::FMINV;
return true;
}
static bool TryExtractFMINV_ASIMDALL_ONLY_SD(InstData &inst, uint32_t bits) {
// bits
// & 10111111101111111111110000000000
// --------------------------------
// 00101110101100001111100000000000
if ((bits & 0xbfbffc00U) != 0x2eb0f800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t opcode : 5;
uint32_t _17 : 1; // 0
uint32_t _18 : 1; // 0
uint32_t _19 : 1; // 0
uint32_t _20 : 1; // 1
uint32_t _21 : 1; // 1
uint32_t sz : 1;
uint32_t o1 : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.sz = static_cast<uint8_t>(enc.sz);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o1 = static_cast<uint8_t>(enc.o1);
inst.iform = InstForm::FMINV_ASIMDALL_ONLY_SD;
inst.iclass = InstName::FMINV;
return true;
}
static bool TryExtractMOV_ORR_32_LOG_IMM(InstData &inst, uint32_t bits) {
// bits
// & 11111111110000000000001111100000
// --------------------------------
// 00110010000000000000001111100000
if ((bits & 0xffc003e0U) != 0x320003e0U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t imms : 6;
uint32_t immr : 6;
uint32_t N : 1;
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 0
uint32_t _28 : 1; // 1
uint32_t opc : 2;
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.sf = static_cast<uint8_t>(enc.sf);
inst.N = static_cast<uint8_t>(enc.N);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.immr.uimm = static_cast<uint64_t>(enc.immr);
inst.imms.uimm = static_cast<uint64_t>(enc.imms);
inst.iform = InstForm::MOV_ORR_32_LOG_IMM;
inst.iclass = InstName::ORR;
return true;
}
static bool TryExtractMOV_ORR_64_LOG_IMM(InstData &inst, uint32_t bits) {
// bits
// & 11111111100000000000001111100000
// --------------------------------
// 10110010000000000000001111100000
if ((bits & 0xff8003e0U) != 0xb20003e0U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t imms : 6;
uint32_t immr : 6;
uint32_t N : 1;
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 0
uint32_t _28 : 1; // 1
uint32_t opc : 2;
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.sf = static_cast<uint8_t>(enc.sf);
inst.N = static_cast<uint8_t>(enc.N);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.immr.uimm = static_cast<uint64_t>(enc.immr);
inst.imms.uimm = static_cast<uint64_t>(enc.imms);
inst.iform = InstForm::MOV_ORR_64_LOG_IMM;
inst.iclass = InstName::ORR;
return true;
}
static bool TryExtractDSB_BO_SYSTEM(InstData &inst, uint32_t bits) {
// bits
// & 11111111111111111111000011111111
// --------------------------------
// 11010101000000110011000010011111
if ((bits & 0xfffff0ffU) != 0xd503309fU) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t opc : 2;
uint32_t _7 : 1; // 1
uint32_t CRm : 4;
uint32_t CRn : 4;
uint32_t op1 : 3;
uint32_t op0 : 2;
uint32_t L : 1;
uint32_t _22 : 1; // 0
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 0
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 0
uint32_t _30 : 1; // 1
uint32_t _31 : 1; // 1
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.op0 = static_cast<uint8_t>(enc.op0);
inst.op1 = static_cast<uint8_t>(enc.op1);
inst.L = static_cast<uint8_t>(enc.L);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.CRn = static_cast<uint8_t>(enc.CRn);
inst.CRm = static_cast<uint8_t>(enc.CRm);
inst.iform = InstForm::DSB_BO_SYSTEM;
inst.iclass = InstName::DSB;
return true;
}
static bool TryExtractFCVTMS_32H_FLOAT2INT(InstData &inst, uint32_t bits) {
// bits
// & 11111111111111111111110000000000
// --------------------------------
// 00011110111100000000000000000000
if ((bits & 0xfffffc00U) != 0x1ef00000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t _12 : 1; // 0
uint32_t _13 : 1; // 0
uint32_t _14 : 1; // 0
uint32_t _15 : 1; // 0
uint32_t opcode : 3;
uint32_t rmode : 2;
uint32_t _21 : 1; // 1
uint32_t type : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t _30 : 1; // 0
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.sf = static_cast<uint8_t>(enc.sf);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.type = static_cast<uint8_t>(enc.type);
inst.rmode = static_cast<uint8_t>(enc.rmode);
inst.iform = InstForm::FCVTMS_32H_FLOAT2INT;
inst.iclass = InstName::FCVTMS;
return true;
}
static bool TryExtractFCVTMS_64H_FLOAT2INT(InstData &inst, uint32_t bits) {
// bits
// & 11111111111111111111110000000000
// --------------------------------
// 10011110111100000000000000000000
if ((bits & 0xfffffc00U) != 0x9ef00000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t _12 : 1; // 0
uint32_t _13 : 1; // 0
uint32_t _14 : 1; // 0
uint32_t _15 : 1; // 0
uint32_t opcode : 3;
uint32_t rmode : 2;
uint32_t _21 : 1; // 1
uint32_t type : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t _30 : 1; // 0
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.sf = static_cast<uint8_t>(enc.sf);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.type = static_cast<uint8_t>(enc.type);
inst.rmode = static_cast<uint8_t>(enc.rmode);
inst.iform = InstForm::FCVTMS_64H_FLOAT2INT;
inst.iclass = InstName::FCVTMS;
return true;
}
static bool TryExtractFCVTMS_32S_FLOAT2INT(InstData &inst, uint32_t bits) {
// bits
// & 11111111111111111111110000000000
// --------------------------------
// 00011110001100000000000000000000
if ((bits & 0xfffffc00U) != 0x1e300000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t _12 : 1; // 0
uint32_t _13 : 1; // 0
uint32_t _14 : 1; // 0
uint32_t _15 : 1; // 0
uint32_t opcode : 3;
uint32_t rmode : 2;
uint32_t _21 : 1; // 1
uint32_t type : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t _30 : 1; // 0
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.sf = static_cast<uint8_t>(enc.sf);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.type = static_cast<uint8_t>(enc.type);
inst.rmode = static_cast<uint8_t>(enc.rmode);
inst.iform = InstForm::FCVTMS_32S_FLOAT2INT;
inst.iclass = InstName::FCVTMS;
return true;
}
static bool TryExtractFCVTMS_64S_FLOAT2INT(InstData &inst, uint32_t bits) {
// bits
// & 11111111111111111111110000000000
// --------------------------------
// 10011110001100000000000000000000
if ((bits & 0xfffffc00U) != 0x9e300000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t _12 : 1; // 0
uint32_t _13 : 1; // 0
uint32_t _14 : 1; // 0
uint32_t _15 : 1; // 0
uint32_t opcode : 3;
uint32_t rmode : 2;
uint32_t _21 : 1; // 1
uint32_t type : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t _30 : 1; // 0
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.sf = static_cast<uint8_t>(enc.sf);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.type = static_cast<uint8_t>(enc.type);
inst.rmode = static_cast<uint8_t>(enc.rmode);
inst.iform = InstForm::FCVTMS_64S_FLOAT2INT;
inst.iclass = InstName::FCVTMS;
return true;
}
static bool TryExtractFCVTMS_32D_FLOAT2INT(InstData &inst, uint32_t bits) {
// bits
// & 11111111111111111111110000000000
// --------------------------------
// 00011110011100000000000000000000
if ((bits & 0xfffffc00U) != 0x1e700000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t _12 : 1; // 0
uint32_t _13 : 1; // 0
uint32_t _14 : 1; // 0
uint32_t _15 : 1; // 0
uint32_t opcode : 3;
uint32_t rmode : 2;
uint32_t _21 : 1; // 1
uint32_t type : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t _30 : 1; // 0
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.sf = static_cast<uint8_t>(enc.sf);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.type = static_cast<uint8_t>(enc.type);
inst.rmode = static_cast<uint8_t>(enc.rmode);
inst.iform = InstForm::FCVTMS_32D_FLOAT2INT;
inst.iclass = InstName::FCVTMS;
return true;
}
static bool TryExtractFCVTMS_64D_FLOAT2INT(InstData &inst, uint32_t bits) {
// bits
// & 11111111111111111111110000000000
// --------------------------------
// 10011110011100000000000000000000
if ((bits & 0xfffffc00U) != 0x9e700000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t _12 : 1; // 0
uint32_t _13 : 1; // 0
uint32_t _14 : 1; // 0
uint32_t _15 : 1; // 0
uint32_t opcode : 3;
uint32_t rmode : 2;
uint32_t _21 : 1; // 1
uint32_t type : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t _30 : 1; // 0
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.sf = static_cast<uint8_t>(enc.sf);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.type = static_cast<uint8_t>(enc.type);
inst.rmode = static_cast<uint8_t>(enc.rmode);
inst.iform = InstForm::FCVTMS_64D_FLOAT2INT;
inst.iclass = InstName::FCVTMS;
return true;
}
static bool TryExtractSTSMINH_32S_MEMOP(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000011111
// --------------------------------
// 01111000001000000101000000011111
if ((bits & 0xffe0fc1fU) != 0x7820501fU) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t opc : 3;
uint32_t o3 : 1;
uint32_t Rs : 5;
uint32_t _21 : 1; // 1
uint32_t R : 1;
uint32_t A : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.A = static_cast<uint8_t>(enc.A);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.V = static_cast<uint8_t>(enc.V);
inst.R = static_cast<uint8_t>(enc.R);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o3 = static_cast<uint8_t>(enc.o3);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::STSMINH_32S_MEMOP;
inst.iclass = InstName::STSMINH;
return true;
}
static bool TryExtractSTSMINLH_32S_MEMOP(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000011111
// --------------------------------
// 01111000011000000101000000011111
if ((bits & 0xffe0fc1fU) != 0x7860501fU) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t opc : 3;
uint32_t o3 : 1;
uint32_t Rs : 5;
uint32_t _21 : 1; // 1
uint32_t R : 1;
uint32_t A : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.A = static_cast<uint8_t>(enc.A);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.V = static_cast<uint8_t>(enc.V);
inst.R = static_cast<uint8_t>(enc.R);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o3 = static_cast<uint8_t>(enc.o3);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::STSMINLH_32S_MEMOP;
inst.iclass = InstName::STSMINLH;
return true;
}
static bool TryExtractST4_ASISDLSO_B4_4B(InstData &inst, uint32_t bits) {
// bits
// & 10111111111111111110000000000000
// --------------------------------
// 00001101001000000010000000000000
if ((bits & 0xbfffe000U) != 0xd202000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t size : 2;
uint32_t S : 1;
uint32_t opcode : 3;
uint32_t _16 : 1; // 0
uint32_t _17 : 1; // 0
uint32_t _18 : 1; // 0
uint32_t _19 : 1; // 0
uint32_t _20 : 1; // 0
uint32_t R : 1;
uint32_t L : 1;
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 0
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.L = static_cast<uint8_t>(enc.L);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.S = static_cast<uint8_t>(enc.S);
inst.R = static_cast<uint8_t>(enc.R);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::ST4_ASISDLSO_B4_4B;
inst.iclass = InstName::ST4;
return true;
}
static bool TryExtractST4_ASISDLSO_H4_4H(InstData &inst, uint32_t bits) {
// bits
// & 10111111111111111110010000000000
// --------------------------------
// 00001101001000000110000000000000
if ((bits & 0xbfffe400U) != 0xd206000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t size : 2;
uint32_t S : 1;
uint32_t opcode : 3;
uint32_t _16 : 1; // 0
uint32_t _17 : 1; // 0
uint32_t _18 : 1; // 0
uint32_t _19 : 1; // 0
uint32_t _20 : 1; // 0
uint32_t R : 1;
uint32_t L : 1;
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 0
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.L = static_cast<uint8_t>(enc.L);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.S = static_cast<uint8_t>(enc.S);
inst.R = static_cast<uint8_t>(enc.R);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::ST4_ASISDLSO_H4_4H;
inst.iclass = InstName::ST4;
return true;
}
static bool TryExtractST4_ASISDLSO_S4_4S(InstData &inst, uint32_t bits) {
// bits
// & 10111111111111111110110000000000
// --------------------------------
// 00001101001000001010000000000000
if ((bits & 0xbfffec00U) != 0xd20a000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t size : 2;
uint32_t S : 1;
uint32_t opcode : 3;
uint32_t _16 : 1; // 0
uint32_t _17 : 1; // 0
uint32_t _18 : 1; // 0
uint32_t _19 : 1; // 0
uint32_t _20 : 1; // 0
uint32_t R : 1;
uint32_t L : 1;
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 0
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.L = static_cast<uint8_t>(enc.L);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.S = static_cast<uint8_t>(enc.S);
inst.R = static_cast<uint8_t>(enc.R);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::ST4_ASISDLSO_S4_4S;
inst.iclass = InstName::ST4;
return true;
}
static bool TryExtractST4_ASISDLSO_D4_4D(InstData &inst, uint32_t bits) {
// bits
// & 10111111111111111111110000000000
// --------------------------------
// 00001101001000001010010000000000
if ((bits & 0xbffffc00U) != 0xd20a400U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t size : 2;
uint32_t S : 1;
uint32_t opcode : 3;
uint32_t _16 : 1; // 0
uint32_t _17 : 1; // 0
uint32_t _18 : 1; // 0
uint32_t _19 : 1; // 0
uint32_t _20 : 1; // 0
uint32_t R : 1;
uint32_t L : 1;
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 0
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.L = static_cast<uint8_t>(enc.L);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.S = static_cast<uint8_t>(enc.S);
inst.R = static_cast<uint8_t>(enc.R);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::ST4_ASISDLSO_D4_4D;
inst.iclass = InstName::ST4;
return true;
}
static bool TryExtractST4_ASISDLSOP_B4_I4B(InstData &inst, uint32_t bits) {
// bits
// & 10111111111111111110000000000000
// --------------------------------
// 00001101101111110010000000000000
if ((bits & 0xbfffe000U) != 0xdbf2000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t size : 2;
uint32_t S : 1;
uint32_t opcode : 3;
uint32_t Rm : 5;
uint32_t R : 1;
uint32_t L : 1;
uint32_t _23 : 1; // 1
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 0
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.L = static_cast<uint8_t>(enc.L);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.S = static_cast<uint8_t>(enc.S);
inst.R = static_cast<uint8_t>(enc.R);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::ST4_ASISDLSOP_B4_I4B;
inst.iclass = InstName::ST4;
return true;
}
static bool TryExtractST4_ASISDLSOP_BX4_R4B(InstData &inst, uint32_t bits) {
// bits
// & 10111111111000001110000000000000
// --------------------------------
// 00001101101000000010000000000000
if ((bits & 0xbfe0e000U) != 0xda02000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t size : 2;
uint32_t S : 1;
uint32_t opcode : 3;
uint32_t Rm : 5;
uint32_t R : 1;
uint32_t L : 1;
uint32_t _23 : 1; // 1
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 0
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.L = static_cast<uint8_t>(enc.L);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.S = static_cast<uint8_t>(enc.S);
inst.R = static_cast<uint8_t>(enc.R);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::ST4_ASISDLSOP_BX4_R4B;
inst.iclass = InstName::ST4;
return true;
}
static bool TryExtractST4_ASISDLSOP_H4_I4H(InstData &inst, uint32_t bits) {
// bits
// & 10111111111111111110010000000000
// --------------------------------
// 00001101101111110110000000000000
if ((bits & 0xbfffe400U) != 0xdbf6000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t size : 2;
uint32_t S : 1;
uint32_t opcode : 3;
uint32_t Rm : 5;
uint32_t R : 1;
uint32_t L : 1;
uint32_t _23 : 1; // 1
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 0
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.L = static_cast<uint8_t>(enc.L);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.S = static_cast<uint8_t>(enc.S);
inst.R = static_cast<uint8_t>(enc.R);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::ST4_ASISDLSOP_H4_I4H;
inst.iclass = InstName::ST4;
return true;
}
static bool TryExtractST4_ASISDLSOP_HX4_R4H(InstData &inst, uint32_t bits) {
// bits
// & 10111111111000001110010000000000
// --------------------------------
// 00001101101000000110000000000000
if ((bits & 0xbfe0e400U) != 0xda06000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t size : 2;
uint32_t S : 1;
uint32_t opcode : 3;
uint32_t Rm : 5;
uint32_t R : 1;
uint32_t L : 1;
uint32_t _23 : 1; // 1
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 0
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.L = static_cast<uint8_t>(enc.L);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.S = static_cast<uint8_t>(enc.S);
inst.R = static_cast<uint8_t>(enc.R);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::ST4_ASISDLSOP_HX4_R4H;
inst.iclass = InstName::ST4;
return true;
}
static bool TryExtractST4_ASISDLSOP_S4_I4S(InstData &inst, uint32_t bits) {
// bits
// & 10111111111111111110110000000000
// --------------------------------
// 00001101101111111010000000000000
if ((bits & 0xbfffec00U) != 0xdbfa000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t size : 2;
uint32_t S : 1;
uint32_t opcode : 3;
uint32_t Rm : 5;
uint32_t R : 1;
uint32_t L : 1;
uint32_t _23 : 1; // 1
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 0
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.L = static_cast<uint8_t>(enc.L);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.S = static_cast<uint8_t>(enc.S);
inst.R = static_cast<uint8_t>(enc.R);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::ST4_ASISDLSOP_S4_I4S;
inst.iclass = InstName::ST4;
return true;
}
static bool TryExtractST4_ASISDLSOP_SX4_R4S(InstData &inst, uint32_t bits) {
// bits
// & 10111111111000001110110000000000
// --------------------------------
// 00001101101000001010000000000000
if ((bits & 0xbfe0ec00U) != 0xda0a000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t size : 2;
uint32_t S : 1;
uint32_t opcode : 3;
uint32_t Rm : 5;
uint32_t R : 1;
uint32_t L : 1;
uint32_t _23 : 1; // 1
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 0
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.L = static_cast<uint8_t>(enc.L);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.S = static_cast<uint8_t>(enc.S);
inst.R = static_cast<uint8_t>(enc.R);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::ST4_ASISDLSOP_SX4_R4S;
inst.iclass = InstName::ST4;
return true;
}
static bool TryExtractST4_ASISDLSOP_D4_I4D(InstData &inst, uint32_t bits) {
// bits
// & 10111111111111111111110000000000
// --------------------------------
// 00001101101111111010010000000000
if ((bits & 0xbffffc00U) != 0xdbfa400U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t size : 2;
uint32_t S : 1;
uint32_t opcode : 3;
uint32_t Rm : 5;
uint32_t R : 1;
uint32_t L : 1;
uint32_t _23 : 1; // 1
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 0
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.L = static_cast<uint8_t>(enc.L);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.S = static_cast<uint8_t>(enc.S);
inst.R = static_cast<uint8_t>(enc.R);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::ST4_ASISDLSOP_D4_I4D;
inst.iclass = InstName::ST4;
return true;
}
static bool TryExtractST4_ASISDLSOP_DX4_R4D(InstData &inst, uint32_t bits) {
// bits
// & 10111111111000001111110000000000
// --------------------------------
// 00001101101000001010010000000000
if ((bits & 0xbfe0fc00U) != 0xda0a400U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t size : 2;
uint32_t S : 1;
uint32_t opcode : 3;
uint32_t Rm : 5;
uint32_t R : 1;
uint32_t L : 1;
uint32_t _23 : 1; // 1
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 0
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.L = static_cast<uint8_t>(enc.L);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.S = static_cast<uint8_t>(enc.S);
inst.R = static_cast<uint8_t>(enc.R);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::ST4_ASISDLSOP_DX4_R4D;
inst.iclass = InstName::ST4;
return true;
}
static bool TryExtractLDNP_S_LDSTNAPAIR_OFFS(InstData &inst, uint32_t bits) {
// bits
// & 11111111110000000000000000000000
// --------------------------------
// 00101100010000000000000000000000
if ((bits & 0xffc00000U) != 0x2c400000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t Rt2 : 5;
uint32_t imm7 : 7;
uint32_t L : 1;
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 1
uint32_t opc : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rt2 = static_cast<uint8_t>(enc.Rt2);
inst.L = static_cast<uint8_t>(enc.L);
inst.V = static_cast<uint8_t>(enc.V);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.imm7.uimm = static_cast<uint64_t>(enc.imm7);
inst.iform = InstForm::LDNP_S_LDSTNAPAIR_OFFS;
inst.iclass = InstName::LDNP;
return true;
}
static bool TryExtractLDNP_D_LDSTNAPAIR_OFFS(InstData &inst, uint32_t bits) {
// bits
// & 11111111110000000000000000000000
// --------------------------------
// 01101100010000000000000000000000
if ((bits & 0xffc00000U) != 0x6c400000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t Rt2 : 5;
uint32_t imm7 : 7;
uint32_t L : 1;
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 1
uint32_t opc : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rt2 = static_cast<uint8_t>(enc.Rt2);
inst.L = static_cast<uint8_t>(enc.L);
inst.V = static_cast<uint8_t>(enc.V);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.imm7.uimm = static_cast<uint64_t>(enc.imm7);
inst.iform = InstForm::LDNP_D_LDSTNAPAIR_OFFS;
inst.iclass = InstName::LDNP;
return true;
}
static bool TryExtractLDNP_Q_LDSTNAPAIR_OFFS(InstData &inst, uint32_t bits) {
// bits
// & 11111111110000000000000000000000
// --------------------------------
// 10101100010000000000000000000000
if ((bits & 0xffc00000U) != 0xac400000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t Rt2 : 5;
uint32_t imm7 : 7;
uint32_t L : 1;
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 1
uint32_t opc : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rt2 = static_cast<uint8_t>(enc.Rt2);
inst.L = static_cast<uint8_t>(enc.L);
inst.V = static_cast<uint8_t>(enc.V);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.imm7.uimm = static_cast<uint64_t>(enc.imm7);
inst.iform = InstForm::LDNP_Q_LDSTNAPAIR_OFFS;
inst.iclass = InstName::LDNP;
return true;
}
static bool TryExtractADDS_32S_ADDSUB_EXT(InstData &inst, uint32_t bits) {
if (false && TryExtractCMN_ADDS_32S_ADDSUB_EXT(inst, bits))
return true;
// bits
// & 11111111111000000000000000000000
// --------------------------------
// 00101011001000000000000000000000
if ((bits & 0xffe00000U) != 0x2b200000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t imm3 : 3;
uint32_t option : 3;
uint32_t Rm : 5;
uint32_t _21 : 1; // 1
uint32_t opt : 2;
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t S : 1;
uint32_t op : 1;
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.opt = static_cast<uint8_t>(enc.opt);
inst.option = static_cast<uint8_t>(enc.option);
inst.sf = static_cast<uint8_t>(enc.sf);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.imm3.uimm = static_cast<uint64_t>(enc.imm3);
inst.op = static_cast<uint8_t>(enc.op);
inst.iform = InstForm::ADDS_32S_ADDSUB_EXT;
inst.iclass = InstName::ADDS;
return true;
}
static bool TryExtractADDS_64S_ADDSUB_EXT(InstData &inst, uint32_t bits) {
if (false && TryExtractCMN_ADDS_64S_ADDSUB_EXT(inst, bits))
return true;
// bits
// & 11111111111000000000000000000000
// --------------------------------
// 10101011001000000000000000000000
if ((bits & 0xffe00000U) != 0xab200000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t imm3 : 3;
uint32_t option : 3;
uint32_t Rm : 5;
uint32_t _21 : 1; // 1
uint32_t opt : 2;
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t S : 1;
uint32_t op : 1;
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.opt = static_cast<uint8_t>(enc.opt);
inst.option = static_cast<uint8_t>(enc.option);
inst.sf = static_cast<uint8_t>(enc.sf);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.imm3.uimm = static_cast<uint64_t>(enc.imm3);
inst.op = static_cast<uint8_t>(enc.op);
inst.iform = InstForm::ADDS_64S_ADDSUB_EXT;
inst.iclass = InstName::ADDS;
return true;
}
static bool TryExtractCBZ_32_COMPBRANCH(InstData &inst, uint32_t bits) {
// bits
// & 11111111000000000000000000000000
// --------------------------------
// 00110100000000000000000000000000
if ((bits & 0xff000000U) != 0x34000000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t imm19 : 19;
uint32_t op : 1;
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 0
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t _30 : 1; // 0
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.imm19.uimm = static_cast<uint64_t>(enc.imm19);
inst.sf = static_cast<uint8_t>(enc.sf);
inst.op = static_cast<uint8_t>(enc.op);
inst.iform = InstForm::CBZ_32_COMPBRANCH;
inst.iclass = InstName::CBZ;
return true;
}
static bool TryExtractCBZ_64_COMPBRANCH(InstData &inst, uint32_t bits) {
// bits
// & 11111111000000000000000000000000
// --------------------------------
// 10110100000000000000000000000000
if ((bits & 0xff000000U) != 0xb4000000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t imm19 : 19;
uint32_t op : 1;
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 0
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t _30 : 1; // 0
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.imm19.uimm = static_cast<uint64_t>(enc.imm19);
inst.sf = static_cast<uint8_t>(enc.sf);
inst.op = static_cast<uint8_t>(enc.op);
inst.iform = InstForm::CBZ_64_COMPBRANCH;
inst.iclass = InstName::CBZ;
return true;
}
static bool TryExtractURSHL_ASISDSAME_ONLY(InstData &inst, uint32_t bits) {
// bits
// & 11111111001000001111110000000000
// --------------------------------
// 01111110001000000101010000000000
if ((bits & 0xff20fc00U) != 0x7e205400U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t S : 1;
uint32_t R : 1;
uint32_t _13 : 1; // 0
uint32_t _14 : 1; // 1
uint32_t _15 : 1; // 0
uint32_t Rm : 5;
uint32_t _21 : 1; // 1
uint32_t size : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t U : 1;
uint32_t _30 : 1; // 1
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.R = static_cast<uint8_t>(enc.R);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::URSHL_ASISDSAME_ONLY;
inst.iclass = InstName::URSHL;
return true;
}
static bool TryExtractURSHL_ASIMDSAME_ONLY(InstData &inst, uint32_t bits) {
// bits
// & 10111111001000001111110000000000
// --------------------------------
// 00101110001000000101010000000000
if ((bits & 0xbf20fc00U) != 0x2e205400U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t S : 1;
uint32_t R : 1;
uint32_t _13 : 1; // 0
uint32_t _14 : 1; // 1
uint32_t _15 : 1; // 0
uint32_t Rm : 5;
uint32_t _21 : 1; // 1
uint32_t size : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.R = static_cast<uint8_t>(enc.R);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::URSHL_ASIMDSAME_ONLY;
inst.iclass = InstName::URSHL;
return true;
}
static bool TryExtractSQRSHRUN_ASISDSHF_N(InstData &inst, uint32_t bits) {
// bits
// & 11111111100000001111110000000000
// --------------------------------
// 01111111000000001000110000000000
if ((bits & 0xff80fc00U) != 0x7f008c00U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t op : 1;
uint32_t _12 : 1; // 0
uint32_t _13 : 1; // 0
uint32_t _14 : 1; // 0
uint32_t _15 : 1; // 1
uint32_t immb : 3;
uint32_t immh : 4;
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t U : 1;
uint32_t _30 : 1; // 1
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.immh.uimm = static_cast<uint64_t>(enc.immh);
if (!(inst.immh.uimm != 0x0))
return false;
inst.immb.uimm = static_cast<uint64_t>(enc.immb);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.op = static_cast<uint8_t>(enc.op);
inst.iform = InstForm::SQRSHRUN_ASISDSHF_N;
inst.iclass = InstName::SQRSHRUN;
return true;
}
static bool TryExtractSQRSHRUN_ASIMDSHF_N(InstData &inst, uint32_t bits) {
// bits
// & 10111111100000001111110000000000
// --------------------------------
// 00101111000000001000110000000000
if ((bits & 0xbf80fc00U) != 0x2f008c00U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t op : 1;
uint32_t _12 : 1; // 0
uint32_t _13 : 1; // 0
uint32_t _14 : 1; // 0
uint32_t _15 : 1; // 1
uint32_t immb : 3;
uint32_t immh : 4;
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.immh.uimm = static_cast<uint64_t>(enc.immh);
if (!(inst.immh.uimm != 0x0))
return false;
inst.immb.uimm = static_cast<uint64_t>(enc.immb);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.op = static_cast<uint8_t>(enc.op);
inst.iform = InstForm::SQRSHRUN_ASIMDSHF_N;
inst.iclass = InstName::SQRSHRUN;
return true;
}
static bool TryExtractROR_EXTR_32_EXTRACT(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001000000000000000
// --------------------------------
// 00010011100000000000000000000000
if ((bits & 0xffe08000U) != 0x13800000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t imms : 6;
uint32_t Rm : 5;
uint32_t o0 : 1;
uint32_t N : 1;
uint32_t _23 : 1; // 1
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 0
uint32_t _28 : 1; // 1
uint32_t op21 : 2;
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.N = static_cast<uint8_t>(enc.N);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.op21 = static_cast<uint8_t>(enc.op21);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.sf = static_cast<uint8_t>(enc.sf);
inst.imms.uimm = static_cast<uint64_t>(enc.imms);
inst.o0 = static_cast<uint8_t>(enc.o0);
inst.iform = InstForm::ROR_EXTR_32_EXTRACT;
inst.iclass = InstName::EXTR;
return true;
}
static bool TryExtractROR_EXTR_64_EXTRACT(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000000000000000000000
// --------------------------------
// 10010011110000000000000000000000
if ((bits & 0xffe00000U) != 0x93c00000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t imms : 6;
uint32_t Rm : 5;
uint32_t o0 : 1;
uint32_t N : 1;
uint32_t _23 : 1; // 1
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 0
uint32_t _28 : 1; // 1
uint32_t op21 : 2;
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.N = static_cast<uint8_t>(enc.N);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.op21 = static_cast<uint8_t>(enc.op21);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.sf = static_cast<uint8_t>(enc.sf);
inst.imms.uimm = static_cast<uint64_t>(enc.imms);
inst.o0 = static_cast<uint8_t>(enc.o0);
inst.iform = InstForm::ROR_EXTR_64_EXTRACT;
inst.iclass = InstName::EXTR;
return true;
}
static bool TryExtractFRINTI_ASIMDMISCFP16_R(InstData &inst, uint32_t bits) {
// bits
// & 10111111111111111111110000000000
// --------------------------------
// 00101110111110011001100000000000
if ((bits & 0xbffffc00U) != 0x2ef99800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t o1 : 1;
uint32_t _13 : 1; // 0
uint32_t _14 : 1; // 0
uint32_t _15 : 1; // 1
uint32_t _16 : 1; // 1
uint32_t _17 : 1; // 0
uint32_t _18 : 1; // 0
uint32_t _19 : 1; // 1
uint32_t _20 : 1; // 1
uint32_t _21 : 1; // 1
uint32_t _22 : 1; // 1
uint32_t o2 : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o2 = static_cast<uint8_t>(enc.o2);
inst.o1 = static_cast<uint8_t>(enc.o1);
inst.iform = InstForm::FRINTI_ASIMDMISCFP16_R;
inst.iclass = InstName::FRINTI;
return true;
}
static bool TryExtractFRINTI_ASIMDMISC_R(InstData &inst, uint32_t bits) {
// bits
// & 10111111101111111111110000000000
// --------------------------------
// 00101110101000011001100000000000
if ((bits & 0xbfbffc00U) != 0x2ea19800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t o1 : 1;
uint32_t _13 : 1; // 0
uint32_t _14 : 1; // 0
uint32_t _15 : 1; // 1
uint32_t _16 : 1; // 1
uint32_t _17 : 1; // 0
uint32_t _18 : 1; // 0
uint32_t _19 : 1; // 0
uint32_t _20 : 1; // 0
uint32_t _21 : 1; // 1
uint32_t sz : 1;
uint32_t o2 : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.sz = static_cast<uint8_t>(enc.sz);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o2 = static_cast<uint8_t>(enc.o2);
inst.o1 = static_cast<uint8_t>(enc.o1);
inst.iform = InstForm::FRINTI_ASIMDMISC_R;
inst.iclass = InstName::FRINTI;
return true;
}
static bool TryExtractLDXRB_LR32_LDSTEXCL(InstData &inst, uint32_t bits) {
// bits
// & 11111111111111111111110000000000
// --------------------------------
// 00001000010111110111110000000000
if ((bits & 0xfffffc00U) != 0x85f7c00U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t Rt2 : 5;
uint32_t o0 : 1;
uint32_t Rs : 5;
uint32_t o1 : 1;
uint32_t L : 1;
uint32_t o2 : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 0
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.L = static_cast<uint8_t>(enc.L);
inst.Rt2 = static_cast<uint8_t>(enc.Rt2);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.o2 = static_cast<uint8_t>(enc.o2);
inst.o1 = static_cast<uint8_t>(enc.o1);
inst.o0 = static_cast<uint8_t>(enc.o0);
inst.iform = InstForm::LDXRB_LR32_LDSTEXCL;
inst.iclass = InstName::LDXRB;
return true;
}
static bool TryExtractSTP_S_LDSTPAIR_POST(InstData &inst, uint32_t bits) {
// bits
// & 11111111110000000000000000000000
// --------------------------------
// 00101100100000000000000000000000
if ((bits & 0xffc00000U) != 0x2c800000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t Rt2 : 5;
uint32_t imm7 : 7;
uint32_t L : 1;
uint32_t _23 : 1; // 1
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 1
uint32_t opc : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rt2 = static_cast<uint8_t>(enc.Rt2);
inst.L = static_cast<uint8_t>(enc.L);
inst.V = static_cast<uint8_t>(enc.V);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.imm7.uimm = static_cast<uint64_t>(enc.imm7);
inst.iform = InstForm::STP_S_LDSTPAIR_POST;
inst.iclass = InstName::STP;
return true;
}
static bool TryExtractSTP_D_LDSTPAIR_POST(InstData &inst, uint32_t bits) {
// bits
// & 11111111110000000000000000000000
// --------------------------------
// 01101100100000000000000000000000
if ((bits & 0xffc00000U) != 0x6c800000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t Rt2 : 5;
uint32_t imm7 : 7;
uint32_t L : 1;
uint32_t _23 : 1; // 1
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 1
uint32_t opc : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rt2 = static_cast<uint8_t>(enc.Rt2);
inst.L = static_cast<uint8_t>(enc.L);
inst.V = static_cast<uint8_t>(enc.V);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.imm7.uimm = static_cast<uint64_t>(enc.imm7);
inst.iform = InstForm::STP_D_LDSTPAIR_POST;
inst.iclass = InstName::STP;
return true;
}
static bool TryExtractSTP_Q_LDSTPAIR_POST(InstData &inst, uint32_t bits) {
// bits
// & 11111111110000000000000000000000
// --------------------------------
// 10101100100000000000000000000000
if ((bits & 0xffc00000U) != 0xac800000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t Rt2 : 5;
uint32_t imm7 : 7;
uint32_t L : 1;
uint32_t _23 : 1; // 1
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 1
uint32_t opc : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rt2 = static_cast<uint8_t>(enc.Rt2);
inst.L = static_cast<uint8_t>(enc.L);
inst.V = static_cast<uint8_t>(enc.V);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.imm7.uimm = static_cast<uint64_t>(enc.imm7);
inst.iform = InstForm::STP_Q_LDSTPAIR_POST;
inst.iclass = InstName::STP;
return true;
}
static bool TryExtractSTP_S_LDSTPAIR_PRE(InstData &inst, uint32_t bits) {
// bits
// & 11111111110000000000000000000000
// --------------------------------
// 00101101100000000000000000000000
if ((bits & 0xffc00000U) != 0x2d800000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t Rt2 : 5;
uint32_t imm7 : 7;
uint32_t L : 1;
uint32_t _23 : 1; // 1
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 1
uint32_t opc : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rt2 = static_cast<uint8_t>(enc.Rt2);
inst.L = static_cast<uint8_t>(enc.L);
inst.V = static_cast<uint8_t>(enc.V);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.imm7.uimm = static_cast<uint64_t>(enc.imm7);
inst.iform = InstForm::STP_S_LDSTPAIR_PRE;
inst.iclass = InstName::STP;
return true;
}
static bool TryExtractSTP_D_LDSTPAIR_PRE(InstData &inst, uint32_t bits) {
// bits
// & 11111111110000000000000000000000
// --------------------------------
// 01101101100000000000000000000000
if ((bits & 0xffc00000U) != 0x6d800000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t Rt2 : 5;
uint32_t imm7 : 7;
uint32_t L : 1;
uint32_t _23 : 1; // 1
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 1
uint32_t opc : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rt2 = static_cast<uint8_t>(enc.Rt2);
inst.L = static_cast<uint8_t>(enc.L);
inst.V = static_cast<uint8_t>(enc.V);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.imm7.uimm = static_cast<uint64_t>(enc.imm7);
inst.iform = InstForm::STP_D_LDSTPAIR_PRE;
inst.iclass = InstName::STP;
return true;
}
static bool TryExtractSTP_Q_LDSTPAIR_PRE(InstData &inst, uint32_t bits) {
// bits
// & 11111111110000000000000000000000
// --------------------------------
// 10101101100000000000000000000000
if ((bits & 0xffc00000U) != 0xad800000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t Rt2 : 5;
uint32_t imm7 : 7;
uint32_t L : 1;
uint32_t _23 : 1; // 1
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 1
uint32_t opc : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rt2 = static_cast<uint8_t>(enc.Rt2);
inst.L = static_cast<uint8_t>(enc.L);
inst.V = static_cast<uint8_t>(enc.V);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.imm7.uimm = static_cast<uint64_t>(enc.imm7);
inst.iform = InstForm::STP_Q_LDSTPAIR_PRE;
inst.iclass = InstName::STP;
return true;
}
static bool TryExtractSTP_S_LDSTPAIR_OFF(InstData &inst, uint32_t bits) {
// bits
// & 11111111110000000000000000000000
// --------------------------------
// 00101101000000000000000000000000
if ((bits & 0xffc00000U) != 0x2d000000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t Rt2 : 5;
uint32_t imm7 : 7;
uint32_t L : 1;
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 1
uint32_t opc : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rt2 = static_cast<uint8_t>(enc.Rt2);
inst.L = static_cast<uint8_t>(enc.L);
inst.V = static_cast<uint8_t>(enc.V);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.imm7.uimm = static_cast<uint64_t>(enc.imm7);
inst.iform = InstForm::STP_S_LDSTPAIR_OFF;
inst.iclass = InstName::STP;
return true;
}
static bool TryExtractSTP_D_LDSTPAIR_OFF(InstData &inst, uint32_t bits) {
// bits
// & 11111111110000000000000000000000
// --------------------------------
// 01101101000000000000000000000000
if ((bits & 0xffc00000U) != 0x6d000000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t Rt2 : 5;
uint32_t imm7 : 7;
uint32_t L : 1;
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 1
uint32_t opc : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rt2 = static_cast<uint8_t>(enc.Rt2);
inst.L = static_cast<uint8_t>(enc.L);
inst.V = static_cast<uint8_t>(enc.V);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.imm7.uimm = static_cast<uint64_t>(enc.imm7);
inst.iform = InstForm::STP_D_LDSTPAIR_OFF;
inst.iclass = InstName::STP;
return true;
}
static bool TryExtractSTP_Q_LDSTPAIR_OFF(InstData &inst, uint32_t bits) {
// bits
// & 11111111110000000000000000000000
// --------------------------------
// 10101101000000000000000000000000
if ((bits & 0xffc00000U) != 0xad000000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t Rt2 : 5;
uint32_t imm7 : 7;
uint32_t L : 1;
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 1
uint32_t opc : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rt2 = static_cast<uint8_t>(enc.Rt2);
inst.L = static_cast<uint8_t>(enc.L);
inst.V = static_cast<uint8_t>(enc.V);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.imm7.uimm = static_cast<uint64_t>(enc.imm7);
inst.iform = InstForm::STP_Q_LDSTPAIR_OFF;
inst.iclass = InstName::STP;
return true;
}
static bool TryExtractADR_ONLY_PCRELADDR(InstData &inst, uint32_t bits) {
// bits
// & 10011111000000000000000000000000
// --------------------------------
// 00010000000000000000000000000000
if ((bits & 0x9f000000U) != 0x10000000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t immhi : 19;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 0
uint32_t _28 : 1; // 1
uint32_t immlo : 2;
uint32_t op : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.immlo.uimm = static_cast<uint64_t>(enc.immlo);
inst.immhi.uimm = static_cast<uint64_t>(enc.immhi);
inst.op = static_cast<uint8_t>(enc.op);
inst.immhi_immlo.uimm = static_cast<uint64_t>(inst.immhi.uimm);
inst.immhi_immlo.uimm <<= static_cast<uint64_t>(2U);
inst.immhi_immlo.uimm |= static_cast<uint64_t>(inst.immlo.uimm);
inst.iform = InstForm::ADR_ONLY_PCRELADDR;
inst.iclass = InstName::ADR;
return true;
}
static bool TryExtractLDSMINAB_32_MEMOP(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 00111000101000000101000000000000
if ((bits & 0xffe0fc00U) != 0x38a05000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t opc : 3;
uint32_t o3 : 1;
uint32_t Rs : 5;
uint32_t _21 : 1; // 1
uint32_t R : 1;
uint32_t A : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.A = static_cast<uint8_t>(enc.A);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.V = static_cast<uint8_t>(enc.V);
inst.R = static_cast<uint8_t>(enc.R);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o3 = static_cast<uint8_t>(enc.o3);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LDSMINAB_32_MEMOP;
inst.iclass = InstName::LDSMINAB;
return true;
}
static bool TryExtractLDSMINALB_32_MEMOP(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 00111000111000000101000000000000
if ((bits & 0xffe0fc00U) != 0x38e05000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t opc : 3;
uint32_t o3 : 1;
uint32_t Rs : 5;
uint32_t _21 : 1; // 1
uint32_t R : 1;
uint32_t A : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.A = static_cast<uint8_t>(enc.A);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.V = static_cast<uint8_t>(enc.V);
inst.R = static_cast<uint8_t>(enc.R);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o3 = static_cast<uint8_t>(enc.o3);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LDSMINALB_32_MEMOP;
inst.iclass = InstName::LDSMINALB;
return true;
}
static bool TryExtractLDSMINB_32_MEMOP(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 00111000001000000101000000000000
if ((bits & 0xffe0fc00U) != 0x38205000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t opc : 3;
uint32_t o3 : 1;
uint32_t Rs : 5;
uint32_t _21 : 1; // 1
uint32_t R : 1;
uint32_t A : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.A = static_cast<uint8_t>(enc.A);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.V = static_cast<uint8_t>(enc.V);
inst.R = static_cast<uint8_t>(enc.R);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o3 = static_cast<uint8_t>(enc.o3);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LDSMINB_32_MEMOP;
inst.iclass = InstName::LDSMINB;
return true;
}
static bool TryExtractLDSMINLB_32_MEMOP(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 00111000011000000101000000000000
if ((bits & 0xffe0fc00U) != 0x38605000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t opc : 3;
uint32_t o3 : 1;
uint32_t Rs : 5;
uint32_t _21 : 1; // 1
uint32_t R : 1;
uint32_t A : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.A = static_cast<uint8_t>(enc.A);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.V = static_cast<uint8_t>(enc.V);
inst.R = static_cast<uint8_t>(enc.R);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o3 = static_cast<uint8_t>(enc.o3);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LDSMINLB_32_MEMOP;
inst.iclass = InstName::LDSMINLB;
return true;
}
static bool TryExtractUBFIZ_UBFM_32M_BITFIELD(InstData &inst, uint32_t bits) {
// bits
// & 11111111110000000000000000000000
// --------------------------------
// 01010011000000000000000000000000
if ((bits & 0xffc00000U) != 0x53000000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t imms : 6;
uint32_t immr : 6;
uint32_t N : 1;
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 0
uint32_t _28 : 1; // 1
uint32_t opc : 2;
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.sf = static_cast<uint8_t>(enc.sf);
inst.N = static_cast<uint8_t>(enc.N);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.immr.uimm = static_cast<uint64_t>(enc.immr);
inst.imms.uimm = static_cast<uint64_t>(enc.imms);
inst.iform = InstForm::UBFIZ_UBFM_32M_BITFIELD;
inst.iclass = InstName::UBFM;
return true;
}
static bool TryExtractUBFIZ_UBFM_64M_BITFIELD(InstData &inst, uint32_t bits) {
// bits
// & 11111111110000000000000000000000
// --------------------------------
// 11010011010000000000000000000000
if ((bits & 0xffc00000U) != 0xd3400000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t imms : 6;
uint32_t immr : 6;
uint32_t N : 1;
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 0
uint32_t _28 : 1; // 1
uint32_t opc : 2;
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.sf = static_cast<uint8_t>(enc.sf);
inst.N = static_cast<uint8_t>(enc.N);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.immr.uimm = static_cast<uint64_t>(enc.immr);
inst.imms.uimm = static_cast<uint64_t>(enc.imms);
inst.iform = InstForm::UBFIZ_UBFM_64M_BITFIELD;
inst.iclass = InstName::UBFM;
return true;
}
static bool TryExtractLD4_ASISDLSO_B4_4B(InstData &inst, uint32_t bits) {
// bits
// & 10111111111111111110000000000000
// --------------------------------
// 00001101011000000010000000000000
if ((bits & 0xbfffe000U) != 0xd602000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t size : 2;
uint32_t S : 1;
uint32_t opcode : 3;
uint32_t _16 : 1; // 0
uint32_t _17 : 1; // 0
uint32_t _18 : 1; // 0
uint32_t _19 : 1; // 0
uint32_t _20 : 1; // 0
uint32_t R : 1;
uint32_t L : 1;
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 0
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.L = static_cast<uint8_t>(enc.L);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.S = static_cast<uint8_t>(enc.S);
inst.R = static_cast<uint8_t>(enc.R);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LD4_ASISDLSO_B4_4B;
inst.iclass = InstName::LD4;
return true;
}
static bool TryExtractLD4_ASISDLSO_H4_4H(InstData &inst, uint32_t bits) {
// bits
// & 10111111111111111110010000000000
// --------------------------------
// 00001101011000000110000000000000
if ((bits & 0xbfffe400U) != 0xd606000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t size : 2;
uint32_t S : 1;
uint32_t opcode : 3;
uint32_t _16 : 1; // 0
uint32_t _17 : 1; // 0
uint32_t _18 : 1; // 0
uint32_t _19 : 1; // 0
uint32_t _20 : 1; // 0
uint32_t R : 1;
uint32_t L : 1;
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 0
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.L = static_cast<uint8_t>(enc.L);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.S = static_cast<uint8_t>(enc.S);
inst.R = static_cast<uint8_t>(enc.R);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LD4_ASISDLSO_H4_4H;
inst.iclass = InstName::LD4;
return true;
}
static bool TryExtractLD4_ASISDLSO_S4_4S(InstData &inst, uint32_t bits) {
// bits
// & 10111111111111111110110000000000
// --------------------------------
// 00001101011000001010000000000000
if ((bits & 0xbfffec00U) != 0xd60a000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t size : 2;
uint32_t S : 1;
uint32_t opcode : 3;
uint32_t _16 : 1; // 0
uint32_t _17 : 1; // 0
uint32_t _18 : 1; // 0
uint32_t _19 : 1; // 0
uint32_t _20 : 1; // 0
uint32_t R : 1;
uint32_t L : 1;
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 0
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.L = static_cast<uint8_t>(enc.L);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.S = static_cast<uint8_t>(enc.S);
inst.R = static_cast<uint8_t>(enc.R);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LD4_ASISDLSO_S4_4S;
inst.iclass = InstName::LD4;
return true;
}
static bool TryExtractLD4_ASISDLSO_D4_4D(InstData &inst, uint32_t bits) {
// bits
// & 10111111111111111111110000000000
// --------------------------------
// 00001101011000001010010000000000
if ((bits & 0xbffffc00U) != 0xd60a400U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t size : 2;
uint32_t S : 1;
uint32_t opcode : 3;
uint32_t _16 : 1; // 0
uint32_t _17 : 1; // 0
uint32_t _18 : 1; // 0
uint32_t _19 : 1; // 0
uint32_t _20 : 1; // 0
uint32_t R : 1;
uint32_t L : 1;
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 0
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.L = static_cast<uint8_t>(enc.L);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.S = static_cast<uint8_t>(enc.S);
inst.R = static_cast<uint8_t>(enc.R);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LD4_ASISDLSO_D4_4D;
inst.iclass = InstName::LD4;
return true;
}
static bool TryExtractLD4_ASISDLSOP_B4_I4B(InstData &inst, uint32_t bits) {
// bits
// & 10111111111111111110000000000000
// --------------------------------
// 00001101111111110010000000000000
if ((bits & 0xbfffe000U) != 0xdff2000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t size : 2;
uint32_t S : 1;
uint32_t opcode : 3;
uint32_t Rm : 5;
uint32_t R : 1;
uint32_t L : 1;
uint32_t _23 : 1; // 1
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 0
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.L = static_cast<uint8_t>(enc.L);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.S = static_cast<uint8_t>(enc.S);
inst.R = static_cast<uint8_t>(enc.R);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LD4_ASISDLSOP_B4_I4B;
inst.iclass = InstName::LD4;
return true;
}
static bool TryExtractLD4_ASISDLSOP_BX4_R4B(InstData &inst, uint32_t bits) {
// bits
// & 10111111111000001110000000000000
// --------------------------------
// 00001101111000000010000000000000
if ((bits & 0xbfe0e000U) != 0xde02000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t size : 2;
uint32_t S : 1;
uint32_t opcode : 3;
uint32_t Rm : 5;
uint32_t R : 1;
uint32_t L : 1;
uint32_t _23 : 1; // 1
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 0
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.L = static_cast<uint8_t>(enc.L);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.S = static_cast<uint8_t>(enc.S);
inst.R = static_cast<uint8_t>(enc.R);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LD4_ASISDLSOP_BX4_R4B;
inst.iclass = InstName::LD4;
return true;
}
static bool TryExtractLD4_ASISDLSOP_H4_I4H(InstData &inst, uint32_t bits) {
// bits
// & 10111111111111111110010000000000
// --------------------------------
// 00001101111111110110000000000000
if ((bits & 0xbfffe400U) != 0xdff6000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t size : 2;
uint32_t S : 1;
uint32_t opcode : 3;
uint32_t Rm : 5;
uint32_t R : 1;
uint32_t L : 1;
uint32_t _23 : 1; // 1
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 0
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.L = static_cast<uint8_t>(enc.L);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.S = static_cast<uint8_t>(enc.S);
inst.R = static_cast<uint8_t>(enc.R);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LD4_ASISDLSOP_H4_I4H;
inst.iclass = InstName::LD4;
return true;
}
static bool TryExtractLD4_ASISDLSOP_HX4_R4H(InstData &inst, uint32_t bits) {
// bits
// & 10111111111000001110010000000000
// --------------------------------
// 00001101111000000110000000000000
if ((bits & 0xbfe0e400U) != 0xde06000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t size : 2;
uint32_t S : 1;
uint32_t opcode : 3;
uint32_t Rm : 5;
uint32_t R : 1;
uint32_t L : 1;
uint32_t _23 : 1; // 1
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 0
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.L = static_cast<uint8_t>(enc.L);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.S = static_cast<uint8_t>(enc.S);
inst.R = static_cast<uint8_t>(enc.R);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LD4_ASISDLSOP_HX4_R4H;
inst.iclass = InstName::LD4;
return true;
}
static bool TryExtractLD4_ASISDLSOP_S4_I4S(InstData &inst, uint32_t bits) {
// bits
// & 10111111111111111110110000000000
// --------------------------------
// 00001101111111111010000000000000
if ((bits & 0xbfffec00U) != 0xdffa000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t size : 2;
uint32_t S : 1;
uint32_t opcode : 3;
uint32_t Rm : 5;
uint32_t R : 1;
uint32_t L : 1;
uint32_t _23 : 1; // 1
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 0
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.L = static_cast<uint8_t>(enc.L);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.S = static_cast<uint8_t>(enc.S);
inst.R = static_cast<uint8_t>(enc.R);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LD4_ASISDLSOP_S4_I4S;
inst.iclass = InstName::LD4;
return true;
}
static bool TryExtractLD4_ASISDLSOP_SX4_R4S(InstData &inst, uint32_t bits) {
// bits
// & 10111111111000001110110000000000
// --------------------------------
// 00001101111000001010000000000000
if ((bits & 0xbfe0ec00U) != 0xde0a000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t size : 2;
uint32_t S : 1;
uint32_t opcode : 3;
uint32_t Rm : 5;
uint32_t R : 1;
uint32_t L : 1;
uint32_t _23 : 1; // 1
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 0
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.L = static_cast<uint8_t>(enc.L);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.S = static_cast<uint8_t>(enc.S);
inst.R = static_cast<uint8_t>(enc.R);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LD4_ASISDLSOP_SX4_R4S;
inst.iclass = InstName::LD4;
return true;
}
static bool TryExtractLD4_ASISDLSOP_D4_I4D(InstData &inst, uint32_t bits) {
// bits
// & 10111111111111111111110000000000
// --------------------------------
// 00001101111111111010010000000000
if ((bits & 0xbffffc00U) != 0xdffa400U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t size : 2;
uint32_t S : 1;
uint32_t opcode : 3;
uint32_t Rm : 5;
uint32_t R : 1;
uint32_t L : 1;
uint32_t _23 : 1; // 1
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 0
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.L = static_cast<uint8_t>(enc.L);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.S = static_cast<uint8_t>(enc.S);
inst.R = static_cast<uint8_t>(enc.R);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LD4_ASISDLSOP_D4_I4D;
inst.iclass = InstName::LD4;
return true;
}
static bool TryExtractLD4_ASISDLSOP_DX4_R4D(InstData &inst, uint32_t bits) {
// bits
// & 10111111111000001111110000000000
// --------------------------------
// 00001101111000001010010000000000
if ((bits & 0xbfe0fc00U) != 0xde0a400U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t size : 2;
uint32_t S : 1;
uint32_t opcode : 3;
uint32_t Rm : 5;
uint32_t R : 1;
uint32_t L : 1;
uint32_t _23 : 1; // 1
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 0
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.L = static_cast<uint8_t>(enc.L);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.S = static_cast<uint8_t>(enc.S);
inst.R = static_cast<uint8_t>(enc.R);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LD4_ASISDLSOP_DX4_R4D;
inst.iclass = InstName::LD4;
return true;
}
static bool TryExtractSTRB_32B_LDST_REGOFF(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000000000110000000000
// --------------------------------
// 00111000001000000000100000000000
if ((bits & 0xffe00c00U) != 0x38200800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t S : 1;
uint32_t option : 3;
uint32_t Rm : 5;
uint32_t _21 : 1; // 1
uint32_t opc : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.option = static_cast<uint8_t>(enc.option);
inst.V = static_cast<uint8_t>(enc.V);
inst.S = static_cast<uint8_t>(enc.S);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::STRB_32B_LDST_REGOFF;
inst.iclass = InstName::STRB;
return true;
}
static bool TryExtractSTRB_32BL_LDST_REGOFF(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001110110000000000
// --------------------------------
// 00111000001000000110100000000000
if ((bits & 0xffe0ec00U) != 0x38206800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t S : 1;
uint32_t option : 3;
uint32_t Rm : 5;
uint32_t _21 : 1; // 1
uint32_t opc : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.option = static_cast<uint8_t>(enc.option);
inst.V = static_cast<uint8_t>(enc.V);
inst.S = static_cast<uint8_t>(enc.S);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::STRB_32BL_LDST_REGOFF;
inst.iclass = InstName::STRB;
return true;
}
static bool TryExtractUMAX_ASIMDSAME_ONLY(InstData &inst, uint32_t bits) {
// bits
// & 10111111001000001111110000000000
// --------------------------------
// 00101110001000000110010000000000
if ((bits & 0xbf20fc00U) != 0x2e206400U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t o1 : 1;
uint32_t _12 : 1; // 0
uint32_t _13 : 1; // 1
uint32_t _14 : 1; // 1
uint32_t _15 : 1; // 0
uint32_t Rm : 5;
uint32_t _21 : 1; // 1
uint32_t size : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o1 = static_cast<uint8_t>(enc.o1);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::UMAX_ASIMDSAME_ONLY;
inst.iclass = InstName::UMAX;
return true;
}
static bool TryExtractCRC32B_32C_DP_2SRC(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 00011010110000000100000000000000
if ((bits & 0xffe0fc00U) != 0x1ac04000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t sz : 2;
uint32_t C : 1;
uint32_t opcode2 : 3;
uint32_t Rm : 5;
uint32_t _21 : 1; // 0
uint32_t _22 : 1; // 1
uint32_t _23 : 1; // 1
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t op : 1;
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.sz = static_cast<uint8_t>(enc.sz);
inst.C = static_cast<uint8_t>(enc.C);
inst.opcode2 = static_cast<uint8_t>(enc.opcode2);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.sf = static_cast<uint8_t>(enc.sf);
inst.op = static_cast<uint8_t>(enc.op);
inst.iform = InstForm::CRC32B_32C_DP_2SRC;
inst.iclass = InstName::CRC32B;
return true;
}
static bool TryExtractCRC32H_32C_DP_2SRC(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 00011010110000000100010000000000
if ((bits & 0xffe0fc00U) != 0x1ac04400U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t sz : 2;
uint32_t C : 1;
uint32_t opcode2 : 3;
uint32_t Rm : 5;
uint32_t _21 : 1; // 0
uint32_t _22 : 1; // 1
uint32_t _23 : 1; // 1
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t op : 1;
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.sz = static_cast<uint8_t>(enc.sz);
inst.C = static_cast<uint8_t>(enc.C);
inst.opcode2 = static_cast<uint8_t>(enc.opcode2);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.sf = static_cast<uint8_t>(enc.sf);
inst.op = static_cast<uint8_t>(enc.op);
inst.iform = InstForm::CRC32H_32C_DP_2SRC;
inst.iclass = InstName::CRC32H;
return true;
}
static bool TryExtractCRC32W_32C_DP_2SRC(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 00011010110000000100100000000000
if ((bits & 0xffe0fc00U) != 0x1ac04800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t sz : 2;
uint32_t C : 1;
uint32_t opcode2 : 3;
uint32_t Rm : 5;
uint32_t _21 : 1; // 0
uint32_t _22 : 1; // 1
uint32_t _23 : 1; // 1
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t op : 1;
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.sz = static_cast<uint8_t>(enc.sz);
inst.C = static_cast<uint8_t>(enc.C);
inst.opcode2 = static_cast<uint8_t>(enc.opcode2);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.sf = static_cast<uint8_t>(enc.sf);
inst.op = static_cast<uint8_t>(enc.op);
inst.iform = InstForm::CRC32W_32C_DP_2SRC;
inst.iclass = InstName::CRC32W;
return true;
}
static bool TryExtractCRC32X_64C_DP_2SRC(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 10011010110000000100110000000000
if ((bits & 0xffe0fc00U) != 0x9ac04c00U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t sz : 2;
uint32_t C : 1;
uint32_t opcode2 : 3;
uint32_t Rm : 5;
uint32_t _21 : 1; // 0
uint32_t _22 : 1; // 1
uint32_t _23 : 1; // 1
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t op : 1;
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.sz = static_cast<uint8_t>(enc.sz);
inst.C = static_cast<uint8_t>(enc.C);
inst.opcode2 = static_cast<uint8_t>(enc.opcode2);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.sf = static_cast<uint8_t>(enc.sf);
inst.op = static_cast<uint8_t>(enc.op);
inst.iform = InstForm::CRC32X_64C_DP_2SRC;
inst.iclass = InstName::CRC32X;
return true;
}
static bool TryExtractURSHR_ASISDSHF_R(InstData &inst, uint32_t bits) {
// bits
// & 11111111100000001111110000000000
// --------------------------------
// 01111111000000000010010000000000
if ((bits & 0xff80fc00U) != 0x7f002400U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t _11 : 1; // 0
uint32_t o0 : 1;
uint32_t o1 : 1;
uint32_t _14 : 1; // 0
uint32_t _15 : 1; // 0
uint32_t immb : 3;
uint32_t immh : 4;
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t U : 1;
uint32_t _30 : 1; // 1
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.immh.uimm = static_cast<uint64_t>(enc.immh);
if (!(inst.immh.uimm != 0x0))
return false;
inst.immb.uimm = static_cast<uint64_t>(enc.immb);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o1 = static_cast<uint8_t>(enc.o1);
inst.o0 = static_cast<uint8_t>(enc.o0);
inst.iform = InstForm::URSHR_ASISDSHF_R;
inst.iclass = InstName::URSHR;
return true;
}
static bool TryExtractURSHR_ASIMDSHF_R(InstData &inst, uint32_t bits) {
// bits
// & 10111111100000001111110000000000
// --------------------------------
// 00101111000000000010010000000000
if ((bits & 0xbf80fc00U) != 0x2f002400U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t _11 : 1; // 0
uint32_t o0 : 1;
uint32_t o1 : 1;
uint32_t _14 : 1; // 0
uint32_t _15 : 1; // 0
uint32_t immb : 3;
uint32_t immh : 4;
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.immh.uimm = static_cast<uint64_t>(enc.immh);
if (!(inst.immh.uimm != 0x0))
return false;
inst.immb.uimm = static_cast<uint64_t>(enc.immb);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o1 = static_cast<uint8_t>(enc.o1);
inst.o0 = static_cast<uint8_t>(enc.o0);
inst.iform = InstForm::URSHR_ASIMDSHF_R;
inst.iclass = InstName::URSHR;
return true;
}
static bool TryExtractPRFM_P_LDST_POS(InstData &inst, uint32_t bits) {
// bits
// & 11111111110000000000000000000000
// --------------------------------
// 11111001100000000000000000000000
if ((bits & 0xffc00000U) != 0xf9800000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t imm12 : 12;
uint32_t opc : 2;
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.imm12.uimm = static_cast<uint64_t>(enc.imm12);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.V = static_cast<uint8_t>(enc.V);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::PRFM_P_LDST_POS;
inst.iclass = InstName::PRFM;
return true;
}
static bool TryExtractSUBS_32S_ADDSUB_IMM(InstData &inst, uint32_t bits) {
if (false && TryExtractCMP_SUBS_32S_ADDSUB_IMM(inst, bits))
return true;
// bits
// & 11111111000000000000000000000000
// --------------------------------
// 01110001000000000000000000000000
if ((bits & 0xff000000U) != 0x71000000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t imm12 : 12;
uint32_t shift : 2;
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 0
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t op : 1;
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.imm12.uimm = static_cast<uint64_t>(enc.imm12);
inst.shift = static_cast<uint8_t>(enc.shift);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.sf = static_cast<uint8_t>(enc.sf);
inst.op = static_cast<uint8_t>(enc.op);
inst.iform = InstForm::SUBS_32S_ADDSUB_IMM;
inst.iclass = InstName::SUBS;
return true;
}
static bool TryExtractSUBS_64S_ADDSUB_IMM(InstData &inst, uint32_t bits) {
if (false && TryExtractCMP_SUBS_64S_ADDSUB_IMM(inst, bits))
return true;
// bits
// & 11111111000000000000000000000000
// --------------------------------
// 11110001000000000000000000000000
if ((bits & 0xff000000U) != 0xf1000000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t imm12 : 12;
uint32_t shift : 2;
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 0
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t op : 1;
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.imm12.uimm = static_cast<uint64_t>(enc.imm12);
inst.shift = static_cast<uint8_t>(enc.shift);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.sf = static_cast<uint8_t>(enc.sf);
inst.op = static_cast<uint8_t>(enc.op);
inst.iform = InstForm::SUBS_64S_ADDSUB_IMM;
inst.iclass = InstName::SUBS;
return true;
}
static bool TryExtractSUBS_32S_ADDSUB_EXT(InstData &inst, uint32_t bits) {
if (false && TryExtractCMP_SUBS_32S_ADDSUB_EXT(inst, bits))
return true;
// bits
// & 11111111111000000000000000000000
// --------------------------------
// 01101011001000000000000000000000
if ((bits & 0xffe00000U) != 0x6b200000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t imm3 : 3;
uint32_t option : 3;
uint32_t Rm : 5;
uint32_t _21 : 1; // 1
uint32_t opt : 2;
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t S : 1;
uint32_t op : 1;
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.opt = static_cast<uint8_t>(enc.opt);
inst.option = static_cast<uint8_t>(enc.option);
inst.sf = static_cast<uint8_t>(enc.sf);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.imm3.uimm = static_cast<uint64_t>(enc.imm3);
inst.op = static_cast<uint8_t>(enc.op);
inst.iform = InstForm::SUBS_32S_ADDSUB_EXT;
inst.iclass = InstName::SUBS;
return true;
}
static bool TryExtractSUBS_64S_ADDSUB_EXT(InstData &inst, uint32_t bits) {
if (false && TryExtractCMP_SUBS_64S_ADDSUB_EXT(inst, bits))
return true;
// bits
// & 11111111111000000000000000000000
// --------------------------------
// 11101011001000000000000000000000
if ((bits & 0xffe00000U) != 0xeb200000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t imm3 : 3;
uint32_t option : 3;
uint32_t Rm : 5;
uint32_t _21 : 1; // 1
uint32_t opt : 2;
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t S : 1;
uint32_t op : 1;
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.opt = static_cast<uint8_t>(enc.opt);
inst.option = static_cast<uint8_t>(enc.option);
inst.sf = static_cast<uint8_t>(enc.sf);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.imm3.uimm = static_cast<uint64_t>(enc.imm3);
inst.op = static_cast<uint8_t>(enc.op);
inst.iform = InstForm::SUBS_64S_ADDSUB_EXT;
inst.iclass = InstName::SUBS;
return true;
}
static bool TryExtractSYSL_RC_SYSTEM(InstData &inst, uint32_t bits) {
// bits
// & 11111111111110000000000000000000
// --------------------------------
// 11010101001010000000000000000000
if ((bits & 0xfff80000U) != 0xd5280000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t op2 : 3;
uint32_t CRm : 4;
uint32_t CRn : 4;
uint32_t op1 : 3;
uint32_t op0 : 2;
uint32_t L : 1;
uint32_t _22 : 1; // 0
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 0
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 0
uint32_t _30 : 1; // 1
uint32_t _31 : 1; // 1
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.op0 = static_cast<uint8_t>(enc.op0);
inst.op1 = static_cast<uint8_t>(enc.op1);
inst.op2 = static_cast<uint8_t>(enc.op2);
inst.L = static_cast<uint8_t>(enc.L);
inst.CRn = static_cast<uint8_t>(enc.CRn);
inst.CRm = static_cast<uint8_t>(enc.CRm);
inst.iform = InstForm::SYSL_RC_SYSTEM;
inst.iclass = InstName::SYSL;
return true;
}
static bool TryExtractSMSUBL_64WA_DP_3SRC(InstData &inst, uint32_t bits) {
if (false && TryExtractSMNEGL_SMSUBL_64WA_DP_3SRC(inst, bits))
return true;
// bits
// & 11111111111000001000000000000000
// --------------------------------
// 10011011001000001000000000000000
if ((bits & 0xffe08000U) != 0x9b208000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t Ra : 5;
uint32_t o0 : 1;
uint32_t Rm : 5;
uint32_t _21 : 1; // 1
uint32_t _22 : 1; // 0
uint32_t U : 1;
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t op54 : 2;
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.U = static_cast<uint8_t>(enc.U);
inst.Ra = static_cast<uint8_t>(enc.Ra);
inst.op54 = static_cast<uint8_t>(enc.op54);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.sf = static_cast<uint8_t>(enc.sf);
inst.o0 = static_cast<uint8_t>(enc.o0);
inst.iform = InstForm::SMSUBL_64WA_DP_3SRC;
inst.iclass = InstName::SMSUBL;
return true;
}
static bool TryExtractURSRA_ASISDSHF_R(InstData &inst, uint32_t bits) {
// bits
// & 11111111100000001111110000000000
// --------------------------------
// 01111111000000000011010000000000
if ((bits & 0xff80fc00U) != 0x7f003400U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t _11 : 1; // 0
uint32_t o0 : 1;
uint32_t o1 : 1;
uint32_t _14 : 1; // 0
uint32_t _15 : 1; // 0
uint32_t immb : 3;
uint32_t immh : 4;
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t U : 1;
uint32_t _30 : 1; // 1
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.immh.uimm = static_cast<uint64_t>(enc.immh);
if (!(inst.immh.uimm != 0x0))
return false;
inst.immb.uimm = static_cast<uint64_t>(enc.immb);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o1 = static_cast<uint8_t>(enc.o1);
inst.o0 = static_cast<uint8_t>(enc.o0);
inst.iform = InstForm::URSRA_ASISDSHF_R;
inst.iclass = InstName::URSRA;
return true;
}
static bool TryExtractURSRA_ASIMDSHF_R(InstData &inst, uint32_t bits) {
// bits
// & 10111111100000001111110000000000
// --------------------------------
// 00101111000000000011010000000000
if ((bits & 0xbf80fc00U) != 0x2f003400U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t _11 : 1; // 0
uint32_t o0 : 1;
uint32_t o1 : 1;
uint32_t _14 : 1; // 0
uint32_t _15 : 1; // 0
uint32_t immb : 3;
uint32_t immh : 4;
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.immh.uimm = static_cast<uint64_t>(enc.immh);
if (!(inst.immh.uimm != 0x0))
return false;
inst.immb.uimm = static_cast<uint64_t>(enc.immb);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o1 = static_cast<uint8_t>(enc.o1);
inst.o0 = static_cast<uint8_t>(enc.o0);
inst.iform = InstForm::URSRA_ASIMDSHF_R;
inst.iclass = InstName::URSRA;
return true;
}
static bool TryExtractLDURH_32_LDST_UNSCALED(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000000000110000000000
// --------------------------------
// 01111000010000000000000000000000
if ((bits & 0xffe00c00U) != 0x78400000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t imm9 : 9;
uint32_t _21 : 1; // 0
uint32_t opc : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.imm9.uimm = static_cast<uint64_t>(enc.imm9);
inst.V = static_cast<uint8_t>(enc.V);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LDURH_32_LDST_UNSCALED;
inst.iclass = InstName::LDURH;
return true;
}
static bool TryExtractSUB_32_ADDSUB_SHIFT(InstData &inst, uint32_t bits) {
if (false && TryExtractNEG_SUB_32_ADDSUB_SHIFT(inst, bits))
return true;
// bits
// & 11111111001000000000000000000000
// --------------------------------
// 01001011000000000000000000000000
if ((bits & 0xff200000U) != 0x4b000000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t imm6 : 6;
uint32_t Rm : 5;
uint32_t _21 : 1; // 0
uint32_t shift : 2;
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t S : 1;
uint32_t op : 1;
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.shift = static_cast<uint8_t>(enc.shift);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.op = static_cast<uint8_t>(enc.op);
inst.sf = static_cast<uint8_t>(enc.sf);
inst.imm6.uimm = static_cast<uint64_t>(enc.imm6);
inst.iform = InstForm::SUB_32_ADDSUB_SHIFT;
inst.iclass = InstName::SUB;
return true;
}
static bool TryExtractSUB_64_ADDSUB_SHIFT(InstData &inst, uint32_t bits) {
if (false && TryExtractNEG_SUB_64_ADDSUB_SHIFT(inst, bits))
return true;
// bits
// & 11111111001000000000000000000000
// --------------------------------
// 11001011000000000000000000000000
if ((bits & 0xff200000U) != 0xcb000000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t imm6 : 6;
uint32_t Rm : 5;
uint32_t _21 : 1; // 0
uint32_t shift : 2;
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t S : 1;
uint32_t op : 1;
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.shift = static_cast<uint8_t>(enc.shift);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.op = static_cast<uint8_t>(enc.op);
inst.sf = static_cast<uint8_t>(enc.sf);
inst.imm6.uimm = static_cast<uint64_t>(enc.imm6);
inst.iform = InstForm::SUB_64_ADDSUB_SHIFT;
inst.iclass = InstName::SUB;
return true;
}
static bool TryExtractSRI_ASISDSHF_R(InstData &inst, uint32_t bits) {
// bits
// & 11111111100000001111110000000000
// --------------------------------
// 01111111000000000100010000000000
if ((bits & 0xff80fc00U) != 0x7f004400U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t opcode : 5;
uint32_t immb : 3;
uint32_t immh : 4;
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t U : 1;
uint32_t _30 : 1; // 1
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.immh.uimm = static_cast<uint64_t>(enc.immh);
if (!(inst.immh.uimm != 0x0))
return false;
inst.immb.uimm = static_cast<uint64_t>(enc.immb);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.iform = InstForm::SRI_ASISDSHF_R;
inst.iclass = InstName::SRI;
return true;
}
static bool TryExtractSRI_ASIMDSHF_R(InstData &inst, uint32_t bits) {
// bits
// & 10111111100000001111110000000000
// --------------------------------
// 00101111000000000100010000000000
if ((bits & 0xbf80fc00U) != 0x2f004400U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t opcode : 5;
uint32_t immb : 3;
uint32_t immh : 4;
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.immh.uimm = static_cast<uint64_t>(enc.immh);
if (!(inst.immh.uimm != 0x0))
return false;
inst.immb.uimm = static_cast<uint64_t>(enc.immb);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.iform = InstForm::SRI_ASIMDSHF_R;
inst.iclass = InstName::SRI;
return true;
}
static bool TryExtractUMAXP_ASIMDSAME_ONLY(InstData &inst, uint32_t bits) {
// bits
// & 10111111001000001111110000000000
// --------------------------------
// 00101110001000001010010000000000
if ((bits & 0xbf20fc00U) != 0x2e20a400U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t o1 : 1;
uint32_t _12 : 1; // 0
uint32_t _13 : 1; // 1
uint32_t _14 : 1; // 0
uint32_t _15 : 1; // 1
uint32_t Rm : 5;
uint32_t _21 : 1; // 1
uint32_t size : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o1 = static_cast<uint8_t>(enc.o1);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::UMAXP_ASIMDSAME_ONLY;
inst.iclass = InstName::UMAXP;
return true;
}
static bool TryExtractIC_SYS_CR_SYSTEM(InstData &inst, uint32_t bits) {
// bits
// & 11111111111110001111000000000000
// --------------------------------
// 11010101000010000111000000000000
if ((bits & 0xfff8f000U) != 0xd5087000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t op2 : 3;
uint32_t CRm : 4;
uint32_t CRn : 4;
uint32_t op1 : 3;
uint32_t op0 : 2;
uint32_t L : 1;
uint32_t _22 : 1; // 0
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 0
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 0
uint32_t _30 : 1; // 1
uint32_t _31 : 1; // 1
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.op0 = static_cast<uint8_t>(enc.op0);
inst.op1 = static_cast<uint8_t>(enc.op1);
inst.op2 = static_cast<uint8_t>(enc.op2);
inst.L = static_cast<uint8_t>(enc.L);
inst.CRn = static_cast<uint8_t>(enc.CRn);
inst.CRm = static_cast<uint8_t>(enc.CRm);
inst.iform = InstForm::IC_SYS_CR_SYSTEM;
inst.iclass = InstName::SYS;
return true;
}
static bool TryExtractLDTRSH_32_LDST_UNPRIV(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000000000110000000000
// --------------------------------
// 01111000110000000000100000000000
if ((bits & 0xffe00c00U) != 0x78c00800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t imm9 : 9;
uint32_t _21 : 1; // 0
uint32_t opc : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.imm9.uimm = static_cast<uint64_t>(enc.imm9);
inst.V = static_cast<uint8_t>(enc.V);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LDTRSH_32_LDST_UNPRIV;
inst.iclass = InstName::LDTRSH;
return true;
}
static bool TryExtractLDTRSH_64_LDST_UNPRIV(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000000000110000000000
// --------------------------------
// 01111000100000000000100000000000
if ((bits & 0xffe00c00U) != 0x78800800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t imm9 : 9;
uint32_t _21 : 1; // 0
uint32_t opc : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.imm9.uimm = static_cast<uint64_t>(enc.imm9);
inst.V = static_cast<uint8_t>(enc.V);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LDTRSH_64_LDST_UNPRIV;
inst.iclass = InstName::LDTRSH;
return true;
}
static bool TryExtractSADALP_ASIMDMISC_P(InstData &inst, uint32_t bits) {
// bits
// & 10111111001111111111110000000000
// --------------------------------
// 00001110001000000110100000000000
if ((bits & 0xbf3ffc00U) != 0xe206800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t _12 : 1; // 0
uint32_t _13 : 1; // 1
uint32_t op : 1;
uint32_t _15 : 1; // 0
uint32_t _16 : 1; // 0
uint32_t _17 : 1; // 0
uint32_t _18 : 1; // 0
uint32_t _19 : 1; // 0
uint32_t _20 : 1; // 0
uint32_t _21 : 1; // 1
uint32_t size : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.op = static_cast<uint8_t>(enc.op);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::SADALP_ASIMDMISC_P;
inst.iclass = InstName::SADALP;
return true;
}
static bool TryExtractLDTRH_32_LDST_UNPRIV(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000000000110000000000
// --------------------------------
// 01111000010000000000100000000000
if ((bits & 0xffe00c00U) != 0x78400800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t imm9 : 9;
uint32_t _21 : 1; // 0
uint32_t opc : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.imm9.uimm = static_cast<uint64_t>(enc.imm9);
inst.V = static_cast<uint8_t>(enc.V);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LDTRH_32_LDST_UNPRIV;
inst.iclass = InstName::LDTRH;
return true;
}
static bool TryExtractSMAX_ASIMDSAME_ONLY(InstData &inst, uint32_t bits) {
// bits
// & 10111111001000001111110000000000
// --------------------------------
// 00001110001000000110010000000000
if ((bits & 0xbf20fc00U) != 0xe206400U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t o1 : 1;
uint32_t _12 : 1; // 0
uint32_t _13 : 1; // 1
uint32_t _14 : 1; // 1
uint32_t _15 : 1; // 0
uint32_t Rm : 5;
uint32_t _21 : 1; // 1
uint32_t size : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o1 = static_cast<uint8_t>(enc.o1);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::SMAX_ASIMDSAME_ONLY;
inst.iclass = InstName::SMAX;
return true;
}
static bool TryExtractFCVTPU_ASISDMISCFP16_R(InstData &inst, uint32_t bits) {
// bits
// & 11111111111111111111110000000000
// --------------------------------
// 01111110111110011010100000000000
if ((bits & 0xfffffc00U) != 0x7ef9a800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t o1 : 1;
uint32_t _13 : 1; // 1
uint32_t _14 : 1; // 0
uint32_t _15 : 1; // 1
uint32_t _16 : 1; // 1
uint32_t _17 : 1; // 0
uint32_t _18 : 1; // 0
uint32_t _19 : 1; // 1
uint32_t _20 : 1; // 1
uint32_t _21 : 1; // 1
uint32_t _22 : 1; // 1
uint32_t o2 : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t U : 1;
uint32_t _30 : 1; // 1
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.U = static_cast<uint8_t>(enc.U);
inst.o2 = static_cast<uint8_t>(enc.o2);
inst.o1 = static_cast<uint8_t>(enc.o1);
inst.iform = InstForm::FCVTPU_ASISDMISCFP16_R;
inst.iclass = InstName::FCVTPU;
return true;
}
static bool TryExtractFCVTPU_ASISDMISC_R(InstData &inst, uint32_t bits) {
// bits
// & 11111111101111111111110000000000
// --------------------------------
// 01111110101000011010100000000000
if ((bits & 0xffbffc00U) != 0x7ea1a800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t o1 : 1;
uint32_t _13 : 1; // 1
uint32_t _14 : 1; // 0
uint32_t _15 : 1; // 1
uint32_t _16 : 1; // 1
uint32_t _17 : 1; // 0
uint32_t _18 : 1; // 0
uint32_t _19 : 1; // 0
uint32_t _20 : 1; // 0
uint32_t _21 : 1; // 1
uint32_t sz : 1;
uint32_t o2 : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t U : 1;
uint32_t _30 : 1; // 1
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.sz = static_cast<uint8_t>(enc.sz);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o2 = static_cast<uint8_t>(enc.o2);
inst.o1 = static_cast<uint8_t>(enc.o1);
inst.iform = InstForm::FCVTPU_ASISDMISC_R;
inst.iclass = InstName::FCVTPU;
return true;
}
static bool TryExtractFCVTPU_ASIMDMISCFP16_R(InstData &inst, uint32_t bits) {
// bits
// & 10111111111111111111110000000000
// --------------------------------
// 00101110111110011010100000000000
if ((bits & 0xbffffc00U) != 0x2ef9a800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t o1 : 1;
uint32_t _13 : 1; // 1
uint32_t _14 : 1; // 0
uint32_t _15 : 1; // 1
uint32_t _16 : 1; // 1
uint32_t _17 : 1; // 0
uint32_t _18 : 1; // 0
uint32_t _19 : 1; // 1
uint32_t _20 : 1; // 1
uint32_t _21 : 1; // 1
uint32_t _22 : 1; // 1
uint32_t o2 : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o2 = static_cast<uint8_t>(enc.o2);
inst.o1 = static_cast<uint8_t>(enc.o1);
inst.iform = InstForm::FCVTPU_ASIMDMISCFP16_R;
inst.iclass = InstName::FCVTPU;
return true;
}
static bool TryExtractFCVTPU_ASIMDMISC_R(InstData &inst, uint32_t bits) {
// bits
// & 10111111101111111111110000000000
// --------------------------------
// 00101110101000011010100000000000
if ((bits & 0xbfbffc00U) != 0x2ea1a800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t o1 : 1;
uint32_t _13 : 1; // 1
uint32_t _14 : 1; // 0
uint32_t _15 : 1; // 1
uint32_t _16 : 1; // 1
uint32_t _17 : 1; // 0
uint32_t _18 : 1; // 0
uint32_t _19 : 1; // 0
uint32_t _20 : 1; // 0
uint32_t _21 : 1; // 1
uint32_t sz : 1;
uint32_t o2 : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.sz = static_cast<uint8_t>(enc.sz);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o2 = static_cast<uint8_t>(enc.o2);
inst.o1 = static_cast<uint8_t>(enc.o1);
inst.iform = InstForm::FCVTPU_ASIMDMISC_R;
inst.iclass = InstName::FCVTPU;
return true;
}
static bool TryExtractRET_64R_BRANCH_REG(InstData &inst, uint32_t bits) {
// bits
// & 11111111111111111111110000011111
// --------------------------------
// 11010110010111110000000000000000
if ((bits & 0xfffffc1fU) != 0xd65f0000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t op4 : 5;
uint32_t Rn : 5;
uint32_t op3 : 6;
uint32_t op2 : 5;
uint32_t op : 2;
uint32_t opc : 2;
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 0
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 0
uint32_t _30 : 1; // 1
uint32_t _31 : 1; // 1
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.op4 = static_cast<uint8_t>(enc.op4);
inst.op2 = static_cast<uint8_t>(enc.op2);
inst.op3 = static_cast<uint8_t>(enc.op3);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.op = static_cast<uint8_t>(enc.op);
inst.iform = InstForm::RET_64R_BRANCH_REG;
inst.iclass = InstName::RET;
return true;
}
static bool TryExtractUQRSHL_ASISDSAME_ONLY(InstData &inst, uint32_t bits) {
// bits
// & 11111111001000001111110000000000
// --------------------------------
// 01111110001000000101110000000000
if ((bits & 0xff20fc00U) != 0x7e205c00U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t S : 1;
uint32_t R : 1;
uint32_t _13 : 1; // 0
uint32_t _14 : 1; // 1
uint32_t _15 : 1; // 0
uint32_t Rm : 5;
uint32_t _21 : 1; // 1
uint32_t size : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t U : 1;
uint32_t _30 : 1; // 1
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.R = static_cast<uint8_t>(enc.R);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::UQRSHL_ASISDSAME_ONLY;
inst.iclass = InstName::UQRSHL;
return true;
}
static bool TryExtractUQRSHL_ASIMDSAME_ONLY(InstData &inst, uint32_t bits) {
// bits
// & 10111111001000001111110000000000
// --------------------------------
// 00101110001000000101110000000000
if ((bits & 0xbf20fc00U) != 0x2e205c00U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t S : 1;
uint32_t R : 1;
uint32_t _13 : 1; // 0
uint32_t _14 : 1; // 1
uint32_t _15 : 1; // 0
uint32_t Rm : 5;
uint32_t _21 : 1; // 1
uint32_t size : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.R = static_cast<uint8_t>(enc.R);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::UQRSHL_ASIMDSAME_ONLY;
inst.iclass = InstName::UQRSHL;
return true;
}
static bool TryExtractLDRB_32_LDST_IMMPOST(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000000000110000000000
// --------------------------------
// 00111000010000000000010000000000
if ((bits & 0xffe00c00U) != 0x38400400U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t _11 : 1; // 0
uint32_t imm9 : 9;
uint32_t _21 : 1; // 0
uint32_t opc : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.imm9.uimm = static_cast<uint64_t>(enc.imm9);
inst.V = static_cast<uint8_t>(enc.V);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LDRB_32_LDST_IMMPOST;
inst.iclass = InstName::LDRB;
return true;
}
static bool TryExtractLDRB_32_LDST_IMMPRE(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000000000110000000000
// --------------------------------
// 00111000010000000000110000000000
if ((bits & 0xffe00c00U) != 0x38400c00U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t _11 : 1; // 1
uint32_t imm9 : 9;
uint32_t _21 : 1; // 0
uint32_t opc : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.imm9.uimm = static_cast<uint64_t>(enc.imm9);
inst.V = static_cast<uint8_t>(enc.V);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LDRB_32_LDST_IMMPRE;
inst.iclass = InstName::LDRB;
return true;
}
static bool TryExtractLDRB_32_LDST_POS(InstData &inst, uint32_t bits) {
// bits
// & 11111111110000000000000000000000
// --------------------------------
// 00111001010000000000000000000000
if ((bits & 0xffc00000U) != 0x39400000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t imm12 : 12;
uint32_t opc : 2;
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.imm12.uimm = static_cast<uint64_t>(enc.imm12);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.V = static_cast<uint8_t>(enc.V);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LDRB_32_LDST_POS;
inst.iclass = InstName::LDRB;
return true;
}
static bool TryExtractFCVTXN_ASISDMISC_N(InstData &inst, uint32_t bits) {
// bits
// & 11111111101111111111110000000000
// --------------------------------
// 01111110001000010110100000000000
if ((bits & 0xffbffc00U) != 0x7e216800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t opcode : 5;
uint32_t _17 : 1; // 0
uint32_t _18 : 1; // 0
uint32_t _19 : 1; // 0
uint32_t _20 : 1; // 0
uint32_t _21 : 1; // 1
uint32_t sz : 1;
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t U : 1;
uint32_t _30 : 1; // 1
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.sz = static_cast<uint8_t>(enc.sz);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.U = static_cast<uint8_t>(enc.U);
inst.iform = InstForm::FCVTXN_ASISDMISC_N;
inst.iclass = InstName::FCVTXN;
return true;
}
static bool TryExtractFCVTXN_ASIMDMISC_N(InstData &inst, uint32_t bits) {
// bits
// & 10111111101111111111110000000000
// --------------------------------
// 00101110001000010110100000000000
if ((bits & 0xbfbffc00U) != 0x2e216800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t opcode : 5;
uint32_t _17 : 1; // 0
uint32_t _18 : 1; // 0
uint32_t _19 : 1; // 0
uint32_t _20 : 1; // 0
uint32_t _21 : 1; // 1
uint32_t sz : 1;
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.sz = static_cast<uint8_t>(enc.sz);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.U = static_cast<uint8_t>(enc.U);
inst.iform = InstForm::FCVTXN_ASIMDMISC_N;
inst.iclass = InstName::FCVTXN;
return true;
}
static bool TryExtractMSR_SI_SYSTEM(InstData &inst, uint32_t bits) {
// bits
// & 11111111111110001111000000011111
// --------------------------------
// 11010101000000000100000000011111
if ((bits & 0xfff8f01fU) != 0xd500401fU) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t op2 : 3;
uint32_t CRm : 4;
uint32_t CRn : 4;
uint32_t op1 : 3;
uint32_t op0 : 2;
uint32_t L : 1;
uint32_t _22 : 1; // 0
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 0
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 0
uint32_t _30 : 1; // 1
uint32_t _31 : 1; // 1
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.op0 = static_cast<uint8_t>(enc.op0);
inst.op1 = static_cast<uint8_t>(enc.op1);
inst.op2 = static_cast<uint8_t>(enc.op2);
inst.L = static_cast<uint8_t>(enc.L);
inst.CRn = static_cast<uint8_t>(enc.CRn);
inst.CRm = static_cast<uint8_t>(enc.CRm);
inst.iform = InstForm::MSR_SI_SYSTEM;
inst.iclass = InstName::MSR;
return true;
}
static bool TryExtractUABDL_ASIMDDIFF_L(InstData &inst, uint32_t bits) {
// bits
// & 10111111001000001111110000000000
// --------------------------------
// 00101110001000000111000000000000
if ((bits & 0xbf20fc00U) != 0x2e207000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t _12 : 1; // 1
uint32_t op : 1;
uint32_t _14 : 1; // 1
uint32_t _15 : 1; // 0
uint32_t Rm : 5;
uint32_t _21 : 1; // 1
uint32_t size : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.op = static_cast<uint8_t>(enc.op);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::UABDL_ASIMDDIFF_L;
inst.iclass = InstName::UABDL;
return true;
}
static bool TryExtractMSR_SR_SYSTEM(InstData &inst, uint32_t bits) {
// bits
// & 11111111111100000000000000000000
// --------------------------------
// 11010101000100000000000000000000
if ((bits & 0xfff00000U) != 0xd5100000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t op2 : 3;
uint32_t CRm : 4;
uint32_t CRn : 4;
uint32_t op1 : 3;
uint32_t o0 : 1;
uint32_t _20 : 1; // 1
uint32_t L : 1;
uint32_t _22 : 1; // 0
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 0
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 0
uint32_t _30 : 1; // 1
uint32_t _31 : 1; // 1
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.op1 = static_cast<uint8_t>(enc.op1);
inst.op2 = static_cast<uint8_t>(enc.op2);
inst.L = static_cast<uint8_t>(enc.L);
inst.CRm = static_cast<uint8_t>(enc.CRm);
inst.CRn = static_cast<uint8_t>(enc.CRn);
inst.o0 = static_cast<uint8_t>(enc.o0);
inst.iform = InstForm::MSR_SR_SYSTEM;
inst.iclass = InstName::MSR;
return true;
}
static bool TryExtractLDRH_32_LDST_REGOFF(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000000000110000000000
// --------------------------------
// 01111000011000000000100000000000
if ((bits & 0xffe00c00U) != 0x78600800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t S : 1;
uint32_t option : 3;
uint32_t Rm : 5;
uint32_t _21 : 1; // 1
uint32_t opc : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.option = static_cast<uint8_t>(enc.option);
inst.V = static_cast<uint8_t>(enc.V);
inst.S = static_cast<uint8_t>(enc.S);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LDRH_32_LDST_REGOFF;
inst.iclass = InstName::LDRH;
return true;
}
static bool TryExtractUQSHL_ASISDSHF_R(InstData &inst, uint32_t bits) {
// bits
// & 11111111100000001111110000000000
// --------------------------------
// 01111111000000000111010000000000
if ((bits & 0xff80fc00U) != 0x7f007400U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t _11 : 1; // 0
uint32_t op : 1;
uint32_t _13 : 1; // 1
uint32_t _14 : 1; // 1
uint32_t _15 : 1; // 0
uint32_t immb : 3;
uint32_t immh : 4;
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t U : 1;
uint32_t _30 : 1; // 1
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.immh.uimm = static_cast<uint64_t>(enc.immh);
if (!(inst.immh.uimm != 0x0))
return false;
inst.immb.uimm = static_cast<uint64_t>(enc.immb);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.op = static_cast<uint8_t>(enc.op);
inst.iform = InstForm::UQSHL_ASISDSHF_R;
inst.iclass = InstName::UQSHL;
return true;
}
static bool TryExtractUQSHL_ASIMDSHF_R(InstData &inst, uint32_t bits) {
// bits
// & 10111111100000001111110000000000
// --------------------------------
// 00101111000000000111010000000000
if ((bits & 0xbf80fc00U) != 0x2f007400U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t _11 : 1; // 0
uint32_t op : 1;
uint32_t _13 : 1; // 1
uint32_t _14 : 1; // 1
uint32_t _15 : 1; // 0
uint32_t immb : 3;
uint32_t immh : 4;
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.immh.uimm = static_cast<uint64_t>(enc.immh);
if (!(inst.immh.uimm != 0x0))
return false;
inst.immb.uimm = static_cast<uint64_t>(enc.immb);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.op = static_cast<uint8_t>(enc.op);
inst.iform = InstForm::UQSHL_ASIMDSHF_R;
inst.iclass = InstName::UQSHL;
return true;
}
static bool TryExtractFMINNMP_ASISDPAIR_ONLY_H(InstData &inst, uint32_t bits) {
// bits
// & 11111111111111111111110000000000
// --------------------------------
// 01011110101100001100100000000000
if ((bits & 0xfffffc00U) != 0x5eb0c800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t opcode : 5;
uint32_t _17 : 1; // 0
uint32_t _18 : 1; // 0
uint32_t _19 : 1; // 0
uint32_t _20 : 1; // 1
uint32_t _21 : 1; // 1
uint32_t sz : 1;
uint32_t o1 : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t U : 1;
uint32_t _30 : 1; // 1
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.sz = static_cast<uint8_t>(enc.sz);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o1 = static_cast<uint8_t>(enc.o1);
inst.iform = InstForm::FMINNMP_ASISDPAIR_ONLY_H;
inst.iclass = InstName::FMINNMP;
return true;
}
static bool TryExtractFMINNMP_ASISDPAIR_ONLY_SD(InstData &inst, uint32_t bits) {
// bits
// & 11111111101111111111110000000000
// --------------------------------
// 01111110101100001100100000000000
if ((bits & 0xffbffc00U) != 0x7eb0c800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t opcode : 5;
uint32_t _17 : 1; // 0
uint32_t _18 : 1; // 0
uint32_t _19 : 1; // 0
uint32_t _20 : 1; // 1
uint32_t _21 : 1; // 1
uint32_t sz : 1;
uint32_t o1 : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t U : 1;
uint32_t _30 : 1; // 1
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.sz = static_cast<uint8_t>(enc.sz);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o1 = static_cast<uint8_t>(enc.o1);
inst.iform = InstForm::FMINNMP_ASISDPAIR_ONLY_SD;
inst.iclass = InstName::FMINNMP;
return true;
}
static bool TryExtractUMADDL_64WA_DP_3SRC(InstData &inst, uint32_t bits) {
if (false && TryExtractUMULL_UMADDL_64WA_DP_3SRC(inst, bits))
return true;
// bits
// & 11111111111000001000000000000000
// --------------------------------
// 10011011101000000000000000000000
if ((bits & 0xffe08000U) != 0x9ba00000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t Ra : 5;
uint32_t o0 : 1;
uint32_t Rm : 5;
uint32_t _21 : 1; // 1
uint32_t _22 : 1; // 0
uint32_t U : 1;
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t op54 : 2;
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.U = static_cast<uint8_t>(enc.U);
inst.Ra = static_cast<uint8_t>(enc.Ra);
inst.op54 = static_cast<uint8_t>(enc.op54);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.sf = static_cast<uint8_t>(enc.sf);
inst.o0 = static_cast<uint8_t>(enc.o0);
inst.iform = InstForm::UMADDL_64WA_DP_3SRC;
inst.iclass = InstName::UMADDL;
return true;
}
static bool TryExtractFMOV_H_FLOATDP1(InstData &inst, uint32_t bits) {
// bits
// & 11111111111111111111110000000000
// --------------------------------
// 00011110111000000100000000000000
if ((bits & 0xfffffc00U) != 0x1ee04000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t _12 : 1; // 0
uint32_t _13 : 1; // 0
uint32_t _14 : 1; // 1
uint32_t opc : 2;
uint32_t _17 : 1; // 0
uint32_t _18 : 1; // 0
uint32_t _19 : 1; // 0
uint32_t _20 : 1; // 0
uint32_t _21 : 1; // 1
uint32_t type : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t _30 : 1; // 0
uint32_t M : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.M = static_cast<uint8_t>(enc.M);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.type = static_cast<uint8_t>(enc.type);
inst.iform = InstForm::FMOV_H_FLOATDP1;
inst.iclass = InstName::FMOV;
return true;
}
static bool TryExtractFMOV_S_FLOATDP1(InstData &inst, uint32_t bits) {
// bits
// & 11111111111111111111110000000000
// --------------------------------
// 00011110001000000100000000000000
if ((bits & 0xfffffc00U) != 0x1e204000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t _12 : 1; // 0
uint32_t _13 : 1; // 0
uint32_t _14 : 1; // 1
uint32_t opc : 2;
uint32_t _17 : 1; // 0
uint32_t _18 : 1; // 0
uint32_t _19 : 1; // 0
uint32_t _20 : 1; // 0
uint32_t _21 : 1; // 1
uint32_t type : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t _30 : 1; // 0
uint32_t M : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.M = static_cast<uint8_t>(enc.M);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.type = static_cast<uint8_t>(enc.type);
inst.iform = InstForm::FMOV_S_FLOATDP1;
inst.iclass = InstName::FMOV;
return true;
}
static bool TryExtractFMOV_D_FLOATDP1(InstData &inst, uint32_t bits) {
// bits
// & 11111111111111111111110000000000
// --------------------------------
// 00011110011000000100000000000000
if ((bits & 0xfffffc00U) != 0x1e604000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t _12 : 1; // 0
uint32_t _13 : 1; // 0
uint32_t _14 : 1; // 1
uint32_t opc : 2;
uint32_t _17 : 1; // 0
uint32_t _18 : 1; // 0
uint32_t _19 : 1; // 0
uint32_t _20 : 1; // 0
uint32_t _21 : 1; // 1
uint32_t type : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t _30 : 1; // 0
uint32_t M : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.M = static_cast<uint8_t>(enc.M);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.type = static_cast<uint8_t>(enc.type);
inst.iform = InstForm::FMOV_D_FLOATDP1;
inst.iclass = InstName::FMOV;
return true;
}
static bool TryExtractSRHADD_ASIMDSAME_ONLY(InstData &inst, uint32_t bits) {
// bits
// & 10111111001000001111110000000000
// --------------------------------
// 00001110001000000001010000000000
if ((bits & 0xbf20fc00U) != 0xe201400U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t opcode : 5;
uint32_t Rm : 5;
uint32_t _21 : 1; // 1
uint32_t size : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.U = static_cast<uint8_t>(enc.U);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::SRHADD_ASIMDSAME_ONLY;
inst.iclass = InstName::SRHADD;
return true;
}
static bool TryExtractNGC_SBC_32_ADDSUB_CARRY(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111111111100000
// --------------------------------
// 01011010000000000000001111100000
if ((bits & 0xffe0ffe0U) != 0x5a0003e0U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t opcode2 : 6;
uint32_t Rm : 5;
uint32_t _21 : 1; // 0
uint32_t _22 : 1; // 0
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t op : 1;
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.opcode2 = static_cast<uint8_t>(enc.opcode2);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.sf = static_cast<uint8_t>(enc.sf);
inst.op = static_cast<uint8_t>(enc.op);
inst.iform = InstForm::NGC_SBC_32_ADDSUB_CARRY;
inst.iclass = InstName::SBC;
return true;
}
static bool TryExtractNGC_SBC_64_ADDSUB_CARRY(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111111111100000
// --------------------------------
// 11011010000000000000001111100000
if ((bits & 0xffe0ffe0U) != 0xda0003e0U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t opcode2 : 6;
uint32_t Rm : 5;
uint32_t _21 : 1; // 0
uint32_t _22 : 1; // 0
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t op : 1;
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.opcode2 = static_cast<uint8_t>(enc.opcode2);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.sf = static_cast<uint8_t>(enc.sf);
inst.op = static_cast<uint8_t>(enc.op);
inst.iform = InstForm::NGC_SBC_64_ADDSUB_CARRY;
inst.iclass = InstName::SBC;
return true;
}
static bool TryExtractSBFIZ_SBFM_32M_BITFIELD(InstData &inst, uint32_t bits) {
// bits
// & 11111111110000000000000000000000
// --------------------------------
// 00010011000000000000000000000000
if ((bits & 0xffc00000U) != 0x13000000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t imms : 6;
uint32_t immr : 6;
uint32_t N : 1;
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 0
uint32_t _28 : 1; // 1
uint32_t opc : 2;
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.sf = static_cast<uint8_t>(enc.sf);
inst.N = static_cast<uint8_t>(enc.N);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.immr.uimm = static_cast<uint64_t>(enc.immr);
inst.imms.uimm = static_cast<uint64_t>(enc.imms);
inst.iform = InstForm::SBFIZ_SBFM_32M_BITFIELD;
inst.iclass = InstName::SBFM;
return true;
}
static bool TryExtractSBFIZ_SBFM_64M_BITFIELD(InstData &inst, uint32_t bits) {
// bits
// & 11111111110000000000000000000000
// --------------------------------
// 10010011010000000000000000000000
if ((bits & 0xffc00000U) != 0x93400000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t imms : 6;
uint32_t immr : 6;
uint32_t N : 1;
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 0
uint32_t _28 : 1; // 1
uint32_t opc : 2;
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.sf = static_cast<uint8_t>(enc.sf);
inst.N = static_cast<uint8_t>(enc.N);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.immr.uimm = static_cast<uint64_t>(enc.immr);
inst.imms.uimm = static_cast<uint64_t>(enc.imms);
inst.iform = InstForm::SBFIZ_SBFM_64M_BITFIELD;
inst.iclass = InstName::SBFM;
return true;
}
static bool TryExtractUMSUBL_64WA_DP_3SRC(InstData &inst, uint32_t bits) {
if (false && TryExtractUMNEGL_UMSUBL_64WA_DP_3SRC(inst, bits))
return true;
// bits
// & 11111111111000001000000000000000
// --------------------------------
// 10011011101000001000000000000000
if ((bits & 0xffe08000U) != 0x9ba08000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t Ra : 5;
uint32_t o0 : 1;
uint32_t Rm : 5;
uint32_t _21 : 1; // 1
uint32_t _22 : 1; // 0
uint32_t U : 1;
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t op54 : 2;
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.U = static_cast<uint8_t>(enc.U);
inst.Ra = static_cast<uint8_t>(enc.Ra);
inst.op54 = static_cast<uint8_t>(enc.op54);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.sf = static_cast<uint8_t>(enc.sf);
inst.o0 = static_cast<uint8_t>(enc.o0);
inst.iform = InstForm::UMSUBL_64WA_DP_3SRC;
inst.iclass = InstName::UMSUBL;
return true;
}
static bool TryExtractFCVTMU_32H_FLOAT2INT(InstData &inst, uint32_t bits) {
// bits
// & 11111111111111111111110000000000
// --------------------------------
// 00011110111100010000000000000000
if ((bits & 0xfffffc00U) != 0x1ef10000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t _12 : 1; // 0
uint32_t _13 : 1; // 0
uint32_t _14 : 1; // 0
uint32_t _15 : 1; // 0
uint32_t opcode : 3;
uint32_t rmode : 2;
uint32_t _21 : 1; // 1
uint32_t type : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t _30 : 1; // 0
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.sf = static_cast<uint8_t>(enc.sf);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.type = static_cast<uint8_t>(enc.type);
inst.rmode = static_cast<uint8_t>(enc.rmode);
inst.iform = InstForm::FCVTMU_32H_FLOAT2INT;
inst.iclass = InstName::FCVTMU;
return true;
}
static bool TryExtractFCVTMU_64H_FLOAT2INT(InstData &inst, uint32_t bits) {
// bits
// & 11111111111111111111110000000000
// --------------------------------
// 10011110111100010000000000000000
if ((bits & 0xfffffc00U) != 0x9ef10000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t _12 : 1; // 0
uint32_t _13 : 1; // 0
uint32_t _14 : 1; // 0
uint32_t _15 : 1; // 0
uint32_t opcode : 3;
uint32_t rmode : 2;
uint32_t _21 : 1; // 1
uint32_t type : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t _30 : 1; // 0
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.sf = static_cast<uint8_t>(enc.sf);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.type = static_cast<uint8_t>(enc.type);
inst.rmode = static_cast<uint8_t>(enc.rmode);
inst.iform = InstForm::FCVTMU_64H_FLOAT2INT;
inst.iclass = InstName::FCVTMU;
return true;
}
static bool TryExtractFCVTMU_32S_FLOAT2INT(InstData &inst, uint32_t bits) {
// bits
// & 11111111111111111111110000000000
// --------------------------------
// 00011110001100010000000000000000
if ((bits & 0xfffffc00U) != 0x1e310000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t _12 : 1; // 0
uint32_t _13 : 1; // 0
uint32_t _14 : 1; // 0
uint32_t _15 : 1; // 0
uint32_t opcode : 3;
uint32_t rmode : 2;
uint32_t _21 : 1; // 1
uint32_t type : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t _30 : 1; // 0
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.sf = static_cast<uint8_t>(enc.sf);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.type = static_cast<uint8_t>(enc.type);
inst.rmode = static_cast<uint8_t>(enc.rmode);
inst.iform = InstForm::FCVTMU_32S_FLOAT2INT;
inst.iclass = InstName::FCVTMU;
return true;
}
static bool TryExtractFCVTMU_64S_FLOAT2INT(InstData &inst, uint32_t bits) {
// bits
// & 11111111111111111111110000000000
// --------------------------------
// 10011110001100010000000000000000
if ((bits & 0xfffffc00U) != 0x9e310000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t _12 : 1; // 0
uint32_t _13 : 1; // 0
uint32_t _14 : 1; // 0
uint32_t _15 : 1; // 0
uint32_t opcode : 3;
uint32_t rmode : 2;
uint32_t _21 : 1; // 1
uint32_t type : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t _30 : 1; // 0
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.sf = static_cast<uint8_t>(enc.sf);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.type = static_cast<uint8_t>(enc.type);
inst.rmode = static_cast<uint8_t>(enc.rmode);
inst.iform = InstForm::FCVTMU_64S_FLOAT2INT;
inst.iclass = InstName::FCVTMU;
return true;
}
static bool TryExtractFCVTMU_32D_FLOAT2INT(InstData &inst, uint32_t bits) {
// bits
// & 11111111111111111111110000000000
// --------------------------------
// 00011110011100010000000000000000
if ((bits & 0xfffffc00U) != 0x1e710000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t _12 : 1; // 0
uint32_t _13 : 1; // 0
uint32_t _14 : 1; // 0
uint32_t _15 : 1; // 0
uint32_t opcode : 3;
uint32_t rmode : 2;
uint32_t _21 : 1; // 1
uint32_t type : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t _30 : 1; // 0
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.sf = static_cast<uint8_t>(enc.sf);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.type = static_cast<uint8_t>(enc.type);
inst.rmode = static_cast<uint8_t>(enc.rmode);
inst.iform = InstForm::FCVTMU_32D_FLOAT2INT;
inst.iclass = InstName::FCVTMU;
return true;
}
static bool TryExtractFCVTMU_64D_FLOAT2INT(InstData &inst, uint32_t bits) {
// bits
// & 11111111111111111111110000000000
// --------------------------------
// 10011110011100010000000000000000
if ((bits & 0xfffffc00U) != 0x9e710000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t _12 : 1; // 0
uint32_t _13 : 1; // 0
uint32_t _14 : 1; // 0
uint32_t _15 : 1; // 0
uint32_t opcode : 3;
uint32_t rmode : 2;
uint32_t _21 : 1; // 1
uint32_t type : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t _30 : 1; // 0
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.sf = static_cast<uint8_t>(enc.sf);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.type = static_cast<uint8_t>(enc.type);
inst.rmode = static_cast<uint8_t>(enc.rmode);
inst.iform = InstForm::FCVTMU_64D_FLOAT2INT;
inst.iclass = InstName::FCVTMU;
return true;
}
static bool TryExtractLDP_S_LDSTPAIR_POST(InstData &inst, uint32_t bits) {
// bits
// & 11111111110000000000000000000000
// --------------------------------
// 00101100110000000000000000000000
if ((bits & 0xffc00000U) != 0x2cc00000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t Rt2 : 5;
uint32_t imm7 : 7;
uint32_t L : 1;
uint32_t _23 : 1; // 1
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 1
uint32_t opc : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rt2 = static_cast<uint8_t>(enc.Rt2);
inst.L = static_cast<uint8_t>(enc.L);
inst.V = static_cast<uint8_t>(enc.V);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.imm7.uimm = static_cast<uint64_t>(enc.imm7);
inst.iform = InstForm::LDP_S_LDSTPAIR_POST;
inst.iclass = InstName::LDP;
return true;
}
static bool TryExtractLDP_D_LDSTPAIR_POST(InstData &inst, uint32_t bits) {
// bits
// & 11111111110000000000000000000000
// --------------------------------
// 01101100110000000000000000000000
if ((bits & 0xffc00000U) != 0x6cc00000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t Rt2 : 5;
uint32_t imm7 : 7;
uint32_t L : 1;
uint32_t _23 : 1; // 1
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 1
uint32_t opc : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rt2 = static_cast<uint8_t>(enc.Rt2);
inst.L = static_cast<uint8_t>(enc.L);
inst.V = static_cast<uint8_t>(enc.V);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.imm7.uimm = static_cast<uint64_t>(enc.imm7);
inst.iform = InstForm::LDP_D_LDSTPAIR_POST;
inst.iclass = InstName::LDP;
return true;
}
static bool TryExtractLDP_Q_LDSTPAIR_POST(InstData &inst, uint32_t bits) {
// bits
// & 11111111110000000000000000000000
// --------------------------------
// 10101100110000000000000000000000
if ((bits & 0xffc00000U) != 0xacc00000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t Rt2 : 5;
uint32_t imm7 : 7;
uint32_t L : 1;
uint32_t _23 : 1; // 1
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 1
uint32_t opc : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rt2 = static_cast<uint8_t>(enc.Rt2);
inst.L = static_cast<uint8_t>(enc.L);
inst.V = static_cast<uint8_t>(enc.V);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.imm7.uimm = static_cast<uint64_t>(enc.imm7);
inst.iform = InstForm::LDP_Q_LDSTPAIR_POST;
inst.iclass = InstName::LDP;
return true;
}
static bool TryExtractLDP_S_LDSTPAIR_PRE(InstData &inst, uint32_t bits) {
// bits
// & 11111111110000000000000000000000
// --------------------------------
// 00101101110000000000000000000000
if ((bits & 0xffc00000U) != 0x2dc00000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t Rt2 : 5;
uint32_t imm7 : 7;
uint32_t L : 1;
uint32_t _23 : 1; // 1
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 1
uint32_t opc : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rt2 = static_cast<uint8_t>(enc.Rt2);
inst.L = static_cast<uint8_t>(enc.L);
inst.V = static_cast<uint8_t>(enc.V);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.imm7.uimm = static_cast<uint64_t>(enc.imm7);
inst.iform = InstForm::LDP_S_LDSTPAIR_PRE;
inst.iclass = InstName::LDP;
return true;
}
static bool TryExtractLDP_D_LDSTPAIR_PRE(InstData &inst, uint32_t bits) {
// bits
// & 11111111110000000000000000000000
// --------------------------------
// 01101101110000000000000000000000
if ((bits & 0xffc00000U) != 0x6dc00000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t Rt2 : 5;
uint32_t imm7 : 7;
uint32_t L : 1;
uint32_t _23 : 1; // 1
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 1
uint32_t opc : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rt2 = static_cast<uint8_t>(enc.Rt2);
inst.L = static_cast<uint8_t>(enc.L);
inst.V = static_cast<uint8_t>(enc.V);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.imm7.uimm = static_cast<uint64_t>(enc.imm7);
inst.iform = InstForm::LDP_D_LDSTPAIR_PRE;
inst.iclass = InstName::LDP;
return true;
}
static bool TryExtractLDP_Q_LDSTPAIR_PRE(InstData &inst, uint32_t bits) {
// bits
// & 11111111110000000000000000000000
// --------------------------------
// 10101101110000000000000000000000
if ((bits & 0xffc00000U) != 0xadc00000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t Rt2 : 5;
uint32_t imm7 : 7;
uint32_t L : 1;
uint32_t _23 : 1; // 1
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 1
uint32_t opc : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rt2 = static_cast<uint8_t>(enc.Rt2);
inst.L = static_cast<uint8_t>(enc.L);
inst.V = static_cast<uint8_t>(enc.V);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.imm7.uimm = static_cast<uint64_t>(enc.imm7);
inst.iform = InstForm::LDP_Q_LDSTPAIR_PRE;
inst.iclass = InstName::LDP;
return true;
}
static bool TryExtractLDP_S_LDSTPAIR_OFF(InstData &inst, uint32_t bits) {
// bits
// & 11111111110000000000000000000000
// --------------------------------
// 00101101010000000000000000000000
if ((bits & 0xffc00000U) != 0x2d400000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t Rt2 : 5;
uint32_t imm7 : 7;
uint32_t L : 1;
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 1
uint32_t opc : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rt2 = static_cast<uint8_t>(enc.Rt2);
inst.L = static_cast<uint8_t>(enc.L);
inst.V = static_cast<uint8_t>(enc.V);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.imm7.uimm = static_cast<uint64_t>(enc.imm7);
inst.iform = InstForm::LDP_S_LDSTPAIR_OFF;
inst.iclass = InstName::LDP;
return true;
}
static bool TryExtractLDP_D_LDSTPAIR_OFF(InstData &inst, uint32_t bits) {
// bits
// & 11111111110000000000000000000000
// --------------------------------
// 01101101010000000000000000000000
if ((bits & 0xffc00000U) != 0x6d400000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t Rt2 : 5;
uint32_t imm7 : 7;
uint32_t L : 1;
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 1
uint32_t opc : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rt2 = static_cast<uint8_t>(enc.Rt2);
inst.L = static_cast<uint8_t>(enc.L);
inst.V = static_cast<uint8_t>(enc.V);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.imm7.uimm = static_cast<uint64_t>(enc.imm7);
inst.iform = InstForm::LDP_D_LDSTPAIR_OFF;
inst.iclass = InstName::LDP;
return true;
}
static bool TryExtractLDP_Q_LDSTPAIR_OFF(InstData &inst, uint32_t bits) {
// bits
// & 11111111110000000000000000000000
// --------------------------------
// 10101101010000000000000000000000
if ((bits & 0xffc00000U) != 0xad400000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t Rt2 : 5;
uint32_t imm7 : 7;
uint32_t L : 1;
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 1
uint32_t opc : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rt2 = static_cast<uint8_t>(enc.Rt2);
inst.L = static_cast<uint8_t>(enc.L);
inst.V = static_cast<uint8_t>(enc.V);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.imm7.uimm = static_cast<uint64_t>(enc.imm7);
inst.iform = InstForm::LDP_Q_LDSTPAIR_OFF;
inst.iclass = InstName::LDP;
return true;
}
static bool TryExtractSBC_32_ADDSUB_CARRY(InstData &inst, uint32_t bits) {
if (false && TryExtractNGC_SBC_32_ADDSUB_CARRY(inst, bits))
return true;
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 01011010000000000000000000000000
if ((bits & 0xffe0fc00U) != 0x5a000000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t opcode2 : 6;
uint32_t Rm : 5;
uint32_t _21 : 1; // 0
uint32_t _22 : 1; // 0
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t op : 1;
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.opcode2 = static_cast<uint8_t>(enc.opcode2);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.sf = static_cast<uint8_t>(enc.sf);
inst.op = static_cast<uint8_t>(enc.op);
inst.iform = InstForm::SBC_32_ADDSUB_CARRY;
inst.iclass = InstName::SBC;
return true;
}
static bool TryExtractSBC_64_ADDSUB_CARRY(InstData &inst, uint32_t bits) {
if (false && TryExtractNGC_SBC_64_ADDSUB_CARRY(inst, bits))
return true;
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 11011010000000000000000000000000
if ((bits & 0xffe0fc00U) != 0xda000000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t opcode2 : 6;
uint32_t Rm : 5;
uint32_t _21 : 1; // 0
uint32_t _22 : 1; // 0
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t op : 1;
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.opcode2 = static_cast<uint8_t>(enc.opcode2);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.sf = static_cast<uint8_t>(enc.sf);
inst.op = static_cast<uint8_t>(enc.op);
inst.iform = InstForm::SBC_64_ADDSUB_CARRY;
inst.iclass = InstName::SBC;
return true;
}
static bool TryExtractFCVTZU_32H_FLOAT2INT(InstData &inst, uint32_t bits) {
// bits
// & 11111111111111111111110000000000
// --------------------------------
// 00011110111110010000000000000000
if ((bits & 0xfffffc00U) != 0x1ef90000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t _12 : 1; // 0
uint32_t _13 : 1; // 0
uint32_t _14 : 1; // 0
uint32_t _15 : 1; // 0
uint32_t opcode : 3;
uint32_t rmode : 2;
uint32_t _21 : 1; // 1
uint32_t type : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t _30 : 1; // 0
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.sf = static_cast<uint8_t>(enc.sf);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.type = static_cast<uint8_t>(enc.type);
inst.rmode = static_cast<uint8_t>(enc.rmode);
inst.iform = InstForm::FCVTZU_32H_FLOAT2INT;
inst.iclass = InstName::FCVTZU;
return true;
}
static bool TryExtractFCVTZU_64H_FLOAT2INT(InstData &inst, uint32_t bits) {
// bits
// & 11111111111111111111110000000000
// --------------------------------
// 10011110111110010000000000000000
if ((bits & 0xfffffc00U) != 0x9ef90000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t _12 : 1; // 0
uint32_t _13 : 1; // 0
uint32_t _14 : 1; // 0
uint32_t _15 : 1; // 0
uint32_t opcode : 3;
uint32_t rmode : 2;
uint32_t _21 : 1; // 1
uint32_t type : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t _30 : 1; // 0
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.sf = static_cast<uint8_t>(enc.sf);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.type = static_cast<uint8_t>(enc.type);
inst.rmode = static_cast<uint8_t>(enc.rmode);
inst.iform = InstForm::FCVTZU_64H_FLOAT2INT;
inst.iclass = InstName::FCVTZU;
return true;
}
static bool TryExtractFCVTZU_32S_FLOAT2INT(InstData &inst, uint32_t bits) {
// bits
// & 11111111111111111111110000000000
// --------------------------------
// 00011110001110010000000000000000
if ((bits & 0xfffffc00U) != 0x1e390000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t _12 : 1; // 0
uint32_t _13 : 1; // 0
uint32_t _14 : 1; // 0
uint32_t _15 : 1; // 0
uint32_t opcode : 3;
uint32_t rmode : 2;
uint32_t _21 : 1; // 1
uint32_t type : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t _30 : 1; // 0
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.sf = static_cast<uint8_t>(enc.sf);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.type = static_cast<uint8_t>(enc.type);
inst.rmode = static_cast<uint8_t>(enc.rmode);
inst.iform = InstForm::FCVTZU_32S_FLOAT2INT;
inst.iclass = InstName::FCVTZU;
return true;
}
static bool TryExtractFCVTZU_64S_FLOAT2INT(InstData &inst, uint32_t bits) {
// bits
// & 11111111111111111111110000000000
// --------------------------------
// 10011110001110010000000000000000
if ((bits & 0xfffffc00U) != 0x9e390000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t _12 : 1; // 0
uint32_t _13 : 1; // 0
uint32_t _14 : 1; // 0
uint32_t _15 : 1; // 0
uint32_t opcode : 3;
uint32_t rmode : 2;
uint32_t _21 : 1; // 1
uint32_t type : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t _30 : 1; // 0
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.sf = static_cast<uint8_t>(enc.sf);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.type = static_cast<uint8_t>(enc.type);
inst.rmode = static_cast<uint8_t>(enc.rmode);
inst.iform = InstForm::FCVTZU_64S_FLOAT2INT;
inst.iclass = InstName::FCVTZU;
return true;
}
static bool TryExtractFCVTZU_32D_FLOAT2INT(InstData &inst, uint32_t bits) {
// bits
// & 11111111111111111111110000000000
// --------------------------------
// 00011110011110010000000000000000
if ((bits & 0xfffffc00U) != 0x1e790000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t _12 : 1; // 0
uint32_t _13 : 1; // 0
uint32_t _14 : 1; // 0
uint32_t _15 : 1; // 0
uint32_t opcode : 3;
uint32_t rmode : 2;
uint32_t _21 : 1; // 1
uint32_t type : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t _30 : 1; // 0
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.sf = static_cast<uint8_t>(enc.sf);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.type = static_cast<uint8_t>(enc.type);
inst.rmode = static_cast<uint8_t>(enc.rmode);
inst.iform = InstForm::FCVTZU_32D_FLOAT2INT;
inst.iclass = InstName::FCVTZU;
return true;
}
static bool TryExtractFCVTZU_64D_FLOAT2INT(InstData &inst, uint32_t bits) {
// bits
// & 11111111111111111111110000000000
// --------------------------------
// 10011110011110010000000000000000
if ((bits & 0xfffffc00U) != 0x9e790000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t _12 : 1; // 0
uint32_t _13 : 1; // 0
uint32_t _14 : 1; // 0
uint32_t _15 : 1; // 0
uint32_t opcode : 3;
uint32_t rmode : 2;
uint32_t _21 : 1; // 1
uint32_t type : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t _30 : 1; // 0
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.sf = static_cast<uint8_t>(enc.sf);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.type = static_cast<uint8_t>(enc.type);
inst.rmode = static_cast<uint8_t>(enc.rmode);
inst.iform = InstForm::FCVTZU_64D_FLOAT2INT;
inst.iclass = InstName::FCVTZU;
return true;
}
static bool TryExtractCINV_CSINV_32_CONDSEL(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000000000110000000000
// --------------------------------
// 01011010100000000000000000000000
if ((bits & 0xffe00c00U) != 0x5a800000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t o2 : 1;
uint32_t _11 : 1; // 0
uint32_t cond : 4;
uint32_t Rm : 5;
uint32_t _21 : 1; // 0
uint32_t _22 : 1; // 0
uint32_t _23 : 1; // 1
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t op : 1;
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.sf = static_cast<uint8_t>(enc.sf);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.cond = static_cast<uint8_t>(enc.cond);
if (!(inst.cond != 0xe))
return false;
if (!(inst.cond != 0xf))
return false;
inst.Rm = static_cast<uint8_t>(enc.Rm);
if (!(inst.Rm != 0x1f))
return false;
inst.Rn = static_cast<uint8_t>(enc.Rn);
if (!(inst.Rn != 0x1f))
return false;
inst.o2 = static_cast<uint8_t>(enc.o2);
inst.op = static_cast<uint8_t>(enc.op);
inst.iform = InstForm::CINV_CSINV_32_CONDSEL;
inst.iclass = InstName::CSINV;
return true;
}
static bool TryExtractCINV_CSINV_64_CONDSEL(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000000000110000000000
// --------------------------------
// 11011010100000000000000000000000
if ((bits & 0xffe00c00U) != 0xda800000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t o2 : 1;
uint32_t _11 : 1; // 0
uint32_t cond : 4;
uint32_t Rm : 5;
uint32_t _21 : 1; // 0
uint32_t _22 : 1; // 0
uint32_t _23 : 1; // 1
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t op : 1;
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.sf = static_cast<uint8_t>(enc.sf);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.cond = static_cast<uint8_t>(enc.cond);
if (!(inst.cond != 0xe))
return false;
if (!(inst.cond != 0xf))
return false;
inst.Rm = static_cast<uint8_t>(enc.Rm);
if (!(inst.Rm != 0x1f))
return false;
inst.Rn = static_cast<uint8_t>(enc.Rn);
if (!(inst.Rn != 0x1f))
return false;
inst.o2 = static_cast<uint8_t>(enc.o2);
inst.op = static_cast<uint8_t>(enc.op);
inst.iform = InstForm::CINV_CSINV_64_CONDSEL;
inst.iclass = InstName::CSINV;
return true;
}
static bool TryExtractSTR_32_LDST_REGOFF(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000000000110000000000
// --------------------------------
// 10111000001000000000100000000000
if ((bits & 0xffe00c00U) != 0xb8200800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t S : 1;
uint32_t option : 3;
uint32_t Rm : 5;
uint32_t _21 : 1; // 1
uint32_t opc : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.option = static_cast<uint8_t>(enc.option);
inst.V = static_cast<uint8_t>(enc.V);
inst.S = static_cast<uint8_t>(enc.S);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::STR_32_LDST_REGOFF;
inst.iclass = InstName::STR;
return true;
}
static bool TryExtractSTR_64_LDST_REGOFF(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000000000110000000000
// --------------------------------
// 11111000001000000000100000000000
if ((bits & 0xffe00c00U) != 0xf8200800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t S : 1;
uint32_t option : 3;
uint32_t Rm : 5;
uint32_t _21 : 1; // 1
uint32_t opc : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.option = static_cast<uint8_t>(enc.option);
inst.V = static_cast<uint8_t>(enc.V);
inst.S = static_cast<uint8_t>(enc.S);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::STR_64_LDST_REGOFF;
inst.iclass = InstName::STR;
return true;
}
static bool TryExtractFDIV_H_FLOATDP2(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 00011110111000000001100000000000
if ((bits & 0xffe0fc00U) != 0x1ee01800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t opcode : 4;
uint32_t Rm : 5;
uint32_t _21 : 1; // 1
uint32_t type : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t _30 : 1; // 0
uint32_t M : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.M = static_cast<uint8_t>(enc.M);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.type = static_cast<uint8_t>(enc.type);
inst.iform = InstForm::FDIV_H_FLOATDP2;
inst.iclass = InstName::FDIV;
return true;
}
static bool TryExtractFDIV_S_FLOATDP2(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 00011110001000000001100000000000
if ((bits & 0xffe0fc00U) != 0x1e201800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t opcode : 4;
uint32_t Rm : 5;
uint32_t _21 : 1; // 1
uint32_t type : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t _30 : 1; // 0
uint32_t M : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.M = static_cast<uint8_t>(enc.M);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.type = static_cast<uint8_t>(enc.type);
inst.iform = InstForm::FDIV_S_FLOATDP2;
inst.iclass = InstName::FDIV;
return true;
}
static bool TryExtractFDIV_D_FLOATDP2(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 00011110011000000001100000000000
if ((bits & 0xffe0fc00U) != 0x1e601800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t opcode : 4;
uint32_t Rm : 5;
uint32_t _21 : 1; // 1
uint32_t type : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t _30 : 1; // 0
uint32_t M : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.M = static_cast<uint8_t>(enc.M);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.type = static_cast<uint8_t>(enc.type);
inst.iform = InstForm::FDIV_D_FLOATDP2;
inst.iclass = InstName::FDIV;
return true;
}
static bool TryExtractURECPE_ASIMDMISC_R(InstData &inst, uint32_t bits) {
// bits
// & 10111111101111111111110000000000
// --------------------------------
// 00001110101000011100100000000000
if ((bits & 0xbfbffc00U) != 0xea1c800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t opcode : 5;
uint32_t _17 : 1; // 0
uint32_t _18 : 1; // 0
uint32_t _19 : 1; // 0
uint32_t _20 : 1; // 0
uint32_t _21 : 1; // 1
uint32_t sz : 1;
uint32_t _23 : 1; // 1
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.sz = static_cast<uint8_t>(enc.sz);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.U = static_cast<uint8_t>(enc.U);
inst.iform = InstForm::URECPE_ASIMDMISC_R;
inst.iclass = InstName::URECPE;
return true;
}
static bool TryExtractISB_BI_SYSTEM(InstData &inst, uint32_t bits) {
// bits
// & 11111111111111111111000011111111
// --------------------------------
// 11010101000000110011000011011111
if ((bits & 0xfffff0ffU) != 0xd50330dfU) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t opc : 2;
uint32_t _7 : 1; // 1
uint32_t CRm : 4;
uint32_t CRn : 4;
uint32_t op1 : 3;
uint32_t op0 : 2;
uint32_t L : 1;
uint32_t _22 : 1; // 0
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 0
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 0
uint32_t _30 : 1; // 1
uint32_t _31 : 1; // 1
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.op0 = static_cast<uint8_t>(enc.op0);
inst.op1 = static_cast<uint8_t>(enc.op1);
inst.L = static_cast<uint8_t>(enc.L);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.CRn = static_cast<uint8_t>(enc.CRn);
inst.CRm = static_cast<uint8_t>(enc.CRm);
inst.iform = InstForm::ISB_BI_SYSTEM;
inst.iclass = InstName::ISB;
return true;
}
static bool TryExtractRSUBHN_ASIMDDIFF_N(InstData &inst, uint32_t bits) {
// bits
// & 10111111001000001111110000000000
// --------------------------------
// 00101110001000000110000000000000
if ((bits & 0xbf20fc00U) != 0x2e206000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t _12 : 1; // 0
uint32_t o1 : 1;
uint32_t _14 : 1; // 1
uint32_t _15 : 1; // 0
uint32_t Rm : 5;
uint32_t _21 : 1; // 1
uint32_t size : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o1 = static_cast<uint8_t>(enc.o1);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::RSUBHN_ASIMDDIFF_N;
inst.iclass = InstName::RSUBHN;
return true;
}
static bool TryExtractSMULL_ASIMDELEM_L(InstData &inst, uint32_t bits) {
// bits
// & 10111111000000001111010000000000
// --------------------------------
// 00001111000000001010000000000000
if ((bits & 0xbf00f400U) != 0xf00a000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t H : 1;
uint32_t opcode : 4;
uint32_t Rm : 4;
uint32_t M : 1;
uint32_t L : 1;
uint32_t size : 2;
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Q = static_cast<uint8_t>(enc.Q);
inst.H = static_cast<uint8_t>(enc.H);
inst.M = static_cast<uint8_t>(enc.M);
inst.L = static_cast<uint8_t>(enc.L);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.U = static_cast<uint8_t>(enc.U);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::SMULL_ASIMDELEM_L;
inst.iclass = InstName::SMULL;
return true;
}
static bool TryExtractSUQADD_ASISDMISC_R(InstData &inst, uint32_t bits) {
// bits
// & 11111111001111111111110000000000
// --------------------------------
// 01011110001000000011100000000000
if ((bits & 0xff3ffc00U) != 0x5e203800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t opcode : 5;
uint32_t _17 : 1; // 0
uint32_t _18 : 1; // 0
uint32_t _19 : 1; // 0
uint32_t _20 : 1; // 0
uint32_t _21 : 1; // 1
uint32_t size : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t U : 1;
uint32_t _30 : 1; // 1
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::SUQADD_ASISDMISC_R;
inst.iclass = InstName::SUQADD;
return true;
}
static bool TryExtractSUQADD_ASIMDMISC_R(InstData &inst, uint32_t bits) {
// bits
// & 10111111001111111111110000000000
// --------------------------------
// 00001110001000000011100000000000
if ((bits & 0xbf3ffc00U) != 0xe203800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t opcode : 5;
uint32_t _17 : 1; // 0
uint32_t _18 : 1; // 0
uint32_t _19 : 1; // 0
uint32_t _20 : 1; // 0
uint32_t _21 : 1; // 1
uint32_t size : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.U = static_cast<uint8_t>(enc.U);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::SUQADD_ASIMDMISC_R;
inst.iclass = InstName::SUQADD;
return true;
}
static bool TryExtractLDRSH_32_LDST_REGOFF(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000000000110000000000
// --------------------------------
// 01111000111000000000100000000000
if ((bits & 0xffe00c00U) != 0x78e00800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t S : 1;
uint32_t option : 3;
uint32_t Rm : 5;
uint32_t _21 : 1; // 1
uint32_t opc : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.option = static_cast<uint8_t>(enc.option);
inst.V = static_cast<uint8_t>(enc.V);
inst.S = static_cast<uint8_t>(enc.S);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LDRSH_32_LDST_REGOFF;
inst.iclass = InstName::LDRSH;
return true;
}
static bool TryExtractLDRSH_64_LDST_REGOFF(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000000000110000000000
// --------------------------------
// 01111000101000000000100000000000
if ((bits & 0xffe00c00U) != 0x78a00800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t S : 1;
uint32_t option : 3;
uint32_t Rm : 5;
uint32_t _21 : 1; // 1
uint32_t opc : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.option = static_cast<uint8_t>(enc.option);
inst.V = static_cast<uint8_t>(enc.V);
inst.S = static_cast<uint8_t>(enc.S);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LDRSH_64_LDST_REGOFF;
inst.iclass = InstName::LDRSH;
return true;
}
static bool TryExtractADRP_ONLY_PCRELADDR(InstData &inst, uint32_t bits) {
// bits
// & 10011111000000000000000000000000
// --------------------------------
// 10010000000000000000000000000000
if ((bits & 0x9f000000U) != 0x90000000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t immhi : 19;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 0
uint32_t _28 : 1; // 1
uint32_t immlo : 2;
uint32_t op : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.immlo.uimm = static_cast<uint64_t>(enc.immlo);
inst.immhi.uimm = static_cast<uint64_t>(enc.immhi);
inst.op = static_cast<uint8_t>(enc.op);
inst.immhi_immlo.uimm = static_cast<uint64_t>(inst.immhi.uimm);
inst.immhi_immlo.uimm <<= static_cast<uint64_t>(2U);
inst.immhi_immlo.uimm |= static_cast<uint64_t>(inst.immlo.uimm);
inst.iform = InstForm::ADRP_ONLY_PCRELADDR;
inst.iclass = InstName::ADRP;
return true;
}
static bool TryExtractDUP_ASIMDINS_DR_R(InstData &inst, uint32_t bits) {
// bits
// & 10111111111000001111110000000000
// --------------------------------
// 00001110000000000000110000000000
if ((bits & 0xbfe0fc00U) != 0xe000c00U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t imm4 : 4;
uint32_t _15 : 1; // 0
uint32_t imm5 : 5;
uint32_t _21 : 1; // 0
uint32_t _22 : 1; // 0
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t op : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.imm5.uimm = static_cast<uint64_t>(enc.imm5);
inst.imm4.uimm = static_cast<uint64_t>(enc.imm4);
inst.op = static_cast<uint8_t>(enc.op);
inst.iform = InstForm::DUP_ASIMDINS_DR_R;
inst.iclass = InstName::DUP;
return true;
}
static bool TryExtractFABS_H_FLOATDP1(InstData &inst, uint32_t bits) {
// bits
// & 11111111111111111111110000000000
// --------------------------------
// 00011110111000001100000000000000
if ((bits & 0xfffffc00U) != 0x1ee0c000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t _12 : 1; // 0
uint32_t _13 : 1; // 0
uint32_t _14 : 1; // 1
uint32_t opc : 2;
uint32_t _17 : 1; // 0
uint32_t _18 : 1; // 0
uint32_t _19 : 1; // 0
uint32_t _20 : 1; // 0
uint32_t _21 : 1; // 1
uint32_t type : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t _30 : 1; // 0
uint32_t M : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.M = static_cast<uint8_t>(enc.M);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.type = static_cast<uint8_t>(enc.type);
inst.iform = InstForm::FABS_H_FLOATDP1;
inst.iclass = InstName::FABS;
return true;
}
static bool TryExtractFABS_S_FLOATDP1(InstData &inst, uint32_t bits) {
// bits
// & 11111111111111111111110000000000
// --------------------------------
// 00011110001000001100000000000000
if ((bits & 0xfffffc00U) != 0x1e20c000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t _12 : 1; // 0
uint32_t _13 : 1; // 0
uint32_t _14 : 1; // 1
uint32_t opc : 2;
uint32_t _17 : 1; // 0
uint32_t _18 : 1; // 0
uint32_t _19 : 1; // 0
uint32_t _20 : 1; // 0
uint32_t _21 : 1; // 1
uint32_t type : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t _30 : 1; // 0
uint32_t M : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.M = static_cast<uint8_t>(enc.M);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.type = static_cast<uint8_t>(enc.type);
inst.iform = InstForm::FABS_S_FLOATDP1;
inst.iclass = InstName::FABS;
return true;
}
static bool TryExtractFABS_D_FLOATDP1(InstData &inst, uint32_t bits) {
// bits
// & 11111111111111111111110000000000
// --------------------------------
// 00011110011000001100000000000000
if ((bits & 0xfffffc00U) != 0x1e60c000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t _12 : 1; // 0
uint32_t _13 : 1; // 0
uint32_t _14 : 1; // 1
uint32_t opc : 2;
uint32_t _17 : 1; // 0
uint32_t _18 : 1; // 0
uint32_t _19 : 1; // 0
uint32_t _20 : 1; // 0
uint32_t _21 : 1; // 1
uint32_t type : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t _30 : 1; // 0
uint32_t M : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.M = static_cast<uint8_t>(enc.M);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.type = static_cast<uint8_t>(enc.type);
inst.iform = InstForm::FABS_D_FLOATDP1;
inst.iclass = InstName::FABS;
return true;
}
static bool TryExtractREV32_ASIMDMISC_R(InstData &inst, uint32_t bits) {
// bits
// & 10111111001111111111110000000000
// --------------------------------
// 00101110001000000000100000000000
if ((bits & 0xbf3ffc00U) != 0x2e200800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t o0 : 1;
uint32_t _13 : 1; // 0
uint32_t _14 : 1; // 0
uint32_t _15 : 1; // 0
uint32_t _16 : 1; // 0
uint32_t _17 : 1; // 0
uint32_t _18 : 1; // 0
uint32_t _19 : 1; // 0
uint32_t _20 : 1; // 0
uint32_t _21 : 1; // 1
uint32_t size : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o0 = static_cast<uint8_t>(enc.o0);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::REV32_ASIMDMISC_R;
inst.iclass = InstName::REV32;
return true;
}
static bool TryExtractAT_SYS_CR_SYSTEM(InstData &inst, uint32_t bits) {
// bits
// & 11111111111110001111111000000000
// --------------------------------
// 11010101000010000111100000000000
if ((bits & 0xfff8fe00U) != 0xd5087800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t op2 : 3;
uint32_t CRm : 4;
uint32_t CRn : 4;
uint32_t op1 : 3;
uint32_t op0 : 2;
uint32_t L : 1;
uint32_t _22 : 1; // 0
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 0
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 0
uint32_t _30 : 1; // 1
uint32_t _31 : 1; // 1
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.op0 = static_cast<uint8_t>(enc.op0);
inst.op1 = static_cast<uint8_t>(enc.op1);
inst.op2 = static_cast<uint8_t>(enc.op2);
inst.L = static_cast<uint8_t>(enc.L);
inst.CRn = static_cast<uint8_t>(enc.CRn);
inst.CRm = static_cast<uint8_t>(enc.CRm);
inst.iform = InstForm::AT_SYS_CR_SYSTEM;
inst.iclass = InstName::SYS;
return true;
}
static bool TryExtractUQRSHRN_ASISDSHF_N(InstData &inst, uint32_t bits) {
// bits
// & 11111111100000001111110000000000
// --------------------------------
// 01111111000000001001110000000000
if ((bits & 0xff80fc00U) != 0x7f009c00U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t op : 1;
uint32_t _12 : 1; // 1
uint32_t _13 : 1; // 0
uint32_t _14 : 1; // 0
uint32_t _15 : 1; // 1
uint32_t immb : 3;
uint32_t immh : 4;
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t U : 1;
uint32_t _30 : 1; // 1
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.immh.uimm = static_cast<uint64_t>(enc.immh);
if (!(inst.immh.uimm != 0x0))
return false;
inst.immb.uimm = static_cast<uint64_t>(enc.immb);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.op = static_cast<uint8_t>(enc.op);
inst.iform = InstForm::UQRSHRN_ASISDSHF_N;
inst.iclass = InstName::UQRSHRN;
return true;
}
static bool TryExtractUQRSHRN_ASIMDSHF_N(InstData &inst, uint32_t bits) {
// bits
// & 10111111100000001111110000000000
// --------------------------------
// 00101111000000001001110000000000
if ((bits & 0xbf80fc00U) != 0x2f009c00U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t op : 1;
uint32_t _12 : 1; // 1
uint32_t _13 : 1; // 0
uint32_t _14 : 1; // 0
uint32_t _15 : 1; // 1
uint32_t immb : 3;
uint32_t immh : 4;
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.immh.uimm = static_cast<uint64_t>(enc.immh);
if (!(inst.immh.uimm != 0x0))
return false;
inst.immb.uimm = static_cast<uint64_t>(enc.immb);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.op = static_cast<uint8_t>(enc.op);
inst.iform = InstForm::UQRSHRN_ASIMDSHF_N;
inst.iclass = InstName::UQRSHRN;
return true;
}
static bool TryExtractUBFM_32M_BITFIELD(InstData &inst, uint32_t bits) {
if (false && TryExtractUXTH_UBFM_32M_BITFIELD(inst, bits))
return true;
if (false && TryExtractUXTB_UBFM_32M_BITFIELD(inst, bits))
return true;
if (false && TryExtractLSR_UBFM_32M_BITFIELD(inst, bits))
return true;
if (false && TryExtractLSL_UBFM_32M_BITFIELD(inst, bits))
return true;
if (false && TryExtractUBFIZ_UBFM_32M_BITFIELD(inst, bits))
return true;
if (false && TryExtractUBFX_UBFM_32M_BITFIELD(inst, bits))
return true;
// bits
// & 11111111110000000000000000000000
// --------------------------------
// 01010011000000000000000000000000
if ((bits & 0xffc00000U) != 0x53000000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t imms : 6;
uint32_t immr : 6;
uint32_t N : 1;
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 0
uint32_t _28 : 1; // 1
uint32_t opc : 2;
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.sf = static_cast<uint8_t>(enc.sf);
inst.N = static_cast<uint8_t>(enc.N);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.immr.uimm = static_cast<uint64_t>(enc.immr);
inst.imms.uimm = static_cast<uint64_t>(enc.imms);
inst.iform = InstForm::UBFM_32M_BITFIELD;
inst.iclass = InstName::UBFM;
return true;
}
static bool TryExtractUBFM_64M_BITFIELD(InstData &inst, uint32_t bits) {
if (false && TryExtractLSR_UBFM_64M_BITFIELD(inst, bits))
return true;
if (false && TryExtractUBFX_UBFM_64M_BITFIELD(inst, bits))
return true;
if (false && TryExtractUBFIZ_UBFM_64M_BITFIELD(inst, bits))
return true;
if (false && TryExtractLSL_UBFM_64M_BITFIELD(inst, bits))
return true;
// bits
// & 11111111110000000000000000000000
// --------------------------------
// 11010011010000000000000000000000
if ((bits & 0xffc00000U) != 0xd3400000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t imms : 6;
uint32_t immr : 6;
uint32_t N : 1;
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 0
uint32_t _28 : 1; // 1
uint32_t opc : 2;
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.sf = static_cast<uint8_t>(enc.sf);
inst.N = static_cast<uint8_t>(enc.N);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.immr.uimm = static_cast<uint64_t>(enc.immr);
inst.imms.uimm = static_cast<uint64_t>(enc.imms);
inst.iform = InstForm::UBFM_64M_BITFIELD;
inst.iclass = InstName::UBFM;
return true;
}
static bool TryExtractSTNP_32_LDSTNAPAIR_OFFS(InstData &inst, uint32_t bits) {
// bits
// & 11111111110000000000000000000000
// --------------------------------
// 00101000000000000000000000000000
if ((bits & 0xffc00000U) != 0x28000000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t Rt2 : 5;
uint32_t imm7 : 7;
uint32_t L : 1;
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 1
uint32_t opc : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rt2 = static_cast<uint8_t>(enc.Rt2);
inst.L = static_cast<uint8_t>(enc.L);
inst.V = static_cast<uint8_t>(enc.V);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.imm7.uimm = static_cast<uint64_t>(enc.imm7);
inst.iform = InstForm::STNP_32_LDSTNAPAIR_OFFS;
inst.iclass = InstName::STNP;
return true;
}
static bool TryExtractSTNP_64_LDSTNAPAIR_OFFS(InstData &inst, uint32_t bits) {
// bits
// & 11111111110000000000000000000000
// --------------------------------
// 10101000000000000000000000000000
if ((bits & 0xffc00000U) != 0xa8000000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t Rt2 : 5;
uint32_t imm7 : 7;
uint32_t L : 1;
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 1
uint32_t opc : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rt2 = static_cast<uint8_t>(enc.Rt2);
inst.L = static_cast<uint8_t>(enc.L);
inst.V = static_cast<uint8_t>(enc.V);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.imm7.uimm = static_cast<uint64_t>(enc.imm7);
inst.iform = InstForm::STNP_64_LDSTNAPAIR_OFFS;
inst.iclass = InstName::STNP;
return true;
}
static bool TryExtractLDARB_LR32_LDSTEXCL(InstData &inst, uint32_t bits) {
// bits
// & 11111111111111111111110000000000
// --------------------------------
// 00001000110111111111110000000000
if ((bits & 0xfffffc00U) != 0x8dffc00U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t Rt2 : 5;
uint32_t o0 : 1;
uint32_t Rs : 5;
uint32_t o1 : 1;
uint32_t L : 1;
uint32_t o2 : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 0
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.L = static_cast<uint8_t>(enc.L);
inst.Rt2 = static_cast<uint8_t>(enc.Rt2);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.o2 = static_cast<uint8_t>(enc.o2);
inst.o1 = static_cast<uint8_t>(enc.o1);
inst.o0 = static_cast<uint8_t>(enc.o0);
inst.iform = InstForm::LDARB_LR32_LDSTEXCL;
inst.iclass = InstName::LDARB;
return true;
}
static bool TryExtractSRSRA_ASISDSHF_R(InstData &inst, uint32_t bits) {
// bits
// & 11111111100000001111110000000000
// --------------------------------
// 01011111000000000011010000000000
if ((bits & 0xff80fc00U) != 0x5f003400U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t _11 : 1; // 0
uint32_t o0 : 1;
uint32_t o1 : 1;
uint32_t _14 : 1; // 0
uint32_t _15 : 1; // 0
uint32_t immb : 3;
uint32_t immh : 4;
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t U : 1;
uint32_t _30 : 1; // 1
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.immh.uimm = static_cast<uint64_t>(enc.immh);
if (!(inst.immh.uimm != 0x0))
return false;
inst.immb.uimm = static_cast<uint64_t>(enc.immb);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o1 = static_cast<uint8_t>(enc.o1);
inst.o0 = static_cast<uint8_t>(enc.o0);
inst.iform = InstForm::SRSRA_ASISDSHF_R;
inst.iclass = InstName::SRSRA;
return true;
}
static bool TryExtractSRSRA_ASIMDSHF_R(InstData &inst, uint32_t bits) {
// bits
// & 10111111100000001111110000000000
// --------------------------------
// 00001111000000000011010000000000
if ((bits & 0xbf80fc00U) != 0xf003400U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t _11 : 1; // 0
uint32_t o0 : 1;
uint32_t o1 : 1;
uint32_t _14 : 1; // 0
uint32_t _15 : 1; // 0
uint32_t immb : 3;
uint32_t immh : 4;
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.immh.uimm = static_cast<uint64_t>(enc.immh);
if (!(inst.immh.uimm != 0x0))
return false;
inst.immb.uimm = static_cast<uint64_t>(enc.immb);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o1 = static_cast<uint8_t>(enc.o1);
inst.o0 = static_cast<uint8_t>(enc.o0);
inst.iform = InstForm::SRSRA_ASIMDSHF_R;
inst.iclass = InstName::SRSRA;
return true;
}
static bool TryExtractCMGE_ASISDSAME_ONLY(InstData &inst, uint32_t bits) {
// bits
// & 11111111001000001111110000000000
// --------------------------------
// 01011110001000000011110000000000
if ((bits & 0xff20fc00U) != 0x5e203c00U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t eq : 1;
uint32_t _12 : 1; // 1
uint32_t _13 : 1; // 1
uint32_t _14 : 1; // 0
uint32_t _15 : 1; // 0
uint32_t Rm : 5;
uint32_t _21 : 1; // 1
uint32_t size : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t U : 1;
uint32_t _30 : 1; // 1
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.eq = static_cast<uint8_t>(enc.eq);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::CMGE_ASISDSAME_ONLY;
inst.iclass = InstName::CMGE;
return true;
}
static bool TryExtractCMGE_ASIMDSAME_ONLY(InstData &inst, uint32_t bits) {
// bits
// & 10111111001000001111110000000000
// --------------------------------
// 00001110001000000011110000000000
if ((bits & 0xbf20fc00U) != 0xe203c00U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t eq : 1;
uint32_t _12 : 1; // 1
uint32_t _13 : 1; // 1
uint32_t _14 : 1; // 0
uint32_t _15 : 1; // 0
uint32_t Rm : 5;
uint32_t _21 : 1; // 1
uint32_t size : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.eq = static_cast<uint8_t>(enc.eq);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::CMGE_ASIMDSAME_ONLY;
inst.iclass = InstName::CMGE;
return true;
}
static bool TryExtractFADD_ASIMDSAMEFP16_ONLY(InstData &inst, uint32_t bits) {
// bits
// & 10111111111000001111110000000000
// --------------------------------
// 00001110010000000001010000000000
if ((bits & 0xbfe0fc00U) != 0xe401400U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t opcode : 3;
uint32_t _14 : 1; // 0
uint32_t _15 : 1; // 0
uint32_t Rm : 5;
uint32_t _21 : 1; // 0
uint32_t _22 : 1; // 1
uint32_t a : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.a = static_cast<uint8_t>(enc.a);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.U = static_cast<uint8_t>(enc.U);
inst.iform = InstForm::FADD_ASIMDSAMEFP16_ONLY;
inst.iclass = InstName::FADD;
return true;
}
static bool TryExtractFADD_ASIMDSAME_ONLY(InstData &inst, uint32_t bits) {
// bits
// & 10111111101000001111110000000000
// --------------------------------
// 00001110001000001101010000000000
if ((bits & 0xbfa0fc00U) != 0xe20d400U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t opcode : 5;
uint32_t Rm : 5;
uint32_t _21 : 1; // 1
uint32_t sz : 1;
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.sz = static_cast<uint8_t>(enc.sz);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.U = static_cast<uint8_t>(enc.U);
inst.iform = InstForm::FADD_ASIMDSAME_ONLY;
inst.iclass = InstName::FADD;
return true;
}
static bool TryExtractSQRDMLAH_ASISDSAME2_ONLY(InstData &inst, uint32_t bits) {
// bits
// & 11111111001000001111110000000000
// --------------------------------
// 01111110000000001000010000000000
if ((bits & 0xff20fc00U) != 0x7e008400U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t S : 1;
uint32_t _12 : 1; // 0
uint32_t _13 : 1; // 0
uint32_t _14 : 1; // 0
uint32_t _15 : 1; // 1
uint32_t Rm : 5;
uint32_t _21 : 1; // 0
uint32_t size : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t U : 1;
uint32_t _30 : 1; // 1
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::SQRDMLAH_ASISDSAME2_ONLY;
inst.iclass = InstName::SQRDMLAH;
return true;
}
static bool TryExtractSQRDMLAH_ASIMDSAME2_ONLY(InstData &inst, uint32_t bits) {
// bits
// & 10111111001000001111110000000000
// --------------------------------
// 00101110000000001000010000000000
if ((bits & 0xbf20fc00U) != 0x2e008400U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t S : 1;
uint32_t _12 : 1; // 0
uint32_t _13 : 1; // 0
uint32_t _14 : 1; // 0
uint32_t _15 : 1; // 1
uint32_t Rm : 5;
uint32_t _21 : 1; // 0
uint32_t size : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::SQRDMLAH_ASIMDSAME2_ONLY;
inst.iclass = InstName::SQRDMLAH;
return true;
}
static bool TryExtractORN_ASIMDSAME_ONLY(InstData &inst, uint32_t bits) {
// bits
// & 10111111111000001111110000000000
// --------------------------------
// 00001110111000000001110000000000
if ((bits & 0xbfe0fc00U) != 0xee01c00U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t opcode : 5;
uint32_t Rm : 5;
uint32_t _21 : 1; // 1
uint32_t size : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.U = static_cast<uint8_t>(enc.U);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::ORN_ASIMDSAME_ONLY;
inst.iclass = InstName::ORN;
return true;
}
static bool TryExtractSTSETB_32S_MEMOP(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000011111
// --------------------------------
// 00111000001000000011000000011111
if ((bits & 0xffe0fc1fU) != 0x3820301fU) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t opc : 3;
uint32_t o3 : 1;
uint32_t Rs : 5;
uint32_t _21 : 1; // 1
uint32_t R : 1;
uint32_t A : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.A = static_cast<uint8_t>(enc.A);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.V = static_cast<uint8_t>(enc.V);
inst.R = static_cast<uint8_t>(enc.R);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o3 = static_cast<uint8_t>(enc.o3);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::STSETB_32S_MEMOP;
inst.iclass = InstName::STSETB;
return true;
}
static bool TryExtractSTSETLB_32S_MEMOP(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000011111
// --------------------------------
// 00111000011000000011000000011111
if ((bits & 0xffe0fc1fU) != 0x3860301fU) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t opc : 3;
uint32_t o3 : 1;
uint32_t Rs : 5;
uint32_t _21 : 1; // 1
uint32_t R : 1;
uint32_t A : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.A = static_cast<uint8_t>(enc.A);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.V = static_cast<uint8_t>(enc.V);
inst.R = static_cast<uint8_t>(enc.R);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o3 = static_cast<uint8_t>(enc.o3);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::STSETLB_32S_MEMOP;
inst.iclass = InstName::STSETLB;
return true;
}
static bool TryExtractADC_32_ADDSUB_CARRY(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 00011010000000000000000000000000
if ((bits & 0xffe0fc00U) != 0x1a000000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t opcode2 : 6;
uint32_t Rm : 5;
uint32_t _21 : 1; // 0
uint32_t _22 : 1; // 0
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t op : 1;
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.opcode2 = static_cast<uint8_t>(enc.opcode2);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.sf = static_cast<uint8_t>(enc.sf);
inst.op = static_cast<uint8_t>(enc.op);
inst.iform = InstForm::ADC_32_ADDSUB_CARRY;
inst.iclass = InstName::ADC;
return true;
}
static bool TryExtractADC_64_ADDSUB_CARRY(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 10011010000000000000000000000000
if ((bits & 0xffe0fc00U) != 0x9a000000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t opcode2 : 6;
uint32_t Rm : 5;
uint32_t _21 : 1; // 0
uint32_t _22 : 1; // 0
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t op : 1;
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.opcode2 = static_cast<uint8_t>(enc.opcode2);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.sf = static_cast<uint8_t>(enc.sf);
inst.op = static_cast<uint8_t>(enc.op);
inst.iform = InstForm::ADC_64_ADDSUB_CARRY;
inst.iclass = InstName::ADC;
return true;
}
static bool TryExtractBFC_BFM_32M_BITFIELD(InstData &inst, uint32_t bits) {
// bits
// & 11111111110000000000001111100000
// --------------------------------
// 00110011000000000000001111100000
if ((bits & 0xffc003e0U) != 0x330003e0U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t imms : 6;
uint32_t immr : 6;
uint32_t N : 1;
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 0
uint32_t _28 : 1; // 1
uint32_t opc : 2;
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.sf = static_cast<uint8_t>(enc.sf);
inst.N = static_cast<uint8_t>(enc.N);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.immr.uimm = static_cast<uint64_t>(enc.immr);
inst.imms.uimm = static_cast<uint64_t>(enc.imms);
inst.iform = InstForm::BFC_BFM_32M_BITFIELD;
inst.iclass = InstName::BFM;
return true;
}
static bool TryExtractBFC_BFM_64M_BITFIELD(InstData &inst, uint32_t bits) {
// bits
// & 11111111110000000000001111100000
// --------------------------------
// 10110011010000000000001111100000
if ((bits & 0xffc003e0U) != 0xb34003e0U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t imms : 6;
uint32_t immr : 6;
uint32_t N : 1;
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 0
uint32_t _28 : 1; // 1
uint32_t opc : 2;
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.sf = static_cast<uint8_t>(enc.sf);
inst.N = static_cast<uint8_t>(enc.N);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.immr.uimm = static_cast<uint64_t>(enc.immr);
inst.imms.uimm = static_cast<uint64_t>(enc.imms);
inst.iform = InstForm::BFC_BFM_64M_BITFIELD;
inst.iclass = InstName::BFM;
return true;
}
static bool TryExtractLD2R_ASISDLSO_R2(InstData &inst, uint32_t bits) {
// bits
// & 10111111111111111111000000000000
// --------------------------------
// 00001101011000001100000000000000
if ((bits & 0xbffff000U) != 0xd60c000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t size : 2;
uint32_t S : 1;
uint32_t opcode : 3;
uint32_t _16 : 1; // 0
uint32_t _17 : 1; // 0
uint32_t _18 : 1; // 0
uint32_t _19 : 1; // 0
uint32_t _20 : 1; // 0
uint32_t R : 1;
uint32_t L : 1;
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 0
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.L = static_cast<uint8_t>(enc.L);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.S = static_cast<uint8_t>(enc.S);
inst.R = static_cast<uint8_t>(enc.R);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LD2R_ASISDLSO_R2;
inst.iclass = InstName::LD2R;
return true;
}
static bool TryExtractLD2R_ASISDLSOP_R2_I(InstData &inst, uint32_t bits) {
// bits
// & 10111111111111111111000000000000
// --------------------------------
// 00001101111111111100000000000000
if ((bits & 0xbffff000U) != 0xdffc000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t size : 2;
uint32_t S : 1;
uint32_t opcode : 3;
uint32_t Rm : 5;
uint32_t R : 1;
uint32_t L : 1;
uint32_t _23 : 1; // 1
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 0
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.L = static_cast<uint8_t>(enc.L);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.S = static_cast<uint8_t>(enc.S);
inst.R = static_cast<uint8_t>(enc.R);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LD2R_ASISDLSOP_R2_I;
inst.iclass = InstName::LD2R;
return true;
}
static bool TryExtractLD2R_ASISDLSOP_RX2_R(InstData &inst, uint32_t bits) {
// bits
// & 10111111111000001111000000000000
// --------------------------------
// 00001101111000001100000000000000
if ((bits & 0xbfe0f000U) != 0xde0c000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t size : 2;
uint32_t S : 1;
uint32_t opcode : 3;
uint32_t Rm : 5;
uint32_t R : 1;
uint32_t L : 1;
uint32_t _23 : 1; // 1
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 0
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.L = static_cast<uint8_t>(enc.L);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.S = static_cast<uint8_t>(enc.S);
inst.R = static_cast<uint8_t>(enc.R);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LD2R_ASISDLSOP_RX2_R;
inst.iclass = InstName::LD2R;
return true;
}
static bool TryExtractCSINC_32_CONDSEL(InstData &inst, uint32_t bits) {
if (false && TryExtractCSET_CSINC_32_CONDSEL(inst, bits))
return true;
if (false && TryExtractCINC_CSINC_32_CONDSEL(inst, bits))
return true;
// bits
// & 11111111111000000000110000000000
// --------------------------------
// 00011010100000000000010000000000
if ((bits & 0xffe00c00U) != 0x1a800400U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t o2 : 1;
uint32_t _11 : 1; // 0
uint32_t cond : 4;
uint32_t Rm : 5;
uint32_t _21 : 1; // 0
uint32_t _22 : 1; // 0
uint32_t _23 : 1; // 1
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t op : 1;
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.sf = static_cast<uint8_t>(enc.sf);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.cond = static_cast<uint8_t>(enc.cond);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o2 = static_cast<uint8_t>(enc.o2);
inst.op = static_cast<uint8_t>(enc.op);
inst.iform = InstForm::CSINC_32_CONDSEL;
inst.iclass = InstName::CSINC;
return true;
}
static bool TryExtractCSINC_64_CONDSEL(InstData &inst, uint32_t bits) {
if (false && TryExtractCSET_CSINC_64_CONDSEL(inst, bits))
return true;
if (false && TryExtractCINC_CSINC_64_CONDSEL(inst, bits))
return true;
// bits
// & 11111111111000000000110000000000
// --------------------------------
// 10011010100000000000010000000000
if ((bits & 0xffe00c00U) != 0x9a800400U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t o2 : 1;
uint32_t _11 : 1; // 0
uint32_t cond : 4;
uint32_t Rm : 5;
uint32_t _21 : 1; // 0
uint32_t _22 : 1; // 0
uint32_t _23 : 1; // 1
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t op : 1;
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.sf = static_cast<uint8_t>(enc.sf);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.cond = static_cast<uint8_t>(enc.cond);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o2 = static_cast<uint8_t>(enc.o2);
inst.op = static_cast<uint8_t>(enc.op);
inst.iform = InstForm::CSINC_64_CONDSEL;
inst.iclass = InstName::CSINC;
return true;
}
static bool TryExtractFMLS_ASISDELEM_RH_H(InstData &inst, uint32_t bits) {
// bits
// & 11111111110000001111010000000000
// --------------------------------
// 01011111000000000101000000000000
if ((bits & 0xffc0f400U) != 0x5f005000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t H : 1;
uint32_t _12 : 1; // 1
uint32_t _13 : 1; // 0
uint32_t o2 : 1;
uint32_t _15 : 1; // 0
uint32_t Rm : 4;
uint32_t M : 1;
uint32_t L : 1;
uint32_t size : 2;
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t U : 1;
uint32_t _30 : 1; // 1
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.H = static_cast<uint8_t>(enc.H);
inst.M = static_cast<uint8_t>(enc.M);
inst.L = static_cast<uint8_t>(enc.L);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o2 = static_cast<uint8_t>(enc.o2);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::FMLS_ASISDELEM_RH_H;
inst.iclass = InstName::FMLS;
return true;
}
static bool TryExtractFMLS_ASISDELEM_R_SD(InstData &inst, uint32_t bits) {
// bits
// & 11111111100000001111010000000000
// --------------------------------
// 01011111100000000101000000000000
if ((bits & 0xff80f400U) != 0x5f805000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t H : 1;
uint32_t _12 : 1; // 1
uint32_t _13 : 1; // 0
uint32_t o2 : 1;
uint32_t _15 : 1; // 0
uint32_t Rm : 4;
uint32_t M : 1;
uint32_t L : 1;
uint32_t sz : 1;
uint32_t _23 : 1; // 1
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t U : 1;
uint32_t _30 : 1; // 1
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.sz = static_cast<uint8_t>(enc.sz);
inst.H = static_cast<uint8_t>(enc.H);
inst.M = static_cast<uint8_t>(enc.M);
inst.L = static_cast<uint8_t>(enc.L);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o2 = static_cast<uint8_t>(enc.o2);
inst.iform = InstForm::FMLS_ASISDELEM_R_SD;
inst.iclass = InstName::FMLS;
return true;
}
static bool TryExtractFMLS_ASIMDELEM_RH_H(InstData &inst, uint32_t bits) {
// bits
// & 10111111110000001111010000000000
// --------------------------------
// 00001111000000000101000000000000
if ((bits & 0xbfc0f400U) != 0xf005000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t H : 1;
uint32_t _12 : 1; // 1
uint32_t _13 : 1; // 0
uint32_t o2 : 1;
uint32_t _15 : 1; // 0
uint32_t Rm : 4;
uint32_t M : 1;
uint32_t L : 1;
uint32_t size : 2;
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Q = static_cast<uint8_t>(enc.Q);
inst.H = static_cast<uint8_t>(enc.H);
inst.M = static_cast<uint8_t>(enc.M);
inst.L = static_cast<uint8_t>(enc.L);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o2 = static_cast<uint8_t>(enc.o2);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::FMLS_ASIMDELEM_RH_H;
inst.iclass = InstName::FMLS;
return true;
}
static bool TryExtractFMLS_ASIMDELEM_R_SD(InstData &inst, uint32_t bits) {
// bits
// & 10111111100000001111010000000000
// --------------------------------
// 00001111100000000101000000000000
if ((bits & 0xbf80f400U) != 0xf805000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t H : 1;
uint32_t _12 : 1; // 1
uint32_t _13 : 1; // 0
uint32_t o2 : 1;
uint32_t _15 : 1; // 0
uint32_t Rm : 4;
uint32_t M : 1;
uint32_t L : 1;
uint32_t sz : 1;
uint32_t _23 : 1; // 1
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.sz = static_cast<uint8_t>(enc.sz);
inst.H = static_cast<uint8_t>(enc.H);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.M = static_cast<uint8_t>(enc.M);
inst.L = static_cast<uint8_t>(enc.L);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o2 = static_cast<uint8_t>(enc.o2);
inst.iform = InstForm::FMLS_ASIMDELEM_R_SD;
inst.iclass = InstName::FMLS;
return true;
}
static bool TryExtractSHA256H2_QQV_CRYPTOSHA3(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 01011110000000000101000000000000
if ((bits & 0xffe0fc00U) != 0x5e005000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t P : 1;
uint32_t _13 : 1; // 0
uint32_t _14 : 1; // 1
uint32_t _15 : 1; // 0
uint32_t Rm : 5;
uint32_t _21 : 1; // 0
uint32_t size : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 0
uint32_t _30 : 1; // 1
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.P = static_cast<uint8_t>(enc.P);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.iform = InstForm::SHA256H2_QQV_CRYPTOSHA3;
inst.iclass = InstName::SHA256H2;
return true;
}
static bool TryExtractRBIT_ASIMDMISC_R(InstData &inst, uint32_t bits) {
// bits
// & 10111111111111111111110000000000
// --------------------------------
// 00101110011000000101100000000000
if ((bits & 0xbffffc00U) != 0x2e605800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t opcode : 5;
uint32_t _17 : 1; // 0
uint32_t _18 : 1; // 0
uint32_t _19 : 1; // 0
uint32_t _20 : 1; // 0
uint32_t _21 : 1; // 1
uint32_t size : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.U = static_cast<uint8_t>(enc.U);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::RBIT_ASIMDMISC_R;
inst.iclass = InstName::RBIT;
return true;
}
static bool TryExtractRSHRN_ASIMDSHF_N(InstData &inst, uint32_t bits) {
// bits
// & 10111111100000001111110000000000
// --------------------------------
// 00001111000000001000110000000000
if ((bits & 0xbf80fc00U) != 0xf008c00U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t op : 1;
uint32_t _12 : 1; // 0
uint32_t _13 : 1; // 0
uint32_t _14 : 1; // 0
uint32_t _15 : 1; // 1
uint32_t immb : 3;
uint32_t immh : 4;
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.immh.uimm = static_cast<uint64_t>(enc.immh);
if (!(inst.immh.uimm != 0x0))
return false;
inst.immb.uimm = static_cast<uint64_t>(enc.immb);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.op = static_cast<uint8_t>(enc.op);
inst.iform = InstForm::RSHRN_ASIMDSHF_N;
inst.iclass = InstName::RSHRN;
return true;
}
static bool TryExtractUMOV_ASIMDINS_W_W(InstData &inst, uint32_t bits) {
if (false && TryExtractMOV_UMOV_ASIMDINS_W_W(inst, bits))
return true;
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 00001110000000000011110000000000
if ((bits & 0xffe0fc00U) != 0xe003c00U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t imm4 : 4;
uint32_t _15 : 1; // 0
uint32_t imm5 : 5;
uint32_t _21 : 1; // 0
uint32_t _22 : 1; // 0
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t op : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.imm5.uimm = static_cast<uint64_t>(enc.imm5);
inst.imm4.uimm = static_cast<uint64_t>(enc.imm4);
inst.op = static_cast<uint8_t>(enc.op);
inst.iform = InstForm::UMOV_ASIMDINS_W_W;
inst.iclass = InstName::UMOV;
return true;
}
static bool TryExtractUMOV_ASIMDINS_X_X(InstData &inst, uint32_t bits) {
if (false && TryExtractMOV_UMOV_ASIMDINS_X_X(inst, bits))
return true;
// bits
// & 11111111111011111111110000000000
// --------------------------------
// 01001110000010000011110000000000
if ((bits & 0xffeffc00U) != 0x4e083c00U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t imm4 : 4;
uint32_t _15 : 1; // 0
uint32_t imm5 : 5;
uint32_t _21 : 1; // 0
uint32_t _22 : 1; // 0
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t op : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.imm5.uimm = static_cast<uint64_t>(enc.imm5);
inst.imm4.uimm = static_cast<uint64_t>(enc.imm4);
inst.op = static_cast<uint8_t>(enc.op);
inst.iform = InstForm::UMOV_ASIMDINS_X_X;
inst.iclass = InstName::UMOV;
return true;
}
static bool TryExtractFCVTZS_32H_FLOAT2INT(InstData &inst, uint32_t bits) {
// bits
// & 11111111111111111111110000000000
// --------------------------------
// 00011110111110000000000000000000
if ((bits & 0xfffffc00U) != 0x1ef80000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t _12 : 1; // 0
uint32_t _13 : 1; // 0
uint32_t _14 : 1; // 0
uint32_t _15 : 1; // 0
uint32_t opcode : 3;
uint32_t rmode : 2;
uint32_t _21 : 1; // 1
uint32_t type : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t _30 : 1; // 0
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.sf = static_cast<uint8_t>(enc.sf);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.type = static_cast<uint8_t>(enc.type);
inst.rmode = static_cast<uint8_t>(enc.rmode);
inst.iform = InstForm::FCVTZS_32H_FLOAT2INT;
inst.iclass = InstName::FCVTZS;
return true;
}
static bool TryExtractFCVTZS_64H_FLOAT2INT(InstData &inst, uint32_t bits) {
// bits
// & 11111111111111111111110000000000
// --------------------------------
// 10011110111110000000000000000000
if ((bits & 0xfffffc00U) != 0x9ef80000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t _12 : 1; // 0
uint32_t _13 : 1; // 0
uint32_t _14 : 1; // 0
uint32_t _15 : 1; // 0
uint32_t opcode : 3;
uint32_t rmode : 2;
uint32_t _21 : 1; // 1
uint32_t type : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t _30 : 1; // 0
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.sf = static_cast<uint8_t>(enc.sf);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.type = static_cast<uint8_t>(enc.type);
inst.rmode = static_cast<uint8_t>(enc.rmode);
inst.iform = InstForm::FCVTZS_64H_FLOAT2INT;
inst.iclass = InstName::FCVTZS;
return true;
}
static bool TryExtractFCVTZS_32S_FLOAT2INT(InstData &inst, uint32_t bits) {
// bits
// & 11111111111111111111110000000000
// --------------------------------
// 00011110001110000000000000000000
if ((bits & 0xfffffc00U) != 0x1e380000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t _12 : 1; // 0
uint32_t _13 : 1; // 0
uint32_t _14 : 1; // 0
uint32_t _15 : 1; // 0
uint32_t opcode : 3;
uint32_t rmode : 2;
uint32_t _21 : 1; // 1
uint32_t type : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t _30 : 1; // 0
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.sf = static_cast<uint8_t>(enc.sf);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.type = static_cast<uint8_t>(enc.type);
inst.rmode = static_cast<uint8_t>(enc.rmode);
inst.iform = InstForm::FCVTZS_32S_FLOAT2INT;
inst.iclass = InstName::FCVTZS;
return true;
}
static bool TryExtractFCVTZS_64S_FLOAT2INT(InstData &inst, uint32_t bits) {
// bits
// & 11111111111111111111110000000000
// --------------------------------
// 10011110001110000000000000000000
if ((bits & 0xfffffc00U) != 0x9e380000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t _12 : 1; // 0
uint32_t _13 : 1; // 0
uint32_t _14 : 1; // 0
uint32_t _15 : 1; // 0
uint32_t opcode : 3;
uint32_t rmode : 2;
uint32_t _21 : 1; // 1
uint32_t type : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t _30 : 1; // 0
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.sf = static_cast<uint8_t>(enc.sf);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.type = static_cast<uint8_t>(enc.type);
inst.rmode = static_cast<uint8_t>(enc.rmode);
inst.iform = InstForm::FCVTZS_64S_FLOAT2INT;
inst.iclass = InstName::FCVTZS;
return true;
}
static bool TryExtractFCVTZS_32D_FLOAT2INT(InstData &inst, uint32_t bits) {
// bits
// & 11111111111111111111110000000000
// --------------------------------
// 00011110011110000000000000000000
if ((bits & 0xfffffc00U) != 0x1e780000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t _12 : 1; // 0
uint32_t _13 : 1; // 0
uint32_t _14 : 1; // 0
uint32_t _15 : 1; // 0
uint32_t opcode : 3;
uint32_t rmode : 2;
uint32_t _21 : 1; // 1
uint32_t type : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t _30 : 1; // 0
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.sf = static_cast<uint8_t>(enc.sf);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.type = static_cast<uint8_t>(enc.type);
inst.rmode = static_cast<uint8_t>(enc.rmode);
inst.iform = InstForm::FCVTZS_32D_FLOAT2INT;
inst.iclass = InstName::FCVTZS;
return true;
}
static bool TryExtractFCVTZS_64D_FLOAT2INT(InstData &inst, uint32_t bits) {
// bits
// & 11111111111111111111110000000000
// --------------------------------
// 10011110011110000000000000000000
if ((bits & 0xfffffc00U) != 0x9e780000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t _12 : 1; // 0
uint32_t _13 : 1; // 0
uint32_t _14 : 1; // 0
uint32_t _15 : 1; // 0
uint32_t opcode : 3;
uint32_t rmode : 2;
uint32_t _21 : 1; // 1
uint32_t type : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t _30 : 1; // 0
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.sf = static_cast<uint8_t>(enc.sf);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.type = static_cast<uint8_t>(enc.type);
inst.rmode = static_cast<uint8_t>(enc.rmode);
inst.iform = InstForm::FCVTZS_64D_FLOAT2INT;
inst.iclass = InstName::FCVTZS;
return true;
}
static bool TryExtractNOP_HI_SYSTEM(InstData &inst, uint32_t bits) {
// bits
// & 11111111111111111111111111111111
// --------------------------------
// 11010101000000110010000000011111
if ((bits & 0xffffffffU) != 0xd503201fU) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t op2 : 3;
uint32_t CRm : 4;
uint32_t CRn : 4;
uint32_t op1 : 3;
uint32_t op0 : 2;
uint32_t L : 1;
uint32_t _22 : 1; // 0
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 0
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 0
uint32_t _30 : 1; // 1
uint32_t _31 : 1; // 1
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.op0 = static_cast<uint8_t>(enc.op0);
inst.op1 = static_cast<uint8_t>(enc.op1);
inst.op2 = static_cast<uint8_t>(enc.op2);
inst.L = static_cast<uint8_t>(enc.L);
inst.CRn = static_cast<uint8_t>(enc.CRn);
inst.CRm = static_cast<uint8_t>(enc.CRm);
inst.iform = InstForm::NOP_HI_SYSTEM;
inst.iclass = InstName::NOP;
return true;
}
static bool TryExtractFCVTMS_ASISDMISCFP16_R(InstData &inst, uint32_t bits) {
// bits
// & 11111111111111111111110000000000
// --------------------------------
// 01011110011110011011100000000000
if ((bits & 0xfffffc00U) != 0x5e79b800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t o1 : 1;
uint32_t _13 : 1; // 1
uint32_t _14 : 1; // 0
uint32_t _15 : 1; // 1
uint32_t _16 : 1; // 1
uint32_t _17 : 1; // 0
uint32_t _18 : 1; // 0
uint32_t _19 : 1; // 1
uint32_t _20 : 1; // 1
uint32_t _21 : 1; // 1
uint32_t _22 : 1; // 1
uint32_t o2 : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t U : 1;
uint32_t _30 : 1; // 1
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.U = static_cast<uint8_t>(enc.U);
inst.o2 = static_cast<uint8_t>(enc.o2);
inst.o1 = static_cast<uint8_t>(enc.o1);
inst.iform = InstForm::FCVTMS_ASISDMISCFP16_R;
inst.iclass = InstName::FCVTMS;
return true;
}
static bool TryExtractFCVTMS_ASISDMISC_R(InstData &inst, uint32_t bits) {
// bits
// & 11111111101111111111110000000000
// --------------------------------
// 01011110001000011011100000000000
if ((bits & 0xffbffc00U) != 0x5e21b800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t o1 : 1;
uint32_t _13 : 1; // 1
uint32_t _14 : 1; // 0
uint32_t _15 : 1; // 1
uint32_t _16 : 1; // 1
uint32_t _17 : 1; // 0
uint32_t _18 : 1; // 0
uint32_t _19 : 1; // 0
uint32_t _20 : 1; // 0
uint32_t _21 : 1; // 1
uint32_t sz : 1;
uint32_t o2 : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t U : 1;
uint32_t _30 : 1; // 1
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.sz = static_cast<uint8_t>(enc.sz);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o2 = static_cast<uint8_t>(enc.o2);
inst.o1 = static_cast<uint8_t>(enc.o1);
inst.iform = InstForm::FCVTMS_ASISDMISC_R;
inst.iclass = InstName::FCVTMS;
return true;
}
static bool TryExtractFCVTMS_ASIMDMISCFP16_R(InstData &inst, uint32_t bits) {
// bits
// & 10111111111111111111110000000000
// --------------------------------
// 00001110011110011011100000000000
if ((bits & 0xbffffc00U) != 0xe79b800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t o1 : 1;
uint32_t _13 : 1; // 1
uint32_t _14 : 1; // 0
uint32_t _15 : 1; // 1
uint32_t _16 : 1; // 1
uint32_t _17 : 1; // 0
uint32_t _18 : 1; // 0
uint32_t _19 : 1; // 1
uint32_t _20 : 1; // 1
uint32_t _21 : 1; // 1
uint32_t _22 : 1; // 1
uint32_t o2 : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o2 = static_cast<uint8_t>(enc.o2);
inst.o1 = static_cast<uint8_t>(enc.o1);
inst.iform = InstForm::FCVTMS_ASIMDMISCFP16_R;
inst.iclass = InstName::FCVTMS;
return true;
}
static bool TryExtractFCVTMS_ASIMDMISC_R(InstData &inst, uint32_t bits) {
// bits
// & 10111111101111111111110000000000
// --------------------------------
// 00001110001000011011100000000000
if ((bits & 0xbfbffc00U) != 0xe21b800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t o1 : 1;
uint32_t _13 : 1; // 1
uint32_t _14 : 1; // 0
uint32_t _15 : 1; // 1
uint32_t _16 : 1; // 1
uint32_t _17 : 1; // 0
uint32_t _18 : 1; // 0
uint32_t _19 : 1; // 0
uint32_t _20 : 1; // 0
uint32_t _21 : 1; // 1
uint32_t sz : 1;
uint32_t o2 : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.sz = static_cast<uint8_t>(enc.sz);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o2 = static_cast<uint8_t>(enc.o2);
inst.o1 = static_cast<uint8_t>(enc.o1);
inst.iform = InstForm::FCVTMS_ASIMDMISC_R;
inst.iclass = InstName::FCVTMS;
return true;
}
static bool TryExtractFRINTA_H_FLOATDP1(InstData &inst, uint32_t bits) {
// bits
// & 11111111111111111111110000000000
// --------------------------------
// 00011110111001100100000000000000
if ((bits & 0xfffffc00U) != 0x1ee64000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t _12 : 1; // 0
uint32_t _13 : 1; // 0
uint32_t _14 : 1; // 1
uint32_t rmode : 3;
uint32_t _18 : 1; // 1
uint32_t _19 : 1; // 0
uint32_t _20 : 1; // 0
uint32_t _21 : 1; // 1
uint32_t type : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t _30 : 1; // 0
uint32_t M : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.M = static_cast<uint8_t>(enc.M);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.type = static_cast<uint8_t>(enc.type);
inst.rmode = static_cast<uint8_t>(enc.rmode);
inst.iform = InstForm::FRINTA_H_FLOATDP1;
inst.iclass = InstName::FRINTA;
return true;
}
static bool TryExtractFRINTA_S_FLOATDP1(InstData &inst, uint32_t bits) {
// bits
// & 11111111111111111111110000000000
// --------------------------------
// 00011110001001100100000000000000
if ((bits & 0xfffffc00U) != 0x1e264000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t _12 : 1; // 0
uint32_t _13 : 1; // 0
uint32_t _14 : 1; // 1
uint32_t rmode : 3;
uint32_t _18 : 1; // 1
uint32_t _19 : 1; // 0
uint32_t _20 : 1; // 0
uint32_t _21 : 1; // 1
uint32_t type : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t _30 : 1; // 0
uint32_t M : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.M = static_cast<uint8_t>(enc.M);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.type = static_cast<uint8_t>(enc.type);
inst.rmode = static_cast<uint8_t>(enc.rmode);
inst.iform = InstForm::FRINTA_S_FLOATDP1;
inst.iclass = InstName::FRINTA;
return true;
}
static bool TryExtractFRINTA_D_FLOATDP1(InstData &inst, uint32_t bits) {
// bits
// & 11111111111111111111110000000000
// --------------------------------
// 00011110011001100100000000000000
if ((bits & 0xfffffc00U) != 0x1e664000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t _12 : 1; // 0
uint32_t _13 : 1; // 0
uint32_t _14 : 1; // 1
uint32_t rmode : 3;
uint32_t _18 : 1; // 1
uint32_t _19 : 1; // 0
uint32_t _20 : 1; // 0
uint32_t _21 : 1; // 1
uint32_t type : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t _30 : 1; // 0
uint32_t M : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.M = static_cast<uint8_t>(enc.M);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.type = static_cast<uint8_t>(enc.type);
inst.rmode = static_cast<uint8_t>(enc.rmode);
inst.iform = InstForm::FRINTA_D_FLOATDP1;
inst.iclass = InstName::FRINTA;
return true;
}
static bool TryExtractFCSEL_H_FLOATSEL(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000000000110000000000
// --------------------------------
// 00011110111000000000110000000000
if ((bits & 0xffe00c00U) != 0x1ee00c00U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t _11 : 1; // 1
uint32_t cond : 4;
uint32_t Rm : 5;
uint32_t _21 : 1; // 1
uint32_t type : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t _30 : 1; // 0
uint32_t M : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.M = static_cast<uint8_t>(enc.M);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.cond = static_cast<uint8_t>(enc.cond);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.type = static_cast<uint8_t>(enc.type);
inst.iform = InstForm::FCSEL_H_FLOATSEL;
inst.iclass = InstName::FCSEL;
return true;
}
static bool TryExtractFCSEL_S_FLOATSEL(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000000000110000000000
// --------------------------------
// 00011110001000000000110000000000
if ((bits & 0xffe00c00U) != 0x1e200c00U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t _11 : 1; // 1
uint32_t cond : 4;
uint32_t Rm : 5;
uint32_t _21 : 1; // 1
uint32_t type : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t _30 : 1; // 0
uint32_t M : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.M = static_cast<uint8_t>(enc.M);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.cond = static_cast<uint8_t>(enc.cond);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.type = static_cast<uint8_t>(enc.type);
inst.iform = InstForm::FCSEL_S_FLOATSEL;
inst.iclass = InstName::FCSEL;
return true;
}
static bool TryExtractFCSEL_D_FLOATSEL(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000000000110000000000
// --------------------------------
// 00011110011000000000110000000000
if ((bits & 0xffe00c00U) != 0x1e600c00U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t _11 : 1; // 1
uint32_t cond : 4;
uint32_t Rm : 5;
uint32_t _21 : 1; // 1
uint32_t type : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t _30 : 1; // 0
uint32_t M : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.M = static_cast<uint8_t>(enc.M);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.cond = static_cast<uint8_t>(enc.cond);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.type = static_cast<uint8_t>(enc.type);
inst.iform = InstForm::FCSEL_D_FLOATSEL;
inst.iclass = InstName::FCSEL;
return true;
}
static bool TryExtractSUBHN_ASIMDDIFF_N(InstData &inst, uint32_t bits) {
// bits
// & 10111111001000001111110000000000
// --------------------------------
// 00001110001000000110000000000000
if ((bits & 0xbf20fc00U) != 0xe206000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t _12 : 1; // 0
uint32_t o1 : 1;
uint32_t _14 : 1; // 1
uint32_t _15 : 1; // 0
uint32_t Rm : 5;
uint32_t _21 : 1; // 1
uint32_t size : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o1 = static_cast<uint8_t>(enc.o1);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::SUBHN_ASIMDDIFF_N;
inst.iclass = InstName::SUBHN;
return true;
}
static bool TryExtractLDRSB_32_LDST_IMMPOST(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000000000110000000000
// --------------------------------
// 00111000110000000000010000000000
if ((bits & 0xffe00c00U) != 0x38c00400U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t _11 : 1; // 0
uint32_t imm9 : 9;
uint32_t _21 : 1; // 0
uint32_t opc : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.imm9.uimm = static_cast<uint64_t>(enc.imm9);
inst.V = static_cast<uint8_t>(enc.V);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LDRSB_32_LDST_IMMPOST;
inst.iclass = InstName::LDRSB;
return true;
}
static bool TryExtractLDRSB_64_LDST_IMMPOST(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000000000110000000000
// --------------------------------
// 00111000100000000000010000000000
if ((bits & 0xffe00c00U) != 0x38800400U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t _11 : 1; // 0
uint32_t imm9 : 9;
uint32_t _21 : 1; // 0
uint32_t opc : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.imm9.uimm = static_cast<uint64_t>(enc.imm9);
inst.V = static_cast<uint8_t>(enc.V);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LDRSB_64_LDST_IMMPOST;
inst.iclass = InstName::LDRSB;
return true;
}
static bool TryExtractLDRSB_32_LDST_IMMPRE(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000000000110000000000
// --------------------------------
// 00111000110000000000110000000000
if ((bits & 0xffe00c00U) != 0x38c00c00U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t _11 : 1; // 1
uint32_t imm9 : 9;
uint32_t _21 : 1; // 0
uint32_t opc : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.imm9.uimm = static_cast<uint64_t>(enc.imm9);
inst.V = static_cast<uint8_t>(enc.V);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LDRSB_32_LDST_IMMPRE;
inst.iclass = InstName::LDRSB;
return true;
}
static bool TryExtractLDRSB_64_LDST_IMMPRE(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000000000110000000000
// --------------------------------
// 00111000100000000000110000000000
if ((bits & 0xffe00c00U) != 0x38800c00U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t _11 : 1; // 1
uint32_t imm9 : 9;
uint32_t _21 : 1; // 0
uint32_t opc : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.imm9.uimm = static_cast<uint64_t>(enc.imm9);
inst.V = static_cast<uint8_t>(enc.V);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LDRSB_64_LDST_IMMPRE;
inst.iclass = InstName::LDRSB;
return true;
}
static bool TryExtractLDRSB_32_LDST_POS(InstData &inst, uint32_t bits) {
// bits
// & 11111111110000000000000000000000
// --------------------------------
// 00111001110000000000000000000000
if ((bits & 0xffc00000U) != 0x39c00000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t imm12 : 12;
uint32_t opc : 2;
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.imm12.uimm = static_cast<uint64_t>(enc.imm12);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.V = static_cast<uint8_t>(enc.V);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LDRSB_32_LDST_POS;
inst.iclass = InstName::LDRSB;
return true;
}
static bool TryExtractLDRSB_64_LDST_POS(InstData &inst, uint32_t bits) {
// bits
// & 11111111110000000000000000000000
// --------------------------------
// 00111001100000000000000000000000
if ((bits & 0xffc00000U) != 0x39800000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t imm12 : 12;
uint32_t opc : 2;
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.imm12.uimm = static_cast<uint64_t>(enc.imm12);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.V = static_cast<uint8_t>(enc.V);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LDRSB_64_LDST_POS;
inst.iclass = InstName::LDRSB;
return true;
}
static bool TryExtractFACGT_ASISDSAMEFP16_ONLY(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 01111110110000000010110000000000
if ((bits & 0xffe0fc00U) != 0x7ec02c00U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t ac : 1;
uint32_t _12 : 1; // 0
uint32_t _13 : 1; // 1
uint32_t _14 : 1; // 0
uint32_t _15 : 1; // 0
uint32_t Rm : 5;
uint32_t _21 : 1; // 0
uint32_t _22 : 1; // 1
uint32_t E : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t U : 1;
uint32_t _30 : 1; // 1
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.ac = static_cast<uint8_t>(enc.ac);
inst.E = static_cast<uint8_t>(enc.E);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.iform = InstForm::FACGT_ASISDSAMEFP16_ONLY;
inst.iclass = InstName::FACGT;
return true;
}
static bool TryExtractFACGT_ASISDSAME_ONLY(InstData &inst, uint32_t bits) {
// bits
// & 11111111101000001111110000000000
// --------------------------------
// 01111110101000001110110000000000
if ((bits & 0xffa0fc00U) != 0x7ea0ec00U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t ac : 1;
uint32_t _12 : 1; // 0
uint32_t _13 : 1; // 1
uint32_t _14 : 1; // 1
uint32_t _15 : 1; // 1
uint32_t Rm : 5;
uint32_t _21 : 1; // 1
uint32_t sz : 1;
uint32_t E : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t U : 1;
uint32_t _30 : 1; // 1
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.sz = static_cast<uint8_t>(enc.sz);
inst.ac = static_cast<uint8_t>(enc.ac);
inst.E = static_cast<uint8_t>(enc.E);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.iform = InstForm::FACGT_ASISDSAME_ONLY;
inst.iclass = InstName::FACGT;
return true;
}
static bool TryExtractFACGT_ASIMDSAMEFP16_ONLY(InstData &inst, uint32_t bits) {
// bits
// & 10111111111000001111110000000000
// --------------------------------
// 00101110110000000010110000000000
if ((bits & 0xbfe0fc00U) != 0x2ec02c00U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t ac : 1;
uint32_t _12 : 1; // 0
uint32_t _13 : 1; // 1
uint32_t _14 : 1; // 0
uint32_t _15 : 1; // 0
uint32_t Rm : 5;
uint32_t _21 : 1; // 0
uint32_t _22 : 1; // 1
uint32_t E : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Q = static_cast<uint8_t>(enc.Q);
inst.ac = static_cast<uint8_t>(enc.ac);
inst.E = static_cast<uint8_t>(enc.E);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.iform = InstForm::FACGT_ASIMDSAMEFP16_ONLY;
inst.iclass = InstName::FACGT;
return true;
}
static bool TryExtractFACGT_ASIMDSAME_ONLY(InstData &inst, uint32_t bits) {
// bits
// & 10111111101000001111110000000000
// --------------------------------
// 00101110101000001110110000000000
if ((bits & 0xbfa0fc00U) != 0x2ea0ec00U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t ac : 1;
uint32_t _12 : 1; // 0
uint32_t _13 : 1; // 1
uint32_t _14 : 1; // 1
uint32_t _15 : 1; // 1
uint32_t Rm : 5;
uint32_t _21 : 1; // 1
uint32_t sz : 1;
uint32_t E : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.sz = static_cast<uint8_t>(enc.sz);
inst.ac = static_cast<uint8_t>(enc.ac);
inst.E = static_cast<uint8_t>(enc.E);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.iform = InstForm::FACGT_ASIMDSAME_ONLY;
inst.iclass = InstName::FACGT;
return true;
}
static bool TryExtractNEG_ASISDMISC_R(InstData &inst, uint32_t bits) {
// bits
// & 11111111001111111111110000000000
// --------------------------------
// 01111110001000001011100000000000
if ((bits & 0xff3ffc00U) != 0x7e20b800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t opcode : 5;
uint32_t _17 : 1; // 0
uint32_t _18 : 1; // 0
uint32_t _19 : 1; // 0
uint32_t _20 : 1; // 0
uint32_t _21 : 1; // 1
uint32_t size : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t U : 1;
uint32_t _30 : 1; // 1
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::NEG_ASISDMISC_R;
inst.iclass = InstName::NEG;
return true;
}
static bool TryExtractNEG_ASIMDMISC_R(InstData &inst, uint32_t bits) {
// bits
// & 10111111001111111111110000000000
// --------------------------------
// 00101110001000001011100000000000
if ((bits & 0xbf3ffc00U) != 0x2e20b800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t opcode : 5;
uint32_t _17 : 1; // 0
uint32_t _18 : 1; // 0
uint32_t _19 : 1; // 0
uint32_t _20 : 1; // 0
uint32_t _21 : 1; // 1
uint32_t size : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.U = static_cast<uint8_t>(enc.U);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::NEG_ASIMDMISC_R;
inst.iclass = InstName::NEG;
return true;
}
static bool TryExtractUMLAL_ASIMDDIFF_L(InstData &inst, uint32_t bits) {
// bits
// & 10111111001000001111110000000000
// --------------------------------
// 00101110001000001000000000000000
if ((bits & 0xbf20fc00U) != 0x2e208000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t _12 : 1; // 0
uint32_t o1 : 1;
uint32_t _14 : 1; // 0
uint32_t _15 : 1; // 1
uint32_t Rm : 5;
uint32_t _21 : 1; // 1
uint32_t size : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o1 = static_cast<uint8_t>(enc.o1);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::UMLAL_ASIMDDIFF_L;
inst.iclass = InstName::UMLAL;
return true;
}
static bool TryExtractREV16_ASIMDMISC_R(InstData &inst, uint32_t bits) {
// bits
// & 10111111001111111111110000000000
// --------------------------------
// 00001110001000000001100000000000
if ((bits & 0xbf3ffc00U) != 0xe201800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t o0 : 1;
uint32_t _13 : 1; // 0
uint32_t _14 : 1; // 0
uint32_t _15 : 1; // 0
uint32_t _16 : 1; // 0
uint32_t _17 : 1; // 0
uint32_t _18 : 1; // 0
uint32_t _19 : 1; // 0
uint32_t _20 : 1; // 0
uint32_t _21 : 1; // 1
uint32_t size : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o0 = static_cast<uint8_t>(enc.o0);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::REV16_ASIMDMISC_R;
inst.iclass = InstName::REV16;
return true;
}
static bool TryExtractPMULL_ASIMDDIFF_L(InstData &inst, uint32_t bits) {
// bits
// & 10111111001000001111110000000000
// --------------------------------
// 00001110001000001110000000000000
if ((bits & 0xbf20fc00U) != 0xe20e000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t opcode : 4;
uint32_t Rm : 5;
uint32_t _21 : 1; // 1
uint32_t size : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.U = static_cast<uint8_t>(enc.U);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::PMULL_ASIMDDIFF_L;
inst.iclass = InstName::PMULL;
return true;
}
static bool TryExtractFMLS_ASIMDSAMEFP16_ONLY(InstData &inst, uint32_t bits) {
// bits
// & 10111111111000001111110000000000
// --------------------------------
// 00001110110000000000110000000000
if ((bits & 0xbfe0fc00U) != 0xec00c00U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t opcode : 3;
uint32_t _14 : 1; // 0
uint32_t _15 : 1; // 0
uint32_t Rm : 5;
uint32_t _21 : 1; // 0
uint32_t _22 : 1; // 1
uint32_t a : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.a = static_cast<uint8_t>(enc.a);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.U = static_cast<uint8_t>(enc.U);
inst.iform = InstForm::FMLS_ASIMDSAMEFP16_ONLY;
inst.iclass = InstName::FMLS;
return true;
}
static bool TryExtractFMLS_ASIMDSAME_ONLY(InstData &inst, uint32_t bits) {
// bits
// & 10111111101000001111110000000000
// --------------------------------
// 00001110101000001100110000000000
if ((bits & 0xbfa0fc00U) != 0xea0cc00U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t opcode : 5;
uint32_t Rm : 5;
uint32_t _21 : 1; // 1
uint32_t sz : 1;
uint32_t op : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.sz = static_cast<uint8_t>(enc.sz);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.U = static_cast<uint8_t>(enc.U);
inst.op = static_cast<uint8_t>(enc.op);
inst.iform = InstForm::FMLS_ASIMDSAME_ONLY;
inst.iclass = InstName::FMLS;
return true;
}
static bool TryExtractEOR_32_LOG_SHIFT(InstData &inst, uint32_t bits) {
// bits
// & 11111111001000000000000000000000
// --------------------------------
// 01001010000000000000000000000000
if ((bits & 0xff200000U) != 0x4a000000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t imm6 : 6;
uint32_t Rm : 5;
uint32_t N : 1;
uint32_t shift : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t opc : 2;
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.shift = static_cast<uint8_t>(enc.shift);
inst.N = static_cast<uint8_t>(enc.N);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.sf = static_cast<uint8_t>(enc.sf);
inst.imm6.uimm = static_cast<uint64_t>(enc.imm6);
inst.iform = InstForm::EOR_32_LOG_SHIFT;
inst.iclass = InstName::EOR;
return true;
}
static bool TryExtractEOR_64_LOG_SHIFT(InstData &inst, uint32_t bits) {
// bits
// & 11111111001000000000000000000000
// --------------------------------
// 11001010000000000000000000000000
if ((bits & 0xff200000U) != 0xca000000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t imm6 : 6;
uint32_t Rm : 5;
uint32_t N : 1;
uint32_t shift : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t opc : 2;
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.shift = static_cast<uint8_t>(enc.shift);
inst.N = static_cast<uint8_t>(enc.N);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.sf = static_cast<uint8_t>(enc.sf);
inst.imm6.uimm = static_cast<uint64_t>(enc.imm6);
inst.iform = InstForm::EOR_64_LOG_SHIFT;
inst.iclass = InstName::EOR;
return true;
}
static bool TryExtractLDSMAXA_32_MEMOP(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 10111000101000000100000000000000
if ((bits & 0xffe0fc00U) != 0xb8a04000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t opc : 3;
uint32_t o3 : 1;
uint32_t Rs : 5;
uint32_t _21 : 1; // 1
uint32_t R : 1;
uint32_t A : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.A = static_cast<uint8_t>(enc.A);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.V = static_cast<uint8_t>(enc.V);
inst.R = static_cast<uint8_t>(enc.R);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o3 = static_cast<uint8_t>(enc.o3);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LDSMAXA_32_MEMOP;
inst.iclass = InstName::LDSMAXA;
return true;
}
static bool TryExtractLDSMAXAL_32_MEMOP(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 10111000111000000100000000000000
if ((bits & 0xffe0fc00U) != 0xb8e04000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t opc : 3;
uint32_t o3 : 1;
uint32_t Rs : 5;
uint32_t _21 : 1; // 1
uint32_t R : 1;
uint32_t A : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.A = static_cast<uint8_t>(enc.A);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.V = static_cast<uint8_t>(enc.V);
inst.R = static_cast<uint8_t>(enc.R);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o3 = static_cast<uint8_t>(enc.o3);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LDSMAXAL_32_MEMOP;
inst.iclass = InstName::LDSMAXAL;
return true;
}
static bool TryExtractLDSMAX_32_MEMOP(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 10111000001000000100000000000000
if ((bits & 0xffe0fc00U) != 0xb8204000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t opc : 3;
uint32_t o3 : 1;
uint32_t Rs : 5;
uint32_t _21 : 1; // 1
uint32_t R : 1;
uint32_t A : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.A = static_cast<uint8_t>(enc.A);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.V = static_cast<uint8_t>(enc.V);
inst.R = static_cast<uint8_t>(enc.R);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o3 = static_cast<uint8_t>(enc.o3);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LDSMAX_32_MEMOP;
inst.iclass = InstName::LDSMAX;
return true;
}
static bool TryExtractLDSMAXL_32_MEMOP(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 10111000011000000100000000000000
if ((bits & 0xffe0fc00U) != 0xb8604000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t opc : 3;
uint32_t o3 : 1;
uint32_t Rs : 5;
uint32_t _21 : 1; // 1
uint32_t R : 1;
uint32_t A : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.A = static_cast<uint8_t>(enc.A);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.V = static_cast<uint8_t>(enc.V);
inst.R = static_cast<uint8_t>(enc.R);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o3 = static_cast<uint8_t>(enc.o3);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LDSMAXL_32_MEMOP;
inst.iclass = InstName::LDSMAXL;
return true;
}
static bool TryExtractLDSMAXA_64_MEMOP(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 11111000101000000100000000000000
if ((bits & 0xffe0fc00U) != 0xf8a04000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t opc : 3;
uint32_t o3 : 1;
uint32_t Rs : 5;
uint32_t _21 : 1; // 1
uint32_t R : 1;
uint32_t A : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.A = static_cast<uint8_t>(enc.A);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.V = static_cast<uint8_t>(enc.V);
inst.R = static_cast<uint8_t>(enc.R);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o3 = static_cast<uint8_t>(enc.o3);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LDSMAXA_64_MEMOP;
inst.iclass = InstName::LDSMAXA;
return true;
}
static bool TryExtractLDSMAXAL_64_MEMOP(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 11111000111000000100000000000000
if ((bits & 0xffe0fc00U) != 0xf8e04000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t opc : 3;
uint32_t o3 : 1;
uint32_t Rs : 5;
uint32_t _21 : 1; // 1
uint32_t R : 1;
uint32_t A : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.A = static_cast<uint8_t>(enc.A);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.V = static_cast<uint8_t>(enc.V);
inst.R = static_cast<uint8_t>(enc.R);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o3 = static_cast<uint8_t>(enc.o3);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LDSMAXAL_64_MEMOP;
inst.iclass = InstName::LDSMAXAL;
return true;
}
static bool TryExtractLDSMAX_64_MEMOP(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 11111000001000000100000000000000
if ((bits & 0xffe0fc00U) != 0xf8204000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t opc : 3;
uint32_t o3 : 1;
uint32_t Rs : 5;
uint32_t _21 : 1; // 1
uint32_t R : 1;
uint32_t A : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.A = static_cast<uint8_t>(enc.A);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.V = static_cast<uint8_t>(enc.V);
inst.R = static_cast<uint8_t>(enc.R);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o3 = static_cast<uint8_t>(enc.o3);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LDSMAX_64_MEMOP;
inst.iclass = InstName::LDSMAX;
return true;
}
static bool TryExtractLDSMAXL_64_MEMOP(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 11111000011000000100000000000000
if ((bits & 0xffe0fc00U) != 0xf8604000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t opc : 3;
uint32_t o3 : 1;
uint32_t Rs : 5;
uint32_t _21 : 1; // 1
uint32_t R : 1;
uint32_t A : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.A = static_cast<uint8_t>(enc.A);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.V = static_cast<uint8_t>(enc.V);
inst.R = static_cast<uint8_t>(enc.R);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o3 = static_cast<uint8_t>(enc.o3);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LDSMAXL_64_MEMOP;
inst.iclass = InstName::LDSMAXL;
return true;
}
static bool TryExtractSYS_CR_SYSTEM(InstData &inst, uint32_t bits) {
if (false && TryExtractAT_SYS_CR_SYSTEM(inst, bits))
return true;
if (false && TryExtractTLBI_SYS_CR_SYSTEM(inst, bits))
return true;
if (false && TryExtractDC_SYS_CR_SYSTEM(inst, bits))
return true;
if (false && TryExtractIC_SYS_CR_SYSTEM(inst, bits))
return true;
// bits
// & 11111111111110000000000000000000
// --------------------------------
// 11010101000010000000000000000000
if ((bits & 0xfff80000U) != 0xd5080000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t op2 : 3;
uint32_t CRm : 4;
uint32_t CRn : 4;
uint32_t op1 : 3;
uint32_t op0 : 2;
uint32_t L : 1;
uint32_t _22 : 1; // 0
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 0
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 0
uint32_t _30 : 1; // 1
uint32_t _31 : 1; // 1
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.op0 = static_cast<uint8_t>(enc.op0);
inst.op1 = static_cast<uint8_t>(enc.op1);
inst.op2 = static_cast<uint8_t>(enc.op2);
inst.L = static_cast<uint8_t>(enc.L);
inst.CRn = static_cast<uint8_t>(enc.CRn);
inst.CRm = static_cast<uint8_t>(enc.CRm);
inst.iform = InstForm::SYS_CR_SYSTEM;
inst.iclass = InstName::SYS;
return true;
}
static bool TryExtractSQABS_ASISDMISC_R(InstData &inst, uint32_t bits) {
// bits
// & 11111111001111111111110000000000
// --------------------------------
// 01011110001000000111100000000000
if ((bits & 0xff3ffc00U) != 0x5e207800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t opcode : 5;
uint32_t _17 : 1; // 0
uint32_t _18 : 1; // 0
uint32_t _19 : 1; // 0
uint32_t _20 : 1; // 0
uint32_t _21 : 1; // 1
uint32_t size : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t U : 1;
uint32_t _30 : 1; // 1
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::SQABS_ASISDMISC_R;
inst.iclass = InstName::SQABS;
return true;
}
static bool TryExtractSQABS_ASIMDMISC_R(InstData &inst, uint32_t bits) {
// bits
// & 10111111001111111111110000000000
// --------------------------------
// 00001110001000000111100000000000
if ((bits & 0xbf3ffc00U) != 0xe207800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t opcode : 5;
uint32_t _17 : 1; // 0
uint32_t _18 : 1; // 0
uint32_t _19 : 1; // 0
uint32_t _20 : 1; // 0
uint32_t _21 : 1; // 1
uint32_t size : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.U = static_cast<uint8_t>(enc.U);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::SQABS_ASIMDMISC_R;
inst.iclass = InstName::SQABS;
return true;
}
static bool TryExtractLDAR_LR32_LDSTEXCL(InstData &inst, uint32_t bits) {
// bits
// & 11111111111111111111110000000000
// --------------------------------
// 10001000110111111111110000000000
if ((bits & 0xfffffc00U) != 0x88dffc00U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t Rt2 : 5;
uint32_t o0 : 1;
uint32_t Rs : 5;
uint32_t o1 : 1;
uint32_t L : 1;
uint32_t o2 : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 0
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.L = static_cast<uint8_t>(enc.L);
inst.Rt2 = static_cast<uint8_t>(enc.Rt2);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.o2 = static_cast<uint8_t>(enc.o2);
inst.o1 = static_cast<uint8_t>(enc.o1);
inst.o0 = static_cast<uint8_t>(enc.o0);
inst.iform = InstForm::LDAR_LR32_LDSTEXCL;
inst.iclass = InstName::LDAR;
return true;
}
static bool TryExtractLDAR_LR64_LDSTEXCL(InstData &inst, uint32_t bits) {
// bits
// & 11111111111111111111110000000000
// --------------------------------
// 11001000110111111111110000000000
if ((bits & 0xfffffc00U) != 0xc8dffc00U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t Rt2 : 5;
uint32_t o0 : 1;
uint32_t Rs : 5;
uint32_t o1 : 1;
uint32_t L : 1;
uint32_t o2 : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 0
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.L = static_cast<uint8_t>(enc.L);
inst.Rt2 = static_cast<uint8_t>(enc.Rt2);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.o2 = static_cast<uint8_t>(enc.o2);
inst.o1 = static_cast<uint8_t>(enc.o1);
inst.o0 = static_cast<uint8_t>(enc.o0);
inst.iform = InstForm::LDAR_LR64_LDSTEXCL;
inst.iclass = InstName::LDAR;
return true;
}
static bool TryExtractSTADDH_32S_MEMOP(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000011111
// --------------------------------
// 01111000001000000000000000011111
if ((bits & 0xffe0fc1fU) != 0x7820001fU) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t opc : 3;
uint32_t o3 : 1;
uint32_t Rs : 5;
uint32_t _21 : 1; // 1
uint32_t R : 1;
uint32_t A : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.A = static_cast<uint8_t>(enc.A);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.V = static_cast<uint8_t>(enc.V);
inst.R = static_cast<uint8_t>(enc.R);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o3 = static_cast<uint8_t>(enc.o3);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::STADDH_32S_MEMOP;
inst.iclass = InstName::STADDH;
return true;
}
static bool TryExtractSTADDLH_32S_MEMOP(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000011111
// --------------------------------
// 01111000011000000000000000011111
if ((bits & 0xffe0fc1fU) != 0x7860001fU) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t opc : 3;
uint32_t o3 : 1;
uint32_t Rs : 5;
uint32_t _21 : 1; // 1
uint32_t R : 1;
uint32_t A : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.A = static_cast<uint8_t>(enc.A);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.V = static_cast<uint8_t>(enc.V);
inst.R = static_cast<uint8_t>(enc.R);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o3 = static_cast<uint8_t>(enc.o3);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::STADDLH_32S_MEMOP;
inst.iclass = InstName::STADDLH;
return true;
}
static bool TryExtractLDRSW_64_LDST_IMMPOST(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000000000110000000000
// --------------------------------
// 10111000100000000000010000000000
if ((bits & 0xffe00c00U) != 0xb8800400U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t _11 : 1; // 0
uint32_t imm9 : 9;
uint32_t _21 : 1; // 0
uint32_t opc : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.imm9.uimm = static_cast<uint64_t>(enc.imm9);
inst.V = static_cast<uint8_t>(enc.V);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LDRSW_64_LDST_IMMPOST;
inst.iclass = InstName::LDRSW;
return true;
}
static bool TryExtractLDRSW_64_LDST_IMMPRE(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000000000110000000000
// --------------------------------
// 10111000100000000000110000000000
if ((bits & 0xffe00c00U) != 0xb8800c00U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t _11 : 1; // 1
uint32_t imm9 : 9;
uint32_t _21 : 1; // 0
uint32_t opc : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.imm9.uimm = static_cast<uint64_t>(enc.imm9);
inst.V = static_cast<uint8_t>(enc.V);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LDRSW_64_LDST_IMMPRE;
inst.iclass = InstName::LDRSW;
return true;
}
static bool TryExtractLDRSW_64_LDST_POS(InstData &inst, uint32_t bits) {
// bits
// & 11111111110000000000000000000000
// --------------------------------
// 10111001100000000000000000000000
if ((bits & 0xffc00000U) != 0xb9800000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t imm12 : 12;
uint32_t opc : 2;
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.imm12.uimm = static_cast<uint64_t>(enc.imm12);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.V = static_cast<uint8_t>(enc.V);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LDRSW_64_LDST_POS;
inst.iclass = InstName::LDRSW;
return true;
}
static bool TryExtractFCVTAS_ASISDMISCFP16_R(InstData &inst, uint32_t bits) {
// bits
// & 11111111111111111111110000000000
// --------------------------------
// 01011110011110011100100000000000
if ((bits & 0xfffffc00U) != 0x5e79c800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t opcode : 5;
uint32_t _17 : 1; // 0
uint32_t _18 : 1; // 0
uint32_t _19 : 1; // 1
uint32_t _20 : 1; // 1
uint32_t _21 : 1; // 1
uint32_t _22 : 1; // 1
uint32_t size : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t U : 1;
uint32_t _30 : 1; // 1
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::FCVTAS_ASISDMISCFP16_R;
inst.iclass = InstName::FCVTAS;
return true;
}
static bool TryExtractFCVTAS_ASISDMISC_R(InstData &inst, uint32_t bits) {
// bits
// & 11111111101111111111110000000000
// --------------------------------
// 01011110001000011100100000000000
if ((bits & 0xffbffc00U) != 0x5e21c800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t opcode : 5;
uint32_t _17 : 1; // 0
uint32_t _18 : 1; // 0
uint32_t _19 : 1; // 0
uint32_t _20 : 1; // 0
uint32_t _21 : 1; // 1
uint32_t sz : 1;
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t U : 1;
uint32_t _30 : 1; // 1
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.sz = static_cast<uint8_t>(enc.sz);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.U = static_cast<uint8_t>(enc.U);
inst.iform = InstForm::FCVTAS_ASISDMISC_R;
inst.iclass = InstName::FCVTAS;
return true;
}
static bool TryExtractFCVTAS_ASIMDMISCFP16_R(InstData &inst, uint32_t bits) {
// bits
// & 10111111111111111111110000000000
// --------------------------------
// 00001110011110011100100000000000
if ((bits & 0xbffffc00U) != 0xe79c800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t opcode : 5;
uint32_t _17 : 1; // 0
uint32_t _18 : 1; // 0
uint32_t _19 : 1; // 1
uint32_t _20 : 1; // 1
uint32_t _21 : 1; // 1
uint32_t _22 : 1; // 1
uint32_t a : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.a = static_cast<uint8_t>(enc.a);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.iform = InstForm::FCVTAS_ASIMDMISCFP16_R;
inst.iclass = InstName::FCVTAS;
return true;
}
static bool TryExtractFCVTAS_ASIMDMISC_R(InstData &inst, uint32_t bits) {
// bits
// & 10111111101111111111110000000000
// --------------------------------
// 00001110001000011100100000000000
if ((bits & 0xbfbffc00U) != 0xe21c800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t opcode : 5;
uint32_t _17 : 1; // 0
uint32_t _18 : 1; // 0
uint32_t _19 : 1; // 0
uint32_t _20 : 1; // 0
uint32_t _21 : 1; // 1
uint32_t sz : 1;
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.sz = static_cast<uint8_t>(enc.sz);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.U = static_cast<uint8_t>(enc.U);
inst.iform = InstForm::FCVTAS_ASIMDMISC_R;
inst.iclass = InstName::FCVTAS;
return true;
}
static bool TryExtractUQSHRN_ASISDSHF_N(InstData &inst, uint32_t bits) {
// bits
// & 11111111100000001111110000000000
// --------------------------------
// 01111111000000001001010000000000
if ((bits & 0xff80fc00U) != 0x7f009400U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t op : 1;
uint32_t _12 : 1; // 1
uint32_t _13 : 1; // 0
uint32_t _14 : 1; // 0
uint32_t _15 : 1; // 1
uint32_t immb : 3;
uint32_t immh : 4;
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t U : 1;
uint32_t _30 : 1; // 1
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.immh.uimm = static_cast<uint64_t>(enc.immh);
if (!(inst.immh.uimm != 0x0))
return false;
inst.immb.uimm = static_cast<uint64_t>(enc.immb);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.op = static_cast<uint8_t>(enc.op);
inst.iform = InstForm::UQSHRN_ASISDSHF_N;
inst.iclass = InstName::UQSHRN;
return true;
}
static bool TryExtractUQSHRN_ASIMDSHF_N(InstData &inst, uint32_t bits) {
// bits
// & 10111111100000001111110000000000
// --------------------------------
// 00101111000000001001010000000000
if ((bits & 0xbf80fc00U) != 0x2f009400U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t op : 1;
uint32_t _12 : 1; // 1
uint32_t _13 : 1; // 0
uint32_t _14 : 1; // 0
uint32_t _15 : 1; // 1
uint32_t immb : 3;
uint32_t immh : 4;
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.immh.uimm = static_cast<uint64_t>(enc.immh);
if (!(inst.immh.uimm != 0x0))
return false;
inst.immb.uimm = static_cast<uint64_t>(enc.immb);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.op = static_cast<uint8_t>(enc.op);
inst.iform = InstForm::UQSHRN_ASIMDSHF_N;
inst.iclass = InstName::UQSHRN;
return true;
}
static bool TryExtractEXT_ASIMDEXT_ONLY(InstData &inst, uint32_t bits) {
// bits
// & 10111111111000001000010000000000
// --------------------------------
// 00101110000000000000000000000000
if ((bits & 0xbfe08400U) != 0x2e000000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t imm4 : 4;
uint32_t _15 : 1; // 0
uint32_t Rm : 5;
uint32_t _21 : 1; // 0
uint32_t op2 : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 1
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Q = static_cast<uint8_t>(enc.Q);
inst.op2 = static_cast<uint8_t>(enc.op2);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.imm4.uimm = static_cast<uint64_t>(enc.imm4);
inst.iform = InstForm::EXT_ASIMDEXT_ONLY;
inst.iclass = InstName::EXT;
return true;
}
static bool TryExtractUSHL_ASISDSAME_ONLY(InstData &inst, uint32_t bits) {
// bits
// & 11111111001000001111110000000000
// --------------------------------
// 01111110001000000100010000000000
if ((bits & 0xff20fc00U) != 0x7e204400U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t S : 1;
uint32_t R : 1;
uint32_t _13 : 1; // 0
uint32_t _14 : 1; // 1
uint32_t _15 : 1; // 0
uint32_t Rm : 5;
uint32_t _21 : 1; // 1
uint32_t size : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t U : 1;
uint32_t _30 : 1; // 1
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.R = static_cast<uint8_t>(enc.R);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::USHL_ASISDSAME_ONLY;
inst.iclass = InstName::USHL;
return true;
}
static bool TryExtractUSHL_ASIMDSAME_ONLY(InstData &inst, uint32_t bits) {
// bits
// & 10111111001000001111110000000000
// --------------------------------
// 00101110001000000100010000000000
if ((bits & 0xbf20fc00U) != 0x2e204400U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t S : 1;
uint32_t R : 1;
uint32_t _13 : 1; // 0
uint32_t _14 : 1; // 1
uint32_t _15 : 1; // 0
uint32_t Rm : 5;
uint32_t _21 : 1; // 1
uint32_t size : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.R = static_cast<uint8_t>(enc.R);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::USHL_ASIMDSAME_ONLY;
inst.iclass = InstName::USHL;
return true;
}
static bool TryExtractFADDP_ASISDPAIR_ONLY_H(InstData &inst, uint32_t bits) {
// bits
// & 11111111111111111111110000000000
// --------------------------------
// 01011110001100001101100000000000
if ((bits & 0xfffffc00U) != 0x5e30d800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t opcode : 5;
uint32_t _17 : 1; // 0
uint32_t _18 : 1; // 0
uint32_t _19 : 1; // 0
uint32_t _20 : 1; // 1
uint32_t _21 : 1; // 1
uint32_t sz : 1;
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t U : 1;
uint32_t _30 : 1; // 1
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.sz = static_cast<uint8_t>(enc.sz);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.U = static_cast<uint8_t>(enc.U);
inst.iform = InstForm::FADDP_ASISDPAIR_ONLY_H;
inst.iclass = InstName::FADDP;
return true;
}
static bool TryExtractFADDP_ASISDPAIR_ONLY_SD(InstData &inst, uint32_t bits) {
// bits
// & 11111111101111111111110000000000
// --------------------------------
// 01111110001100001101100000000000
if ((bits & 0xffbffc00U) != 0x7e30d800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t opcode : 5;
uint32_t _17 : 1; // 0
uint32_t _18 : 1; // 0
uint32_t _19 : 1; // 0
uint32_t _20 : 1; // 1
uint32_t _21 : 1; // 1
uint32_t sz : 1;
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t U : 1;
uint32_t _30 : 1; // 1
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.sz = static_cast<uint8_t>(enc.sz);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.U = static_cast<uint8_t>(enc.U);
inst.iform = InstForm::FADDP_ASISDPAIR_ONLY_SD;
inst.iclass = InstName::FADDP;
return true;
}
static bool TryExtractSSHR_ASISDSHF_R(InstData &inst, uint32_t bits) {
// bits
// & 11111111100000001111110000000000
// --------------------------------
// 01011111000000000000010000000000
if ((bits & 0xff80fc00U) != 0x5f000400U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t _11 : 1; // 0
uint32_t o0 : 1;
uint32_t o1 : 1;
uint32_t _14 : 1; // 0
uint32_t _15 : 1; // 0
uint32_t immb : 3;
uint32_t immh : 4;
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t U : 1;
uint32_t _30 : 1; // 1
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.immh.uimm = static_cast<uint64_t>(enc.immh);
if (!(inst.immh.uimm != 0x0))
return false;
inst.immb.uimm = static_cast<uint64_t>(enc.immb);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o1 = static_cast<uint8_t>(enc.o1);
inst.o0 = static_cast<uint8_t>(enc.o0);
inst.iform = InstForm::SSHR_ASISDSHF_R;
inst.iclass = InstName::SSHR;
return true;
}
static bool TryExtractSSHR_ASIMDSHF_R(InstData &inst, uint32_t bits) {
// bits
// & 10111111100000001111110000000000
// --------------------------------
// 00001111000000000000010000000000
if ((bits & 0xbf80fc00U) != 0xf000400U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t _11 : 1; // 0
uint32_t o0 : 1;
uint32_t o1 : 1;
uint32_t _14 : 1; // 0
uint32_t _15 : 1; // 0
uint32_t immb : 3;
uint32_t immh : 4;
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.immh.uimm = static_cast<uint64_t>(enc.immh);
if (!(inst.immh.uimm != 0x0))
return false;
inst.immb.uimm = static_cast<uint64_t>(enc.immb);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o1 = static_cast<uint8_t>(enc.o1);
inst.o0 = static_cast<uint8_t>(enc.o0);
inst.iform = InstForm::SSHR_ASIMDSHF_R;
inst.iclass = InstName::SSHR;
return true;
}
static bool TryExtractSHSUB_ASIMDSAME_ONLY(InstData &inst, uint32_t bits) {
// bits
// & 10111111001000001111110000000000
// --------------------------------
// 00001110001000000010010000000000
if ((bits & 0xbf20fc00U) != 0xe202400U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t opcode : 5;
uint32_t Rm : 5;
uint32_t _21 : 1; // 1
uint32_t size : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.U = static_cast<uint8_t>(enc.U);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::SHSUB_ASIMDSAME_ONLY;
inst.iclass = InstName::SHSUB;
return true;
}
static bool TryExtractCMN_ADDS_32S_ADDSUB_EXT(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000000000000000011111
// --------------------------------
// 00101011001000000000000000011111
if ((bits & 0xffe0001fU) != 0x2b20001fU) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t imm3 : 3;
uint32_t option : 3;
uint32_t Rm : 5;
uint32_t _21 : 1; // 1
uint32_t opt : 2;
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t S : 1;
uint32_t op : 1;
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.opt = static_cast<uint8_t>(enc.opt);
inst.option = static_cast<uint8_t>(enc.option);
inst.sf = static_cast<uint8_t>(enc.sf);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.imm3.uimm = static_cast<uint64_t>(enc.imm3);
inst.op = static_cast<uint8_t>(enc.op);
inst.iform = InstForm::CMN_ADDS_32S_ADDSUB_EXT;
inst.iclass = InstName::ADDS;
return true;
}
static bool TryExtractCMN_ADDS_64S_ADDSUB_EXT(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000000000000000011111
// --------------------------------
// 10101011001000000000000000011111
if ((bits & 0xffe0001fU) != 0xab20001fU) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t imm3 : 3;
uint32_t option : 3;
uint32_t Rm : 5;
uint32_t _21 : 1; // 1
uint32_t opt : 2;
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t S : 1;
uint32_t op : 1;
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.opt = static_cast<uint8_t>(enc.opt);
inst.option = static_cast<uint8_t>(enc.option);
inst.sf = static_cast<uint8_t>(enc.sf);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.imm3.uimm = static_cast<uint64_t>(enc.imm3);
inst.op = static_cast<uint8_t>(enc.op);
inst.iform = InstForm::CMN_ADDS_64S_ADDSUB_EXT;
inst.iclass = InstName::ADDS;
return true;
}
static bool TryExtractFMINNM_ASIMDSAMEFP16_ONLY(InstData &inst, uint32_t bits) {
// bits
// & 10111111111000001111110000000000
// --------------------------------
// 00001110110000000000010000000000
if ((bits & 0xbfe0fc00U) != 0xec00400U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t Op3 : 3;
uint32_t _14 : 1; // 0
uint32_t _15 : 1; // 0
uint32_t Rm : 5;
uint32_t _21 : 1; // 0
uint32_t _22 : 1; // 1
uint32_t a : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.a = static_cast<uint8_t>(enc.a);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Op3 = static_cast<uint8_t>(enc.Op3);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.iform = InstForm::FMINNM_ASIMDSAMEFP16_ONLY;
inst.iclass = InstName::FMINNM;
return true;
}
static bool TryExtractFMINNM_ASIMDSAME_ONLY(InstData &inst, uint32_t bits) {
// bits
// & 10111111101000001111110000000000
// --------------------------------
// 00001110101000001100010000000000
if ((bits & 0xbfa0fc00U) != 0xea0c400U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t opcode : 5;
uint32_t Rm : 5;
uint32_t _21 : 1; // 1
uint32_t sz : 1;
uint32_t o1 : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.sz = static_cast<uint8_t>(enc.sz);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.U = static_cast<uint8_t>(enc.U);
inst.o1 = static_cast<uint8_t>(enc.o1);
inst.iform = InstForm::FMINNM_ASIMDSAME_ONLY;
inst.iclass = InstName::FMINNM;
return true;
}
static bool TryExtractUMLSL_ASIMDDIFF_L(InstData &inst, uint32_t bits) {
// bits
// & 10111111001000001111110000000000
// --------------------------------
// 00101110001000001010000000000000
if ((bits & 0xbf20fc00U) != 0x2e20a000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t _12 : 1; // 0
uint32_t o1 : 1;
uint32_t _14 : 1; // 0
uint32_t _15 : 1; // 1
uint32_t Rm : 5;
uint32_t _21 : 1; // 1
uint32_t size : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o1 = static_cast<uint8_t>(enc.o1);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::UMLSL_ASIMDDIFF_L;
inst.iclass = InstName::UMLSL;
return true;
}
static bool TryExtractUSHLL_ASIMDSHF_L(InstData &inst, uint32_t bits) {
if (false && TryExtractUXTL_USHLL_ASIMDSHF_L(inst, bits))
return true;
// bits
// & 10111111100000001111110000000000
// --------------------------------
// 00101111000000001010010000000000
if ((bits & 0xbf80fc00U) != 0x2f00a400U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t opcode : 5;
uint32_t immb : 3;
uint32_t immh : 4;
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.immh.uimm = static_cast<uint64_t>(enc.immh);
if (!(inst.immh.uimm != 0x0))
return false;
inst.immb.uimm = static_cast<uint64_t>(enc.immb);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.iform = InstForm::USHLL_ASIMDSHF_L;
inst.iclass = InstName::USHLL;
return true;
}
static bool TryExtractSTLR_SL32_LDSTEXCL(InstData &inst, uint32_t bits) {
// bits
// & 11111111111111111111110000000000
// --------------------------------
// 10001000100111111111110000000000
if ((bits & 0xfffffc00U) != 0x889ffc00U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t Rt2 : 5;
uint32_t o0 : 1;
uint32_t Rs : 5;
uint32_t o1 : 1;
uint32_t L : 1;
uint32_t o2 : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 0
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.L = static_cast<uint8_t>(enc.L);
inst.Rt2 = static_cast<uint8_t>(enc.Rt2);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.o2 = static_cast<uint8_t>(enc.o2);
inst.o1 = static_cast<uint8_t>(enc.o1);
inst.o0 = static_cast<uint8_t>(enc.o0);
inst.iform = InstForm::STLR_SL32_LDSTEXCL;
inst.iclass = InstName::STLR;
return true;
}
static bool TryExtractSTLR_SL64_LDSTEXCL(InstData &inst, uint32_t bits) {
// bits
// & 11111111111111111111110000000000
// --------------------------------
// 11001000100111111111110000000000
if ((bits & 0xfffffc00U) != 0xc89ffc00U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t Rt2 : 5;
uint32_t o0 : 1;
uint32_t Rs : 5;
uint32_t o1 : 1;
uint32_t L : 1;
uint32_t o2 : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 0
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.L = static_cast<uint8_t>(enc.L);
inst.Rt2 = static_cast<uint8_t>(enc.Rt2);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.o2 = static_cast<uint8_t>(enc.o2);
inst.o1 = static_cast<uint8_t>(enc.o1);
inst.o0 = static_cast<uint8_t>(enc.o0);
inst.iform = InstForm::STLR_SL64_LDSTEXCL;
inst.iclass = InstName::STLR;
return true;
}
static bool TryExtractEON_32_LOG_SHIFT(InstData &inst, uint32_t bits) {
// bits
// & 11111111001000000000000000000000
// --------------------------------
// 01001010001000000000000000000000
if ((bits & 0xff200000U) != 0x4a200000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t imm6 : 6;
uint32_t Rm : 5;
uint32_t N : 1;
uint32_t shift : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t opc : 2;
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.shift = static_cast<uint8_t>(enc.shift);
inst.N = static_cast<uint8_t>(enc.N);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.sf = static_cast<uint8_t>(enc.sf);
inst.imm6.uimm = static_cast<uint64_t>(enc.imm6);
inst.iform = InstForm::EON_32_LOG_SHIFT;
inst.iclass = InstName::EON;
return true;
}
static bool TryExtractEON_64_LOG_SHIFT(InstData &inst, uint32_t bits) {
// bits
// & 11111111001000000000000000000000
// --------------------------------
// 11001010001000000000000000000000
if ((bits & 0xff200000U) != 0xca200000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t imm6 : 6;
uint32_t Rm : 5;
uint32_t N : 1;
uint32_t shift : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t opc : 2;
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.shift = static_cast<uint8_t>(enc.shift);
inst.N = static_cast<uint8_t>(enc.N);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.sf = static_cast<uint8_t>(enc.sf);
inst.imm6.uimm = static_cast<uint64_t>(enc.imm6);
inst.iform = InstForm::EON_64_LOG_SHIFT;
inst.iclass = InstName::EON;
return true;
}
static bool TryExtractSTSMAXB_32S_MEMOP(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000011111
// --------------------------------
// 00111000001000000100000000011111
if ((bits & 0xffe0fc1fU) != 0x3820401fU) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t opc : 3;
uint32_t o3 : 1;
uint32_t Rs : 5;
uint32_t _21 : 1; // 1
uint32_t R : 1;
uint32_t A : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.A = static_cast<uint8_t>(enc.A);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.V = static_cast<uint8_t>(enc.V);
inst.R = static_cast<uint8_t>(enc.R);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o3 = static_cast<uint8_t>(enc.o3);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::STSMAXB_32S_MEMOP;
inst.iclass = InstName::STSMAXB;
return true;
}
static bool TryExtractSTSMAXLB_32S_MEMOP(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000011111
// --------------------------------
// 00111000011000000100000000011111
if ((bits & 0xffe0fc1fU) != 0x3860401fU) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t opc : 3;
uint32_t o3 : 1;
uint32_t Rs : 5;
uint32_t _21 : 1; // 1
uint32_t R : 1;
uint32_t A : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.A = static_cast<uint8_t>(enc.A);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.V = static_cast<uint8_t>(enc.V);
inst.R = static_cast<uint8_t>(enc.R);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o3 = static_cast<uint8_t>(enc.o3);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::STSMAXLB_32S_MEMOP;
inst.iclass = InstName::STSMAXLB;
return true;
}
static bool TryExtractFCVTNS_32H_FLOAT2INT(InstData &inst, uint32_t bits) {
// bits
// & 11111111111111111111110000000000
// --------------------------------
// 00011110111000000000000000000000
if ((bits & 0xfffffc00U) != 0x1ee00000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t _12 : 1; // 0
uint32_t _13 : 1; // 0
uint32_t _14 : 1; // 0
uint32_t _15 : 1; // 0
uint32_t opcode : 3;
uint32_t rmode : 2;
uint32_t _21 : 1; // 1
uint32_t type : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t _30 : 1; // 0
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.sf = static_cast<uint8_t>(enc.sf);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.type = static_cast<uint8_t>(enc.type);
inst.rmode = static_cast<uint8_t>(enc.rmode);
inst.iform = InstForm::FCVTNS_32H_FLOAT2INT;
inst.iclass = InstName::FCVTNS;
return true;
}
static bool TryExtractFCVTNS_64H_FLOAT2INT(InstData &inst, uint32_t bits) {
// bits
// & 11111111111111111111110000000000
// --------------------------------
// 10011110111000000000000000000000
if ((bits & 0xfffffc00U) != 0x9ee00000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t _12 : 1; // 0
uint32_t _13 : 1; // 0
uint32_t _14 : 1; // 0
uint32_t _15 : 1; // 0
uint32_t opcode : 3;
uint32_t rmode : 2;
uint32_t _21 : 1; // 1
uint32_t type : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t _30 : 1; // 0
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.sf = static_cast<uint8_t>(enc.sf);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.type = static_cast<uint8_t>(enc.type);
inst.rmode = static_cast<uint8_t>(enc.rmode);
inst.iform = InstForm::FCVTNS_64H_FLOAT2INT;
inst.iclass = InstName::FCVTNS;
return true;
}
static bool TryExtractFCVTNS_32S_FLOAT2INT(InstData &inst, uint32_t bits) {
// bits
// & 11111111111111111111110000000000
// --------------------------------
// 00011110001000000000000000000000
if ((bits & 0xfffffc00U) != 0x1e200000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t _12 : 1; // 0
uint32_t _13 : 1; // 0
uint32_t _14 : 1; // 0
uint32_t _15 : 1; // 0
uint32_t opcode : 3;
uint32_t rmode : 2;
uint32_t _21 : 1; // 1
uint32_t type : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t _30 : 1; // 0
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.sf = static_cast<uint8_t>(enc.sf);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.type = static_cast<uint8_t>(enc.type);
inst.rmode = static_cast<uint8_t>(enc.rmode);
inst.iform = InstForm::FCVTNS_32S_FLOAT2INT;
inst.iclass = InstName::FCVTNS;
return true;
}
static bool TryExtractFCVTNS_64S_FLOAT2INT(InstData &inst, uint32_t bits) {
// bits
// & 11111111111111111111110000000000
// --------------------------------
// 10011110001000000000000000000000
if ((bits & 0xfffffc00U) != 0x9e200000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t _12 : 1; // 0
uint32_t _13 : 1; // 0
uint32_t _14 : 1; // 0
uint32_t _15 : 1; // 0
uint32_t opcode : 3;
uint32_t rmode : 2;
uint32_t _21 : 1; // 1
uint32_t type : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t _30 : 1; // 0
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.sf = static_cast<uint8_t>(enc.sf);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.type = static_cast<uint8_t>(enc.type);
inst.rmode = static_cast<uint8_t>(enc.rmode);
inst.iform = InstForm::FCVTNS_64S_FLOAT2INT;
inst.iclass = InstName::FCVTNS;
return true;
}
static bool TryExtractFCVTNS_32D_FLOAT2INT(InstData &inst, uint32_t bits) {
// bits
// & 11111111111111111111110000000000
// --------------------------------
// 00011110011000000000000000000000
if ((bits & 0xfffffc00U) != 0x1e600000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t _12 : 1; // 0
uint32_t _13 : 1; // 0
uint32_t _14 : 1; // 0
uint32_t _15 : 1; // 0
uint32_t opcode : 3;
uint32_t rmode : 2;
uint32_t _21 : 1; // 1
uint32_t type : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t _30 : 1; // 0
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.sf = static_cast<uint8_t>(enc.sf);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.type = static_cast<uint8_t>(enc.type);
inst.rmode = static_cast<uint8_t>(enc.rmode);
inst.iform = InstForm::FCVTNS_32D_FLOAT2INT;
inst.iclass = InstName::FCVTNS;
return true;
}
static bool TryExtractFCVTNS_64D_FLOAT2INT(InstData &inst, uint32_t bits) {
// bits
// & 11111111111111111111110000000000
// --------------------------------
// 10011110011000000000000000000000
if ((bits & 0xfffffc00U) != 0x9e600000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t _12 : 1; // 0
uint32_t _13 : 1; // 0
uint32_t _14 : 1; // 0
uint32_t _15 : 1; // 0
uint32_t opcode : 3;
uint32_t rmode : 2;
uint32_t _21 : 1; // 1
uint32_t type : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t _30 : 1; // 0
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.sf = static_cast<uint8_t>(enc.sf);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.type = static_cast<uint8_t>(enc.type);
inst.rmode = static_cast<uint8_t>(enc.rmode);
inst.iform = InstForm::FCVTNS_64D_FLOAT2INT;
inst.iclass = InstName::FCVTNS;
return true;
}
static bool TryExtractSQSHRN_ASISDSHF_N(InstData &inst, uint32_t bits) {
// bits
// & 11111111100000001111110000000000
// --------------------------------
// 01011111000000001001010000000000
if ((bits & 0xff80fc00U) != 0x5f009400U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t op : 1;
uint32_t _12 : 1; // 1
uint32_t _13 : 1; // 0
uint32_t _14 : 1; // 0
uint32_t _15 : 1; // 1
uint32_t immb : 3;
uint32_t immh : 4;
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t U : 1;
uint32_t _30 : 1; // 1
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.immh.uimm = static_cast<uint64_t>(enc.immh);
if (!(inst.immh.uimm != 0x0))
return false;
inst.immb.uimm = static_cast<uint64_t>(enc.immb);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.op = static_cast<uint8_t>(enc.op);
inst.iform = InstForm::SQSHRN_ASISDSHF_N;
inst.iclass = InstName::SQSHRN;
return true;
}
static bool TryExtractSQSHRN_ASIMDSHF_N(InstData &inst, uint32_t bits) {
// bits
// & 10111111100000001111110000000000
// --------------------------------
// 00001111000000001001010000000000
if ((bits & 0xbf80fc00U) != 0xf009400U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t op : 1;
uint32_t _12 : 1; // 1
uint32_t _13 : 1; // 0
uint32_t _14 : 1; // 0
uint32_t _15 : 1; // 1
uint32_t immb : 3;
uint32_t immh : 4;
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.immh.uimm = static_cast<uint64_t>(enc.immh);
if (!(inst.immh.uimm != 0x0))
return false;
inst.immb.uimm = static_cast<uint64_t>(enc.immb);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.op = static_cast<uint8_t>(enc.op);
inst.iform = InstForm::SQSHRN_ASIMDSHF_N;
inst.iclass = InstName::SQSHRN;
return true;
}
static bool TryExtractLDTRB_32_LDST_UNPRIV(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000000000110000000000
// --------------------------------
// 00111000010000000000100000000000
if ((bits & 0xffe00c00U) != 0x38400800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t imm9 : 9;
uint32_t _21 : 1; // 0
uint32_t opc : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.imm9.uimm = static_cast<uint64_t>(enc.imm9);
inst.V = static_cast<uint8_t>(enc.V);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LDTRB_32_LDST_UNPRIV;
inst.iclass = InstName::LDTRB;
return true;
}
static bool TryExtractLDRSB_32B_LDST_REGOFF(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000000000110000000000
// --------------------------------
// 00111000111000000000100000000000
if ((bits & 0xffe00c00U) != 0x38e00800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t S : 1;
uint32_t option : 3;
uint32_t Rm : 5;
uint32_t _21 : 1; // 1
uint32_t opc : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.option = static_cast<uint8_t>(enc.option);
inst.V = static_cast<uint8_t>(enc.V);
inst.S = static_cast<uint8_t>(enc.S);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LDRSB_32B_LDST_REGOFF;
inst.iclass = InstName::LDRSB;
return true;
}
static bool TryExtractLDRSB_32BL_LDST_REGOFF(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001110110000000000
// --------------------------------
// 00111000111000000110100000000000
if ((bits & 0xffe0ec00U) != 0x38e06800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t S : 1;
uint32_t option : 3;
uint32_t Rm : 5;
uint32_t _21 : 1; // 1
uint32_t opc : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.option = static_cast<uint8_t>(enc.option);
inst.V = static_cast<uint8_t>(enc.V);
inst.S = static_cast<uint8_t>(enc.S);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LDRSB_32BL_LDST_REGOFF;
inst.iclass = InstName::LDRSB;
return true;
}
static bool TryExtractLDRSB_64B_LDST_REGOFF(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000000000110000000000
// --------------------------------
// 00111000101000000000100000000000
if ((bits & 0xffe00c00U) != 0x38a00800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t S : 1;
uint32_t option : 3;
uint32_t Rm : 5;
uint32_t _21 : 1; // 1
uint32_t opc : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.option = static_cast<uint8_t>(enc.option);
inst.V = static_cast<uint8_t>(enc.V);
inst.S = static_cast<uint8_t>(enc.S);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LDRSB_64B_LDST_REGOFF;
inst.iclass = InstName::LDRSB;
return true;
}
static bool TryExtractLDRSB_64BL_LDST_REGOFF(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001110110000000000
// --------------------------------
// 00111000101000000110100000000000
if ((bits & 0xffe0ec00U) != 0x38a06800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t S : 1;
uint32_t option : 3;
uint32_t Rm : 5;
uint32_t _21 : 1; // 1
uint32_t opc : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.option = static_cast<uint8_t>(enc.option);
inst.V = static_cast<uint8_t>(enc.V);
inst.S = static_cast<uint8_t>(enc.S);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LDRSB_64BL_LDST_REGOFF;
inst.iclass = InstName::LDRSB;
return true;
}
static bool TryExtractSXTH_SBFM_32M_BITFIELD(InstData &inst, uint32_t bits) {
// bits
// & 11111111111111111111110000000000
// --------------------------------
// 00010011000000000011110000000000
if ((bits & 0xfffffc00U) != 0x13003c00U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t imms : 6;
uint32_t immr : 6;
uint32_t N : 1;
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 0
uint32_t _28 : 1; // 1
uint32_t opc : 2;
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.sf = static_cast<uint8_t>(enc.sf);
inst.N = static_cast<uint8_t>(enc.N);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.immr.uimm = static_cast<uint64_t>(enc.immr);
inst.imms.uimm = static_cast<uint64_t>(enc.imms);
inst.iform = InstForm::SXTH_SBFM_32M_BITFIELD;
inst.iclass = InstName::SBFM;
return true;
}
static bool TryExtractSXTH_SBFM_64M_BITFIELD(InstData &inst, uint32_t bits) {
// bits
// & 11111111111111111111110000000000
// --------------------------------
// 10010011010000000011110000000000
if ((bits & 0xfffffc00U) != 0x93403c00U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t imms : 6;
uint32_t immr : 6;
uint32_t N : 1;
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 0
uint32_t _28 : 1; // 1
uint32_t opc : 2;
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.sf = static_cast<uint8_t>(enc.sf);
inst.N = static_cast<uint8_t>(enc.N);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.immr.uimm = static_cast<uint64_t>(enc.immr);
inst.imms.uimm = static_cast<uint64_t>(enc.imms);
inst.iform = InstForm::SXTH_SBFM_64M_BITFIELD;
inst.iclass = InstName::SBFM;
return true;
}
static bool TryExtractLDURSB_32_LDST_UNSCALED(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000000000110000000000
// --------------------------------
// 00111000110000000000000000000000
if ((bits & 0xffe00c00U) != 0x38c00000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t imm9 : 9;
uint32_t _21 : 1; // 0
uint32_t opc : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.imm9.uimm = static_cast<uint64_t>(enc.imm9);
inst.V = static_cast<uint8_t>(enc.V);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LDURSB_32_LDST_UNSCALED;
inst.iclass = InstName::LDURSB;
return true;
}
static bool TryExtractLDURSB_64_LDST_UNSCALED(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000000000110000000000
// --------------------------------
// 00111000100000000000000000000000
if ((bits & 0xffe00c00U) != 0x38800000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t imm9 : 9;
uint32_t _21 : 1; // 0
uint32_t opc : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.imm9.uimm = static_cast<uint64_t>(enc.imm9);
inst.V = static_cast<uint8_t>(enc.V);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LDURSB_64_LDST_UNSCALED;
inst.iclass = InstName::LDURSB;
return true;
}
static bool TryExtractSHA256H_QQV_CRYPTOSHA3(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 01011110000000000100000000000000
if ((bits & 0xffe0fc00U) != 0x5e004000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t P : 1;
uint32_t _13 : 1; // 0
uint32_t _14 : 1; // 1
uint32_t _15 : 1; // 0
uint32_t Rm : 5;
uint32_t _21 : 1; // 0
uint32_t size : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 0
uint32_t _30 : 1; // 1
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.P = static_cast<uint8_t>(enc.P);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.iform = InstForm::SHA256H_QQV_CRYPTOSHA3;
inst.iclass = InstName::SHA256H;
return true;
}
static bool TryExtractLD4R_ASISDLSO_R4(InstData &inst, uint32_t bits) {
// bits
// & 10111111111111111111000000000000
// --------------------------------
// 00001101011000001110000000000000
if ((bits & 0xbffff000U) != 0xd60e000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t size : 2;
uint32_t S : 1;
uint32_t opcode : 3;
uint32_t _16 : 1; // 0
uint32_t _17 : 1; // 0
uint32_t _18 : 1; // 0
uint32_t _19 : 1; // 0
uint32_t _20 : 1; // 0
uint32_t R : 1;
uint32_t L : 1;
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 0
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.L = static_cast<uint8_t>(enc.L);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.S = static_cast<uint8_t>(enc.S);
inst.R = static_cast<uint8_t>(enc.R);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LD4R_ASISDLSO_R4;
inst.iclass = InstName::LD4R;
return true;
}
static bool TryExtractLD4R_ASISDLSOP_R4_I(InstData &inst, uint32_t bits) {
// bits
// & 10111111111111111111000000000000
// --------------------------------
// 00001101111111111110000000000000
if ((bits & 0xbffff000U) != 0xdffe000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t size : 2;
uint32_t S : 1;
uint32_t opcode : 3;
uint32_t Rm : 5;
uint32_t R : 1;
uint32_t L : 1;
uint32_t _23 : 1; // 1
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 0
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.L = static_cast<uint8_t>(enc.L);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.S = static_cast<uint8_t>(enc.S);
inst.R = static_cast<uint8_t>(enc.R);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LD4R_ASISDLSOP_R4_I;
inst.iclass = InstName::LD4R;
return true;
}
static bool TryExtractLD4R_ASISDLSOP_RX4_R(InstData &inst, uint32_t bits) {
// bits
// & 10111111111000001111000000000000
// --------------------------------
// 00001101111000001110000000000000
if ((bits & 0xbfe0f000U) != 0xde0e000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t size : 2;
uint32_t S : 1;
uint32_t opcode : 3;
uint32_t Rm : 5;
uint32_t R : 1;
uint32_t L : 1;
uint32_t _23 : 1; // 1
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 0
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.L = static_cast<uint8_t>(enc.L);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.S = static_cast<uint8_t>(enc.S);
inst.R = static_cast<uint8_t>(enc.R);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LD4R_ASISDLSOP_RX4_R;
inst.iclass = InstName::LD4R;
return true;
}
static bool TryExtractFCVTNS_ASISDMISCFP16_R(InstData &inst, uint32_t bits) {
// bits
// & 11111111111111111111110000000000
// --------------------------------
// 01011110011110011010100000000000
if ((bits & 0xfffffc00U) != 0x5e79a800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t o1 : 1;
uint32_t _13 : 1; // 1
uint32_t _14 : 1; // 0
uint32_t _15 : 1; // 1
uint32_t _16 : 1; // 1
uint32_t _17 : 1; // 0
uint32_t _18 : 1; // 0
uint32_t _19 : 1; // 1
uint32_t _20 : 1; // 1
uint32_t _21 : 1; // 1
uint32_t _22 : 1; // 1
uint32_t o2 : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t U : 1;
uint32_t _30 : 1; // 1
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.U = static_cast<uint8_t>(enc.U);
inst.o2 = static_cast<uint8_t>(enc.o2);
inst.o1 = static_cast<uint8_t>(enc.o1);
inst.iform = InstForm::FCVTNS_ASISDMISCFP16_R;
inst.iclass = InstName::FCVTNS;
return true;
}
static bool TryExtractFCVTNS_ASISDMISC_R(InstData &inst, uint32_t bits) {
// bits
// & 11111111101111111111110000000000
// --------------------------------
// 01011110001000011010100000000000
if ((bits & 0xffbffc00U) != 0x5e21a800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t o1 : 1;
uint32_t _13 : 1; // 1
uint32_t _14 : 1; // 0
uint32_t _15 : 1; // 1
uint32_t _16 : 1; // 1
uint32_t _17 : 1; // 0
uint32_t _18 : 1; // 0
uint32_t _19 : 1; // 0
uint32_t _20 : 1; // 0
uint32_t _21 : 1; // 1
uint32_t sz : 1;
uint32_t o2 : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t U : 1;
uint32_t _30 : 1; // 1
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.sz = static_cast<uint8_t>(enc.sz);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o2 = static_cast<uint8_t>(enc.o2);
inst.o1 = static_cast<uint8_t>(enc.o1);
inst.iform = InstForm::FCVTNS_ASISDMISC_R;
inst.iclass = InstName::FCVTNS;
return true;
}
static bool TryExtractFCVTNS_ASIMDMISCFP16_R(InstData &inst, uint32_t bits) {
// bits
// & 10111111111111111111110000000000
// --------------------------------
// 00001110011110011010100000000000
if ((bits & 0xbffffc00U) != 0xe79a800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t o1 : 1;
uint32_t _13 : 1; // 1
uint32_t _14 : 1; // 0
uint32_t _15 : 1; // 1
uint32_t _16 : 1; // 1
uint32_t _17 : 1; // 0
uint32_t _18 : 1; // 0
uint32_t _19 : 1; // 1
uint32_t _20 : 1; // 1
uint32_t _21 : 1; // 1
uint32_t _22 : 1; // 1
uint32_t o2 : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o2 = static_cast<uint8_t>(enc.o2);
inst.o1 = static_cast<uint8_t>(enc.o1);
inst.iform = InstForm::FCVTNS_ASIMDMISCFP16_R;
inst.iclass = InstName::FCVTNS;
return true;
}
static bool TryExtractFCVTNS_ASIMDMISC_R(InstData &inst, uint32_t bits) {
// bits
// & 10111111101111111111110000000000
// --------------------------------
// 00001110001000011010100000000000
if ((bits & 0xbfbffc00U) != 0xe21a800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t o1 : 1;
uint32_t _13 : 1; // 1
uint32_t _14 : 1; // 0
uint32_t _15 : 1; // 1
uint32_t _16 : 1; // 1
uint32_t _17 : 1; // 0
uint32_t _18 : 1; // 0
uint32_t _19 : 1; // 0
uint32_t _20 : 1; // 0
uint32_t _21 : 1; // 1
uint32_t sz : 1;
uint32_t o2 : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.sz = static_cast<uint8_t>(enc.sz);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o2 = static_cast<uint8_t>(enc.o2);
inst.o1 = static_cast<uint8_t>(enc.o1);
inst.iform = InstForm::FCVTNS_ASIMDMISC_R;
inst.iclass = InstName::FCVTNS;
return true;
}
static bool TryExtractFDIV_ASIMDSAMEFP16_ONLY(InstData &inst, uint32_t bits) {
// bits
// & 10111111111000001111110000000000
// --------------------------------
// 00101110010000000011110000000000
if ((bits & 0xbfe0fc00U) != 0x2e403c00U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t opcode : 3;
uint32_t _14 : 1; // 0
uint32_t _15 : 1; // 0
uint32_t Rm : 5;
uint32_t _21 : 1; // 0
uint32_t _22 : 1; // 1
uint32_t a : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.a = static_cast<uint8_t>(enc.a);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.U = static_cast<uint8_t>(enc.U);
inst.iform = InstForm::FDIV_ASIMDSAMEFP16_ONLY;
inst.iclass = InstName::FDIV;
return true;
}
static bool TryExtractFDIV_ASIMDSAME_ONLY(InstData &inst, uint32_t bits) {
// bits
// & 10111111101000001111110000000000
// --------------------------------
// 00101110001000001111110000000000
if ((bits & 0xbfa0fc00U) != 0x2e20fc00U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t opcode : 5;
uint32_t Rm : 5;
uint32_t _21 : 1; // 1
uint32_t sz : 1;
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.sz = static_cast<uint8_t>(enc.sz);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.U = static_cast<uint8_t>(enc.U);
inst.iform = InstForm::FDIV_ASIMDSAME_ONLY;
inst.iclass = InstName::FDIV;
return true;
}
static bool TryExtractFRECPE_ASISDMISCFP16_R(InstData &inst, uint32_t bits) {
// bits
// & 11111111111111111111110000000000
// --------------------------------
// 01011110111110011101100000000000
if ((bits & 0xfffffc00U) != 0x5ef9d800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t opcode : 5;
uint32_t _17 : 1; // 0
uint32_t _18 : 1; // 0
uint32_t _19 : 1; // 1
uint32_t _20 : 1; // 1
uint32_t _21 : 1; // 1
uint32_t _22 : 1; // 1
uint32_t size : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t U : 1;
uint32_t _30 : 1; // 1
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::FRECPE_ASISDMISCFP16_R;
inst.iclass = InstName::FRECPE;
return true;
}
static bool TryExtractFRECPE_ASISDMISC_R(InstData &inst, uint32_t bits) {
// bits
// & 11111111101111111111110000000000
// --------------------------------
// 01011110101000011101100000000000
if ((bits & 0xffbffc00U) != 0x5ea1d800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t opcode : 5;
uint32_t _17 : 1; // 0
uint32_t _18 : 1; // 0
uint32_t _19 : 1; // 0
uint32_t _20 : 1; // 0
uint32_t _21 : 1; // 1
uint32_t sz : 1;
uint32_t _23 : 1; // 1
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t U : 1;
uint32_t _30 : 1; // 1
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.sz = static_cast<uint8_t>(enc.sz);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.U = static_cast<uint8_t>(enc.U);
inst.iform = InstForm::FRECPE_ASISDMISC_R;
inst.iclass = InstName::FRECPE;
return true;
}
static bool TryExtractFRECPE_ASIMDMISCFP16_R(InstData &inst, uint32_t bits) {
// bits
// & 10111111111111111111110000000000
// --------------------------------
// 00001110111110011101100000000000
if ((bits & 0xbffffc00U) != 0xef9d800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t opcode : 5;
uint32_t _17 : 1; // 0
uint32_t _18 : 1; // 0
uint32_t _19 : 1; // 1
uint32_t _20 : 1; // 1
uint32_t _21 : 1; // 1
uint32_t _22 : 1; // 1
uint32_t a : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.a = static_cast<uint8_t>(enc.a);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.iform = InstForm::FRECPE_ASIMDMISCFP16_R;
inst.iclass = InstName::FRECPE;
return true;
}
static bool TryExtractFRECPE_ASIMDMISC_R(InstData &inst, uint32_t bits) {
// bits
// & 10111111101111111111110000000000
// --------------------------------
// 00001110101000011101100000000000
if ((bits & 0xbfbffc00U) != 0xea1d800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t opcode : 5;
uint32_t _17 : 1; // 0
uint32_t _18 : 1; // 0
uint32_t _19 : 1; // 0
uint32_t _20 : 1; // 0
uint32_t _21 : 1; // 1
uint32_t sz : 1;
uint32_t _23 : 1; // 1
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.sz = static_cast<uint8_t>(enc.sz);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.U = static_cast<uint8_t>(enc.U);
inst.iform = InstForm::FRECPE_ASIMDMISC_R;
inst.iclass = InstName::FRECPE;
return true;
}
static bool TryExtractLD1R_ASISDLSO_R1(InstData &inst, uint32_t bits) {
// bits
// & 10111111111111111111000000000000
// --------------------------------
// 00001101010000001100000000000000
if ((bits & 0xbffff000U) != 0xd40c000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t size : 2;
uint32_t S : 1;
uint32_t opcode : 3;
uint32_t _16 : 1; // 0
uint32_t _17 : 1; // 0
uint32_t _18 : 1; // 0
uint32_t _19 : 1; // 0
uint32_t _20 : 1; // 0
uint32_t R : 1;
uint32_t L : 1;
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 0
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.L = static_cast<uint8_t>(enc.L);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.S = static_cast<uint8_t>(enc.S);
inst.R = static_cast<uint8_t>(enc.R);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LD1R_ASISDLSO_R1;
inst.iclass = InstName::LD1R;
return true;
}
static bool TryExtractLD1R_ASISDLSOP_R1_I(InstData &inst, uint32_t bits) {
// bits
// & 10111111111111111111000000000000
// --------------------------------
// 00001101110111111100000000000000
if ((bits & 0xbffff000U) != 0xddfc000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t size : 2;
uint32_t S : 1;
uint32_t opcode : 3;
uint32_t Rm : 5;
uint32_t R : 1;
uint32_t L : 1;
uint32_t _23 : 1; // 1
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 0
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.L = static_cast<uint8_t>(enc.L);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.S = static_cast<uint8_t>(enc.S);
inst.R = static_cast<uint8_t>(enc.R);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LD1R_ASISDLSOP_R1_I;
inst.iclass = InstName::LD1R;
return true;
}
static bool TryExtractLD1R_ASISDLSOP_RX1_R(InstData &inst, uint32_t bits) {
// bits
// & 10111111111000001111000000000000
// --------------------------------
// 00001101110000001100000000000000
if ((bits & 0xbfe0f000U) != 0xdc0c000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t size : 2;
uint32_t S : 1;
uint32_t opcode : 3;
uint32_t Rm : 5;
uint32_t R : 1;
uint32_t L : 1;
uint32_t _23 : 1; // 1
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 0
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.L = static_cast<uint8_t>(enc.L);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.S = static_cast<uint8_t>(enc.S);
inst.R = static_cast<uint8_t>(enc.R);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LD1R_ASISDLSOP_RX1_R;
inst.iclass = InstName::LD1R;
return true;
}
static bool TryExtractMUL_ASIMDELEM_R(InstData &inst, uint32_t bits) {
// bits
// & 10111111000000001111010000000000
// --------------------------------
// 00001111000000001000000000000000
if ((bits & 0xbf00f400U) != 0xf008000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t H : 1;
uint32_t opcode : 4;
uint32_t Rm : 4;
uint32_t M : 1;
uint32_t L : 1;
uint32_t size : 2;
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Q = static_cast<uint8_t>(enc.Q);
inst.H = static_cast<uint8_t>(enc.H);
inst.M = static_cast<uint8_t>(enc.M);
inst.L = static_cast<uint8_t>(enc.L);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.U = static_cast<uint8_t>(enc.U);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::MUL_ASIMDELEM_R;
inst.iclass = InstName::MUL;
return true;
}
static bool TryExtractUADDLV_ASIMDALL_ONLY(InstData &inst, uint32_t bits) {
// bits
// & 10111111001111111111110000000000
// --------------------------------
// 00101110001100000011100000000000
if ((bits & 0xbf3ffc00U) != 0x2e303800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t opcode : 5;
uint32_t _17 : 1; // 0
uint32_t _18 : 1; // 0
uint32_t _19 : 1; // 0
uint32_t _20 : 1; // 1
uint32_t _21 : 1; // 1
uint32_t size : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.U = static_cast<uint8_t>(enc.U);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::UADDLV_ASIMDALL_ONLY;
inst.iclass = InstName::UADDLV;
return true;
}
static bool TryExtractFNEG_H_FLOATDP1(InstData &inst, uint32_t bits) {
// bits
// & 11111111111111111111110000000000
// --------------------------------
// 00011110111000010100000000000000
if ((bits & 0xfffffc00U) != 0x1ee14000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t _12 : 1; // 0
uint32_t _13 : 1; // 0
uint32_t _14 : 1; // 1
uint32_t opc : 2;
uint32_t _17 : 1; // 0
uint32_t _18 : 1; // 0
uint32_t _19 : 1; // 0
uint32_t _20 : 1; // 0
uint32_t _21 : 1; // 1
uint32_t type : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t _30 : 1; // 0
uint32_t M : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.M = static_cast<uint8_t>(enc.M);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.type = static_cast<uint8_t>(enc.type);
inst.iform = InstForm::FNEG_H_FLOATDP1;
inst.iclass = InstName::FNEG;
return true;
}
static bool TryExtractFNEG_S_FLOATDP1(InstData &inst, uint32_t bits) {
// bits
// & 11111111111111111111110000000000
// --------------------------------
// 00011110001000010100000000000000
if ((bits & 0xfffffc00U) != 0x1e214000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t _12 : 1; // 0
uint32_t _13 : 1; // 0
uint32_t _14 : 1; // 1
uint32_t opc : 2;
uint32_t _17 : 1; // 0
uint32_t _18 : 1; // 0
uint32_t _19 : 1; // 0
uint32_t _20 : 1; // 0
uint32_t _21 : 1; // 1
uint32_t type : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t _30 : 1; // 0
uint32_t M : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.M = static_cast<uint8_t>(enc.M);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.type = static_cast<uint8_t>(enc.type);
inst.iform = InstForm::FNEG_S_FLOATDP1;
inst.iclass = InstName::FNEG;
return true;
}
static bool TryExtractFNEG_D_FLOATDP1(InstData &inst, uint32_t bits) {
// bits
// & 11111111111111111111110000000000
// --------------------------------
// 00011110011000010100000000000000
if ((bits & 0xfffffc00U) != 0x1e614000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t _12 : 1; // 0
uint32_t _13 : 1; // 0
uint32_t _14 : 1; // 1
uint32_t opc : 2;
uint32_t _17 : 1; // 0
uint32_t _18 : 1; // 0
uint32_t _19 : 1; // 0
uint32_t _20 : 1; // 0
uint32_t _21 : 1; // 1
uint32_t type : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t _30 : 1; // 0
uint32_t M : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.M = static_cast<uint8_t>(enc.M);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.type = static_cast<uint8_t>(enc.type);
inst.iform = InstForm::FNEG_D_FLOATDP1;
inst.iclass = InstName::FNEG;
return true;
}
static bool TryExtractUSUBL_ASIMDDIFF_L(InstData &inst, uint32_t bits) {
// bits
// & 10111111001000001111110000000000
// --------------------------------
// 00101110001000000010000000000000
if ((bits & 0xbf20fc00U) != 0x2e202000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t _12 : 1; // 0
uint32_t o1 : 1;
uint32_t _14 : 1; // 0
uint32_t _15 : 1; // 0
uint32_t Rm : 5;
uint32_t _21 : 1; // 1
uint32_t size : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o1 = static_cast<uint8_t>(enc.o1);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::USUBL_ASIMDDIFF_L;
inst.iclass = InstName::USUBL;
return true;
}
static bool TryExtractSHA1C_QSV_CRYPTOSHA3(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 01011110000000000000000000000000
if ((bits & 0xffe0fc00U) != 0x5e000000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t opcode : 3;
uint32_t _15 : 1; // 0
uint32_t Rm : 5;
uint32_t _21 : 1; // 0
uint32_t size : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 0
uint32_t _30 : 1; // 1
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::SHA1C_QSV_CRYPTOSHA3;
inst.iclass = InstName::SHA1C;
return true;
}
static bool TryExtractSQDMLSL_ASISDDIFF_ONLY(InstData &inst, uint32_t bits) {
// bits
// & 11111111001000001111110000000000
// --------------------------------
// 01011110001000001011000000000000
if ((bits & 0xff20fc00U) != 0x5e20b000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t _12 : 1; // 1
uint32_t o1 : 1;
uint32_t _14 : 1; // 0
uint32_t _15 : 1; // 1
uint32_t Rm : 5;
uint32_t _21 : 1; // 1
uint32_t size : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t U : 1;
uint32_t _30 : 1; // 1
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o1 = static_cast<uint8_t>(enc.o1);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::SQDMLSL_ASISDDIFF_ONLY;
inst.iclass = InstName::SQDMLSL;
return true;
}
static bool TryExtractSQDMLSL_ASIMDDIFF_L(InstData &inst, uint32_t bits) {
// bits
// & 10111111001000001111110000000000
// --------------------------------
// 00001110001000001011000000000000
if ((bits & 0xbf20fc00U) != 0xe20b000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t _12 : 1; // 1
uint32_t o1 : 1;
uint32_t _14 : 1; // 0
uint32_t _15 : 1; // 1
uint32_t Rm : 5;
uint32_t _21 : 1; // 1
uint32_t size : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o1 = static_cast<uint8_t>(enc.o1);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::SQDMLSL_ASIMDDIFF_L;
inst.iclass = InstName::SQDMLSL;
return true;
}
static bool TryExtractPRFUM_P_LDST_UNSCALED(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000000000110000000000
// --------------------------------
// 11111000100000000000000000000000
if ((bits & 0xffe00c00U) != 0xf8800000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t imm9 : 9;
uint32_t _21 : 1; // 0
uint32_t opc : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.imm9.uimm = static_cast<uint64_t>(enc.imm9);
inst.V = static_cast<uint8_t>(enc.V);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::PRFUM_P_LDST_UNSCALED;
inst.iclass = InstName::PRFUM;
return true;
}
static bool TryExtractLDSMAXAB_32_MEMOP(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 00111000101000000100000000000000
if ((bits & 0xffe0fc00U) != 0x38a04000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t opc : 3;
uint32_t o3 : 1;
uint32_t Rs : 5;
uint32_t _21 : 1; // 1
uint32_t R : 1;
uint32_t A : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.A = static_cast<uint8_t>(enc.A);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.V = static_cast<uint8_t>(enc.V);
inst.R = static_cast<uint8_t>(enc.R);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o3 = static_cast<uint8_t>(enc.o3);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LDSMAXAB_32_MEMOP;
inst.iclass = InstName::LDSMAXAB;
return true;
}
static bool TryExtractLDSMAXALB_32_MEMOP(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 00111000111000000100000000000000
if ((bits & 0xffe0fc00U) != 0x38e04000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t opc : 3;
uint32_t o3 : 1;
uint32_t Rs : 5;
uint32_t _21 : 1; // 1
uint32_t R : 1;
uint32_t A : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.A = static_cast<uint8_t>(enc.A);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.V = static_cast<uint8_t>(enc.V);
inst.R = static_cast<uint8_t>(enc.R);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o3 = static_cast<uint8_t>(enc.o3);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LDSMAXALB_32_MEMOP;
inst.iclass = InstName::LDSMAXALB;
return true;
}
static bool TryExtractLDSMAXB_32_MEMOP(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 00111000001000000100000000000000
if ((bits & 0xffe0fc00U) != 0x38204000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t opc : 3;
uint32_t o3 : 1;
uint32_t Rs : 5;
uint32_t _21 : 1; // 1
uint32_t R : 1;
uint32_t A : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.A = static_cast<uint8_t>(enc.A);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.V = static_cast<uint8_t>(enc.V);
inst.R = static_cast<uint8_t>(enc.R);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o3 = static_cast<uint8_t>(enc.o3);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LDSMAXB_32_MEMOP;
inst.iclass = InstName::LDSMAXB;
return true;
}
static bool TryExtractLDSMAXLB_32_MEMOP(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 00111000011000000100000000000000
if ((bits & 0xffe0fc00U) != 0x38604000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t opc : 3;
uint32_t o3 : 1;
uint32_t Rs : 5;
uint32_t _21 : 1; // 1
uint32_t R : 1;
uint32_t A : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.A = static_cast<uint8_t>(enc.A);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.V = static_cast<uint8_t>(enc.V);
inst.R = static_cast<uint8_t>(enc.R);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o3 = static_cast<uint8_t>(enc.o3);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LDSMAXLB_32_MEMOP;
inst.iclass = InstName::LDSMAXLB;
return true;
}
static bool TryExtractFABD_ASISDSAMEFP16_ONLY(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 01111110110000000001010000000000
if ((bits & 0xffe0fc00U) != 0x7ec01400U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t opcode : 3;
uint32_t _14 : 1; // 0
uint32_t _15 : 1; // 0
uint32_t Rm : 5;
uint32_t _21 : 1; // 0
uint32_t _22 : 1; // 1
uint32_t a : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t U : 1;
uint32_t _30 : 1; // 1
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.a = static_cast<uint8_t>(enc.a);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.U = static_cast<uint8_t>(enc.U);
inst.iform = InstForm::FABD_ASISDSAMEFP16_ONLY;
inst.iclass = InstName::FABD;
return true;
}
static bool TryExtractFABD_ASISDSAME_ONLY(InstData &inst, uint32_t bits) {
// bits
// & 11111111101000001111110000000000
// --------------------------------
// 01111110101000001101010000000000
if ((bits & 0xffa0fc00U) != 0x7ea0d400U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t opcode : 5;
uint32_t Rm : 5;
uint32_t _21 : 1; // 1
uint32_t sz : 1;
uint32_t _23 : 1; // 1
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t U : 1;
uint32_t _30 : 1; // 1
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.sz = static_cast<uint8_t>(enc.sz);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.U = static_cast<uint8_t>(enc.U);
inst.iform = InstForm::FABD_ASISDSAME_ONLY;
inst.iclass = InstName::FABD;
return true;
}
static bool TryExtractFABD_ASIMDSAMEFP16_ONLY(InstData &inst, uint32_t bits) {
// bits
// & 10111111111000001111110000000000
// --------------------------------
// 00101110110000000001010000000000
if ((bits & 0xbfe0fc00U) != 0x2ec01400U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t opcode : 3;
uint32_t _14 : 1; // 0
uint32_t _15 : 1; // 0
uint32_t Rm : 5;
uint32_t _21 : 1; // 0
uint32_t _22 : 1; // 1
uint32_t a : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.a = static_cast<uint8_t>(enc.a);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.U = static_cast<uint8_t>(enc.U);
inst.iform = InstForm::FABD_ASIMDSAMEFP16_ONLY;
inst.iclass = InstName::FABD;
return true;
}
static bool TryExtractFABD_ASIMDSAME_ONLY(InstData &inst, uint32_t bits) {
// bits
// & 10111111101000001111110000000000
// --------------------------------
// 00101110101000001101010000000000
if ((bits & 0xbfa0fc00U) != 0x2ea0d400U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t opcode : 5;
uint32_t Rm : 5;
uint32_t _21 : 1; // 1
uint32_t sz : 1;
uint32_t _23 : 1; // 1
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.sz = static_cast<uint8_t>(enc.sz);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.U = static_cast<uint8_t>(enc.U);
inst.iform = InstForm::FABD_ASIMDSAME_ONLY;
inst.iclass = InstName::FABD;
return true;
}
static bool TryExtractB_ONLY_CONDBRANCH(InstData &inst, uint32_t bits) {
// bits
// & 11111111000000000000000000010000
// --------------------------------
// 01010100000000000000000000000000
if ((bits & 0xff000010U) != 0x54000000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t cond : 4;
uint32_t o0 : 1;
uint32_t imm19 : 19;
uint32_t o1 : 1;
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 0
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 0
uint32_t _30 : 1; // 1
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.imm19.uimm = static_cast<uint64_t>(enc.imm19);
inst.cond = static_cast<uint8_t>(enc.cond);
inst.o1 = static_cast<uint8_t>(enc.o1);
inst.o0 = static_cast<uint8_t>(enc.o0);
inst.iform = InstForm::B_ONLY_CONDBRANCH;
inst.iclass = InstName::B;
return true;
}
static bool TryExtractFCVTNU_32H_FLOAT2INT(InstData &inst, uint32_t bits) {
// bits
// & 11111111111111111111110000000000
// --------------------------------
// 00011110111000010000000000000000
if ((bits & 0xfffffc00U) != 0x1ee10000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t _12 : 1; // 0
uint32_t _13 : 1; // 0
uint32_t _14 : 1; // 0
uint32_t _15 : 1; // 0
uint32_t opcode : 3;
uint32_t rmode : 2;
uint32_t _21 : 1; // 1
uint32_t type : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t _30 : 1; // 0
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.sf = static_cast<uint8_t>(enc.sf);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.type = static_cast<uint8_t>(enc.type);
inst.rmode = static_cast<uint8_t>(enc.rmode);
inst.iform = InstForm::FCVTNU_32H_FLOAT2INT;
inst.iclass = InstName::FCVTNU;
return true;
}
static bool TryExtractFCVTNU_64H_FLOAT2INT(InstData &inst, uint32_t bits) {
// bits
// & 11111111111111111111110000000000
// --------------------------------
// 10011110111000010000000000000000
if ((bits & 0xfffffc00U) != 0x9ee10000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t _12 : 1; // 0
uint32_t _13 : 1; // 0
uint32_t _14 : 1; // 0
uint32_t _15 : 1; // 0
uint32_t opcode : 3;
uint32_t rmode : 2;
uint32_t _21 : 1; // 1
uint32_t type : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t _30 : 1; // 0
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.sf = static_cast<uint8_t>(enc.sf);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.type = static_cast<uint8_t>(enc.type);
inst.rmode = static_cast<uint8_t>(enc.rmode);
inst.iform = InstForm::FCVTNU_64H_FLOAT2INT;
inst.iclass = InstName::FCVTNU;
return true;
}
static bool TryExtractFCVTNU_32S_FLOAT2INT(InstData &inst, uint32_t bits) {
// bits
// & 11111111111111111111110000000000
// --------------------------------
// 00011110001000010000000000000000
if ((bits & 0xfffffc00U) != 0x1e210000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t _12 : 1; // 0
uint32_t _13 : 1; // 0
uint32_t _14 : 1; // 0
uint32_t _15 : 1; // 0
uint32_t opcode : 3;
uint32_t rmode : 2;
uint32_t _21 : 1; // 1
uint32_t type : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t _30 : 1; // 0
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.sf = static_cast<uint8_t>(enc.sf);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.type = static_cast<uint8_t>(enc.type);
inst.rmode = static_cast<uint8_t>(enc.rmode);
inst.iform = InstForm::FCVTNU_32S_FLOAT2INT;
inst.iclass = InstName::FCVTNU;
return true;
}
static bool TryExtractFCVTNU_64S_FLOAT2INT(InstData &inst, uint32_t bits) {
// bits
// & 11111111111111111111110000000000
// --------------------------------
// 10011110001000010000000000000000
if ((bits & 0xfffffc00U) != 0x9e210000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t _12 : 1; // 0
uint32_t _13 : 1; // 0
uint32_t _14 : 1; // 0
uint32_t _15 : 1; // 0
uint32_t opcode : 3;
uint32_t rmode : 2;
uint32_t _21 : 1; // 1
uint32_t type : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t _30 : 1; // 0
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.sf = static_cast<uint8_t>(enc.sf);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.type = static_cast<uint8_t>(enc.type);
inst.rmode = static_cast<uint8_t>(enc.rmode);
inst.iform = InstForm::FCVTNU_64S_FLOAT2INT;
inst.iclass = InstName::FCVTNU;
return true;
}
static bool TryExtractFCVTNU_32D_FLOAT2INT(InstData &inst, uint32_t bits) {
// bits
// & 11111111111111111111110000000000
// --------------------------------
// 00011110011000010000000000000000
if ((bits & 0xfffffc00U) != 0x1e610000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t _12 : 1; // 0
uint32_t _13 : 1; // 0
uint32_t _14 : 1; // 0
uint32_t _15 : 1; // 0
uint32_t opcode : 3;
uint32_t rmode : 2;
uint32_t _21 : 1; // 1
uint32_t type : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t _30 : 1; // 0
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.sf = static_cast<uint8_t>(enc.sf);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.type = static_cast<uint8_t>(enc.type);
inst.rmode = static_cast<uint8_t>(enc.rmode);
inst.iform = InstForm::FCVTNU_32D_FLOAT2INT;
inst.iclass = InstName::FCVTNU;
return true;
}
static bool TryExtractFCVTNU_64D_FLOAT2INT(InstData &inst, uint32_t bits) {
// bits
// & 11111111111111111111110000000000
// --------------------------------
// 10011110011000010000000000000000
if ((bits & 0xfffffc00U) != 0x9e610000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t _12 : 1; // 0
uint32_t _13 : 1; // 0
uint32_t _14 : 1; // 0
uint32_t _15 : 1; // 0
uint32_t opcode : 3;
uint32_t rmode : 2;
uint32_t _21 : 1; // 1
uint32_t type : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t _30 : 1; // 0
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.sf = static_cast<uint8_t>(enc.sf);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.type = static_cast<uint8_t>(enc.type);
inst.rmode = static_cast<uint8_t>(enc.rmode);
inst.iform = InstForm::FCVTNU_64D_FLOAT2INT;
inst.iclass = InstName::FCVTNU;
return true;
}
static bool TryExtractMUL_ASIMDSAME_ONLY(InstData &inst, uint32_t bits) {
// bits
// & 10111111001000001111110000000000
// --------------------------------
// 00001110001000001001110000000000
if ((bits & 0xbf20fc00U) != 0xe209c00U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t opcode : 5;
uint32_t Rm : 5;
uint32_t _21 : 1; // 1
uint32_t size : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.U = static_cast<uint8_t>(enc.U);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::MUL_ASIMDSAME_ONLY;
inst.iclass = InstName::MUL;
return true;
}
static bool TryExtractUDIV_32_DP_2SRC(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 00011010110000000000100000000000
if ((bits & 0xffe0fc00U) != 0x1ac00800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t o1 : 1;
uint32_t opcode2 : 5;
uint32_t Rm : 5;
uint32_t _21 : 1; // 0
uint32_t _22 : 1; // 1
uint32_t _23 : 1; // 1
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t op : 1;
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.opcode2 = static_cast<uint8_t>(enc.opcode2);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.sf = static_cast<uint8_t>(enc.sf);
inst.o1 = static_cast<uint8_t>(enc.o1);
inst.op = static_cast<uint8_t>(enc.op);
inst.iform = InstForm::UDIV_32_DP_2SRC;
inst.iclass = InstName::UDIV;
return true;
}
static bool TryExtractUDIV_64_DP_2SRC(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 10011010110000000000100000000000
if ((bits & 0xffe0fc00U) != 0x9ac00800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t o1 : 1;
uint32_t opcode2 : 5;
uint32_t Rm : 5;
uint32_t _21 : 1; // 0
uint32_t _22 : 1; // 1
uint32_t _23 : 1; // 1
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t op : 1;
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.opcode2 = static_cast<uint8_t>(enc.opcode2);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.sf = static_cast<uint8_t>(enc.sf);
inst.o1 = static_cast<uint8_t>(enc.o1);
inst.op = static_cast<uint8_t>(enc.op);
inst.iform = InstForm::UDIV_64_DP_2SRC;
inst.iclass = InstName::UDIV;
return true;
}
static bool TryExtractCMTST_ASISDSAME_ONLY(InstData &inst, uint32_t bits) {
// bits
// & 11111111001000001111110000000000
// --------------------------------
// 01011110001000001000110000000000
if ((bits & 0xff20fc00U) != 0x5e208c00U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t opcode : 5;
uint32_t Rm : 5;
uint32_t _21 : 1; // 1
uint32_t size : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t U : 1;
uint32_t _30 : 1; // 1
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.U = static_cast<uint8_t>(enc.U);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::CMTST_ASISDSAME_ONLY;
inst.iclass = InstName::CMTST;
return true;
}
static bool TryExtractCMTST_ASIMDSAME_ONLY(InstData &inst, uint32_t bits) {
// bits
// & 10111111001000001111110000000000
// --------------------------------
// 00001110001000001000110000000000
if ((bits & 0xbf20fc00U) != 0xe208c00U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t opcode : 5;
uint32_t Rm : 5;
uint32_t _21 : 1; // 1
uint32_t size : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.U = static_cast<uint8_t>(enc.U);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::CMTST_ASIMDSAME_ONLY;
inst.iclass = InstName::CMTST;
return true;
}
static bool TryExtractUADDL_ASIMDDIFF_L(InstData &inst, uint32_t bits) {
// bits
// & 10111111001000001111110000000000
// --------------------------------
// 00101110001000000000000000000000
if ((bits & 0xbf20fc00U) != 0x2e200000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t _12 : 1; // 0
uint32_t o1 : 1;
uint32_t _14 : 1; // 0
uint32_t _15 : 1; // 0
uint32_t Rm : 5;
uint32_t _21 : 1; // 1
uint32_t size : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o1 = static_cast<uint8_t>(enc.o1);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::UADDL_ASIMDDIFF_L;
inst.iclass = InstName::UADDL;
return true;
}
static bool TryExtractMOV_MOVN_32_MOVEWIDE(InstData &inst, uint32_t bits) {
// bits
// & 11111111100000000000000000000000
// --------------------------------
// 00010010100000000000000000000000
if ((bits & 0xff800000U) != 0x12800000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t imm16 : 16;
uint32_t hw : 2;
uint32_t _23 : 1; // 1
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 0
uint32_t _28 : 1; // 1
uint32_t opc : 2;
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.sf = static_cast<uint8_t>(enc.sf);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.hw = static_cast<uint8_t>(enc.hw);
inst.imm16.uimm = static_cast<uint64_t>(enc.imm16);
inst.iform = InstForm::MOV_MOVN_32_MOVEWIDE;
inst.iclass = InstName::MOVN;
return true;
}
static bool TryExtractMOV_MOVN_64_MOVEWIDE(InstData &inst, uint32_t bits) {
// bits
// & 11111111100000000000000000000000
// --------------------------------
// 10010010100000000000000000000000
if ((bits & 0xff800000U) != 0x92800000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t imm16 : 16;
uint32_t hw : 2;
uint32_t _23 : 1; // 1
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 0
uint32_t _28 : 1; // 1
uint32_t opc : 2;
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.sf = static_cast<uint8_t>(enc.sf);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.hw = static_cast<uint8_t>(enc.hw);
inst.imm16.uimm = static_cast<uint64_t>(enc.imm16);
inst.iform = InstForm::MOV_MOVN_64_MOVEWIDE;
inst.iclass = InstName::MOVN;
return true;
}
static bool TryExtractTRN2_ASIMDPERM_ONLY(InstData &inst, uint32_t bits) {
// bits
// & 10111111001000001111110000000000
// --------------------------------
// 00001110000000000110100000000000
if ((bits & 0xbf20fc00U) != 0xe006800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t _12 : 1; // 0
uint32_t _13 : 1; // 1
uint32_t op : 1;
uint32_t _15 : 1; // 0
uint32_t Rm : 5;
uint32_t _21 : 1; // 0
uint32_t size : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 0
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.op = static_cast<uint8_t>(enc.op);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::TRN2_ASIMDPERM_ONLY;
inst.iclass = InstName::TRN2;
return true;
}
static bool TryExtractMOVK_32_MOVEWIDE(InstData &inst, uint32_t bits) {
// bits
// & 11111111100000000000000000000000
// --------------------------------
// 01110010100000000000000000000000
if ((bits & 0xff800000U) != 0x72800000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t imm16 : 16;
uint32_t hw : 2;
uint32_t _23 : 1; // 1
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 0
uint32_t _28 : 1; // 1
uint32_t opc : 2;
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.sf = static_cast<uint8_t>(enc.sf);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.hw = static_cast<uint8_t>(enc.hw);
inst.imm16.uimm = static_cast<uint64_t>(enc.imm16);
inst.iform = InstForm::MOVK_32_MOVEWIDE;
inst.iclass = InstName::MOVK;
return true;
}
static bool TryExtractMOVK_64_MOVEWIDE(InstData &inst, uint32_t bits) {
// bits
// & 11111111100000000000000000000000
// --------------------------------
// 11110010100000000000000000000000
if ((bits & 0xff800000U) != 0xf2800000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t imm16 : 16;
uint32_t hw : 2;
uint32_t _23 : 1; // 1
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 0
uint32_t _28 : 1; // 1
uint32_t opc : 2;
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.sf = static_cast<uint8_t>(enc.sf);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.hw = static_cast<uint8_t>(enc.hw);
inst.imm16.uimm = static_cast<uint64_t>(enc.imm16);
inst.iform = InstForm::MOVK_64_MOVEWIDE;
inst.iclass = InstName::MOVK;
return true;
}
static bool TryExtractSMADDL_64WA_DP_3SRC(InstData &inst, uint32_t bits) {
if (false && TryExtractSMULL_SMADDL_64WA_DP_3SRC(inst, bits))
return true;
// bits
// & 11111111111000001000000000000000
// --------------------------------
// 10011011001000000000000000000000
if ((bits & 0xffe08000U) != 0x9b200000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t Ra : 5;
uint32_t o0 : 1;
uint32_t Rm : 5;
uint32_t _21 : 1; // 1
uint32_t _22 : 1; // 0
uint32_t U : 1;
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t op54 : 2;
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.U = static_cast<uint8_t>(enc.U);
inst.Ra = static_cast<uint8_t>(enc.Ra);
inst.op54 = static_cast<uint8_t>(enc.op54);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.sf = static_cast<uint8_t>(enc.sf);
inst.o0 = static_cast<uint8_t>(enc.o0);
inst.iform = InstForm::SMADDL_64WA_DP_3SRC;
inst.iclass = InstName::SMADDL;
return true;
}
static bool TryExtractAND_32_LOG_SHIFT(InstData &inst, uint32_t bits) {
// bits
// & 11111111001000000000000000000000
// --------------------------------
// 00001010000000000000000000000000
if ((bits & 0xff200000U) != 0xa000000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t imm6 : 6;
uint32_t Rm : 5;
uint32_t N : 1;
uint32_t shift : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t opc : 2;
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.shift = static_cast<uint8_t>(enc.shift);
inst.N = static_cast<uint8_t>(enc.N);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.sf = static_cast<uint8_t>(enc.sf);
inst.imm6.uimm = static_cast<uint64_t>(enc.imm6);
inst.iform = InstForm::AND_32_LOG_SHIFT;
inst.iclass = InstName::AND;
return true;
}
static bool TryExtractAND_64_LOG_SHIFT(InstData &inst, uint32_t bits) {
// bits
// & 11111111001000000000000000000000
// --------------------------------
// 10001010000000000000000000000000
if ((bits & 0xff200000U) != 0x8a000000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t imm6 : 6;
uint32_t Rm : 5;
uint32_t N : 1;
uint32_t shift : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t opc : 2;
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.shift = static_cast<uint8_t>(enc.shift);
inst.N = static_cast<uint8_t>(enc.N);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.sf = static_cast<uint8_t>(enc.sf);
inst.imm6.uimm = static_cast<uint64_t>(enc.imm6);
inst.iform = InstForm::AND_64_LOG_SHIFT;
inst.iclass = InstName::AND;
return true;
}
static bool TryExtractSQSHRUN_ASISDSHF_N(InstData &inst, uint32_t bits) {
// bits
// & 11111111100000001111110000000000
// --------------------------------
// 01111111000000001000010000000000
if ((bits & 0xff80fc00U) != 0x7f008400U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t op : 1;
uint32_t _12 : 1; // 0
uint32_t _13 : 1; // 0
uint32_t _14 : 1; // 0
uint32_t _15 : 1; // 1
uint32_t immb : 3;
uint32_t immh : 4;
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t U : 1;
uint32_t _30 : 1; // 1
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.immh.uimm = static_cast<uint64_t>(enc.immh);
if (!(inst.immh.uimm != 0x0))
return false;
inst.immb.uimm = static_cast<uint64_t>(enc.immb);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.op = static_cast<uint8_t>(enc.op);
inst.iform = InstForm::SQSHRUN_ASISDSHF_N;
inst.iclass = InstName::SQSHRUN;
return true;
}
static bool TryExtractSQSHRUN_ASIMDSHF_N(InstData &inst, uint32_t bits) {
// bits
// & 10111111100000001111110000000000
// --------------------------------
// 00101111000000001000010000000000
if ((bits & 0xbf80fc00U) != 0x2f008400U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t op : 1;
uint32_t _12 : 1; // 0
uint32_t _13 : 1; // 0
uint32_t _14 : 1; // 0
uint32_t _15 : 1; // 1
uint32_t immb : 3;
uint32_t immh : 4;
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.immh.uimm = static_cast<uint64_t>(enc.immh);
if (!(inst.immh.uimm != 0x0))
return false;
inst.immb.uimm = static_cast<uint64_t>(enc.immb);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.op = static_cast<uint8_t>(enc.op);
inst.iform = InstForm::SQSHRUN_ASIMDSHF_N;
inst.iclass = InstName::SQSHRUN;
return true;
}
static bool TryExtractSQDMULL_ASISDDIFF_ONLY(InstData &inst, uint32_t bits) {
// bits
// & 11111111001000001111110000000000
// --------------------------------
// 01011110001000001101000000000000
if ((bits & 0xff20fc00U) != 0x5e20d000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t opcode : 4;
uint32_t Rm : 5;
uint32_t _21 : 1; // 1
uint32_t size : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t U : 1;
uint32_t _30 : 1; // 1
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.U = static_cast<uint8_t>(enc.U);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::SQDMULL_ASISDDIFF_ONLY;
inst.iclass = InstName::SQDMULL;
return true;
}
static bool TryExtractSQDMULL_ASIMDDIFF_L(InstData &inst, uint32_t bits) {
// bits
// & 10111111001000001111110000000000
// --------------------------------
// 00001110001000001101000000000000
if ((bits & 0xbf20fc00U) != 0xe20d000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t opcode : 4;
uint32_t Rm : 5;
uint32_t _21 : 1; // 1
uint32_t size : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.U = static_cast<uint8_t>(enc.U);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::SQDMULL_ASIMDDIFF_L;
inst.iclass = InstName::SQDMULL;
return true;
}
static bool TryExtractFNMADD_H_FLOATDP3(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001000000000000000
// --------------------------------
// 00011111111000000000000000000000
if ((bits & 0xffe08000U) != 0x1fe00000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t Ra : 5;
uint32_t o0 : 1;
uint32_t Rm : 5;
uint32_t o1 : 1;
uint32_t type : 2;
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t _30 : 1; // 0
uint32_t M : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.M = static_cast<uint8_t>(enc.M);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.Ra = static_cast<uint8_t>(enc.Ra);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.type = static_cast<uint8_t>(enc.type);
inst.o1 = static_cast<uint8_t>(enc.o1);
inst.o0 = static_cast<uint8_t>(enc.o0);
inst.iform = InstForm::FNMADD_H_FLOATDP3;
inst.iclass = InstName::FNMADD;
return true;
}
static bool TryExtractFNMADD_S_FLOATDP3(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001000000000000000
// --------------------------------
// 00011111001000000000000000000000
if ((bits & 0xffe08000U) != 0x1f200000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t Ra : 5;
uint32_t o0 : 1;
uint32_t Rm : 5;
uint32_t o1 : 1;
uint32_t type : 2;
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t _30 : 1; // 0
uint32_t M : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.M = static_cast<uint8_t>(enc.M);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.Ra = static_cast<uint8_t>(enc.Ra);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.type = static_cast<uint8_t>(enc.type);
inst.o1 = static_cast<uint8_t>(enc.o1);
inst.o0 = static_cast<uint8_t>(enc.o0);
inst.iform = InstForm::FNMADD_S_FLOATDP3;
inst.iclass = InstName::FNMADD;
return true;
}
static bool TryExtractFNMADD_D_FLOATDP3(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001000000000000000
// --------------------------------
// 00011111011000000000000000000000
if ((bits & 0xffe08000U) != 0x1f600000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t Ra : 5;
uint32_t o0 : 1;
uint32_t Rm : 5;
uint32_t o1 : 1;
uint32_t type : 2;
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t _30 : 1; // 0
uint32_t M : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.M = static_cast<uint8_t>(enc.M);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.Ra = static_cast<uint8_t>(enc.Ra);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.type = static_cast<uint8_t>(enc.type);
inst.o1 = static_cast<uint8_t>(enc.o1);
inst.o0 = static_cast<uint8_t>(enc.o0);
inst.iform = InstForm::FNMADD_D_FLOATDP3;
inst.iclass = InstName::FNMADD;
return true;
}
static bool TryExtractFCCMP_H_FLOATCCMP(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000000000110000010000
// --------------------------------
// 00011110111000000000010000000000
if ((bits & 0xffe00c10U) != 0x1ee00400U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t nzcv : 4;
uint32_t op : 1;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t _11 : 1; // 0
uint32_t cond : 4;
uint32_t Rm : 5;
uint32_t _21 : 1; // 1
uint32_t type : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t _30 : 1; // 0
uint32_t M : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.nzcv = static_cast<uint8_t>(enc.nzcv);
inst.M = static_cast<uint8_t>(enc.M);
inst.S = static_cast<uint8_t>(enc.S);
inst.cond = static_cast<uint8_t>(enc.cond);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.type = static_cast<uint8_t>(enc.type);
inst.op = static_cast<uint8_t>(enc.op);
inst.iform = InstForm::FCCMP_H_FLOATCCMP;
inst.iclass = InstName::FCCMP;
return true;
}
static bool TryExtractFCCMP_S_FLOATCCMP(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000000000110000010000
// --------------------------------
// 00011110001000000000010000000000
if ((bits & 0xffe00c10U) != 0x1e200400U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t nzcv : 4;
uint32_t op : 1;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t _11 : 1; // 0
uint32_t cond : 4;
uint32_t Rm : 5;
uint32_t _21 : 1; // 1
uint32_t type : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t _30 : 1; // 0
uint32_t M : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.nzcv = static_cast<uint8_t>(enc.nzcv);
inst.M = static_cast<uint8_t>(enc.M);
inst.S = static_cast<uint8_t>(enc.S);
inst.cond = static_cast<uint8_t>(enc.cond);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.type = static_cast<uint8_t>(enc.type);
inst.op = static_cast<uint8_t>(enc.op);
inst.iform = InstForm::FCCMP_S_FLOATCCMP;
inst.iclass = InstName::FCCMP;
return true;
}
static bool TryExtractFCCMP_D_FLOATCCMP(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000000000110000010000
// --------------------------------
// 00011110011000000000010000000000
if ((bits & 0xffe00c10U) != 0x1e600400U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t nzcv : 4;
uint32_t op : 1;
uint32_t Rn : 5;
uint32_t _10 : 1; // 1
uint32_t _11 : 1; // 0
uint32_t cond : 4;
uint32_t Rm : 5;
uint32_t _21 : 1; // 1
uint32_t type : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t S : 1;
uint32_t _30 : 1; // 0
uint32_t M : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.nzcv = static_cast<uint8_t>(enc.nzcv);
inst.M = static_cast<uint8_t>(enc.M);
inst.S = static_cast<uint8_t>(enc.S);
inst.cond = static_cast<uint8_t>(enc.cond);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.type = static_cast<uint8_t>(enc.type);
inst.op = static_cast<uint8_t>(enc.op);
inst.iform = InstForm::FCCMP_D_FLOATCCMP;
inst.iclass = InstName::FCCMP;
return true;
}
static bool TryExtractLD3_ASISDLSO_B3_3B(InstData &inst, uint32_t bits) {
// bits
// & 10111111111111111110000000000000
// --------------------------------
// 00001101010000000010000000000000
if ((bits & 0xbfffe000U) != 0xd402000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t size : 2;
uint32_t S : 1;
uint32_t opcode : 3;
uint32_t _16 : 1; // 0
uint32_t _17 : 1; // 0
uint32_t _18 : 1; // 0
uint32_t _19 : 1; // 0
uint32_t _20 : 1; // 0
uint32_t R : 1;
uint32_t L : 1;
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 0
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.L = static_cast<uint8_t>(enc.L);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.S = static_cast<uint8_t>(enc.S);
inst.R = static_cast<uint8_t>(enc.R);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LD3_ASISDLSO_B3_3B;
inst.iclass = InstName::LD3;
return true;
}
static bool TryExtractLD3_ASISDLSO_H3_3H(InstData &inst, uint32_t bits) {
// bits
// & 10111111111111111110010000000000
// --------------------------------
// 00001101010000000110000000000000
if ((bits & 0xbfffe400U) != 0xd406000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t size : 2;
uint32_t S : 1;
uint32_t opcode : 3;
uint32_t _16 : 1; // 0
uint32_t _17 : 1; // 0
uint32_t _18 : 1; // 0
uint32_t _19 : 1; // 0
uint32_t _20 : 1; // 0
uint32_t R : 1;
uint32_t L : 1;
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 0
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.L = static_cast<uint8_t>(enc.L);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.S = static_cast<uint8_t>(enc.S);
inst.R = static_cast<uint8_t>(enc.R);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LD3_ASISDLSO_H3_3H;
inst.iclass = InstName::LD3;
return true;
}
static bool TryExtractLD3_ASISDLSO_S3_3S(InstData &inst, uint32_t bits) {
// bits
// & 10111111111111111110110000000000
// --------------------------------
// 00001101010000001010000000000000
if ((bits & 0xbfffec00U) != 0xd40a000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t size : 2;
uint32_t S : 1;
uint32_t opcode : 3;
uint32_t _16 : 1; // 0
uint32_t _17 : 1; // 0
uint32_t _18 : 1; // 0
uint32_t _19 : 1; // 0
uint32_t _20 : 1; // 0
uint32_t R : 1;
uint32_t L : 1;
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 0
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.L = static_cast<uint8_t>(enc.L);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.S = static_cast<uint8_t>(enc.S);
inst.R = static_cast<uint8_t>(enc.R);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LD3_ASISDLSO_S3_3S;
inst.iclass = InstName::LD3;
return true;
}
static bool TryExtractLD3_ASISDLSO_D3_3D(InstData &inst, uint32_t bits) {
// bits
// & 10111111111111111111110000000000
// --------------------------------
// 00001101010000001010010000000000
if ((bits & 0xbffffc00U) != 0xd40a400U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t size : 2;
uint32_t S : 1;
uint32_t opcode : 3;
uint32_t _16 : 1; // 0
uint32_t _17 : 1; // 0
uint32_t _18 : 1; // 0
uint32_t _19 : 1; // 0
uint32_t _20 : 1; // 0
uint32_t R : 1;
uint32_t L : 1;
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 0
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.L = static_cast<uint8_t>(enc.L);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.S = static_cast<uint8_t>(enc.S);
inst.R = static_cast<uint8_t>(enc.R);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LD3_ASISDLSO_D3_3D;
inst.iclass = InstName::LD3;
return true;
}
static bool TryExtractLD3_ASISDLSOP_B3_I3B(InstData &inst, uint32_t bits) {
// bits
// & 10111111111111111110000000000000
// --------------------------------
// 00001101110111110010000000000000
if ((bits & 0xbfffe000U) != 0xddf2000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t size : 2;
uint32_t S : 1;
uint32_t opcode : 3;
uint32_t Rm : 5;
uint32_t R : 1;
uint32_t L : 1;
uint32_t _23 : 1; // 1
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 0
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.L = static_cast<uint8_t>(enc.L);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.S = static_cast<uint8_t>(enc.S);
inst.R = static_cast<uint8_t>(enc.R);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LD3_ASISDLSOP_B3_I3B;
inst.iclass = InstName::LD3;
return true;
}
static bool TryExtractLD3_ASISDLSOP_BX3_R3B(InstData &inst, uint32_t bits) {
// bits
// & 10111111111000001110000000000000
// --------------------------------
// 00001101110000000010000000000000
if ((bits & 0xbfe0e000U) != 0xdc02000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t size : 2;
uint32_t S : 1;
uint32_t opcode : 3;
uint32_t Rm : 5;
uint32_t R : 1;
uint32_t L : 1;
uint32_t _23 : 1; // 1
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 0
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.L = static_cast<uint8_t>(enc.L);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.S = static_cast<uint8_t>(enc.S);
inst.R = static_cast<uint8_t>(enc.R);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LD3_ASISDLSOP_BX3_R3B;
inst.iclass = InstName::LD3;
return true;
}
static bool TryExtractLD3_ASISDLSOP_H3_I3H(InstData &inst, uint32_t bits) {
// bits
// & 10111111111111111110010000000000
// --------------------------------
// 00001101110111110110000000000000
if ((bits & 0xbfffe400U) != 0xddf6000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t size : 2;
uint32_t S : 1;
uint32_t opcode : 3;
uint32_t Rm : 5;
uint32_t R : 1;
uint32_t L : 1;
uint32_t _23 : 1; // 1
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 0
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.L = static_cast<uint8_t>(enc.L);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.S = static_cast<uint8_t>(enc.S);
inst.R = static_cast<uint8_t>(enc.R);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LD3_ASISDLSOP_H3_I3H;
inst.iclass = InstName::LD3;
return true;
}
static bool TryExtractLD3_ASISDLSOP_HX3_R3H(InstData &inst, uint32_t bits) {
// bits
// & 10111111111000001110010000000000
// --------------------------------
// 00001101110000000110000000000000
if ((bits & 0xbfe0e400U) != 0xdc06000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t size : 2;
uint32_t S : 1;
uint32_t opcode : 3;
uint32_t Rm : 5;
uint32_t R : 1;
uint32_t L : 1;
uint32_t _23 : 1; // 1
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 0
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.L = static_cast<uint8_t>(enc.L);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.S = static_cast<uint8_t>(enc.S);
inst.R = static_cast<uint8_t>(enc.R);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LD3_ASISDLSOP_HX3_R3H;
inst.iclass = InstName::LD3;
return true;
}
static bool TryExtractLD3_ASISDLSOP_S3_I3S(InstData &inst, uint32_t bits) {
// bits
// & 10111111111111111110110000000000
// --------------------------------
// 00001101110111111010000000000000
if ((bits & 0xbfffec00U) != 0xddfa000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t size : 2;
uint32_t S : 1;
uint32_t opcode : 3;
uint32_t Rm : 5;
uint32_t R : 1;
uint32_t L : 1;
uint32_t _23 : 1; // 1
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 0
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.L = static_cast<uint8_t>(enc.L);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.S = static_cast<uint8_t>(enc.S);
inst.R = static_cast<uint8_t>(enc.R);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LD3_ASISDLSOP_S3_I3S;
inst.iclass = InstName::LD3;
return true;
}
static bool TryExtractLD3_ASISDLSOP_SX3_R3S(InstData &inst, uint32_t bits) {
// bits
// & 10111111111000001110110000000000
// --------------------------------
// 00001101110000001010000000000000
if ((bits & 0xbfe0ec00U) != 0xdc0a000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t size : 2;
uint32_t S : 1;
uint32_t opcode : 3;
uint32_t Rm : 5;
uint32_t R : 1;
uint32_t L : 1;
uint32_t _23 : 1; // 1
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 0
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.L = static_cast<uint8_t>(enc.L);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.S = static_cast<uint8_t>(enc.S);
inst.R = static_cast<uint8_t>(enc.R);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LD3_ASISDLSOP_SX3_R3S;
inst.iclass = InstName::LD3;
return true;
}
static bool TryExtractLD3_ASISDLSOP_D3_I3D(InstData &inst, uint32_t bits) {
// bits
// & 10111111111111111111110000000000
// --------------------------------
// 00001101110111111010010000000000
if ((bits & 0xbffffc00U) != 0xddfa400U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t size : 2;
uint32_t S : 1;
uint32_t opcode : 3;
uint32_t Rm : 5;
uint32_t R : 1;
uint32_t L : 1;
uint32_t _23 : 1; // 1
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 0
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.L = static_cast<uint8_t>(enc.L);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.S = static_cast<uint8_t>(enc.S);
inst.R = static_cast<uint8_t>(enc.R);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LD3_ASISDLSOP_D3_I3D;
inst.iclass = InstName::LD3;
return true;
}
static bool TryExtractLD3_ASISDLSOP_DX3_R3D(InstData &inst, uint32_t bits) {
// bits
// & 10111111111000001111110000000000
// --------------------------------
// 00001101110000001010010000000000
if ((bits & 0xbfe0fc00U) != 0xdc0a400U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t size : 2;
uint32_t S : 1;
uint32_t opcode : 3;
uint32_t Rm : 5;
uint32_t R : 1;
uint32_t L : 1;
uint32_t _23 : 1; // 1
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 0
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 0
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.L = static_cast<uint8_t>(enc.L);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.S = static_cast<uint8_t>(enc.S);
inst.R = static_cast<uint8_t>(enc.R);
inst.opcode = static_cast<uint8_t>(enc.opcode);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LD3_ASISDLSOP_DX3_R3D;
inst.iclass = InstName::LD3;
return true;
}
static bool TryExtractFRINTN_ASIMDMISCFP16_R(InstData &inst, uint32_t bits) {
// bits
// & 10111111111111111111110000000000
// --------------------------------
// 00001110011110011000100000000000
if ((bits & 0xbffffc00U) != 0xe798800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t o1 : 1;
uint32_t _13 : 1; // 0
uint32_t _14 : 1; // 0
uint32_t _15 : 1; // 1
uint32_t _16 : 1; // 1
uint32_t _17 : 1; // 0
uint32_t _18 : 1; // 0
uint32_t _19 : 1; // 1
uint32_t _20 : 1; // 1
uint32_t _21 : 1; // 1
uint32_t _22 : 1; // 1
uint32_t o2 : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o2 = static_cast<uint8_t>(enc.o2);
inst.o1 = static_cast<uint8_t>(enc.o1);
inst.iform = InstForm::FRINTN_ASIMDMISCFP16_R;
inst.iclass = InstName::FRINTN;
return true;
}
static bool TryExtractFRINTN_ASIMDMISC_R(InstData &inst, uint32_t bits) {
// bits
// & 10111111101111111111110000000000
// --------------------------------
// 00001110001000011000100000000000
if ((bits & 0xbfbffc00U) != 0xe218800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t o1 : 1;
uint32_t _13 : 1; // 0
uint32_t _14 : 1; // 0
uint32_t _15 : 1; // 1
uint32_t _16 : 1; // 1
uint32_t _17 : 1; // 0
uint32_t _18 : 1; // 0
uint32_t _19 : 1; // 0
uint32_t _20 : 1; // 0
uint32_t _21 : 1; // 1
uint32_t sz : 1;
uint32_t o2 : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 1
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t U : 1;
uint32_t Q : 1;
uint32_t _31 : 1; // 0
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.sz = static_cast<uint8_t>(enc.sz);
inst.Q = static_cast<uint8_t>(enc.Q);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.U = static_cast<uint8_t>(enc.U);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o2 = static_cast<uint8_t>(enc.o2);
inst.o1 = static_cast<uint8_t>(enc.o1);
inst.iform = InstForm::FRINTN_ASIMDMISC_R;
inst.iclass = InstName::FRINTN;
return true;
}
static bool TryExtractSUB_32_ADDSUB_EXT(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000000000000000000000
// --------------------------------
// 01001011001000000000000000000000
if ((bits & 0xffe00000U) != 0x4b200000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t imm3 : 3;
uint32_t option : 3;
uint32_t Rm : 5;
uint32_t _21 : 1; // 1
uint32_t opt : 2;
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t S : 1;
uint32_t op : 1;
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.opt = static_cast<uint8_t>(enc.opt);
inst.option = static_cast<uint8_t>(enc.option);
inst.sf = static_cast<uint8_t>(enc.sf);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.imm3.uimm = static_cast<uint64_t>(enc.imm3);
inst.op = static_cast<uint8_t>(enc.op);
inst.iform = InstForm::SUB_32_ADDSUB_EXT;
inst.iclass = InstName::SUB;
return true;
}
static bool TryExtractSUB_64_ADDSUB_EXT(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000000000000000000000
// --------------------------------
// 11001011001000000000000000000000
if ((bits & 0xffe00000U) != 0xcb200000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t imm3 : 3;
uint32_t option : 3;
uint32_t Rm : 5;
uint32_t _21 : 1; // 1
uint32_t opt : 2;
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t S : 1;
uint32_t op : 1;
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.opt = static_cast<uint8_t>(enc.opt);
inst.option = static_cast<uint8_t>(enc.option);
inst.sf = static_cast<uint8_t>(enc.sf);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.S = static_cast<uint8_t>(enc.S);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.imm3.uimm = static_cast<uint64_t>(enc.imm3);
inst.op = static_cast<uint8_t>(enc.op);
inst.iform = InstForm::SUB_64_ADDSUB_EXT;
inst.iclass = InstName::SUB;
return true;
}
static bool TryExtractSTR_B_LDST_REGOFF(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000000000110000000000
// --------------------------------
// 00111100001000000000100000000000
if ((bits & 0xffe00c00U) != 0x3c200800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t S : 1;
uint32_t option : 3;
uint32_t Rm : 5;
uint32_t _21 : 1; // 1
uint32_t opc : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.option = static_cast<uint8_t>(enc.option);
inst.V = static_cast<uint8_t>(enc.V);
inst.S = static_cast<uint8_t>(enc.S);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::STR_B_LDST_REGOFF;
inst.iclass = InstName::STR;
return true;
}
static bool TryExtractSTR_BL_LDST_REGOFF(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001110110000000000
// --------------------------------
// 00111100001000000110100000000000
if ((bits & 0xffe0ec00U) != 0x3c206800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t S : 1;
uint32_t option : 3;
uint32_t Rm : 5;
uint32_t _21 : 1; // 1
uint32_t opc : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.option = static_cast<uint8_t>(enc.option);
inst.V = static_cast<uint8_t>(enc.V);
inst.S = static_cast<uint8_t>(enc.S);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::STR_BL_LDST_REGOFF;
inst.iclass = InstName::STR;
return true;
}
static bool TryExtractSTR_H_LDST_REGOFF(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000000000110000000000
// --------------------------------
// 01111100001000000000100000000000
if ((bits & 0xffe00c00U) != 0x7c200800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t S : 1;
uint32_t option : 3;
uint32_t Rm : 5;
uint32_t _21 : 1; // 1
uint32_t opc : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.option = static_cast<uint8_t>(enc.option);
inst.V = static_cast<uint8_t>(enc.V);
inst.S = static_cast<uint8_t>(enc.S);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::STR_H_LDST_REGOFF;
inst.iclass = InstName::STR;
return true;
}
static bool TryExtractSTR_S_LDST_REGOFF(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000000000110000000000
// --------------------------------
// 10111100001000000000100000000000
if ((bits & 0xffe00c00U) != 0xbc200800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t S : 1;
uint32_t option : 3;
uint32_t Rm : 5;
uint32_t _21 : 1; // 1
uint32_t opc : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.option = static_cast<uint8_t>(enc.option);
inst.V = static_cast<uint8_t>(enc.V);
inst.S = static_cast<uint8_t>(enc.S);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::STR_S_LDST_REGOFF;
inst.iclass = InstName::STR;
return true;
}
static bool TryExtractSTR_D_LDST_REGOFF(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000000000110000000000
// --------------------------------
// 11111100001000000000100000000000
if ((bits & 0xffe00c00U) != 0xfc200800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t S : 1;
uint32_t option : 3;
uint32_t Rm : 5;
uint32_t _21 : 1; // 1
uint32_t opc : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.option = static_cast<uint8_t>(enc.option);
inst.V = static_cast<uint8_t>(enc.V);
inst.S = static_cast<uint8_t>(enc.S);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::STR_D_LDST_REGOFF;
inst.iclass = InstName::STR;
return true;
}
static bool TryExtractSTR_Q_LDST_REGOFF(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000000000110000000000
// --------------------------------
// 00111100101000000000100000000000
if ((bits & 0xffe00c00U) != 0x3ca00800U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 1
uint32_t S : 1;
uint32_t option : 3;
uint32_t Rm : 5;
uint32_t _21 : 1; // 1
uint32_t opc : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.option = static_cast<uint8_t>(enc.option);
inst.V = static_cast<uint8_t>(enc.V);
inst.S = static_cast<uint8_t>(enc.S);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::STR_Q_LDST_REGOFF;
inst.iclass = InstName::STR;
return true;
}
static bool TryExtractSTP_32_LDSTPAIR_POST(InstData &inst, uint32_t bits) {
// bits
// & 11111111110000000000000000000000
// --------------------------------
// 00101000100000000000000000000000
if ((bits & 0xffc00000U) != 0x28800000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t Rt2 : 5;
uint32_t imm7 : 7;
uint32_t L : 1;
uint32_t _23 : 1; // 1
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 1
uint32_t opc : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rt2 = static_cast<uint8_t>(enc.Rt2);
inst.L = static_cast<uint8_t>(enc.L);
inst.V = static_cast<uint8_t>(enc.V);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.imm7.uimm = static_cast<uint64_t>(enc.imm7);
inst.iform = InstForm::STP_32_LDSTPAIR_POST;
inst.iclass = InstName::STP;
return true;
}
static bool TryExtractSTP_64_LDSTPAIR_POST(InstData &inst, uint32_t bits) {
// bits
// & 11111111110000000000000000000000
// --------------------------------
// 10101000100000000000000000000000
if ((bits & 0xffc00000U) != 0xa8800000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t Rt2 : 5;
uint32_t imm7 : 7;
uint32_t L : 1;
uint32_t _23 : 1; // 1
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 1
uint32_t opc : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rt2 = static_cast<uint8_t>(enc.Rt2);
inst.L = static_cast<uint8_t>(enc.L);
inst.V = static_cast<uint8_t>(enc.V);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.imm7.uimm = static_cast<uint64_t>(enc.imm7);
inst.iform = InstForm::STP_64_LDSTPAIR_POST;
inst.iclass = InstName::STP;
return true;
}
static bool TryExtractSTP_32_LDSTPAIR_PRE(InstData &inst, uint32_t bits) {
// bits
// & 11111111110000000000000000000000
// --------------------------------
// 00101001100000000000000000000000
if ((bits & 0xffc00000U) != 0x29800000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t Rt2 : 5;
uint32_t imm7 : 7;
uint32_t L : 1;
uint32_t _23 : 1; // 1
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 1
uint32_t opc : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rt2 = static_cast<uint8_t>(enc.Rt2);
inst.L = static_cast<uint8_t>(enc.L);
inst.V = static_cast<uint8_t>(enc.V);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.imm7.uimm = static_cast<uint64_t>(enc.imm7);
inst.iform = InstForm::STP_32_LDSTPAIR_PRE;
inst.iclass = InstName::STP;
return true;
}
static bool TryExtractSTP_64_LDSTPAIR_PRE(InstData &inst, uint32_t bits) {
// bits
// & 11111111110000000000000000000000
// --------------------------------
// 10101001100000000000000000000000
if ((bits & 0xffc00000U) != 0xa9800000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t Rt2 : 5;
uint32_t imm7 : 7;
uint32_t L : 1;
uint32_t _23 : 1; // 1
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 1
uint32_t opc : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rt2 = static_cast<uint8_t>(enc.Rt2);
inst.L = static_cast<uint8_t>(enc.L);
inst.V = static_cast<uint8_t>(enc.V);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.imm7.uimm = static_cast<uint64_t>(enc.imm7);
inst.iform = InstForm::STP_64_LDSTPAIR_PRE;
inst.iclass = InstName::STP;
return true;
}
static bool TryExtractSTP_32_LDSTPAIR_OFF(InstData &inst, uint32_t bits) {
// bits
// & 11111111110000000000000000000000
// --------------------------------
// 00101001000000000000000000000000
if ((bits & 0xffc00000U) != 0x29000000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t Rt2 : 5;
uint32_t imm7 : 7;
uint32_t L : 1;
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 1
uint32_t opc : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rt2 = static_cast<uint8_t>(enc.Rt2);
inst.L = static_cast<uint8_t>(enc.L);
inst.V = static_cast<uint8_t>(enc.V);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.imm7.uimm = static_cast<uint64_t>(enc.imm7);
inst.iform = InstForm::STP_32_LDSTPAIR_OFF;
inst.iclass = InstName::STP;
return true;
}
static bool TryExtractSTP_64_LDSTPAIR_OFF(InstData &inst, uint32_t bits) {
// bits
// & 11111111110000000000000000000000
// --------------------------------
// 10101001000000000000000000000000
if ((bits & 0xffc00000U) != 0xa9000000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t Rt2 : 5;
uint32_t imm7 : 7;
uint32_t L : 1;
uint32_t _23 : 1; // 0
uint32_t _24 : 1; // 1
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t _29 : 1; // 1
uint32_t opc : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rt2 = static_cast<uint8_t>(enc.Rt2);
inst.L = static_cast<uint8_t>(enc.L);
inst.V = static_cast<uint8_t>(enc.V);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.imm7.uimm = static_cast<uint64_t>(enc.imm7);
inst.iform = InstForm::STP_64_LDSTPAIR_OFF;
inst.iclass = InstName::STP;
return true;
}
static bool TryExtractORN_32_LOG_SHIFT(InstData &inst, uint32_t bits) {
if (false && TryExtractMVN_ORN_32_LOG_SHIFT(inst, bits))
return true;
// bits
// & 11111111001000000000000000000000
// --------------------------------
// 00101010001000000000000000000000
if ((bits & 0xff200000U) != 0x2a200000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t imm6 : 6;
uint32_t Rm : 5;
uint32_t N : 1;
uint32_t shift : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t opc : 2;
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.shift = static_cast<uint8_t>(enc.shift);
inst.N = static_cast<uint8_t>(enc.N);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.sf = static_cast<uint8_t>(enc.sf);
inst.imm6.uimm = static_cast<uint64_t>(enc.imm6);
inst.iform = InstForm::ORN_32_LOG_SHIFT;
inst.iclass = InstName::ORN;
return true;
}
static bool TryExtractORN_64_LOG_SHIFT(InstData &inst, uint32_t bits) {
if (false && TryExtractMVN_ORN_64_LOG_SHIFT(inst, bits))
return true;
// bits
// & 11111111001000000000000000000000
// --------------------------------
// 10101010001000000000000000000000
if ((bits & 0xff200000U) != 0xaa200000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rd : 5;
uint32_t Rn : 5;
uint32_t imm6 : 6;
uint32_t Rm : 5;
uint32_t N : 1;
uint32_t shift : 2;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 1
uint32_t _26 : 1; // 0
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 0
uint32_t opc : 2;
uint32_t sf : 1;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.shift = static_cast<uint8_t>(enc.shift);
inst.N = static_cast<uint8_t>(enc.N);
inst.Rd = static_cast<uint8_t>(enc.Rd);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rm = static_cast<uint8_t>(enc.Rm);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.sf = static_cast<uint8_t>(enc.sf);
inst.imm6.uimm = static_cast<uint64_t>(enc.imm6);
inst.iform = InstForm::ORN_64_LOG_SHIFT;
inst.iclass = InstName::ORN;
return true;
}
static bool TryExtractLDCLRAB_32_MEMOP(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 00111000101000000001000000000000
if ((bits & 0xffe0fc00U) != 0x38a01000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t opc : 3;
uint32_t o3 : 1;
uint32_t Rs : 5;
uint32_t _21 : 1; // 1
uint32_t R : 1;
uint32_t A : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.A = static_cast<uint8_t>(enc.A);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.V = static_cast<uint8_t>(enc.V);
inst.R = static_cast<uint8_t>(enc.R);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o3 = static_cast<uint8_t>(enc.o3);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LDCLRAB_32_MEMOP;
inst.iclass = InstName::LDCLRAB;
return true;
}
static bool TryExtractLDCLRALB_32_MEMOP(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 00111000111000000001000000000000
if ((bits & 0xffe0fc00U) != 0x38e01000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t opc : 3;
uint32_t o3 : 1;
uint32_t Rs : 5;
uint32_t _21 : 1; // 1
uint32_t R : 1;
uint32_t A : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.A = static_cast<uint8_t>(enc.A);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.V = static_cast<uint8_t>(enc.V);
inst.R = static_cast<uint8_t>(enc.R);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o3 = static_cast<uint8_t>(enc.o3);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LDCLRALB_32_MEMOP;
inst.iclass = InstName::LDCLRALB;
return true;
}
static bool TryExtractLDCLRB_32_MEMOP(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 00111000001000000001000000000000
if ((bits & 0xffe0fc00U) != 0x38201000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t opc : 3;
uint32_t o3 : 1;
uint32_t Rs : 5;
uint32_t _21 : 1; // 1
uint32_t R : 1;
uint32_t A : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.A = static_cast<uint8_t>(enc.A);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.V = static_cast<uint8_t>(enc.V);
inst.R = static_cast<uint8_t>(enc.R);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o3 = static_cast<uint8_t>(enc.o3);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LDCLRB_32_MEMOP;
inst.iclass = InstName::LDCLRB;
return true;
}
static bool TryExtractLDCLRLB_32_MEMOP(InstData &inst, uint32_t bits) {
// bits
// & 11111111111000001111110000000000
// --------------------------------
// 00111000011000000001000000000000
if ((bits & 0xffe0fc00U) != 0x38601000U) {
return false;
}
union {
uint32_t flat;
struct {
uint32_t Rt : 5;
uint32_t Rn : 5;
uint32_t _10 : 1; // 0
uint32_t _11 : 1; // 0
uint32_t opc : 3;
uint32_t o3 : 1;
uint32_t Rs : 5;
uint32_t _21 : 1; // 1
uint32_t R : 1;
uint32_t A : 1;
uint32_t _24 : 1; // 0
uint32_t _25 : 1; // 0
uint32_t V : 1;
uint32_t _27 : 1; // 1
uint32_t _28 : 1; // 1
uint32_t _29 : 1; // 1
uint32_t size : 2;
} __attribute__((packed));
} __attribute__((packed)) enc;
static_assert(sizeof(enc) == 4, " ");
enc.flat = bits;
inst.Rt = static_cast<uint8_t>(enc.Rt);
inst.A = static_cast<uint8_t>(enc.A);
inst.Rs = static_cast<uint8_t>(enc.Rs);
inst.V = static_cast<uint8_t>(enc.V);
inst.R = static_cast<uint8_t>(enc.R);
inst.opc = static_cast<uint8_t>(enc.opc);
inst.Rn = static_cast<uint8_t>(enc.Rn);
inst.o3 = static_cast<uint8_t>(enc.o3);
inst.size = static_cast<uint8_t>(enc.size);
inst.iform = InstForm::LDCLRLB_32_MEMOP;
inst.iclass = InstName::LDCLRLB;
return true;
}
// 00000000000000000000000000000000
static bool TryExtract0(InstData &inst, uint32_t bits) {
return false;
}
// 00000100000000000000000000000000
static bool TryExtract1(InstData &inst, uint32_t bits) {
return false;
}
// 00001000000000000000000000000000
static bool TryExtract2(InstData &inst, uint32_t bits) {
return false || TryExtractLDLARB_LR32_LDSTEXCL(inst, bits) ||
TryExtractLDAXR_LR32_LDSTEXCL(inst, bits) ||
TryExtractSTLLR_SL64_LDSTEXCL(inst, bits) ||
TryExtractSTLRH_SL32_LDSTEXCL(inst, bits) ||
TryExtractLDXR_LR64_LDSTEXCL(inst, bits) ||
TryExtractLDLARH_LR32_LDSTEXCL(inst, bits) ||
TryExtractSTLLRB_SL32_LDSTEXCL(inst, bits) ||
TryExtractLDAXR_LR64_LDSTEXCL(inst, bits) ||
TryExtractSTLLRH_SL32_LDSTEXCL(inst, bits) ||
TryExtractLDAR_LR32_LDSTEXCL(inst, bits) ||
TryExtractSTLRB_SL32_LDSTEXCL(inst, bits) ||
TryExtractLDARH_LR32_LDSTEXCL(inst, bits) ||
TryExtractSTLR_SL32_LDSTEXCL(inst, bits) ||
TryExtractLDAXRH_LR32_LDSTEXCL(inst, bits) ||
TryExtractLDAXRB_LR32_LDSTEXCL(inst, bits) ||
TryExtractSTLLR_SL32_LDSTEXCL(inst, bits) ||
TryExtractLDXRH_LR32_LDSTEXCL(inst, bits) ||
TryExtractLDAR_LR64_LDSTEXCL(inst, bits) ||
TryExtractLDLAR_LR32_LDSTEXCL(inst, bits) ||
TryExtractLDXRB_LR32_LDSTEXCL(inst, bits) ||
TryExtractLDARB_LR32_LDSTEXCL(inst, bits) ||
TryExtractLDLAR_LR64_LDSTEXCL(inst, bits) ||
TryExtractLDXR_LR32_LDSTEXCL(inst, bits) ||
TryExtractSTLR_SL64_LDSTEXCL(inst, bits) ||
TryExtractCASALB_C32_LDSTEXCL(inst, bits) ||
TryExtractSTXR_SR32_LDSTEXCL(inst, bits) ||
TryExtractCASLH_C32_LDSTEXCL(inst, bits) ||
TryExtractSTXR_SR64_LDSTEXCL(inst, bits) ||
TryExtractSTLXR_SR32_LDSTEXCL(inst, bits) ||
TryExtractLDAXP_LP64_LDSTEXCL(inst, bits) ||
TryExtractCASAL_C64_LDSTEXCL(inst, bits) ||
TryExtractCASA_C32_LDSTEXCL(inst, bits) ||
TryExtractCASAL_C32_LDSTEXCL(inst, bits) ||
TryExtractCAS_C32_LDSTEXCL(inst, bits) ||
TryExtractCASA_C64_LDSTEXCL(inst, bits) ||
TryExtractCASL_C32_LDSTEXCL(inst, bits) ||
TryExtractCASL_C64_LDSTEXCL(inst, bits) ||
TryExtractCAS_C64_LDSTEXCL(inst, bits) ||
TryExtractCASB_C32_LDSTEXCL(inst, bits) ||
TryExtractCASLB_C32_LDSTEXCL(inst, bits) ||
TryExtractCASPA_CP32_LDSTEXCL(inst, bits) ||
TryExtractCASPAL_CP32_LDSTEXCL(inst, bits) ||
TryExtractCASP_CP32_LDSTEXCL(inst, bits) ||
TryExtractSTLXRH_SR32_LDSTEXCL(inst, bits) ||
TryExtractCASPA_CP64_LDSTEXCL(inst, bits) ||
TryExtractCASPAL_CP64_LDSTEXCL(inst, bits) ||
TryExtractCASP_CP64_LDSTEXCL(inst, bits) ||
TryExtractCASPL_CP64_LDSTEXCL(inst, bits) ||
TryExtractSTXRB_SR32_LDSTEXCL(inst, bits) ||
TryExtractLDAXP_LP32_LDSTEXCL(inst, bits) ||
TryExtractSTLXR_SR64_LDSTEXCL(inst, bits) ||
TryExtractCASH_C32_LDSTEXCL(inst, bits) ||
TryExtractCASPL_CP32_LDSTEXCL(inst, bits) ||
TryExtractCASALH_C32_LDSTEXCL(inst, bits) ||
TryExtractCASAB_C32_LDSTEXCL(inst, bits) ||
TryExtractSTXRH_SR32_LDSTEXCL(inst, bits) ||
TryExtractLDXP_LP64_LDSTEXCL(inst, bits) ||
TryExtractLDXP_LP32_LDSTEXCL(inst, bits) ||
TryExtractSTLXRB_SR32_LDSTEXCL(inst, bits) ||
TryExtractCASAH_C32_LDSTEXCL(inst, bits) ||
TryExtractSTLXP_SP32_LDSTEXCL(inst, bits) ||
TryExtractSTLXP_SP64_LDSTEXCL(inst, bits) ||
TryExtractSTXP_SP64_LDSTEXCL(inst, bits) ||
TryExtractSTXP_SP32_LDSTEXCL(inst, bits) ||
TryExtractSUB_64_ADDSUB_EXT(inst, bits) ||
TryExtractSUB_32_ADDSUB_EXT(inst, bits) ||
TryExtractSUBS_32S_ADDSUB_EXT(inst, bits) ||
TryExtractADD_32_ADDSUB_EXT(inst, bits) ||
TryExtractADD_64_ADDSUB_EXT(inst, bits) ||
TryExtractADDS_64S_ADDSUB_EXT(inst, bits) ||
TryExtractADDS_32S_ADDSUB_EXT(inst, bits) ||
TryExtractSUBS_64S_ADDSUB_EXT(inst, bits) ||
TryExtractSTNP_32_LDSTNAPAIR_OFFS(inst, bits) ||
TryExtractSTNP_64_LDSTNAPAIR_OFFS(inst, bits) ||
TryExtractLDNP_32_LDSTNAPAIR_OFFS(inst, bits) ||
TryExtractLDNP_64_LDSTNAPAIR_OFFS(inst, bits) ||
TryExtractLDP_32_LDSTPAIR_POST(inst, bits) ||
TryExtractLDP_64_LDSTPAIR_POST(inst, bits) ||
TryExtractLDP_32_LDSTPAIR_PRE(inst, bits) ||
TryExtractLDP_64_LDSTPAIR_PRE(inst, bits) ||
TryExtractLDP_32_LDSTPAIR_OFF(inst, bits) ||
TryExtractLDP_64_LDSTPAIR_OFF(inst, bits) ||
TryExtractSTP_64_LDSTPAIR_PRE(inst, bits) ||
TryExtractSTP_32_LDSTPAIR_PRE(inst, bits) ||
TryExtractSTP_64_LDSTPAIR_OFF(inst, bits) ||
TryExtractSTP_32_LDSTPAIR_OFF(inst, bits) ||
TryExtractLDPSW_64_LDSTPAIR_POST(inst, bits) ||
TryExtractLDPSW_64_LDSTPAIR_PRE(inst, bits) ||
TryExtractLDPSW_64_LDSTPAIR_OFF(inst, bits) ||
TryExtractSTP_32_LDSTPAIR_POST(inst, bits) ||
TryExtractSTP_64_LDSTPAIR_POST(inst, bits) ||
TryExtractSUB_64_ADDSUB_SHIFT(inst, bits) ||
TryExtractEOR_64_LOG_SHIFT(inst, bits) ||
TryExtractADDS_32_ADDSUB_SHIFT(inst, bits) ||
TryExtractADDS_64_ADDSUB_SHIFT(inst, bits) ||
TryExtractSUBS_32_ADDSUB_SHIFT(inst, bits) ||
TryExtractBIC_32_LOG_SHIFT(inst, bits) ||
TryExtractANDS_64_LOG_SHIFT(inst, bits) ||
TryExtractANDS_32_LOG_SHIFT(inst, bits) ||
TryExtractAND_64_LOG_SHIFT(inst, bits) ||
TryExtractORN_32_LOG_SHIFT(inst, bits) ||
TryExtractAND_32_LOG_SHIFT(inst, bits) ||
TryExtractEON_32_LOG_SHIFT(inst, bits) ||
TryExtractORR_64_LOG_SHIFT(inst, bits) ||
TryExtractBICS_32_LOG_SHIFT(inst, bits) ||
TryExtractEON_64_LOG_SHIFT(inst, bits) ||
TryExtractORN_64_LOG_SHIFT(inst, bits) ||
TryExtractBICS_64_LOG_SHIFT(inst, bits) ||
TryExtractSUBS_64_ADDSUB_SHIFT(inst, bits) ||
TryExtractBIC_64_LOG_SHIFT(inst, bits) ||
TryExtractADD_64_ADDSUB_SHIFT(inst, bits) ||
TryExtractADD_32_ADDSUB_SHIFT(inst, bits) ||
TryExtractORR_32_LOG_SHIFT(inst, bits) ||
TryExtractEOR_32_LOG_SHIFT(inst, bits) ||
TryExtractSUB_32_ADDSUB_SHIFT(inst, bits);
}
// 00001100000000000000000000000000
static bool TryExtract3(InstData &inst, uint32_t bits) {
return false || TryExtractAESIMC_B_CRYPTOAES(inst, bits) ||
TryExtractAESE_B_CRYPTOAES(inst, bits) ||
TryExtractAESD_B_CRYPTOAES(inst, bits) ||
TryExtractAESMC_B_CRYPTOAES(inst, bits) ||
TryExtractFCVTPU_ASIMDMISCFP16_R(inst, bits) ||
TryExtractFRSQRTE_ASIMDMISCFP16_R(inst, bits) ||
TryExtractFRINTI_ASIMDMISCFP16_R(inst, bits) ||
TryExtractNOT_ASIMDMISC_R(inst, bits) ||
TryExtractST2_ASISDLSO_D2_2D(inst, bits) ||
TryExtractST4_ASISDLSO_D4_4D(inst, bits) ||
TryExtractST2_ASISDLSOP_D2_I2D(inst, bits) ||
TryExtractST3_ASISDLSO_D3_3D(inst, bits) ||
TryExtractST3_ASISDLSOP_D3_I3D(inst, bits) ||
TryExtractFCVTZU_ASIMDMISCFP16_R(inst, bits) ||
TryExtractFCMLE_ASIMDMISCFP16_FZ(inst, bits) ||
TryExtractST4_ASISDLSOP_D4_I4D(inst, bits) ||
TryExtractFMINNMV_ASIMDALL_ONLY_H(inst, bits) ||
TryExtractFMINV_ASIMDALL_ONLY_H(inst, bits) ||
TryExtractUCVTF_ASIMDMISCFP16_R(inst, bits) ||
TryExtractFMAXNMV_ASIMDALL_ONLY_H(inst, bits) ||
TryExtractFCVTZS_ASIMDMISCFP16_R(inst, bits) ||
TryExtractFRINTP_ASIMDMISCFP16_R(inst, bits) ||
TryExtractFNEG_ASIMDMISCFP16_R(inst, bits) ||
TryExtractFCMLT_ASIMDMISCFP16_FZ(inst, bits) ||
TryExtractFABS_ASIMDMISCFP16_R(inst, bits) ||
TryExtractFCVTMU_ASIMDMISCFP16_R(inst, bits) ||
TryExtractLD4_ASISDLSOP_D4_I4D(inst, bits) ||
TryExtractSCVTF_ASIMDMISCFP16_R(inst, bits) ||
TryExtractFCMGE_ASIMDMISCFP16_FZ(inst, bits) ||
TryExtractUMOV_ASIMDINS_X_X(inst, bits) ||
TryExtractFRINTA_ASIMDMISCFP16_R(inst, bits) ||
TryExtractLD2_ASISDLSOP_D2_I2D(inst, bits) ||
TryExtractFCVTMS_ASIMDMISCFP16_R(inst, bits) ||
TryExtractLD1_ASISDLSO_D1_1D(inst, bits) ||
TryExtractFCVTPS_ASIMDMISCFP16_R(inst, bits) ||
TryExtractFCMGT_ASIMDMISCFP16_FZ(inst, bits) ||
TryExtractLD1_ASISDLSOP_D1_I1D(inst, bits) ||
TryExtractFMAXV_ASIMDALL_ONLY_H(inst, bits) ||
TryExtractST1_ASISDLSO_D1_1D(inst, bits) ||
TryExtractFRINTM_ASIMDMISCFP16_R(inst, bits) ||
TryExtractLD3_ASISDLSO_D3_3D(inst, bits) ||
TryExtractST1_ASISDLSOP_D1_I1D(inst, bits) ||
TryExtractFRINTZ_ASIMDMISCFP16_R(inst, bits) ||
TryExtractLD2_ASISDLSO_D2_2D(inst, bits) ||
TryExtractFCVTNS_ASIMDMISCFP16_R(inst, bits) ||
TryExtractFRECPE_ASIMDMISCFP16_R(inst, bits) ||
TryExtractFCMEQ_ASIMDMISCFP16_FZ(inst, bits) ||
TryExtractFRINTN_ASIMDMISCFP16_R(inst, bits) ||
TryExtractFCVTAS_ASIMDMISCFP16_R(inst, bits) ||
TryExtractFCVTAU_ASIMDMISCFP16_R(inst, bits) ||
TryExtractFCVTNU_ASIMDMISCFP16_R(inst, bits) ||
TryExtractFSQRT_ASIMDMISCFP16_R(inst, bits) ||
TryExtractFRINTX_ASIMDMISCFP16_R(inst, bits) ||
TryExtractRBIT_ASIMDMISC_R(inst, bits) ||
TryExtractLD3_ASISDLSOP_D3_I3D(inst, bits) ||
TryExtractLD4_ASISDLSO_D4_4D(inst, bits) ||
TryExtractFRSQRTE_ASIMDMISC_R(inst, bits) ||
TryExtractFCMGE_ASIMDMISC_FZ(inst, bits) ||
TryExtractST2_ASISDLSO_S2_2S(inst, bits) ||
TryExtractST4_ASISDLSO_S4_4S(inst, bits) ||
TryExtractST2_ASISDLSOP_S2_I2S(inst, bits) ||
TryExtractFRINTZ_ASIMDMISC_R(inst, bits) ||
TryExtractST3_ASISDLSOP_S3_I3S(inst, bits) ||
TryExtractFCMLE_ASIMDMISC_FZ(inst, bits) ||
TryExtractFRINTM_ASIMDMISC_R(inst, bits) ||
TryExtractST4_ASISDLSOP_S4_I4S(inst, bits) ||
TryExtractFCVTL_ASIMDMISC_L(inst, bits) ||
TryExtractFMINNMV_ASIMDALL_ONLY_SD(inst, bits) ||
TryExtractFMAXNMV_ASIMDALL_ONLY_SD(inst, bits) ||
TryExtractUCVTF_ASIMDMISC_R(inst, bits) ||
TryExtractFMINV_ASIMDALL_ONLY_SD(inst, bits) ||
TryExtractLD4_ASISDLSOP_S4_I4S(inst, bits) ||
TryExtractFCVTN_ASIMDMISC_N(inst, bits) ||
TryExtractST1_ASISDLSOP_S1_I1S(inst, bits) ||
TryExtractFCVTXN_ASIMDMISC_N(inst, bits) ||
TryExtractFRINTP_ASIMDMISC_R(inst, bits) ||
TryExtractLD4_ASISDLSO_S4_4S(inst, bits) ||
TryExtractFRINTA_ASIMDMISC_R(inst, bits) ||
TryExtractFCVTZS_ASIMDMISC_R(inst, bits) ||
TryExtractFCVTPU_ASIMDMISC_R(inst, bits) ||
TryExtractFCVTMS_ASIMDMISC_R(inst, bits) ||
TryExtractST3_ASISDLSO_S3_3S(inst, bits) ||
TryExtractFNEG_ASIMDMISC_R(inst, bits) ||
TryExtractST1_ASISDLSO_S1_1S(inst, bits) ||
TryExtractFRINTI_ASIMDMISC_R(inst, bits) ||
TryExtractFCMLT_ASIMDMISC_FZ(inst, bits) ||
TryExtractFABS_ASIMDMISC_R(inst, bits) ||
TryExtractURSQRTE_ASIMDMISC_R(inst, bits) ||
TryExtractSCVTF_ASIMDMISC_R(inst, bits) ||
TryExtractLD1_ASISDLSO_S1_1S(inst, bits) ||
TryExtractFCVTAS_ASIMDMISC_R(inst, bits) ||
TryExtractFCVTZU_ASIMDMISC_R(inst, bits) ||
TryExtractFCMGT_ASIMDMISC_FZ(inst, bits) ||
TryExtractFCVTPS_ASIMDMISC_R(inst, bits) ||
TryExtractFSQRT_ASIMDMISC_R(inst, bits) ||
TryExtractLD3_ASISDLSO_S3_3S(inst, bits) ||
TryExtractLD2_ASISDLSO_S2_2S(inst, bits) ||
TryExtractFRINTN_ASIMDMISC_R(inst, bits) ||
TryExtractLD2_ASISDLSOP_S2_I2S(inst, bits) ||
TryExtractFCVTNS_ASIMDMISC_R(inst, bits) ||
TryExtractFCMEQ_ASIMDMISC_FZ(inst, bits) ||
TryExtractURECPE_ASIMDMISC_R(inst, bits) ||
TryExtractFCVTAU_ASIMDMISC_R(inst, bits) ||
TryExtractFCVTNU_ASIMDMISC_R(inst, bits) ||
TryExtractFMAXV_ASIMDALL_ONLY_SD(inst, bits) ||
TryExtractFRECPE_ASIMDMISC_R(inst, bits) ||
TryExtractFRINTX_ASIMDMISC_R(inst, bits) ||
TryExtractFCVTMU_ASIMDMISC_R(inst, bits) ||
TryExtractLD1_ASISDLSOP_S1_I1S(inst, bits) ||
TryExtractLD3_ASISDLSOP_S3_I3S(inst, bits) ||
TryExtractCMEQ_ASIMDMISC_Z(inst, bits) ||
TryExtractCMLT_ASIMDMISC_Z(inst, bits) ||
TryExtractST2_ASISDLSE_R2(inst, bits) ||
TryExtractST3_ASISDLSOP_H3_I3H(inst, bits) ||
TryExtractLD4R_ASISDLSO_R4(inst, bits) ||
TryExtractST2_ASISDLSEP_I2_I(inst, bits) ||
TryExtractREV16_ASIMDMISC_R(inst, bits) ||
TryExtractSQXTUN_ASIMDMISC_N(inst, bits) ||
TryExtractLD1_ASISDLSE_R4_4V(inst, bits) ||
TryExtractMOVI_ASIMDIMM_D_DS(inst, bits) ||
TryExtractUADDLV_ASIMDALL_ONLY(inst, bits) ||
TryExtractLD1_ASISDLSEP_I1_I1(inst, bits) ||
TryExtractLD1R_ASISDLSO_R1(inst, bits) ||
TryExtractSHLL_ASIMDMISC_S(inst, bits) ||
TryExtractSUQADD_ASIMDMISC_R(inst, bits) ||
TryExtractST4_ASISDLSO_H4_4H(inst, bits) ||
TryExtractST2_ASISDLSO_H2_2H(inst, bits) ||
TryExtractSADDLP_ASIMDMISC_P(inst, bits) ||
TryExtractST2_ASISDLSOP_H2_I2H(inst, bits) ||
TryExtractSMINV_ASIMDALL_ONLY(inst, bits) ||
TryExtractCMGT_ASIMDMISC_Z(inst, bits) ||
TryExtractST4_ASISDLSOP_H4_I4H(inst, bits) ||
TryExtractNEG_ASIMDMISC_R(inst, bits) ||
TryExtractCLS_ASIMDMISC_R(inst, bits) ||
TryExtractUQXTN_ASIMDMISC_N(inst, bits) ||
TryExtractUSQADD_ASIMDMISC_R(inst, bits) ||
TryExtractLD2R_ASISDLSOP_R2_I(inst, bits) ||
TryExtractLD3R_ASISDLSO_R3(inst, bits) ||
TryExtractLD3R_ASISDLSOP_R3_I(inst, bits) ||
TryExtractCNT_ASIMDMISC_R(inst, bits) ||
TryExtractST3_ASISDLSEP_I3_I(inst, bits) ||
TryExtractLD2R_ASISDLSO_R2(inst, bits) ||
TryExtractLD4_ASISDLSO_H4_4H(inst, bits) ||
TryExtractLD4_ASISDLSOP_H4_I4H(inst, bits) ||
TryExtractSQABS_ASIMDMISC_R(inst, bits) ||
TryExtractST3_ASISDLSE_R3(inst, bits) ||
TryExtractLD1_ASISDLSEP_I4_I4(inst, bits) ||
TryExtractLD1_ASISDLSEP_I3_I3(inst, bits) ||
TryExtractABS_ASIMDMISC_R(inst, bits) ||
TryExtractUMINV_ASIMDALL_ONLY(inst, bits) ||
TryExtractMOVI_ASIMDIMM_D2_D(inst, bits) ||
TryExtractST1_ASISDLSE_R1_1V(inst, bits) ||
TryExtractST1_ASISDLSE_R2_2V(inst, bits) ||
TryExtractST1_ASISDLSE_R3_3V(inst, bits) ||
TryExtractST1_ASISDLSE_R4_4V(inst, bits) ||
TryExtractCLZ_ASIMDMISC_R(inst, bits) ||
TryExtractST1_ASISDLSEP_I1_I1(inst, bits) ||
TryExtractST1_ASISDLSEP_I2_I2(inst, bits) ||
TryExtractST1_ASISDLSEP_I3_I3(inst, bits) ||
TryExtractST1_ASISDLSEP_I4_I4(inst, bits) ||
TryExtractSQXTN_ASIMDMISC_N(inst, bits) ||
TryExtractLD4R_ASISDLSOP_R4_I(inst, bits) ||
TryExtractUMAXV_ASIMDALL_ONLY(inst, bits) ||
TryExtractSADALP_ASIMDMISC_P(inst, bits) ||
TryExtractUADDLP_ASIMDMISC_P(inst, bits) ||
TryExtractLD1_ASISDLSO_H1_1H(inst, bits) ||
TryExtractLD1_ASISDLSOP_H1_I1H(inst, bits) ||
TryExtractCMLE_ASIMDMISC_Z(inst, bits) ||
TryExtractSADDLV_ASIMDALL_ONLY(inst, bits) ||
TryExtractST1_ASISDLSO_H1_1H(inst, bits) ||
TryExtractXTN_ASIMDMISC_N(inst, bits) ||
TryExtractST1_ASISDLSOP_H1_I1H(inst, bits) ||
TryExtractLD2_ASISDLSO_H2_2H(inst, bits) ||
TryExtractLD2_ASISDLSOP_H2_I2H(inst, bits) ||
TryExtractREV32_ASIMDMISC_R(inst, bits) ||
TryExtractLD3_ASISDLSOP_H3_I3H(inst, bits) ||
TryExtractUADALP_ASIMDMISC_P(inst, bits) ||
TryExtractCMGE_ASIMDMISC_Z(inst, bits) ||
TryExtractFMOV_ASIMDIMM_D2_D(inst, bits) ||
TryExtractST4_ASISDLSE_R4(inst, bits) ||
TryExtractLD3_ASISDLSE_R3(inst, bits) ||
TryExtractADDV_ASIMDALL_ONLY(inst, bits) ||
TryExtractLD1R_ASISDLSOP_R1_I(inst, bits) ||
TryExtractLD4_ASISDLSE_R4(inst, bits) ||
TryExtractLD4_ASISDLSEP_I4_I(inst, bits) ||
TryExtractLD1_ASISDLSE_R2_2V(inst, bits) ||
TryExtractLD1_ASISDLSE_R3_3V(inst, bits) ||
TryExtractSMAXV_ASIMDALL_ONLY(inst, bits) ||
TryExtractLD1_ASISDLSEP_I2_I2(inst, bits) ||
TryExtractST4_ASISDLSEP_I4_I(inst, bits) ||
TryExtractLD2_ASISDLSE_R2(inst, bits) ||
TryExtractLD3_ASISDLSO_H3_3H(inst, bits) ||
TryExtractST3_ASISDLSO_H3_3H(inst, bits) ||
TryExtractLD2_ASISDLSEP_I2_I(inst, bits) ||
TryExtractLD1_ASISDLSE_R1_1V(inst, bits) ||
TryExtractLD3_ASISDLSEP_I3_I(inst, bits) ||
TryExtractREV64_ASIMDMISC_R(inst, bits) ||
TryExtractSQNEG_ASIMDMISC_R(inst, bits) ||
TryExtractST4_ASISDLSO_B4_4B(inst, bits) ||
TryExtractST4_ASISDLSOP_B4_I4B(inst, bits) ||
TryExtractMOVI_ASIMDIMM_N_B(inst, bits) ||
TryExtractST2_ASISDLSO_B2_2B(inst, bits) ||
TryExtractST2_ASISDLSOP_B2_I2B(inst, bits) ||
TryExtractST3_ASISDLSOP_B3_I3B(inst, bits) ||
TryExtractFMOV_ASIMDIMM_H_H(inst, bits) ||
TryExtractFMOV_ASIMDIMM_S_S(inst, bits) ||
TryExtractLD4_ASISDLSO_B4_4B(inst, bits) ||
TryExtractLD3_ASISDLSO_B3_3B(inst, bits) ||
TryExtractLD4_ASISDLSOP_B4_I4B(inst, bits) ||
TryExtractLD1_ASISDLSO_B1_1B(inst, bits) ||
TryExtractLD1_ASISDLSOP_B1_I1B(inst, bits) ||
TryExtractST1_ASISDLSO_B1_1B(inst, bits) ||
TryExtractST1_ASISDLSOP_B1_I1B(inst, bits) ||
TryExtractLD2_ASISDLSO_B2_2B(inst, bits) ||
TryExtractLD2_ASISDLSOP_B2_I2B(inst, bits) ||
TryExtractST3_ASISDLSO_B3_3B(inst, bits) ||
TryExtractLD3_ASISDLSOP_B3_I3B(inst, bits) ||
TryExtractBIC_ASIMDIMM_L_HL(inst, bits) ||
TryExtractMOVI_ASIMDIMM_L_HL(inst, bits) ||
TryExtractMOVI_ASIMDIMM_M_SM(inst, bits) ||
TryExtractSMOV_ASIMDINS_X_X(inst, bits) ||
TryExtractUMOV_ASIMDINS_W_W(inst, bits) ||
TryExtractSMOV_ASIMDINS_W_W(inst, bits) ||
TryExtractMVNI_ASIMDIMM_M_SM(inst, bits) ||
TryExtractMVNI_ASIMDIMM_L_HL(inst, bits) ||
TryExtractINS_ASIMDINS_IR_R(inst, bits) ||
TryExtractORR_ASIMDIMM_L_HL(inst, bits) ||
TryExtractEOR_ASIMDSAME_ONLY(inst, bits) ||
TryExtractFMAXNM_ASIMDSAMEFP16_ONLY(inst, bits) ||
TryExtractBIC_ASIMDSAME_ONLY(inst, bits) ||
TryExtractFMUL_ASIMDSAMEFP16_ONLY(inst, bits) ||
TryExtractFRECPS_ASIMDSAMEFP16_ONLY(inst, bits) ||
TryExtractORR_ASIMDSAME_ONLY(inst, bits) ||
TryExtractST4_ASISDLSOP_DX4_R4D(inst, bits) ||
TryExtractFMIN_ASIMDSAMEFP16_ONLY(inst, bits) ||
TryExtractTBX_ASIMDTBL_L2_2(inst, bits) ||
TryExtractFMAX_ASIMDSAMEFP16_ONLY(inst, bits) ||
TryExtractFACGE_ASIMDSAMEFP16_ONLY(inst, bits) ||
TryExtractMOVI_ASIMDIMM_L_SL(inst, bits) ||
TryExtractBIC_ASIMDIMM_L_SL(inst, bits) ||
TryExtractBIF_ASIMDSAME_ONLY(inst, bits) ||
TryExtractFDIV_ASIMDSAMEFP16_ONLY(inst, bits) ||
TryExtractST2_ASISDLSOP_DX2_R2D(inst, bits) ||
TryExtractFMAXP_ASIMDSAMEFP16_ONLY(inst, bits) ||
TryExtractST3_ASISDLSOP_DX3_R3D(inst, bits) ||
TryExtractFABD_ASIMDSAMEFP16_ONLY(inst, bits) ||
TryExtractDUP_ASIMDINS_DR_R(inst, bits) ||
TryExtractORN_ASIMDSAME_ONLY(inst, bits) ||
TryExtractFMLS_ASIMDSAMEFP16_ONLY(inst, bits) ||
TryExtractFMINP_ASIMDSAMEFP16_ONLY(inst, bits) ||
TryExtractFMULX_ASIMDSAMEFP16_ONLY(inst, bits) ||
TryExtractFMAXNMP_ASIMDSAMEFP16_ONLY(inst, bits) ||
TryExtractFRSQRTS_ASIMDSAMEFP16_ONLY(inst, bits) ||
TryExtractFADD_ASIMDSAMEFP16_ONLY(inst, bits) ||
TryExtractAND_ASIMDSAME_ONLY(inst, bits) ||
TryExtractFMINNM_ASIMDSAMEFP16_ONLY(inst, bits) ||
TryExtractFSUB_ASIMDSAMEFP16_ONLY(inst, bits) ||
TryExtractFMLA_ASIMDSAMEFP16_ONLY(inst, bits) ||
TryExtractFADDP_ASIMDSAMEFP16_ONLY(inst, bits) ||
TryExtractTBL_ASIMDTBL_L2_2(inst, bits) ||
TryExtractTBL_ASIMDTBL_L3_3(inst, bits) ||
TryExtractTBL_ASIMDTBL_L1_1(inst, bits) ||
TryExtractFMINNMP_ASIMDSAMEFP16_ONLY(inst, bits) ||
TryExtractLD1_ASISDLSOP_DX1_R1D(inst, bits) ||
TryExtractDUP_ASIMDINS_DV_V(inst, bits) ||
TryExtractTBL_ASIMDTBL_L4_4(inst, bits) ||
TryExtractST1_ASISDLSOP_DX1_R1D(inst, bits) ||
TryExtractLD4_ASISDLSOP_DX4_R4D(inst, bits) ||
TryExtractLD2_ASISDLSOP_DX2_R2D(inst, bits) ||
TryExtractMVNI_ASIMDIMM_L_SL(inst, bits) ||
TryExtractFCMGT_ASIMDSAMEFP16_ONLY(inst, bits) ||
TryExtractFCMGE_ASIMDSAMEFP16_ONLY(inst, bits) ||
TryExtractBIT_ASIMDSAME_ONLY(inst, bits) ||
TryExtractFCMEQ_ASIMDSAMEFP16_ONLY(inst, bits) ||
TryExtractTBX_ASIMDTBL_L3_3(inst, bits) ||
TryExtractTBX_ASIMDTBL_L1_1(inst, bits) ||
TryExtractTBX_ASIMDTBL_L4_4(inst, bits) ||
TryExtractFACGT_ASIMDSAMEFP16_ONLY(inst, bits) ||
TryExtractBSL_ASIMDSAME_ONLY(inst, bits) ||
TryExtractORR_ASIMDIMM_L_SL(inst, bits) ||
TryExtractLD3_ASISDLSOP_DX3_R3D(inst, bits) ||
TryExtractFMAXNM_ASIMDSAME_ONLY(inst, bits) ||
TryExtractST4_ASISDLSOP_SX4_R4S(inst, bits) ||
TryExtractFRECPS_ASIMDSAME_ONLY(inst, bits) ||
TryExtractFMAX_ASIMDSAME_ONLY(inst, bits) ||
TryExtractLD3_ASISDLSOP_SX3_R3S(inst, bits) ||
TryExtractFABD_ASIMDSAME_ONLY(inst, bits) ||
TryExtractST2_ASISDLSOP_SX2_R2S(inst, bits) ||
TryExtractST3_ASISDLSOP_SX3_R3S(inst, bits) ||
TryExtractFDIV_ASIMDSAME_ONLY(inst, bits) ||
TryExtractFMAXNMP_ASIMDSAME_ONLY(inst, bits) ||
TryExtractFACGT_ASIMDSAME_ONLY(inst, bits) ||
TryExtractFCMGE_ASIMDSAME_ONLY(inst, bits) ||
TryExtractFMINP_ASIMDSAME_ONLY(inst, bits) ||
TryExtractFMLA_ASIMDSAME_ONLY(inst, bits) ||
TryExtractFCMGT_ASIMDSAME_ONLY(inst, bits) ||
TryExtractFMAXP_ASIMDSAME_ONLY(inst, bits) ||
TryExtractFMLS_ASIMDSAME_ONLY(inst, bits) ||
TryExtractFMIN_ASIMDSAME_ONLY(inst, bits) ||
TryExtractFMULX_ASIMDSAME_ONLY(inst, bits) ||
TryExtractFMUL_ASIMDSAME_ONLY(inst, bits) ||
TryExtractLD4_ASISDLSOP_SX4_R4S(inst, bits) ||
TryExtractFSUB_ASIMDSAME_ONLY(inst, bits) ||
TryExtractFADDP_ASIMDSAME_ONLY(inst, bits) ||
TryExtractFADD_ASIMDSAME_ONLY(inst, bits) ||
TryExtractFACGE_ASIMDSAME_ONLY(inst, bits) ||
TryExtractLD1_ASISDLSOP_SX1_R1S(inst, bits) ||
TryExtractFMINNM_ASIMDSAME_ONLY(inst, bits) ||
TryExtractST1_ASISDLSOP_SX1_R1S(inst, bits) ||
TryExtractLD2_ASISDLSOP_SX2_R2S(inst, bits) ||
TryExtractFCMEQ_ASIMDSAME_ONLY(inst, bits) ||
TryExtractFRSQRTS_ASIMDSAME_ONLY(inst, bits) ||
TryExtractFMINNMP_ASIMDSAME_ONLY(inst, bits) ||
TryExtractSRSHL_ASIMDSAME_ONLY(inst, bits) ||
TryExtractSQDMULH_ASIMDSAME_ONLY(inst, bits) ||
TryExtractSQSUB_ASIMDSAME_ONLY(inst, bits) ||
TryExtractZIP2_ASIMDPERM_ONLY(inst, bits) ||
TryExtractURSHL_ASIMDSAME_ONLY(inst, bits) ||
TryExtractSMINP_ASIMDSAME_ONLY(inst, bits) ||
TryExtractADD_ASIMDSAME_ONLY(inst, bits) ||
TryExtractSQSHRN_ASIMDSHF_N(inst, bits) ||
TryExtractSQSHLU_ASIMDSHF_R(inst, bits) ||
TryExtractPMUL_ASIMDSAME_ONLY(inst, bits) ||
TryExtractUMULL_ASIMDDIFF_L(inst, bits) ||
TryExtractSQDMLSL_ASIMDDIFF_L(inst, bits) ||
TryExtractUHSUB_ASIMDSAME_ONLY(inst, bits) ||
TryExtractLD1_ASISDLSEP_R1_R1(inst, bits) ||
TryExtractSSHL_ASIMDSAME_ONLY(inst, bits) ||
TryExtractUADDL_ASIMDDIFF_L(inst, bits) ||
TryExtractUMAXP_ASIMDSAME_ONLY(inst, bits) ||
TryExtractSADDW_ASIMDDIFF_W(inst, bits) ||
TryExtractLD1R_ASISDLSOP_RX1_R(inst, bits) ||
TryExtractCMTST_ASIMDSAME_ONLY(inst, bits) ||
TryExtractUSHL_ASIMDSAME_ONLY(inst, bits) ||
TryExtractURHADD_ASIMDSAME_ONLY(inst, bits) ||
TryExtractST2_ASISDLSOP_HX2_R2H(inst, bits) ||
TryExtractST3_ASISDLSOP_HX3_R3H(inst, bits) ||
TryExtractUQRSHL_ASIMDSAME_ONLY(inst, bits) ||
TryExtractUMLAL_ASIMDDIFF_L(inst, bits) ||
TryExtractSHSUB_ASIMDSAME_ONLY(inst, bits) ||
TryExtractSHADD_ASIMDSAME_ONLY(inst, bits) ||
TryExtractCMEQ_ASIMDSAME_ONLY(inst, bits) ||
TryExtractSMLAL_ASIMDDIFF_L(inst, bits) ||
TryExtractSQSHRUN_ASIMDSHF_N(inst, bits) ||
TryExtractST4_ASISDLSOP_HX4_R4H(inst, bits) ||
TryExtractUABD_ASIMDSAME_ONLY(inst, bits) ||
TryExtractUSRA_ASIMDSHF_R(inst, bits) ||
TryExtractSRSRA_ASIMDSHF_R(inst, bits) ||
TryExtractMLS_ASIMDSAME_ONLY(inst, bits) ||
TryExtractMLA_ASIMDSAME_ONLY(inst, bits) ||
TryExtractSQSHL_ASIMDSAME_ONLY(inst, bits) ||
TryExtractSQRSHRUN_ASIMDSHF_N(inst, bits) ||
TryExtractUZP2_ASIMDPERM_ONLY(inst, bits) ||
TryExtractLD4_ASISDLSEP_R4_R(inst, bits) ||
TryExtractLD3R_ASISDLSOP_RX3_R(inst, bits) ||
TryExtractTRN2_ASIMDPERM_ONLY(inst, bits) ||
TryExtractUSUBL_ASIMDDIFF_L(inst, bits) ||
TryExtractUQSUB_ASIMDSAME_ONLY(inst, bits) ||
TryExtractSQRSHRN_ASIMDSHF_N(inst, bits) ||
TryExtractST3_ASISDLSEP_R3_R(inst, bits) ||
TryExtractCMGT_ASIMDSAME_ONLY(inst, bits) ||
TryExtractSRI_ASIMDSHF_R(inst, bits) ||
TryExtractSABD_ASIMDSAME_ONLY(inst, bits) ||
TryExtractSABDL_ASIMDDIFF_L(inst, bits) ||
TryExtractSADDL_ASIMDDIFF_L(inst, bits) ||
TryExtractSSUBL_ASIMDDIFF_L(inst, bits) ||
TryExtractUABDL_ASIMDDIFF_L(inst, bits) ||
TryExtractLD1_ASISDLSEP_R3_R3(inst, bits) ||
TryExtractUADDW_ASIMDDIFF_W(inst, bits) ||
TryExtractLD1_ASISDLSEP_R4_R4(inst, bits) ||
TryExtractSSUBW_ASIMDDIFF_W(inst, bits) ||
TryExtractSQRDMLSH_ASIMDSAME2_ONLY(inst, bits) ||
TryExtractUQSHRN_ASIMDSHF_N(inst, bits) ||
TryExtractSMULL_ASIMDDIFF_L(inst, bits) ||
TryExtractURSHR_ASIMDSHF_R(inst, bits) ||
TryExtractSUBHN_ASIMDDIFF_N(inst, bits) ||
TryExtractLD4_ASISDLSOP_HX4_R4H(inst, bits) ||
TryExtractST2_ASISDLSEP_R2_R(inst, bits) ||
TryExtractSQSHL_ASIMDSHF_R(inst, bits) ||
TryExtractFCVTZU_ASIMDSHF_C(inst, bits) ||
TryExtractRSHRN_ASIMDSHF_N(inst, bits) ||
TryExtractFMUL_ASIMDELEM_RH_H(inst, bits) ||
TryExtractUSHR_ASIMDSHF_R(inst, bits) ||
TryExtractCMHI_ASIMDSAME_ONLY(inst, bits) ||
TryExtractSCVTF_ASIMDSHF_C(inst, bits) ||
TryExtractSMAXP_ASIMDSAME_ONLY(inst, bits) ||
TryExtractADDP_ASIMDSAME_ONLY(inst, bits) ||
TryExtractST1_ASISDLSEP_R1_R1(inst, bits) ||
TryExtractST1_ASISDLSEP_R2_R2(inst, bits) ||
TryExtractST1_ASISDLSEP_R3_R3(inst, bits) ||
TryExtractST1_ASISDLSEP_R4_R4(inst, bits) ||
TryExtractSMAX_ASIMDSAME_ONLY(inst, bits) ||
TryExtractSQDMLAL_ASIMDDIFF_L(inst, bits) ||
TryExtractUQADD_ASIMDSAME_ONLY(inst, bits) ||
TryExtractSMLSL_ASIMDDIFF_L(inst, bits) ||
TryExtractFMLA_ASIMDELEM_RH_H(inst, bits) ||
TryExtractUCVTF_ASIMDSHF_C(inst, bits) ||
TryExtractSSRA_ASIMDSHF_R(inst, bits) ||
TryExtractUMAX_ASIMDSAME_ONLY(inst, bits) ||
TryExtractTRN1_ASIMDPERM_ONLY(inst, bits) ||
TryExtractSRHADD_ASIMDSAME_ONLY(inst, bits) ||
TryExtractSUB_ASIMDSAME_ONLY(inst, bits) ||
TryExtractSQRDMULH_ASIMDSAME_ONLY(inst, bits) ||
TryExtractLD4R_ASISDLSOP_RX4_R(inst, bits) ||
TryExtractFMULX_ASIMDELEM_RH_H(inst, bits) ||
TryExtractLD1_ASISDLSOP_HX1_R1H(inst, bits) ||
TryExtractUSUBW_ASIMDDIFF_W(inst, bits) ||
TryExtractZIP1_ASIMDPERM_ONLY(inst, bits) ||
TryExtractUMLSL_ASIMDDIFF_L(inst, bits) ||
TryExtractSABA_ASIMDSAME_ONLY(inst, bits) ||
TryExtractSHRN_ASIMDSHF_N(inst, bits) ||
TryExtractSQDMULL_ASIMDDIFF_L(inst, bits) ||
TryExtractLD2R_ASISDLSOP_RX2_R(inst, bits) ||
TryExtractST1_ASISDLSOP_HX1_R1H(inst, bits) ||
TryExtractUQSHL_ASIMDSAME_ONLY(inst, bits) ||
TryExtractFMLS_ASIMDELEM_RH_H(inst, bits) ||
TryExtractLD2_ASISDLSOP_HX2_R2H(inst, bits) ||
TryExtractUABAL_ASIMDDIFF_L(inst, bits) ||
TryExtractCMGE_ASIMDSAME_ONLY(inst, bits) ||
TryExtractFCVTZS_ASIMDSHF_C(inst, bits) ||
TryExtractLD1_ASISDLSEP_R2_R2(inst, bits) ||
TryExtractSRSHR_ASIMDSHF_R(inst, bits) ||
TryExtractCMHS_ASIMDSAME_ONLY(inst, bits) ||
TryExtractUHADD_ASIMDSAME_ONLY(inst, bits) ||
TryExtractSSHR_ASIMDSHF_R(inst, bits) ||
TryExtractSQRSHL_ASIMDSAME_ONLY(inst, bits) ||
TryExtractUMIN_ASIMDSAME_ONLY(inst, bits) ||
TryExtractRADDHN_ASIMDDIFF_N(inst, bits) ||
TryExtractSMIN_ASIMDSAME_ONLY(inst, bits) ||
TryExtractLD3_ASISDLSEP_R3_R(inst, bits) ||
TryExtractUZP1_ASIMDPERM_ONLY(inst, bits) ||
TryExtractUABA_ASIMDSAME_ONLY(inst, bits) ||
TryExtractPMULL_ASIMDDIFF_L(inst, bits) ||
TryExtractSQADD_ASIMDSAME_ONLY(inst, bits) ||
TryExtractUQSHL_ASIMDSHF_R(inst, bits) ||
TryExtractUSHLL_ASIMDSHF_L(inst, bits) ||
TryExtractUQRSHRN_ASIMDSHF_N(inst, bits) ||
TryExtractSHL_ASIMDSHF_R(inst, bits) ||
TryExtractMUL_ASIMDSAME_ONLY(inst, bits) ||
TryExtractURSRA_ASIMDSHF_R(inst, bits) ||
TryExtractRSUBHN_ASIMDDIFF_N(inst, bits) ||
TryExtractLD2_ASISDLSEP_R2_R(inst, bits) ||
TryExtractSSHLL_ASIMDSHF_L(inst, bits) ||
TryExtractST4_ASISDLSEP_R4_R(inst, bits) ||
TryExtractUMINP_ASIMDSAME_ONLY(inst, bits) ||
TryExtractLD3_ASISDLSOP_HX3_R3H(inst, bits) ||
TryExtractADDHN_ASIMDDIFF_N(inst, bits) ||
TryExtractSABAL_ASIMDDIFF_L(inst, bits) ||
TryExtractSQRDMLAH_ASIMDSAME2_ONLY(inst, bits) ||
TryExtractSLI_ASIMDSHF_R(inst, bits) ||
TryExtractST4_ASISDLSOP_BX4_R4B(inst, bits) ||
TryExtractINS_ASIMDINS_IV_V(inst, bits) ||
TryExtractST2_ASISDLSOP_BX2_R2B(inst, bits) ||
TryExtractST3_ASISDLSOP_BX3_R3B(inst, bits) ||
TryExtractST1_ASISDLSOP_BX1_R1B(inst, bits) ||
TryExtractFMLS_ASIMDELEM_R_SD(inst, bits) ||
TryExtractFMUL_ASIMDELEM_R_SD(inst, bits) ||
TryExtractLD4_ASISDLSOP_BX4_R4B(inst, bits) ||
TryExtractFMLA_ASIMDELEM_R_SD(inst, bits) ||
TryExtractLD2_ASISDLSOP_BX2_R2B(inst, bits) ||
TryExtractLD1_ASISDLSOP_BX1_R1B(inst, bits) ||
TryExtractLD3_ASISDLSOP_BX3_R3B(inst, bits) ||
TryExtractFMULX_ASIMDELEM_R_SD(inst, bits) ||
TryExtractSQDMULL_ASIMDELEM_L(inst, bits) ||
TryExtractUMLSL_ASIMDELEM_L(inst, bits) ||
TryExtractUMULL_ASIMDELEM_L(inst, bits) ||
TryExtractMLS_ASIMDELEM_R(inst, bits) ||
TryExtractSQRDMLSH_ASIMDELEM_R(inst, bits) ||
TryExtractSMLAL_ASIMDELEM_L(inst, bits) ||
TryExtractMUL_ASIMDELEM_R(inst, bits) ||
TryExtractSQRDMULH_ASIMDELEM_R(inst, bits) ||
TryExtractSQRDMLAH_ASIMDELEM_R(inst, bits) ||
TryExtractSMULL_ASIMDELEM_L(inst, bits) ||
TryExtractSMLSL_ASIMDELEM_L(inst, bits) ||
TryExtractSQDMLSL_ASIMDELEM_L(inst, bits) ||
TryExtractEXT_ASIMDEXT_ONLY(inst, bits) ||
TryExtractMLA_ASIMDELEM_R(inst, bits) ||
TryExtractSQDMLAL_ASIMDELEM_L(inst, bits) ||
TryExtractUMLAL_ASIMDELEM_L(inst, bits) ||
TryExtractSQDMULH_ASIMDELEM_R(inst, bits) ||
TryExtractLDNP_Q_LDSTNAPAIR_OFFS(inst, bits) ||
TryExtractSTP_S_LDSTPAIR_POST(inst, bits) ||
TryExtractLDP_D_LDSTPAIR_OFF(inst, bits) ||
TryExtractLDP_S_LDSTPAIR_POST(inst, bits) ||
TryExtractLDP_D_LDSTPAIR_POST(inst, bits) ||
TryExtractLDP_Q_LDSTPAIR_POST(inst, bits) ||
TryExtractLDP_S_LDSTPAIR_PRE(inst, bits) ||
TryExtractLDP_Q_LDSTPAIR_PRE(inst, bits) ||
TryExtractLDP_S_LDSTPAIR_OFF(inst, bits) ||
TryExtractLDP_Q_LDSTPAIR_OFF(inst, bits) ||
TryExtractLDP_D_LDSTPAIR_PRE(inst, bits) ||
TryExtractSTP_Q_LDSTPAIR_POST(inst, bits) ||
TryExtractSTNP_D_LDSTNAPAIR_OFFS(inst, bits) ||
TryExtractLDNP_D_LDSTNAPAIR_OFFS(inst, bits) ||
TryExtractSTP_Q_LDSTPAIR_OFF(inst, bits) ||
TryExtractSTP_Q_LDSTPAIR_PRE(inst, bits) ||
TryExtractSTP_S_LDSTPAIR_OFF(inst, bits) ||
TryExtractSTP_D_LDSTPAIR_OFF(inst, bits) ||
TryExtractSTNP_Q_LDSTNAPAIR_OFFS(inst, bits) ||
TryExtractSTNP_S_LDSTNAPAIR_OFFS(inst, bits) ||
TryExtractSTP_D_LDSTPAIR_POST(inst, bits) ||
TryExtractSTP_S_LDSTPAIR_PRE(inst, bits) ||
TryExtractSTP_D_LDSTPAIR_PRE(inst, bits) ||
TryExtractLDNP_S_LDSTNAPAIR_OFFS(inst, bits);
}
// 00010000000000000000000000000000
static bool TryExtract4(InstData &inst, uint32_t bits) {
return false || TryExtractEXTR_32_EXTRACT(inst, bits) ||
TryExtractEXTR_64_EXTRACT(inst, bits) ||
TryExtractEOR_32_LOG_IMM(inst, bits) ||
TryExtractBFM_32M_BITFIELD(inst, bits) ||
TryExtractSBFM_32M_BITFIELD(inst, bits) ||
TryExtractUBFM_64M_BITFIELD(inst, bits) ||
TryExtractBFM_64M_BITFIELD(inst, bits) ||
TryExtractAND_32_LOG_IMM(inst, bits) ||
TryExtractSBFM_64M_BITFIELD(inst, bits) ||
TryExtractANDS_32S_LOG_IMM(inst, bits) ||
TryExtractUBFM_32M_BITFIELD(inst, bits) ||
TryExtractORR_32_LOG_IMM(inst, bits) ||
TryExtractORR_64_LOG_IMM(inst, bits) ||
TryExtractMOVN_64_MOVEWIDE(inst, bits) ||
TryExtractMOVZ_64_MOVEWIDE(inst, bits) ||
TryExtractMOVK_32_MOVEWIDE(inst, bits) ||
TryExtractAND_64_LOG_IMM(inst, bits) ||
TryExtractMOVZ_32_MOVEWIDE(inst, bits) ||
TryExtractMOVN_32_MOVEWIDE(inst, bits) ||
TryExtractMOVK_64_MOVEWIDE(inst, bits) ||
TryExtractANDS_64S_LOG_IMM(inst, bits) ||
TryExtractEOR_64_LOG_IMM(inst, bits) ||
TryExtractADD_32_ADDSUB_IMM(inst, bits) ||
TryExtractSUB_32_ADDSUB_IMM(inst, bits) ||
TryExtractADDS_32S_ADDSUB_IMM(inst, bits) ||
TryExtractSUBS_64S_ADDSUB_IMM(inst, bits) ||
TryExtractSUBS_32S_ADDSUB_IMM(inst, bits) ||
TryExtractSUB_64_ADDSUB_IMM(inst, bits) ||
TryExtractADDS_64S_ADDSUB_IMM(inst, bits) ||
TryExtractADD_64_ADDSUB_IMM(inst, bits) ||
TryExtractADR_ONLY_PCRELADDR(inst, bits) ||
TryExtractADRP_ONLY_PCRELADDR(inst, bits);
}
// 00010100000000000000000000000000
static bool TryExtract5(InstData &inst, uint32_t bits) {
return false || TryExtractWFI_HI_SYSTEM(inst, bits) ||
TryExtractERET_64E_BRANCH_REG(inst, bits) ||
TryExtractESB_HI_SYSTEM(inst, bits) ||
TryExtractDRPS_64E_BRANCH_REG(inst, bits) ||
TryExtractWFE_HI_SYSTEM(inst, bits) ||
TryExtractNOP_HI_SYSTEM(inst, bits) ||
TryExtractSEV_HI_SYSTEM(inst, bits) ||
TryExtractPSB_HC_SYSTEM(inst, bits) ||
TryExtractYIELD_HI_SYSTEM(inst, bits) ||
TryExtractSEVL_HI_SYSTEM(inst, bits) || TryExtractHINT_1(inst, bits) ||
TryExtractHINT_3(inst, bits) || TryExtractDSB_BO_SYSTEM(inst, bits) ||
TryExtractISB_BI_SYSTEM(inst, bits) ||
TryExtractCLREX_BN_SYSTEM(inst, bits) ||
TryExtractDMB_BO_SYSTEM(inst, bits) ||
TryExtractBLR_64_BRANCH_REG(inst, bits) ||
TryExtractBR_64_BRANCH_REG(inst, bits) ||
TryExtractRET_64R_BRANCH_REG(inst, bits) ||
TryExtractHINT_2(inst, bits) || TryExtractMSR_SI_SYSTEM(inst, bits) ||
TryExtractDCPS3_DC_EXCEPTION(inst, bits) ||
TryExtractDCPS2_DC_EXCEPTION(inst, bits) ||
TryExtractBRK_EX_EXCEPTION(inst, bits) ||
TryExtractHVC_EX_EXCEPTION(inst, bits) ||
TryExtractDCPS1_DC_EXCEPTION(inst, bits) ||
TryExtractHLT_EX_EXCEPTION(inst, bits) ||
TryExtractSMC_EX_EXCEPTION(inst, bits) ||
TryExtractSVC_EX_EXCEPTION(inst, bits) ||
TryExtractSYS_CR_SYSTEM(inst, bits) ||
TryExtractSYSL_RC_SYSTEM(inst, bits) ||
TryExtractMRS_RS_SYSTEM(inst, bits) ||
TryExtractMSR_SR_SYSTEM(inst, bits) ||
TryExtractB_ONLY_CONDBRANCH(inst, bits) ||
TryExtractCBZ_64_COMPBRANCH(inst, bits) ||
TryExtractCBNZ_32_COMPBRANCH(inst, bits) ||
TryExtractCBZ_32_COMPBRANCH(inst, bits) ||
TryExtractCBNZ_64_COMPBRANCH(inst, bits) ||
TryExtractTBZ_ONLY_TESTBRANCH(inst, bits) ||
TryExtractTBNZ_ONLY_TESTBRANCH(inst, bits) ||
TryExtractBL_ONLY_BRANCH_IMM(inst, bits) ||
TryExtractB_ONLY_BRANCH_IMM(inst, bits);
}
// 00011000000000000000000000000000
static bool TryExtract6(InstData &inst, uint32_t bits) {
return false || TryExtractSTADD_32S_MEMOP(inst, bits) ||
TryExtractSTUMINLH_32S_MEMOP(inst, bits) ||
TryExtractSTUMAXLB_32S_MEMOP(inst, bits) ||
TryExtractREV_64_DP_1SRC(inst, bits) ||
TryExtractREV_32_DP_1SRC(inst, bits) ||
TryExtractSTSMAXH_32S_MEMOP(inst, bits) ||
TryExtractCLZ_32_DP_1SRC(inst, bits) ||
TryExtractSTUMINH_32S_MEMOP(inst, bits) ||
TryExtractSTSMAXLH_32S_MEMOP(inst, bits) ||
TryExtractCLS_32_DP_1SRC(inst, bits) ||
TryExtractSTUMINB_32S_MEMOP(inst, bits) ||
TryExtractSTEORLH_32S_MEMOP(inst, bits) ||
TryExtractSTEORH_32S_MEMOP(inst, bits) ||
TryExtractSTADD_64S_MEMOP(inst, bits) ||
TryExtractSTSMAXL_64S_MEMOP(inst, bits) ||
TryExtractSTUMINLB_32S_MEMOP(inst, bits) ||
TryExtractCLS_64_DP_1SRC(inst, bits) ||
TryExtractSTCLRL_64S_MEMOP(inst, bits) ||
TryExtractSTSETB_32S_MEMOP(inst, bits) ||
TryExtractSTCLRH_32S_MEMOP(inst, bits) ||
TryExtractSTADDB_32S_MEMOP(inst, bits) ||
TryExtractSTUMIN_32S_MEMOP(inst, bits) ||
TryExtractSTADDL_32S_MEMOP(inst, bits) ||
TryExtractSTUMINL_64S_MEMOP(inst, bits) ||
TryExtractSTUMIN_64S_MEMOP(inst, bits) ||
TryExtractSTADDL_64S_MEMOP(inst, bits) ||
TryExtractSTUMAXH_32S_MEMOP(inst, bits) ||
TryExtractREV16_32_DP_1SRC(inst, bits) ||
TryExtractSTSET_32S_MEMOP(inst, bits) ||
TryExtractSTSETL_32S_MEMOP(inst, bits) ||
TryExtractSTSETL_64S_MEMOP(inst, bits) ||
TryExtractSTSMINH_32S_MEMOP(inst, bits) ||
TryExtractSTSMINLH_32S_MEMOP(inst, bits) ||
TryExtractSTUMAXB_32S_MEMOP(inst, bits) ||
TryExtractSTUMINL_32S_MEMOP(inst, bits) ||
TryExtractSTCLRLB_32S_MEMOP(inst, bits) ||
TryExtractSTSMINL_64S_MEMOP(inst, bits) ||
TryExtractSTCLR_32S_MEMOP(inst, bits) ||
TryExtractSTCLRB_32S_MEMOP(inst, bits) ||
TryExtractSTSMAXB_32S_MEMOP(inst, bits) ||
TryExtractSTSMINL_32S_MEMOP(inst, bits) ||
TryExtractSTEORLB_32S_MEMOP(inst, bits) ||
TryExtractSTEORB_32S_MEMOP(inst, bits) ||
TryExtractSTEORL_32S_MEMOP(inst, bits) ||
TryExtractSTCLRLH_32S_MEMOP(inst, bits) ||
TryExtractSTSMAX_64S_MEMOP(inst, bits) ||
TryExtractSTADDLH_32S_MEMOP(inst, bits) ||
TryExtractCLZ_64_DP_1SRC(inst, bits) ||
TryExtractSTADDH_32S_MEMOP(inst, bits) ||
TryExtractSTSMAX_32S_MEMOP(inst, bits) ||
TryExtractSTSMAXL_32S_MEMOP(inst, bits) ||
TryExtractSTSMINLB_32S_MEMOP(inst, bits) ||
TryExtractSTSMINB_32S_MEMOP(inst, bits) ||
TryExtractSTUMAXLH_32S_MEMOP(inst, bits) ||
TryExtractSTADDLB_32S_MEMOP(inst, bits) ||
TryExtractREV32_64_DP_1SRC(inst, bits) ||
TryExtractSTSMAXLB_32S_MEMOP(inst, bits) ||
TryExtractRBIT_64_DP_1SRC(inst, bits) ||
TryExtractSTSETLB_32S_MEMOP(inst, bits) ||
TryExtractSTEOR_32S_MEMOP(inst, bits) ||
TryExtractRBIT_32_DP_1SRC(inst, bits) ||
TryExtractSTCLR_64S_MEMOP(inst, bits) ||
TryExtractSTCLRL_32S_MEMOP(inst, bits) ||
TryExtractSTSETLH_32S_MEMOP(inst, bits) ||
TryExtractSTSET_64S_MEMOP(inst, bits) ||
TryExtractSTUMAX_32S_MEMOP(inst, bits) ||
TryExtractSTUMAXL_32S_MEMOP(inst, bits) ||
TryExtractSTEOR_64S_MEMOP(inst, bits) ||
TryExtractSTEORL_64S_MEMOP(inst, bits) ||
TryExtractSTUMAX_64S_MEMOP(inst, bits) ||
TryExtractSTSMIN_64S_MEMOP(inst, bits) ||
TryExtractSTUMAXL_64S_MEMOP(inst, bits) ||
TryExtractSTSMIN_32S_MEMOP(inst, bits) ||
TryExtractSTSETH_32S_MEMOP(inst, bits) ||
TryExtractREV16_64_DP_1SRC(inst, bits) ||
TryExtractLSLV_32_DP_2SRC(inst, bits) ||
TryExtractLDSMAXALB_32_MEMOP(inst, bits) ||
TryExtractSBC_64_ADDSUB_CARRY(inst, bits) ||
TryExtractLDSMAXAB_32_MEMOP(inst, bits) ||
TryExtractLDUMINALB_32_MEMOP(inst, bits) ||
TryExtractLSLV_64_DP_2SRC(inst, bits) ||
TryExtractLDADDALB_32_MEMOP(inst, bits) ||
TryExtractLDSMAXB_32_MEMOP(inst, bits) ||
TryExtractLDADDAB_32_MEMOP(inst, bits) ||
TryExtractLDSETALB_32_MEMOP(inst, bits) ||
TryExtractLDSETLB_32_MEMOP(inst, bits) ||
TryExtractLDSETB_32_MEMOP(inst, bits) ||
TryExtractLDUMAXA_64_MEMOP(inst, bits) ||
TryExtractLDSMINA_32_MEMOP(inst, bits) ||
TryExtractSWPAB_32_MEMOP(inst, bits) ||
TryExtractLDEORB_32_MEMOP(inst, bits) ||
TryExtractSWPALH_32_MEMOP(inst, bits) ||
TryExtractLDSMINAL_32_MEMOP(inst, bits) ||
TryExtractADC_32_ADDSUB_CARRY(inst, bits) ||
TryExtractLDEORLB_32_MEMOP(inst, bits) ||
TryExtractLDEORH_32_MEMOP(inst, bits) ||
TryExtractLDSMINL_32_MEMOP(inst, bits) ||
TryExtractLDEORA_32_MEMOP(inst, bits) ||
TryExtractLDEORAL_32_MEMOP(inst, bits) ||
TryExtractLDEOR_32_MEMOP(inst, bits) ||
TryExtractLDEORL_32_MEMOP(inst, bits) ||
TryExtractLDEORA_64_MEMOP(inst, bits) ||
TryExtractLDEORAL_64_MEMOP(inst, bits) ||
TryExtractSDIV_64_DP_2SRC(inst, bits) ||
TryExtractLDEOR_64_MEMOP(inst, bits) ||
TryExtractLDEORL_64_MEMOP(inst, bits) ||
TryExtractUDIV_32_DP_2SRC(inst, bits) ||
TryExtractLDSMAXALH_32_MEMOP(inst, bits) ||
TryExtractLDEORLH_32_MEMOP(inst, bits) ||
TryExtractLDUMAXAL_64_MEMOP(inst, bits) ||
TryExtractLDSMAXAL_32_MEMOP(inst, bits) ||
TryExtractLDEORAB_32_MEMOP(inst, bits) ||
TryExtractADC_64_ADDSUB_CARRY(inst, bits) ||
TryExtractLDEORALB_32_MEMOP(inst, bits) ||
TryExtractSWPALB_32_MEMOP(inst, bits) ||
TryExtractLDADDLB_32_MEMOP(inst, bits) ||
TryExtractSWPL_32_MEMOP(inst, bits) ||
TryExtractSWPL_64_MEMOP(inst, bits) ||
TryExtractSWPAL_64_MEMOP(inst, bits) ||
TryExtractSWP_32_MEMOP(inst, bits) ||
TryExtractUMULH_64_DP_3SRC(inst, bits) ||
TryExtractSWPA_64_MEMOP(inst, bits) ||
TryExtractSWPLB_32_MEMOP(inst, bits) ||
TryExtractSBC_32_ADDSUB_CARRY(inst, bits) ||
TryExtractSWP_64_MEMOP(inst, bits) ||
TryExtractLDSMAXLB_32_MEMOP(inst, bits) ||
TryExtractLSRV_64_DP_2SRC(inst, bits) ||
TryExtractLDUMAXA_32_MEMOP(inst, bits) ||
TryExtractLDUMAX_32_MEMOP(inst, bits) ||
TryExtractLDUMAXL_32_MEMOP(inst, bits) ||
TryExtractLDUMAXL_64_MEMOP(inst, bits) ||
TryExtractLDUMAX_64_MEMOP(inst, bits) ||
TryExtractLDCLRA_64_MEMOP(inst, bits) ||
TryExtractLDCLRAL_64_MEMOP(inst, bits) ||
TryExtractLDUMAXAL_32_MEMOP(inst, bits) ||
TryExtractLDCLRL_64_MEMOP(inst, bits) ||
TryExtractRORV_64_DP_2SRC(inst, bits) ||
TryExtractASRV_32_DP_2SRC(inst, bits) ||
TryExtractRORV_32_DP_2SRC(inst, bits) ||
TryExtractLDADDA_32_MEMOP(inst, bits) ||
TryExtractLDCLRA_32_MEMOP(inst, bits) ||
TryExtractLDSMAXL_64_MEMOP(inst, bits) ||
TryExtractLDSMAX_64_MEMOP(inst, bits) ||
TryExtractLDSMAXAL_64_MEMOP(inst, bits) ||
TryExtractLDSMAXA_64_MEMOP(inst, bits) ||
TryExtractLDCLRAL_32_MEMOP(inst, bits) ||
TryExtractLDUMAXAB_32_MEMOP(inst, bits) ||
TryExtractLDUMAXALB_32_MEMOP(inst, bits) ||
TryExtractLDCLR_32_MEMOP(inst, bits) ||
TryExtractLDUMAXB_32_MEMOP(inst, bits) ||
TryExtractLDUMAXLB_32_MEMOP(inst, bits) ||
TryExtractLDUMINB_32_MEMOP(inst, bits) ||
TryExtractLDCLRL_32_MEMOP(inst, bits) ||
TryExtractLDUMINAB_32_MEMOP(inst, bits) ||
TryExtractLDSMIN_32_MEMOP(inst, bits) ||
TryExtractLDUMINLB_32_MEMOP(inst, bits) ||
TryExtractLDSMINA_64_MEMOP(inst, bits) ||
TryExtractLDSMINAL_64_MEMOP(inst, bits) ||
TryExtractLDSMIN_64_MEMOP(inst, bits) ||
TryExtractLSRV_32_DP_2SRC(inst, bits) ||
TryExtractLDCLR_64_MEMOP(inst, bits) ||
TryExtractLDSMAXH_32_MEMOP(inst, bits) ||
TryExtractLDSMAXAH_32_MEMOP(inst, bits) ||
TryExtractASRV_64_DP_2SRC(inst, bits) ||
TryExtractLDSMINL_64_MEMOP(inst, bits) ||
TryExtractSBCS_64_ADDSUB_CARRY(inst, bits) ||
TryExtractLDSMAXLH_32_MEMOP(inst, bits) ||
TryExtractSBCS_32_ADDSUB_CARRY(inst, bits) ||
TryExtractSMULH_64_DP_3SRC(inst, bits) ||
TryExtractADCS_64_ADDSUB_CARRY(inst, bits) ||
TryExtractCRC32CB_32C_DP_2SRC(inst, bits) ||
TryExtractLDCLRLB_32_MEMOP(inst, bits) ||
TryExtractCRC32CW_32C_DP_2SRC(inst, bits) ||
TryExtractCRC32CX_64C_DP_2SRC(inst, bits) ||
TryExtractLDSMINAB_32_MEMOP(inst, bits) ||
TryExtractLDADD_64_MEMOP(inst, bits) ||
TryExtractSDIV_32_DP_2SRC(inst, bits) ||
TryExtractLDSETA_32_MEMOP(inst, bits) ||
TryExtractSWPH_32_MEMOP(inst, bits) ||
TryExtractLDSETH_32_MEMOP(inst, bits) ||
TryExtractSWPLH_32_MEMOP(inst, bits) ||
TryExtractSWPAL_32_MEMOP(inst, bits) ||
TryExtractSWPAH_32_MEMOP(inst, bits) ||
TryExtractLDUMINALH_32_MEMOP(inst, bits) ||
TryExtractLDADDLH_32_MEMOP(inst, bits) ||
TryExtractLDADDB_32_MEMOP(inst, bits) ||
TryExtractLDADDH_32_MEMOP(inst, bits) ||
TryExtractADCS_32_ADDSUB_CARRY(inst, bits) ||
TryExtractLDSETLH_32_MEMOP(inst, bits) ||
TryExtractLDADDALH_32_MEMOP(inst, bits) ||
TryExtractSWPA_32_MEMOP(inst, bits) ||
TryExtractLDADDAH_32_MEMOP(inst, bits) ||
TryExtractLDSETAH_32_MEMOP(inst, bits) ||
TryExtractLDSETALH_32_MEMOP(inst, bits) ||
TryExtractLDUMINAL_32_MEMOP(inst, bits) ||
TryExtractLDUMINL_32_MEMOP(inst, bits) ||
TryExtractCRC32H_32C_DP_2SRC(inst, bits) ||
TryExtractLDSMINAH_32_MEMOP(inst, bits) ||
TryExtractLDUMINA_32_MEMOP(inst, bits) ||
TryExtractLDUMIN_32_MEMOP(inst, bits) ||
TryExtractLDUMINAL_64_MEMOP(inst, bits) ||
TryExtractCRC32W_32C_DP_2SRC(inst, bits) ||
TryExtractLDSMINALH_32_MEMOP(inst, bits) ||
TryExtractLDCLRAB_32_MEMOP(inst, bits) ||
TryExtractLDSETAB_32_MEMOP(inst, bits) ||
TryExtractLDCLRAH_32_MEMOP(inst, bits) ||
TryExtractLDCLRALH_32_MEMOP(inst, bits) ||
TryExtractLDUMINLH_32_MEMOP(inst, bits) ||
TryExtractLDCLRH_32_MEMOP(inst, bits) ||
TryExtractLDCLRB_32_MEMOP(inst, bits) ||
TryExtractLDUMINA_64_MEMOP(inst, bits) ||
TryExtractUDIV_64_DP_2SRC(inst, bits) ||
TryExtractLDCLRALB_32_MEMOP(inst, bits) ||
TryExtractLDSMINH_32_MEMOP(inst, bits) ||
TryExtractCRC32X_64C_DP_2SRC(inst, bits) ||
TryExtractCRC32B_32C_DP_2SRC(inst, bits) ||
TryExtractLDUMINL_64_MEMOP(inst, bits) ||
TryExtractLDEORALH_32_MEMOP(inst, bits) ||
TryExtractSWPB_32_MEMOP(inst, bits) ||
TryExtractLDUMIN_64_MEMOP(inst, bits) ||
TryExtractLDSMINLH_32_MEMOP(inst, bits) ||
TryExtractLDSMINLB_32_MEMOP(inst, bits) ||
TryExtractLDSMINB_32_MEMOP(inst, bits) ||
TryExtractLDEORAH_32_MEMOP(inst, bits) ||
TryExtractLDCLRLH_32_MEMOP(inst, bits) ||
TryExtractCRC32CH_32C_DP_2SRC(inst, bits) ||
TryExtractLDSMAXA_32_MEMOP(inst, bits) ||
TryExtractLDSETAL_32_MEMOP(inst, bits) ||
TryExtractLDSET_32_MEMOP(inst, bits) ||
TryExtractLDSETL_32_MEMOP(inst, bits) ||
TryExtractLDSETA_64_MEMOP(inst, bits) ||
TryExtractLDSETAL_64_MEMOP(inst, bits) ||
TryExtractLDSET_64_MEMOP(inst, bits) ||
TryExtractLDSETL_64_MEMOP(inst, bits) ||
TryExtractLDSMAX_32_MEMOP(inst, bits) ||
TryExtractLDADD_32_MEMOP(inst, bits) ||
TryExtractLDUMINAH_32_MEMOP(inst, bits) ||
TryExtractLDADDL_32_MEMOP(inst, bits) ||
TryExtractLDUMINH_32_MEMOP(inst, bits) ||
TryExtractLDSMAXL_32_MEMOP(inst, bits) ||
TryExtractLDUMAXAH_32_MEMOP(inst, bits) ||
TryExtractLDUMAXLH_32_MEMOP(inst, bits) ||
TryExtractLDUMAXH_32_MEMOP(inst, bits) ||
TryExtractLDADDL_64_MEMOP(inst, bits) ||
TryExtractLDADDA_64_MEMOP(inst, bits) ||
TryExtractLDUMAXALH_32_MEMOP(inst, bits) ||
TryExtractLDADDAL_64_MEMOP(inst, bits) ||
TryExtractLDADDAL_32_MEMOP(inst, bits) ||
TryExtractLDSMINALB_32_MEMOP(inst, bits) ||
TryExtractLDRB_32BL_LDST_REGOFF(inst, bits) ||
TryExtractLDRSB_64BL_LDST_REGOFF(inst, bits) ||
TryExtractLDRSB_32BL_LDST_REGOFF(inst, bits) ||
TryExtractSTRB_32BL_LDST_REGOFF(inst, bits) ||
TryExtractCCMN_32_CONDCMP_REG(inst, bits) ||
TryExtractCCMN_64_CONDCMP_REG(inst, bits) ||
TryExtractCCMP_32_CONDCMP_REG(inst, bits) ||
TryExtractCCMP_64_CONDCMP_IMM(inst, bits) ||
TryExtractCCMP_32_CONDCMP_IMM(inst, bits) ||
TryExtractCCMP_64_CONDCMP_REG(inst, bits) ||
TryExtractCCMN_64_CONDCMP_IMM(inst, bits) ||
TryExtractCCMN_32_CONDCMP_IMM(inst, bits) ||
TryExtractCSNEG_64_CONDSEL(inst, bits) ||
TryExtractCSNEG_32_CONDSEL(inst, bits) ||
TryExtractLDUR_64_LDST_UNSCALED(inst, bits) ||
TryExtractLDTRH_32_LDST_UNPRIV(inst, bits) ||
TryExtractLDTRSH_64_LDST_UNPRIV(inst, bits) ||
TryExtractSTR_64_LDST_IMMPOST(inst, bits) ||
TryExtractSTURB_32_LDST_UNSCALED(inst, bits) ||
TryExtractSTR_32_LDST_REGOFF(inst, bits) ||
TryExtractLDTRSH_32_LDST_UNPRIV(inst, bits) ||
TryExtractLDTRSW_64_LDST_UNPRIV(inst, bits) ||
TryExtractSTR_32_LDST_IMMPRE(inst, bits) ||
TryExtractLDRB_32B_LDST_REGOFF(inst, bits) ||
TryExtractLDUR_32_LDST_UNSCALED(inst, bits) ||
TryExtractLDRSH_32_LDST_IMMPOST(inst, bits) ||
TryExtractLDRSH_64_LDST_IMMPOST(inst, bits) ||
TryExtractLDRSH_32_LDST_IMMPRE(inst, bits) ||
TryExtractLDURSB_32_LDST_UNSCALED(inst, bits) ||
TryExtractLDURSB_64_LDST_UNSCALED(inst, bits) ||
TryExtractSTRH_32_LDST_IMMPOST(inst, bits) ||
TryExtractLDRH_32_LDST_IMMPOST(inst, bits) ||
TryExtractLDURH_32_LDST_UNSCALED(inst, bits) ||
TryExtractLDRH_32_LDST_IMMPRE(inst, bits) ||
TryExtractSTR_32_LDST_IMMPOST(inst, bits) ||
TryExtractSTRB_32_LDST_IMMPOST(inst, bits) ||
TryExtractLDRSH_64_LDST_REGOFF(inst, bits) ||
TryExtractCSEL_64_CONDSEL(inst, bits) ||
TryExtractSTTRH_32_LDST_UNPRIV(inst, bits) ||
TryExtractCSEL_32_CONDSEL(inst, bits) ||
TryExtractLDURSW_64_LDST_UNSCALED(inst, bits) ||
TryExtractLDURB_32_LDST_UNSCALED(inst, bits) ||
TryExtractSTURH_32_LDST_UNSCALED(inst, bits) ||
TryExtractLDRSB_32_LDST_IMMPOST(inst, bits) ||
TryExtractLDRSB_32_LDST_IMMPRE(inst, bits) ||
TryExtractLDRSB_64_LDST_IMMPRE(inst, bits) ||
TryExtractLDTRB_32_LDST_UNPRIV(inst, bits) ||
TryExtractLDRSB_64_LDST_IMMPOST(inst, bits) ||
TryExtractLDRSW_64_LDST_IMMPRE(inst, bits) ||
TryExtractLDR_64_LDST_IMMPRE(inst, bits) ||
TryExtractLDRSW_64_LDST_IMMPOST(inst, bits) ||
TryExtractSTRH_32_LDST_IMMPRE(inst, bits) ||
TryExtractLDTRSB_64_LDST_UNPRIV(inst, bits) ||
TryExtractSTTRB_32_LDST_UNPRIV(inst, bits) ||
TryExtractSTR_64_LDST_IMMPRE(inst, bits) ||
TryExtractSTRB_32_LDST_IMMPRE(inst, bits) ||
TryExtractLDRSH_32_LDST_REGOFF(inst, bits) ||
TryExtractSTRB_32B_LDST_REGOFF(inst, bits) ||
TryExtractLDTR_32_LDST_UNPRIV(inst, bits) ||
TryExtractLDRSW_64_LDST_REGOFF(inst, bits) ||
TryExtractSTTR_32_LDST_UNPRIV(inst, bits) ||
TryExtractCSINC_64_CONDSEL(inst, bits) ||
TryExtractCSINC_32_CONDSEL(inst, bits) ||
TryExtractLDTR_64_LDST_UNPRIV(inst, bits) ||
TryExtractPRFM_P_LDST_REGOFF(inst, bits) ||
TryExtractSTUR_32_LDST_UNSCALED(inst, bits) ||
TryExtractLDRH_32_LDST_REGOFF(inst, bits) ||
TryExtractLDR_32_LDST_IMMPOST(inst, bits) ||
TryExtractSTTR_64_LDST_UNPRIV(inst, bits) ||
TryExtractLDR_64_LDST_IMMPOST(inst, bits) ||
TryExtractLDR_64_LDST_REGOFF(inst, bits) ||
TryExtractLDR_32_LDST_IMMPRE(inst, bits) ||
TryExtractLDR_32_LDST_REGOFF(inst, bits) ||
TryExtractPRFUM_P_LDST_UNSCALED(inst, bits) ||
TryExtractSTUR_64_LDST_UNSCALED(inst, bits) ||
TryExtractLDRB_32_LDST_IMMPRE(inst, bits) ||
TryExtractLDRSH_64_LDST_IMMPRE(inst, bits) ||
TryExtractLDRB_32_LDST_IMMPOST(inst, bits) ||
TryExtractSTRH_32_LDST_REGOFF(inst, bits) ||
TryExtractCSINV_32_CONDSEL(inst, bits) ||
TryExtractSTR_64_LDST_REGOFF(inst, bits) ||
TryExtractLDTRSB_32_LDST_UNPRIV(inst, bits) ||
TryExtractCSINV_64_CONDSEL(inst, bits) ||
TryExtractLDRSB_32B_LDST_REGOFF(inst, bits) ||
TryExtractLDRSB_64B_LDST_REGOFF(inst, bits) ||
TryExtractLDURSH_64_LDST_UNSCALED(inst, bits) ||
TryExtractLDURSH_32_LDST_UNSCALED(inst, bits) ||
TryExtractUMADDL_64WA_DP_3SRC(inst, bits) ||
TryExtractMADD_32A_DP_3SRC(inst, bits) ||
TryExtractMADD_64A_DP_3SRC(inst, bits) ||
TryExtractMSUB_32A_DP_3SRC(inst, bits) ||
TryExtractUMSUBL_64WA_DP_3SRC(inst, bits) ||
TryExtractSMSUBL_64WA_DP_3SRC(inst, bits) ||
TryExtractMSUB_64A_DP_3SRC(inst, bits) ||
TryExtractSMADDL_64WA_DP_3SRC(inst, bits) ||
TryExtractLDRSB_32_LDST_POS(inst, bits) ||
TryExtractLDRSH_32_LDST_POS(inst, bits) ||
TryExtractLDRH_32_LDST_POS(inst, bits) ||
TryExtractLDRSB_64_LDST_POS(inst, bits) ||
TryExtractLDRSW_64_LDST_POS(inst, bits) ||
TryExtractLDR_64_LDST_POS(inst, bits) ||
TryExtractPRFM_P_LDST_POS(inst, bits) ||
TryExtractSTR_32_LDST_POS(inst, bits) ||
TryExtractSTR_64_LDST_POS(inst, bits) ||
TryExtractSTRB_32_LDST_POS(inst, bits) ||
TryExtractSTRH_32_LDST_POS(inst, bits) ||
TryExtractLDRSH_64_LDST_POS(inst, bits) ||
TryExtractLDR_32_LDST_POS(inst, bits) ||
TryExtractLDRB_32_LDST_POS(inst, bits) ||
TryExtractLDR_32_LOADLIT(inst, bits) ||
TryExtractPRFM_P_LOADLIT(inst, bits) ||
TryExtractLDR_64_LOADLIT(inst, bits) ||
TryExtractLDRSW_64_LOADLIT(inst, bits);
}
// 00011100000000000000000000000000
static bool TryExtract7(InstData &inst, uint32_t bits) {
return false || TryExtractFRINTM_S_FLOATDP1(inst, bits) ||
TryExtractFCMP_DZ_FLOATCMP(inst, bits) ||
TryExtractFCVTAS_64D_FLOAT2INT(inst, bits) ||
TryExtractFCMP_SZ_FLOATCMP(inst, bits) ||
TryExtractFRECPX_ASISDMISCFP16_R(inst, bits) ||
TryExtractFCVTPU_ASISDMISCFP16_R(inst, bits) ||
TryExtractFABS_S_FLOATDP1(inst, bits) ||
TryExtractFCVTPS_32S_FLOAT2INT(inst, bits) ||
TryExtractFCVTPS_64S_FLOAT2INT(inst, bits) ||
TryExtractFCVTPS_32D_FLOAT2INT(inst, bits) ||
TryExtractFCVTPS_64D_FLOAT2INT(inst, bits) ||
TryExtractFCVTMU_32D_FLOAT2INT(inst, bits) ||
TryExtractFCVTMU_64D_FLOAT2INT(inst, bits) ||
TryExtractFSQRT_D_FLOATDP1(inst, bits) ||
TryExtractFCMGE_ASISDMISCFP16_FZ(inst, bits) ||
TryExtractFRINTN_S_FLOATDP1(inst, bits) ||
TryExtractFCMP_D_FLOATCMP(inst, bits) ||
TryExtractFSQRT_S_FLOATDP1(inst, bits) ||
TryExtractSHA1H_SS_CRYPTOSHA2(inst, bits) ||
TryExtractFCVTNS_32S_FLOAT2INT(inst, bits) ||
TryExtractFMOV_64D_FLOAT2INT(inst, bits) ||
TryExtractFRINTM_D_FLOATDP1(inst, bits) ||
TryExtractFRINTM_H_FLOATDP1(inst, bits) ||
TryExtractFCVTZU_64H_FLOAT2INT(inst, bits) ||
TryExtractFCVTZS_32H_FLOAT2INT(inst, bits) ||
TryExtractFNEG_S_FLOATDP1(inst, bits) ||
TryExtractFRINTN_H_FLOATDP1(inst, bits) ||
TryExtractFRINTX_D_FLOATDP1(inst, bits) ||
TryExtractFCMLE_ASISDMISCFP16_FZ(inst, bits) ||
TryExtractFMINP_ASISDPAIR_ONLY_H(inst, bits) ||
TryExtractFCVT_SD_FLOATDP1(inst, bits) ||
TryExtractFCVTNS_64S_FLOAT2INT(inst, bits) ||
TryExtractFNEG_H_FLOATDP1(inst, bits) ||
TryExtractFRINTP_S_FLOATDP1(inst, bits) ||
TryExtractFRINTP_D_FLOATDP1(inst, bits) ||
TryExtractFCVTPS_32H_FLOAT2INT(inst, bits) ||
TryExtractFRINTP_H_FLOATDP1(inst, bits) ||
TryExtractFCVTMS_64H_FLOAT2INT(inst, bits) ||
TryExtractFCVTMS_32D_FLOAT2INT(inst, bits) ||
TryExtractFCVTMS_32H_FLOAT2INT(inst, bits) ||
TryExtractFCVTMS_32S_FLOAT2INT(inst, bits) ||
TryExtractFCVTPS_64H_FLOAT2INT(inst, bits) ||
TryExtractSHA1SU1_VV_CRYPTOSHA2(inst, bits) ||
TryExtractFCVTNS_32H_FLOAT2INT(inst, bits) ||
TryExtractFCVTZU_ASISDMISCFP16_R(inst, bits) ||
TryExtractFCVTMU_32H_FLOAT2INT(inst, bits) ||
TryExtractSCVTF_D64_FLOAT2INT(inst, bits) ||
TryExtractFCVTMU_64H_FLOAT2INT(inst, bits) ||
TryExtractUCVTF_ASISDMISCFP16_R(inst, bits) ||
TryExtractFCVTMU_32S_FLOAT2INT(inst, bits) ||
TryExtractFCVTMU_64S_FLOAT2INT(inst, bits) ||
TryExtractFCVTMS_64D_FLOAT2INT(inst, bits) ||
TryExtractSCVTF_S64_FLOAT2INT(inst, bits) ||
TryExtractSCVTF_H64_FLOAT2INT(inst, bits) ||
TryExtractFRSQRTE_ASISDMISCFP16_R(inst, bits) ||
TryExtractSCVTF_D32_FLOAT2INT(inst, bits) ||
TryExtractFRINTX_S_FLOATDP1(inst, bits) ||
TryExtractFCVTAS_64H_FLOAT2INT(inst, bits) ||
TryExtractFNEG_D_FLOATDP1(inst, bits) ||
TryExtractSCVTF_S32_FLOAT2INT(inst, bits) ||
TryExtractFRINTX_H_FLOATDP1(inst, bits) ||
TryExtractFCVTZU_64D_FLOAT2INT(inst, bits) ||
TryExtractFCVTZU_32D_FLOAT2INT(inst, bits) ||
TryExtractSCVTF_H32_FLOAT2INT(inst, bits) ||
TryExtractFMAXP_ASISDPAIR_ONLY_H(inst, bits) ||
TryExtractFCVTNS_64H_FLOAT2INT(inst, bits) ||
TryExtractFCVTNU_32S_FLOAT2INT(inst, bits) ||
TryExtractUCVTF_H64_FLOAT2INT(inst, bits) ||
TryExtractFCVTNU_64H_FLOAT2INT(inst, bits) ||
TryExtractFCVTZS_ASISDMISCFP16_R(inst, bits) ||
TryExtractFCVTAS_64S_FLOAT2INT(inst, bits) ||
TryExtractFCMP_H_FLOATCMP(inst, bits) ||
TryExtractUCVTF_S64_FLOAT2INT(inst, bits) ||
TryExtractUCVTF_S32_FLOAT2INT(inst, bits) ||
TryExtractUCVTF_D32_FLOAT2INT(inst, bits) ||
TryExtractUCVTF_D64_FLOAT2INT(inst, bits) ||
TryExtractFCMLT_ASISDMISCFP16_FZ(inst, bits) ||
TryExtractFCVTNU_32H_FLOAT2INT(inst, bits) ||
TryExtractFCMP_S_FLOATCMP(inst, bits) ||
TryExtractFCMP_HZ_FLOATCMP(inst, bits) ||
TryExtractSCVTF_ASISDMISCFP16_R(inst, bits) ||
TryExtractSHA256SU0_VV_CRYPTOSHA2(inst, bits) ||
TryExtractFCVT_HD_FLOATDP1(inst, bits) ||
TryExtractFRINTI_D_FLOATDP1(inst, bits) ||
TryExtractFSQRT_H_FLOATDP1(inst, bits) ||
TryExtractFCVTZU_32H_FLOAT2INT(inst, bits) ||
TryExtractFMOV_H_FLOATDP1(inst, bits) ||
TryExtractFCVTAS_32H_FLOAT2INT(inst, bits) ||
TryExtractFCVTAS_32D_FLOAT2INT(inst, bits) ||
TryExtractFMAXNMP_ASISDPAIR_ONLY_H(inst, bits) ||
TryExtractFCVTMS_ASISDMISCFP16_R(inst, bits) ||
TryExtractFMOV_V64I_FLOAT2INT(inst, bits) ||
TryExtractFCVTPS_ASISDMISCFP16_R(inst, bits) ||
TryExtractFCVT_SH_FLOATDP1(inst, bits) ||
TryExtractFCVT_DS_FLOATDP1(inst, bits) ||
TryExtractFCVT_HS_FLOATDP1(inst, bits) ||
TryExtractFRINTI_H_FLOATDP1(inst, bits) ||
TryExtractFCVT_DH_FLOATDP1(inst, bits) ||
TryExtractFCVTZS_64H_FLOAT2INT(inst, bits) ||
TryExtractUCVTF_H32_FLOAT2INT(inst, bits) ||
TryExtractFCVTAS_32S_FLOAT2INT(inst, bits) ||
TryExtractFCMPE_HZ_FLOATCMP(inst, bits) ||
TryExtractFCVTZU_64S_FLOAT2INT(inst, bits) ||
TryExtractFRINTA_D_FLOATDP1(inst, bits) ||
TryExtractFRINTA_S_FLOATDP1(inst, bits) ||
TryExtractFRINTA_H_FLOATDP1(inst, bits) ||
TryExtractFMOV_D_FLOATDP1(inst, bits) ||
TryExtractFCVTAS_ASISDMISCFP16_R(inst, bits) ||
TryExtractFCVTNS_32D_FLOAT2INT(inst, bits) ||
TryExtractFRINTZ_H_FLOATDP1(inst, bits) ||
TryExtractFRINTZ_D_FLOATDP1(inst, bits) ||
TryExtractFMOV_S_FLOATDP1(inst, bits) ||
TryExtractFRINTZ_S_FLOATDP1(inst, bits) ||
TryExtractFCVTZS_32D_FLOAT2INT(inst, bits) ||
TryExtractFCVTZS_64S_FLOAT2INT(inst, bits) ||
TryExtractFCVTZS_32S_FLOAT2INT(inst, bits) ||
TryExtractFADDP_ASISDPAIR_ONLY_H(inst, bits) ||
TryExtractFRINTN_D_FLOATDP1(inst, bits) ||
TryExtractFCMPE_D_FLOATCMP(inst, bits) ||
TryExtractFCMPE_H_FLOATCMP(inst, bits) ||
TryExtractFCMPE_DZ_FLOATCMP(inst, bits) ||
TryExtractFCVTNS_ASISDMISCFP16_R(inst, bits) ||
TryExtractFRECPE_ASISDMISCFP16_R(inst, bits) ||
TryExtractFABS_H_FLOATDP1(inst, bits) ||
TryExtractFCMPE_S_FLOATCMP(inst, bits) ||
TryExtractFCVTAU_32D_FLOAT2INT(inst, bits) ||
TryExtractFCMPE_SZ_FLOATCMP(inst, bits) ||
TryExtractFCVTAU_ASISDMISCFP16_R(inst, bits) ||
TryExtractFCVTNU_ASISDMISCFP16_R(inst, bits) ||
TryExtractFMINNMP_ASISDPAIR_ONLY_H(inst, bits) ||
TryExtractFCVTNU_64D_FLOAT2INT(inst, bits) ||
TryExtractFABS_D_FLOATDP1(inst, bits) ||
TryExtractFCVTMS_64S_FLOAT2INT(inst, bits) ||
TryExtractFRINTI_S_FLOATDP1(inst, bits) ||
TryExtractFCVTNU_64S_FLOAT2INT(inst, bits) ||
TryExtractFMOV_32H_FLOAT2INT(inst, bits) ||
TryExtractFCMEQ_ASISDMISCFP16_FZ(inst, bits) ||
TryExtractFCVTAU_32H_FLOAT2INT(inst, bits) ||
TryExtractFCVTAU_64H_FLOAT2INT(inst, bits) ||
TryExtractFCVTAU_64S_FLOAT2INT(inst, bits) ||
TryExtractFCVTZU_32S_FLOAT2INT(inst, bits) ||
TryExtractFCVTPU_64H_FLOAT2INT(inst, bits) ||
TryExtractFCVTZS_64D_FLOAT2INT(inst, bits) ||
TryExtractFMOV_64H_FLOAT2INT(inst, bits) ||
TryExtractFMOV_H32_FLOAT2INT(inst, bits) ||
TryExtractFMOV_S32_FLOAT2INT(inst, bits) ||
TryExtractFCVTMU_ASISDMISCFP16_R(inst, bits) ||
TryExtractFCVTNU_32D_FLOAT2INT(inst, bits) ||
TryExtractFMOV_32S_FLOAT2INT(inst, bits) ||
TryExtractFMOV_H64_FLOAT2INT(inst, bits) ||
TryExtractFCVTNS_64D_FLOAT2INT(inst, bits) ||
TryExtractFMOV_D64_FLOAT2INT(inst, bits) ||
TryExtractFCMGT_ASISDMISCFP16_FZ(inst, bits) ||
TryExtractFMOV_64VX_FLOAT2INT(inst, bits) ||
TryExtractFCVTPU_32S_FLOAT2INT(inst, bits) ||
TryExtractFCVTPU_32H_FLOAT2INT(inst, bits) ||
TryExtractFCVTPU_64S_FLOAT2INT(inst, bits) ||
TryExtractFCVTPU_32D_FLOAT2INT(inst, bits) ||
TryExtractFCVTPU_64D_FLOAT2INT(inst, bits) ||
TryExtractFCVTAU_32S_FLOAT2INT(inst, bits) ||
TryExtractFCVTAU_64D_FLOAT2INT(inst, bits) ||
TryExtractFCVTPU_ASISDMISC_R(inst, bits) ||
TryExtractFRECPX_ASISDMISC_R(inst, bits) ||
TryExtractFRSQRTE_ASISDMISC_R(inst, bits) ||
TryExtractFCMGE_ASISDMISC_FZ(inst, bits) ||
TryExtractFCMLE_ASISDMISC_FZ(inst, bits) ||
TryExtractFCVTZU_ASISDMISC_R(inst, bits) ||
TryExtractUCVTF_ASISDMISC_R(inst, bits) ||
TryExtractFCVTZS_ASISDMISC_R(inst, bits) ||
TryExtractSCVTF_ASISDMISC_R(inst, bits) ||
TryExtractFCVTMS_ASISDMISC_R(inst, bits) ||
TryExtractFCMLT_ASISDMISC_FZ(inst, bits) ||
TryExtractFADDP_ASISDPAIR_ONLY_SD(inst, bits) ||
TryExtractFMAXNMP_ASISDPAIR_ONLY_SD(inst, bits) ||
TryExtractFCMGT_ASISDMISC_FZ(inst, bits) ||
TryExtractFMINP_ASISDPAIR_ONLY_SD(inst, bits) ||
TryExtractFCVTAS_ASISDMISC_R(inst, bits) ||
TryExtractFCVTPS_ASISDMISC_R(inst, bits) ||
TryExtractFCVTNS_ASISDMISC_R(inst, bits) ||
TryExtractFCVTXN_ASISDMISC_N(inst, bits) ||
TryExtractFCMEQ_ASISDMISC_FZ(inst, bits) ||
TryExtractFRECPE_ASISDMISC_R(inst, bits) ||
TryExtractFMINNMP_ASISDPAIR_ONLY_SD(inst, bits) ||
TryExtractFCVTAU_ASISDMISC_R(inst, bits) ||
TryExtractFCVTNU_ASISDMISC_R(inst, bits) ||
TryExtractFMAXP_ASISDPAIR_ONLY_SD(inst, bits) ||
TryExtractFCVTMU_ASISDMISC_R(inst, bits) ||
TryExtractCMLT_ASISDMISC_Z(inst, bits) ||
TryExtractSQXTUN_ASISDMISC_N(inst, bits) ||
TryExtractSQNEG_ASISDMISC_R(inst, bits) ||
TryExtractCMLE_ASISDMISC_Z(inst, bits) ||
TryExtractSUQADD_ASISDMISC_R(inst, bits) ||
TryExtractCMGT_ASISDMISC_Z(inst, bits) ||
TryExtractSQABS_ASISDMISC_R(inst, bits) ||
TryExtractUSQADD_ASISDMISC_R(inst, bits) ||
TryExtractUQXTN_ASISDMISC_N(inst, bits) ||
TryExtractNEG_ASISDMISC_R(inst, bits) ||
TryExtractABS_ASISDMISC_R(inst, bits) ||
TryExtractSQXTN_ASISDMISC_N(inst, bits) ||
TryExtractADDP_ASISDPAIR_ONLY(inst, bits) ||
TryExtractCMEQ_ASISDMISC_Z(inst, bits) ||
TryExtractCMGE_ASISDMISC_Z(inst, bits) ||
TryExtractFMOV_H_FLOATIMM(inst, bits) ||
TryExtractFMOV_S_FLOATIMM(inst, bits) ||
TryExtractFMOV_D_FLOATIMM(inst, bits) ||
TryExtractFSUB_S_FLOATDP2(inst, bits) ||
TryExtractFSUB_H_FLOATDP2(inst, bits) ||
TryExtractFABD_ASISDSAMEFP16_ONLY(inst, bits) ||
TryExtractFMUL_D_FLOATDP2(inst, bits) ||
TryExtractFMINNM_H_FLOATDP2(inst, bits) ||
TryExtractFCMEQ_ASISDSAMEFP16_ONLY(inst, bits) ||
TryExtractFMINNM_D_FLOATDP2(inst, bits) ||
TryExtractSHA256SU1_VVV_CRYPTOSHA3(inst, bits) ||
TryExtractFSUB_D_FLOATDP2(inst, bits) ||
TryExtractFNMUL_S_FLOATDP2(inst, bits) ||
TryExtractFDIV_H_FLOATDP2(inst, bits) ||
TryExtractFRECPS_ASISDSAMEFP16_ONLY(inst, bits) ||
TryExtractFCMGE_ASISDSAMEFP16_ONLY(inst, bits) ||
TryExtractFNMUL_H_FLOATDP2(inst, bits) ||
TryExtractFMAXNM_S_FLOATDP2(inst, bits) ||
TryExtractFMAXNM_H_FLOATDP2(inst, bits) ||
TryExtractSHA256H_QQV_CRYPTOSHA3(inst, bits) ||
TryExtractFMUL_S_FLOATDP2(inst, bits) ||
TryExtractFMULX_ASISDSAMEFP16_ONLY(inst, bits) ||
TryExtractFMUL_H_FLOATDP2(inst, bits) ||
TryExtractFMAX_D_FLOATDP2(inst, bits) ||
TryExtractFDIV_S_FLOATDP2(inst, bits) ||
TryExtractSHA1SU0_VVV_CRYPTOSHA3(inst, bits) ||
TryExtractFDIV_D_FLOATDP2(inst, bits) ||
TryExtractSHA1M_QSV_CRYPTOSHA3(inst, bits) ||
TryExtractFMIN_D_FLOATDP2(inst, bits) ||
TryExtractFADD_S_FLOATDP2(inst, bits) ||
TryExtractFMIN_S_FLOATDP2(inst, bits) ||
TryExtractSHA1P_QSV_CRYPTOSHA3(inst, bits) ||
TryExtractFADD_D_FLOATDP2(inst, bits) ||
TryExtractFMINNM_S_FLOATDP2(inst, bits) ||
TryExtractDUP_ASISDONE_ONLY(inst, bits) ||
TryExtractFMIN_H_FLOATDP2(inst, bits) ||
TryExtractSHA1C_QSV_CRYPTOSHA3(inst, bits) ||
TryExtractFNMUL_D_FLOATDP2(inst, bits) ||
TryExtractFRSQRTS_ASISDSAMEFP16_ONLY(inst, bits) ||
TryExtractFMAXNM_D_FLOATDP2(inst, bits) ||
TryExtractFMAX_S_FLOATDP2(inst, bits) ||
TryExtractFCMGT_ASISDSAMEFP16_ONLY(inst, bits) ||
TryExtractFADD_H_FLOATDP2(inst, bits) ||
TryExtractFACGT_ASISDSAMEFP16_ONLY(inst, bits) ||
TryExtractFMAX_H_FLOATDP2(inst, bits) ||
TryExtractFACGE_ASISDSAMEFP16_ONLY(inst, bits) ||
TryExtractSHA256H2_QQV_CRYPTOSHA3(inst, bits) ||
TryExtractUCVTF_D64_FLOAT2FIX(inst, bits) ||
TryExtractFRECPS_ASISDSAME_ONLY(inst, bits) ||
TryExtractUCVTF_S32_FLOAT2FIX(inst, bits) ||
TryExtractUCVTF_D32_FLOAT2FIX(inst, bits) ||
TryExtractFCVTZS_32S_FLOAT2FIX(inst, bits) ||
TryExtractFABD_ASISDSAME_ONLY(inst, bits) ||
TryExtractFCMEQ_ASISDSAME_ONLY(inst, bits) ||
TryExtractLDR_BL_LDST_REGOFF(inst, bits) ||
TryExtractUCVTF_S64_FLOAT2FIX(inst, bits) ||
TryExtractFCVTZU_32D_FLOAT2FIX(inst, bits) ||
TryExtractFCMGE_ASISDSAME_ONLY(inst, bits) ||
TryExtractSTR_BL_LDST_REGOFF(inst, bits) ||
TryExtractFRSQRTS_ASISDSAME_ONLY(inst, bits) ||
TryExtractFMULX_ASISDSAME_ONLY(inst, bits) ||
TryExtractSCVTF_H32_FLOAT2FIX(inst, bits) ||
TryExtractSCVTF_S32_FLOAT2FIX(inst, bits) ||
TryExtractSCVTF_D32_FLOAT2FIX(inst, bits) ||
TryExtractSCVTF_H64_FLOAT2FIX(inst, bits) ||
TryExtractSCVTF_S64_FLOAT2FIX(inst, bits) ||
TryExtractSCVTF_D64_FLOAT2FIX(inst, bits) ||
TryExtractFCVTZS_64D_FLOAT2FIX(inst, bits) ||
TryExtractFCVTZS_32D_FLOAT2FIX(inst, bits) ||
TryExtractFCVTZS_64S_FLOAT2FIX(inst, bits) ||
TryExtractFCVTZS_64H_FLOAT2FIX(inst, bits) ||
TryExtractFCVTZS_32H_FLOAT2FIX(inst, bits) ||
TryExtractUCVTF_H32_FLOAT2FIX(inst, bits) ||
TryExtractFCVTZU_32H_FLOAT2FIX(inst, bits) ||
TryExtractFCVTZU_64H_FLOAT2FIX(inst, bits) ||
TryExtractFCVTZU_32S_FLOAT2FIX(inst, bits) ||
TryExtractFCVTZU_64S_FLOAT2FIX(inst, bits) ||
TryExtractFCVTZU_64D_FLOAT2FIX(inst, bits) ||
TryExtractFACGE_ASISDSAME_ONLY(inst, bits) ||
TryExtractFACGT_ASISDSAME_ONLY(inst, bits) ||
TryExtractFCMGT_ASISDSAME_ONLY(inst, bits) ||
TryExtractUCVTF_H64_FLOAT2FIX(inst, bits) ||
TryExtractSQSUB_ASISDSAME_ONLY(inst, bits) ||
TryExtractUQSHL_ASISDSHF_R(inst, bits) ||
TryExtractSQRSHRUN_ASISDSHF_N(inst, bits) ||
TryExtractADD_ASISDSAME_ONLY(inst, bits) ||
TryExtractUQSHL_ASISDSAME_ONLY(inst, bits) ||
TryExtractURSHL_ASISDSAME_ONLY(inst, bits) ||
TryExtractSQDMULH_ASISDSAME_ONLY(inst, bits) ||
TryExtractSQSHRN_ASISDSHF_N(inst, bits) ||
TryExtractSQSHLU_ASISDSHF_R(inst, bits) ||
TryExtractSRSRA_ASISDSHF_R(inst, bits) ||
TryExtractCMEQ_ASISDSAME_ONLY(inst, bits) ||
TryExtractUSRA_ASISDSHF_R(inst, bits) ||
TryExtractUSHL_ASISDSAME_ONLY(inst, bits) ||
TryExtractSQSHL_ASISDSAME_ONLY(inst, bits) ||
TryExtractFCVTZU_ASISDSHF_C(inst, bits) ||
TryExtractSQSHL_ASISDSHF_R(inst, bits) ||
TryExtractSQSHRUN_ASISDSHF_N(inst, bits) ||
TryExtractSQDMULL_ASISDDIFF_ONLY(inst, bits) ||
TryExtractUQSUB_ASISDSAME_ONLY(inst, bits) ||
TryExtractCMGT_ASISDSAME_ONLY(inst, bits) ||
TryExtractSQRSHRN_ASISDSHF_N(inst, bits) ||
TryExtractUQADD_ASISDSAME_ONLY(inst, bits) ||
TryExtractSSHR_ASISDSHF_R(inst, bits) ||
TryExtractSQRDMLSH_ASISDSAME2_ONLY(inst, bits) ||
TryExtractSRI_ASISDSHF_R(inst, bits) ||
TryExtractUQRSHRN_ASISDSHF_N(inst, bits) ||
TryExtractCMHI_ASISDSAME_ONLY(inst, bits) ||
TryExtractFMUL_ASISDELEM_RH_H(inst, bits) ||
TryExtractSSRA_ASISDSHF_R(inst, bits) ||
TryExtractSCVTF_ASISDSHF_C(inst, bits) ||
TryExtractSSHL_ASISDSAME_ONLY(inst, bits) ||
TryExtractUSHR_ASISDSHF_R(inst, bits) ||
TryExtractSQDMLAL_ASISDDIFF_ONLY(inst, bits) ||
TryExtractFMLA_ASISDELEM_RH_H(inst, bits) ||
TryExtractUCVTF_ASISDSHF_C(inst, bits) ||
TryExtractSQADD_ASISDSAME_ONLY(inst, bits) ||
TryExtractFMULX_ASISDELEM_RH_H(inst, bits) ||
TryExtractUQSHRN_ASISDSHF_N(inst, bits) ||
TryExtractSQRDMULH_ASISDSAME_ONLY(inst, bits) ||
TryExtractCMGE_ASISDSAME_ONLY(inst, bits) ||
TryExtractURSHR_ASISDSHF_R(inst, bits) ||
TryExtractFMLS_ASISDELEM_RH_H(inst, bits) ||
TryExtractSRSHL_ASISDSAME_ONLY(inst, bits) ||
TryExtractSQRDMLAH_ASISDSAME2_ONLY(inst, bits) ||
TryExtractFCVTZS_ASISDSHF_C(inst, bits) ||
TryExtractCMHS_ASISDSAME_ONLY(inst, bits) ||
TryExtractUQRSHL_ASISDSAME_ONLY(inst, bits) ||
TryExtractSRSHR_ASISDSHF_R(inst, bits) ||
TryExtractCMTST_ASISDSAME_ONLY(inst, bits) ||
TryExtractSQDMLSL_ASISDDIFF_ONLY(inst, bits) ||
TryExtractSLI_ASISDSHF_R(inst, bits) ||
TryExtractSUB_ASISDSAME_ONLY(inst, bits) ||
TryExtractSHL_ASISDSHF_R(inst, bits) ||
TryExtractSQRSHL_ASISDSAME_ONLY(inst, bits) ||
TryExtractURSRA_ASISDSHF_R(inst, bits) ||
TryExtractFCCMP_H_FLOATCCMP(inst, bits) ||
TryExtractFCCMPE_S_FLOATCCMP(inst, bits) ||
TryExtractFMUL_ASISDELEM_R_SD(inst, bits) ||
TryExtractFCCMP_D_FLOATCCMP(inst, bits) ||
TryExtractFCCMPE_H_FLOATCCMP(inst, bits) ||
TryExtractFCCMPE_D_FLOATCCMP(inst, bits) ||
TryExtractFMLA_ASISDELEM_R_SD(inst, bits) ||
TryExtractFMULX_ASISDELEM_R_SD(inst, bits) ||
TryExtractFMLS_ASISDELEM_R_SD(inst, bits) ||
TryExtractFCCMP_S_FLOATCCMP(inst, bits) ||
TryExtractFCSEL_D_FLOATSEL(inst, bits) ||
TryExtractSTR_S_LDST_REGOFF(inst, bits) ||
TryExtractLDR_S_LDST_REGOFF(inst, bits) ||
TryExtractLDR_H_LDST_REGOFF(inst, bits) ||
TryExtractLDR_B_LDST_REGOFF(inst, bits) ||
TryExtractSTR_B_LDST_IMMPOST(inst, bits) ||
TryExtractSTR_H_LDST_IMMPOST(inst, bits) ||
TryExtractSTR_S_LDST_IMMPOST(inst, bits) ||
TryExtractSTR_D_LDST_IMMPOST(inst, bits) ||
TryExtractSTR_Q_LDST_IMMPOST(inst, bits) ||
TryExtractSTR_B_LDST_IMMPRE(inst, bits) ||
TryExtractSTR_H_LDST_IMMPRE(inst, bits) ||
TryExtractSTR_S_LDST_IMMPRE(inst, bits) ||
TryExtractSTR_D_LDST_IMMPRE(inst, bits) ||
TryExtractSTR_Q_LDST_IMMPRE(inst, bits) ||
TryExtractSTR_D_LDST_REGOFF(inst, bits) ||
TryExtractSQDMULL_ASISDELEM_L(inst, bits) ||
TryExtractLDR_Q_LDST_REGOFF(inst, bits) ||
TryExtractLDR_D_LDST_REGOFF(inst, bits) ||
TryExtractSTR_B_LDST_REGOFF(inst, bits) ||
TryExtractSTR_Q_LDST_REGOFF(inst, bits) ||
TryExtractSQRDMULH_ASISDELEM_R(inst, bits) ||
TryExtractSTUR_D_LDST_UNSCALED(inst, bits) ||
TryExtractSTUR_Q_LDST_UNSCALED(inst, bits) ||
TryExtractSQRDMLSH_ASISDELEM_R(inst, bits) ||
TryExtractSTUR_H_LDST_UNSCALED(inst, bits) ||
TryExtractSTR_H_LDST_REGOFF(inst, bits) ||
TryExtractSTUR_S_LDST_UNSCALED(inst, bits) ||
TryExtractSQRDMLAH_ASISDELEM_R(inst, bits) ||
TryExtractLDR_B_LDST_IMMPOST(inst, bits) ||
TryExtractLDUR_D_LDST_UNSCALED(inst, bits) ||
TryExtractLDUR_B_LDST_UNSCALED(inst, bits) ||
TryExtractLDUR_S_LDST_UNSCALED(inst, bits) ||
TryExtractLDUR_Q_LDST_UNSCALED(inst, bits) ||
TryExtractFCSEL_S_FLOATSEL(inst, bits) ||
TryExtractFCSEL_H_FLOATSEL(inst, bits) ||
TryExtractSQDMLSL_ASISDELEM_L(inst, bits) ||
TryExtractLDR_H_LDST_IMMPOST(inst, bits) ||
TryExtractLDR_D_LDST_IMMPOST(inst, bits) ||
TryExtractLDR_Q_LDST_IMMPOST(inst, bits) ||
TryExtractLDR_S_LDST_IMMPOST(inst, bits) ||
TryExtractLDR_Q_LDST_IMMPRE(inst, bits) ||
TryExtractLDR_H_LDST_IMMPRE(inst, bits) ||
TryExtractLDR_D_LDST_IMMPRE(inst, bits) ||
TryExtractLDR_S_LDST_IMMPRE(inst, bits) ||
TryExtractLDR_B_LDST_IMMPRE(inst, bits) ||
TryExtractLDUR_H_LDST_UNSCALED(inst, bits) ||
TryExtractSQDMLAL_ASISDELEM_L(inst, bits) ||
TryExtractSQDMULH_ASISDELEM_R(inst, bits) ||
TryExtractSTUR_B_LDST_UNSCALED(inst, bits) ||
TryExtractFNMSUB_D_FLOATDP3(inst, bits) ||
TryExtractFNMSUB_H_FLOATDP3(inst, bits) ||
TryExtractFNMSUB_S_FLOATDP3(inst, bits) ||
TryExtractFNMADD_S_FLOATDP3(inst, bits) ||
TryExtractFNMADD_D_FLOATDP3(inst, bits) ||
TryExtractFNMADD_H_FLOATDP3(inst, bits) ||
TryExtractFMSUB_S_FLOATDP3(inst, bits) ||
TryExtractFMSUB_H_FLOATDP3(inst, bits) ||
TryExtractFMSUB_D_FLOATDP3(inst, bits) ||
TryExtractFMADD_H_FLOATDP3(inst, bits) ||
TryExtractFMADD_S_FLOATDP3(inst, bits) ||
TryExtractFMADD_D_FLOATDP3(inst, bits) ||
TryExtractSTR_S_LDST_POS(inst, bits) ||
TryExtractSTR_Q_LDST_POS(inst, bits) ||
TryExtractSTR_B_LDST_POS(inst, bits) ||
TryExtractSTR_H_LDST_POS(inst, bits) ||
TryExtractSTR_D_LDST_POS(inst, bits) ||
TryExtractLDR_B_LDST_POS(inst, bits) ||
TryExtractLDR_Q_LDST_POS(inst, bits) ||
TryExtractLDR_H_LDST_POS(inst, bits) ||
TryExtractLDR_S_LDST_POS(inst, bits) ||
TryExtractLDR_D_LDST_POS(inst, bits) ||
TryExtractLDR_S_LOADLIT(inst, bits) ||
TryExtractLDR_Q_LOADLIT(inst, bits) ||
TryExtractLDR_D_LOADLIT(inst, bits);
}
static bool (*const kFirstLevel[])(InstData &, uint32_t) = {
TryExtract0, // ---000--------------------------
TryExtract1, // ---100--------------------------
TryExtract2, // ---010--------------------------
TryExtract3, // ---110--------------------------
TryExtract4, // ---001--------------------------
TryExtract5, // ---101--------------------------
TryExtract6, // ---011--------------------------
TryExtract7, // ---111--------------------------
};
} // namespace
const char *InstNameToString(InstName iclass) {
auto num = static_cast<uint16_t>(iclass);
if (iclass == InstName::INVALID) {
return nullptr;
} else if (static_cast<uint16_t>(InstName::ZIP2) < num) {
return nullptr;
} else {
return kIClassName[num];
}
}
const char *InstFormToString(InstForm iform) {
auto num = static_cast<uint16_t>(iform);
if (iform == InstForm::INVALID) {
return nullptr;
} else if (static_cast<uint16_t>(InstForm::ZIP2_ASIMDPERM_ONLY) < num) {
return nullptr;
} else {
return kIFormName[num];
}
}
bool TryExtract(const uint8_t *bytes, InstData &inst) {
uint32_t bits = 0;
bits = (bits << 8) | static_cast<uint32_t>(bytes[3]);
bits = (bits << 8) | static_cast<uint32_t>(bytes[2]);
bits = (bits << 8) | static_cast<uint32_t>(bytes[1]);
bits = (bits << 8) | static_cast<uint32_t>(bytes[0]);
uint32_t index = 0;
index |= ((bits >> 28U) & 1U) << 2U;
index |= ((bits >> 27U) & 1U) << 1U;
index |= ((bits >> 26U) & 1U) << 0U;
return kFirstLevel[index](inst, bits);
}
} // namespace aarch64
} // namespace remill