| // Copyright 2013 the V8 project authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef V8_CODEGEN_ARM64_CONSTANTS_ARM64_H_ |
| #define V8_CODEGEN_ARM64_CONSTANTS_ARM64_H_ |
| |
| #include "src/base/macros.h" |
| #include "src/common/globals.h" |
| |
| // Assert that this is an LP64 system, or LLP64 on Windows. |
| STATIC_ASSERT(sizeof(int) == sizeof(int32_t)); |
| #if defined(V8_OS_WIN) |
| STATIC_ASSERT(sizeof(1L) == sizeof(int32_t)); |
| #else |
| STATIC_ASSERT(sizeof(long) == sizeof(int64_t)); // NOLINT(runtime/int) |
| STATIC_ASSERT(sizeof(1L) == sizeof(int64_t)); |
| #endif |
| STATIC_ASSERT(sizeof(void*) == sizeof(int64_t)); |
| STATIC_ASSERT(sizeof(1) == sizeof(int32_t)); |
| |
| // Get the standard printf format macros for C99 stdint types. |
| #ifndef __STDC_FORMAT_MACROS |
| #define __STDC_FORMAT_MACROS |
| #endif |
| #include <inttypes.h> |
| |
| namespace v8 { |
| namespace internal { |
| |
| constexpr size_t kMaxPCRelativeCodeRangeInMB = 128; |
| |
| constexpr uint8_t kInstrSize = 4; |
| constexpr uint8_t kInstrSizeLog2 = 2; |
| constexpr uint8_t kLoadLiteralScaleLog2 = 2; |
| constexpr uint8_t kLoadLiteralScale = 1 << kLoadLiteralScaleLog2; |
| constexpr int kMaxLoadLiteralRange = 1 * MB; |
| |
| const int kNumberOfRegisters = 32; |
| const int kNumberOfVRegisters = 32; |
| // Callee saved registers are x19-x28. |
| const int kNumberOfCalleeSavedRegisters = 10; |
| // Callee saved FP registers are d8-d15. |
| const int kNumberOfCalleeSavedVRegisters = 8; |
| const int kWRegSizeInBits = 32; |
| const int kWRegSizeInBitsLog2 = 5; |
| const int kWRegSize = kWRegSizeInBits >> 3; |
| const int kWRegSizeLog2 = kWRegSizeInBitsLog2 - 3; |
| const int kXRegSizeInBits = 64; |
| const int kXRegSizeInBitsLog2 = 6; |
| const int kXRegSize = kXRegSizeInBits >> 3; |
| const int kXRegSizeLog2 = kXRegSizeInBitsLog2 - 3; |
| const int kSRegSizeInBits = 32; |
| const int kSRegSizeInBitsLog2 = 5; |
| const int kSRegSize = kSRegSizeInBits >> 3; |
| const int kSRegSizeLog2 = kSRegSizeInBitsLog2 - 3; |
| const int kDRegSizeInBits = 64; |
| const int kDRegSizeInBitsLog2 = 6; |
| const int kDRegSize = kDRegSizeInBits >> 3; |
| const int kDRegSizeLog2 = kDRegSizeInBitsLog2 - 3; |
| const int kDRegSizeInBytesLog2 = kDRegSizeInBitsLog2 - 3; |
| const int kBRegSizeInBits = 8; |
| const int kBRegSize = kBRegSizeInBits >> 3; |
| const int kHRegSizeInBits = 16; |
| const int kHRegSize = kHRegSizeInBits >> 3; |
| const int kQRegSizeInBits = 128; |
| const int kQRegSizeInBitsLog2 = 7; |
| const int kQRegSize = kQRegSizeInBits >> 3; |
| const int kQRegSizeLog2 = kQRegSizeInBitsLog2 - 3; |
| const int kVRegSizeInBits = kQRegSizeInBits; |
| const int kVRegSize = kVRegSizeInBits >> 3; |
| const int64_t kWRegMask = 0x00000000ffffffffL; |
| const int64_t kXRegMask = 0xffffffffffffffffL; |
| const int64_t kSRegMask = 0x00000000ffffffffL; |
| const int64_t kDRegMask = 0xffffffffffffffffL; |
| // TODO(all) check if the expression below works on all compilers or if it |
| // triggers an overflow error. |
| const int64_t kDSignBit = 63; |
| const int64_t kDSignMask = 0x1LL << kDSignBit; |
| const int64_t kSSignBit = 31; |
| const int64_t kSSignMask = 0x1LL << kSSignBit; |
| const int64_t kXSignBit = 63; |
| const int64_t kXSignMask = 0x1LL << kXSignBit; |
| const int64_t kWSignBit = 31; |
| const int64_t kWSignMask = 0x1LL << kWSignBit; |
| const int64_t kDQuietNanBit = 51; |
| const int64_t kDQuietNanMask = 0x1LL << kDQuietNanBit; |
| const int64_t kSQuietNanBit = 22; |
| const int64_t kSQuietNanMask = 0x1LL << kSQuietNanBit; |
| const int64_t kByteMask = 0xffL; |
| const int64_t kHalfWordMask = 0xffffL; |
| const int64_t kWordMask = 0xffffffffL; |
| const uint64_t kXMaxUInt = 0xffffffffffffffffUL; |
| const uint64_t kWMaxUInt = 0xffffffffUL; |
| const int64_t kXMaxInt = 0x7fffffffffffffffL; |
| const int64_t kXMinInt = 0x8000000000000000L; |
| const int32_t kWMaxInt = 0x7fffffff; |
| const int32_t kWMinInt = 0x80000000; |
| const int kIp0Code = 16; |
| const int kIp1Code = 17; |
| const int kFramePointerRegCode = 29; |
| const int kLinkRegCode = 30; |
| const int kZeroRegCode = 31; |
| const int kSPRegInternalCode = 63; |
| const unsigned kRegCodeMask = 0x1f; |
| const unsigned kShiftAmountWRegMask = 0x1f; |
| const unsigned kShiftAmountXRegMask = 0x3f; |
| // Standard machine types defined by AAPCS64. |
| const unsigned kHalfWordSize = 16; |
| const unsigned kHalfWordSizeLog2 = 4; |
| const unsigned kHalfWordSizeInBytes = kHalfWordSize >> 3; |
| const unsigned kHalfWordSizeInBytesLog2 = kHalfWordSizeLog2 - 3; |
| const unsigned kWordSize = 32; |
| const unsigned kWordSizeLog2 = 5; |
| const unsigned kWordSizeInBytes = kWordSize >> 3; |
| const unsigned kWordSizeInBytesLog2 = kWordSizeLog2 - 3; |
| const unsigned kDoubleWordSize = 64; |
| const unsigned kDoubleWordSizeInBytes = kDoubleWordSize >> 3; |
| const unsigned kQuadWordSize = 128; |
| const unsigned kQuadWordSizeInBytes = kQuadWordSize >> 3; |
| const int kMaxLanesPerVector = 16; |
| |
| const unsigned kAddressTagOffset = 56; |
| const unsigned kAddressTagWidth = 8; |
| const uint64_t kAddressTagMask = ((UINT64_C(1) << kAddressTagWidth) - 1) |
| << kAddressTagOffset; |
| static_assert(kAddressTagMask == UINT64_C(0xff00000000000000), |
| "AddressTagMask must represent most-significant eight bits."); |
| |
| const uint64_t kTTBRMask = UINT64_C(1) << 55; |
| |
| // AArch64 floating-point specifics. These match IEEE-754. |
| const unsigned kDoubleMantissaBits = 52; |
| const unsigned kDoubleExponentBits = 11; |
| const unsigned kDoubleExponentBias = 1023; |
| const unsigned kFloatMantissaBits = 23; |
| const unsigned kFloatExponentBits = 8; |
| const unsigned kFloatExponentBias = 127; |
| const unsigned kFloat16MantissaBits = 10; |
| const unsigned kFloat16ExponentBits = 5; |
| const unsigned kFloat16ExponentBias = 15; |
| |
| // Actual value of root register is offset from the root array's start |
| // to take advantage of negative displacement values. |
| // TODO(sigurds): Choose best value. |
| // TODO(ishell): Choose best value for ptr-compr. |
| constexpr int kRootRegisterBias = kSystemPointerSize == kTaggedSize ? 256 : 0; |
| |
| using float16 = uint16_t; |
| |
| #define INSTRUCTION_FIELDS_LIST(V_) \ |
| /* Register fields */ \ |
| V_(Rd, 4, 0, Bits) /* Destination register. */ \ |
| V_(Rn, 9, 5, Bits) /* First source register. */ \ |
| V_(Rm, 20, 16, Bits) /* Second source register. */ \ |
| V_(Ra, 14, 10, Bits) /* Third source register. */ \ |
| V_(Rt, 4, 0, Bits) /* Load dest / store source. */ \ |
| V_(Rt2, 14, 10, Bits) /* Load second dest / */ \ |
| /* store second source. */ \ |
| V_(Rs, 20, 16, Bits) /* Store-exclusive status */ \ |
| V_(PrefetchMode, 4, 0, Bits) \ |
| \ |
| /* Common bits */ \ |
| V_(SixtyFourBits, 31, 31, Bits) \ |
| V_(FlagsUpdate, 29, 29, Bits) \ |
| \ |
| /* PC relative addressing */ \ |
| V_(ImmPCRelHi, 23, 5, SignedBits) \ |
| V_(ImmPCRelLo, 30, 29, Bits) \ |
| \ |
| /* Add/subtract/logical shift register */ \ |
| V_(ShiftDP, 23, 22, Bits) \ |
| V_(ImmDPShift, 15, 10, Bits) \ |
| \ |
| /* Add/subtract immediate */ \ |
| V_(ImmAddSub, 21, 10, Bits) \ |
| V_(ShiftAddSub, 23, 22, Bits) \ |
| \ |
| /* Add/subtract extend */ \ |
| V_(ImmExtendShift, 12, 10, Bits) \ |
| V_(ExtendMode, 15, 13, Bits) \ |
| \ |
| /* Move wide */ \ |
| V_(ImmMoveWide, 20, 5, Bits) \ |
| V_(ShiftMoveWide, 22, 21, Bits) \ |
| \ |
| /* Logical immediate, bitfield and extract */ \ |
| V_(BitN, 22, 22, Bits) \ |
| V_(ImmRotate, 21, 16, Bits) \ |
| V_(ImmSetBits, 15, 10, Bits) \ |
| V_(ImmR, 21, 16, Bits) \ |
| V_(ImmS, 15, 10, Bits) \ |
| \ |
| /* Test and branch immediate */ \ |
| V_(ImmTestBranch, 18, 5, SignedBits) \ |
| V_(ImmTestBranchBit40, 23, 19, Bits) \ |
| V_(ImmTestBranchBit5, 31, 31, Bits) \ |
| \ |
| /* Conditionals */ \ |
| V_(Condition, 15, 12, Bits) \ |
| V_(ConditionBranch, 3, 0, Bits) \ |
| V_(Nzcv, 3, 0, Bits) \ |
| V_(ImmCondCmp, 20, 16, Bits) \ |
| V_(ImmCondBranch, 23, 5, SignedBits) \ |
| \ |
| /* Floating point */ \ |
| V_(FPType, 23, 22, Bits) \ |
| V_(ImmFP, 20, 13, Bits) \ |
| V_(FPScale, 15, 10, Bits) \ |
| \ |
| /* Load Store */ \ |
| V_(ImmLS, 20, 12, SignedBits) \ |
| V_(ImmLSUnsigned, 21, 10, Bits) \ |
| V_(ImmLSPair, 21, 15, SignedBits) \ |
| V_(ImmShiftLS, 12, 12, Bits) \ |
| V_(LSOpc, 23, 22, Bits) \ |
| V_(LSVector, 26, 26, Bits) \ |
| V_(LSSize, 31, 30, Bits) \ |
| \ |
| /* NEON generic fields */ \ |
| V_(NEONQ, 30, 30, Bits) \ |
| V_(NEONSize, 23, 22, Bits) \ |
| V_(NEONLSSize, 11, 10, Bits) \ |
| V_(NEONS, 12, 12, Bits) \ |
| V_(NEONL, 21, 21, Bits) \ |
| V_(NEONM, 20, 20, Bits) \ |
| V_(NEONH, 11, 11, Bits) \ |
| V_(ImmNEONExt, 14, 11, Bits) \ |
| V_(ImmNEON5, 20, 16, Bits) \ |
| V_(ImmNEON4, 14, 11, Bits) \ |
| \ |
| /* Other immediates */ \ |
| V_(ImmUncondBranch, 25, 0, SignedBits) \ |
| V_(ImmCmpBranch, 23, 5, SignedBits) \ |
| V_(ImmLLiteral, 23, 5, SignedBits) \ |
| V_(ImmException, 20, 5, Bits) \ |
| V_(ImmHint, 11, 5, Bits) \ |
| V_(ImmBarrierDomain, 11, 10, Bits) \ |
| V_(ImmBarrierType, 9, 8, Bits) \ |
| \ |
| /* System (MRS, MSR) */ \ |
| V_(ImmSystemRegister, 19, 5, Bits) \ |
| V_(SysO0, 19, 19, Bits) \ |
| V_(SysOp1, 18, 16, Bits) \ |
| V_(SysOp2, 7, 5, Bits) \ |
| V_(CRn, 15, 12, Bits) \ |
| V_(CRm, 11, 8, Bits) \ |
| \ |
| /* Load-/store-exclusive */ \ |
| V_(LoadStoreXLoad, 22, 22, Bits) \ |
| V_(LoadStoreXNotExclusive, 23, 23, Bits) \ |
| V_(LoadStoreXAcquireRelease, 15, 15, Bits) \ |
| V_(LoadStoreXSizeLog2, 31, 30, Bits) \ |
| V_(LoadStoreXPair, 21, 21, Bits) \ |
| \ |
| /* NEON load/store */ \ |
| V_(NEONLoad, 22, 22, Bits) \ |
| \ |
| /* NEON Modified Immediate fields */ \ |
| V_(ImmNEONabc, 18, 16, Bits) \ |
| V_(ImmNEONdefgh, 9, 5, Bits) \ |
| V_(NEONModImmOp, 29, 29, Bits) \ |
| V_(NEONCmode, 15, 12, Bits) \ |
| \ |
| /* NEON Shift Immediate fields */ \ |
| V_(ImmNEONImmhImmb, 22, 16, Bits) \ |
| V_(ImmNEONImmh, 22, 19, Bits) \ |
| V_(ImmNEONImmb, 18, 16, Bits) |
| |
| #define SYSTEM_REGISTER_FIELDS_LIST(V_, M_) \ |
| /* NZCV */ \ |
| V_(Flags, 31, 28, Bits, uint32_t) \ |
| V_(N, 31, 31, Bits, bool) \ |
| V_(Z, 30, 30, Bits, bool) \ |
| V_(C, 29, 29, Bits, bool) \ |
| V_(V, 28, 28, Bits, bool) \ |
| M_(NZCV, Flags_mask) \ |
| \ |
| /* FPCR */ \ |
| V_(AHP, 26, 26, Bits, bool) \ |
| V_(DN, 25, 25, Bits, bool) \ |
| V_(FZ, 24, 24, Bits, bool) \ |
| V_(RMode, 23, 22, Bits, FPRounding) \ |
| M_(FPCR, AHP_mask | DN_mask | FZ_mask | RMode_mask) |
| |
| // Fields offsets. |
| #define DECLARE_FIELDS_OFFSETS(Name, HighBit, LowBit, unused_1, unused_2) \ |
| const int Name##_offset = LowBit; \ |
| const int Name##_width = HighBit - LowBit + 1; \ |
| const uint32_t Name##_mask = ((1 << Name##_width) - 1) << LowBit; |
| #define DECLARE_INSTRUCTION_FIELDS_OFFSETS(Name, HighBit, LowBit, unused_1) \ |
| DECLARE_FIELDS_OFFSETS(Name, HighBit, LowBit, unused_1, unused_2) |
| INSTRUCTION_FIELDS_LIST(DECLARE_INSTRUCTION_FIELDS_OFFSETS) |
| SYSTEM_REGISTER_FIELDS_LIST(DECLARE_FIELDS_OFFSETS, NOTHING) |
| #undef DECLARE_FIELDS_OFFSETS |
| #undef DECLARE_INSTRUCTION_FIELDS_OFFSETS |
| |
| // ImmPCRel is a compound field (not present in INSTRUCTION_FIELDS_LIST), formed |
| // from ImmPCRelLo and ImmPCRelHi. |
| const int ImmPCRel_mask = ImmPCRelLo_mask | ImmPCRelHi_mask; |
| |
| // Condition codes. |
| enum Condition { |
| eq = 0, |
| ne = 1, |
| hs = 2, |
| cs = hs, |
| lo = 3, |
| cc = lo, |
| mi = 4, |
| pl = 5, |
| vs = 6, |
| vc = 7, |
| hi = 8, |
| ls = 9, |
| ge = 10, |
| lt = 11, |
| gt = 12, |
| le = 13, |
| al = 14, |
| nv = 15 // Behaves as always/al. |
| }; |
| |
| inline Condition NegateCondition(Condition cond) { |
| // Conditions al and nv behave identically, as "always true". They can't be |
| // inverted, because there is no never condition. |
| DCHECK((cond != al) && (cond != nv)); |
| return static_cast<Condition>(cond ^ 1); |
| } |
| |
| enum FlagsUpdate { SetFlags = 1, LeaveFlags = 0 }; |
| |
| enum StatusFlags { |
| NoFlag = 0, |
| |
| // Derive the flag combinations from the system register bit descriptions. |
| NFlag = N_mask, |
| ZFlag = Z_mask, |
| CFlag = C_mask, |
| VFlag = V_mask, |
| NZFlag = NFlag | ZFlag, |
| NCFlag = NFlag | CFlag, |
| NVFlag = NFlag | VFlag, |
| ZCFlag = ZFlag | CFlag, |
| ZVFlag = ZFlag | VFlag, |
| CVFlag = CFlag | VFlag, |
| NZCFlag = NFlag | ZFlag | CFlag, |
| NZVFlag = NFlag | ZFlag | VFlag, |
| NCVFlag = NFlag | CFlag | VFlag, |
| ZCVFlag = ZFlag | CFlag | VFlag, |
| NZCVFlag = NFlag | ZFlag | CFlag | VFlag, |
| |
| // Floating-point comparison results. |
| FPEqualFlag = ZCFlag, |
| FPLessThanFlag = NFlag, |
| FPGreaterThanFlag = CFlag, |
| FPUnorderedFlag = CVFlag |
| }; |
| |
| enum Shift { |
| NO_SHIFT = -1, |
| LSL = 0x0, |
| LSR = 0x1, |
| ASR = 0x2, |
| ROR = 0x3, |
| MSL = 0x4 |
| }; |
| |
| enum Extend { |
| NO_EXTEND = -1, |
| UXTB = 0, |
| UXTH = 1, |
| UXTW = 2, |
| UXTX = 3, |
| SXTB = 4, |
| SXTH = 5, |
| SXTW = 6, |
| SXTX = 7 |
| }; |
| |
| enum SystemHint { |
| NOP = 0, |
| YIELD = 1, |
| WFE = 2, |
| WFI = 3, |
| SEV = 4, |
| SEVL = 5, |
| CSDB = 20, |
| BTI = 32, |
| BTI_c = 34, |
| BTI_j = 36, |
| BTI_jc = 38 |
| }; |
| |
| // In a guarded page, only BTI and PACI[AB]SP instructions are allowed to be |
| // the target of indirect branches. Details on which kinds of branches each |
| // instruction allows follow in the comments below: |
| enum class BranchTargetIdentifier { |
| // Do not emit a BTI instruction. |
| kNone, |
| |
| // Emit a BTI instruction. Cannot be the target of indirect jumps/calls. |
| kBti, |
| |
| // Emit a "BTI c" instruction. Can be the target of indirect jumps (BR) with |
| // x16/x17 as the target register, or indirect calls (BLR). |
| kBtiCall, |
| |
| // Emit a "BTI j" instruction. Can be the target of indirect jumps (BR). |
| kBtiJump, |
| |
| // Emit a "BTI jc" instruction, which is a combination of "BTI j" and "BTI c". |
| kBtiJumpCall, |
| |
| // Emit a PACIBSP instruction, which acts like a "BTI c" or a "BTI jc", |
| // based on the value of SCTLR_EL1.BT0. |
| kPacibsp |
| }; |
| |
| enum BarrierDomain { |
| OuterShareable = 0, |
| NonShareable = 1, |
| InnerShareable = 2, |
| FullSystem = 3 |
| }; |
| |
| enum BarrierType { |
| BarrierOther = 0, |
| BarrierReads = 1, |
| BarrierWrites = 2, |
| BarrierAll = 3 |
| }; |
| |
| // System/special register names. |
| // This information is not encoded as one field but as the concatenation of |
| // multiple fields (Op0<0>, Op1, Crn, Crm, Op2). |
| enum SystemRegister { |
| NZCV = ((0x1 << SysO0_offset) | (0x3 << SysOp1_offset) | (0x4 << CRn_offset) | |
| (0x2 << CRm_offset) | (0x0 << SysOp2_offset)) >> |
| ImmSystemRegister_offset, |
| FPCR = ((0x1 << SysO0_offset) | (0x3 << SysOp1_offset) | (0x4 << CRn_offset) | |
| (0x4 << CRm_offset) | (0x0 << SysOp2_offset)) >> |
| ImmSystemRegister_offset |
| }; |
| |
| // Instruction enumerations. |
| // |
| // These are the masks that define a class of instructions, and the list of |
| // instructions within each class. Each enumeration has a Fixed, FMask and |
| // Mask value. |
| // |
| // Fixed: The fixed bits in this instruction class. |
| // FMask: The mask used to extract the fixed bits in the class. |
| // Mask: The mask used to identify the instructions within a class. |
| // |
| // The enumerations can be used like this: |
| // |
| // DCHECK(instr->Mask(PCRelAddressingFMask) == PCRelAddressingFixed); |
| // switch(instr->Mask(PCRelAddressingMask)) { |
| // case ADR: Format("adr 'Xd, 'AddrPCRelByte"); break; |
| // case ADRP: Format("adrp 'Xd, 'AddrPCRelPage"); break; |
| // default: printf("Unknown instruction\n"); |
| // } |
| |
| // Used to corrupt encodings by setting all bits when orred. Although currently |
| // unallocated in AArch64, this encoding is not guaranteed to be undefined |
| // indefinitely. |
| const uint32_t kUnallocatedInstruction = 0xffffffff; |
| |
| // Generic fields. |
| enum GenericInstrField : uint32_t { |
| SixtyFourBits = 0x80000000, |
| ThirtyTwoBits = 0x00000000, |
| FP32 = 0x00000000, |
| FP64 = 0x00400000 |
| }; |
| |
| enum NEONFormatField : uint32_t { |
| NEONFormatFieldMask = 0x40C00000, |
| NEON_Q = 0x40000000, |
| NEON_8B = 0x00000000, |
| NEON_16B = NEON_8B | NEON_Q, |
| NEON_4H = 0x00400000, |
| NEON_8H = NEON_4H | NEON_Q, |
| NEON_2S = 0x00800000, |
| NEON_4S = NEON_2S | NEON_Q, |
| NEON_1D = 0x00C00000, |
| NEON_2D = 0x00C00000 | NEON_Q |
| }; |
| |
| enum NEONFPFormatField : uint32_t { |
| NEONFPFormatFieldMask = 0x40400000, |
| NEON_FP_2S = FP32, |
| NEON_FP_4S = FP32 | NEON_Q, |
| NEON_FP_2D = FP64 | NEON_Q |
| }; |
| |
| enum NEONLSFormatField : uint32_t { |
| NEONLSFormatFieldMask = 0x40000C00, |
| LS_NEON_8B = 0x00000000, |
| LS_NEON_16B = LS_NEON_8B | NEON_Q, |
| LS_NEON_4H = 0x00000400, |
| LS_NEON_8H = LS_NEON_4H | NEON_Q, |
| LS_NEON_2S = 0x00000800, |
| LS_NEON_4S = LS_NEON_2S | NEON_Q, |
| LS_NEON_1D = 0x00000C00, |
| LS_NEON_2D = LS_NEON_1D | NEON_Q |
| }; |
| |
| enum NEONScalarFormatField : uint32_t { |
| NEONScalarFormatFieldMask = 0x00C00000, |
| NEONScalar = 0x10000000, |
| NEON_B = 0x00000000, |
| NEON_H = 0x00400000, |
| NEON_S = 0x00800000, |
| NEON_D = 0x00C00000 |
| }; |
| |
| // PC relative addressing. |
| enum PCRelAddressingOp : uint32_t { |
| PCRelAddressingFixed = 0x10000000, |
| PCRelAddressingFMask = 0x1F000000, |
| PCRelAddressingMask = 0x9F000000, |
| ADR = PCRelAddressingFixed | 0x00000000, |
| ADRP = PCRelAddressingFixed | 0x80000000 |
| }; |
| |
| // Add/sub (immediate, shifted and extended.) |
| const int kSFOffset = 31; |
| enum AddSubOp : uint32_t { |
| AddSubOpMask = 0x60000000, |
| AddSubSetFlagsBit = 0x20000000, |
| ADD = 0x00000000, |
| ADDS = ADD | AddSubSetFlagsBit, |
| SUB = 0x40000000, |
| SUBS = SUB | AddSubSetFlagsBit |
| }; |
| |
| #define ADD_SUB_OP_LIST(V) V(ADD), V(ADDS), V(SUB), V(SUBS) |
| |
| enum AddSubImmediateOp : uint32_t { |
| AddSubImmediateFixed = 0x11000000, |
| AddSubImmediateFMask = 0x1F000000, |
| AddSubImmediateMask = 0xFF000000, |
| #define ADD_SUB_IMMEDIATE(A) \ |
| A##_w_imm = AddSubImmediateFixed | A, \ |
| A##_x_imm = AddSubImmediateFixed | A | SixtyFourBits |
| ADD_SUB_OP_LIST(ADD_SUB_IMMEDIATE) |
| #undef ADD_SUB_IMMEDIATE |
| }; |
| |
| enum AddSubShiftedOp : uint32_t { |
| AddSubShiftedFixed = 0x0B000000, |
| AddSubShiftedFMask = 0x1F200000, |
| AddSubShiftedMask = 0xFF200000, |
| #define ADD_SUB_SHIFTED(A) \ |
| A##_w_shift = AddSubShiftedFixed | A, \ |
| A##_x_shift = AddSubShiftedFixed | A | SixtyFourBits |
| ADD_SUB_OP_LIST(ADD_SUB_SHIFTED) |
| #undef ADD_SUB_SHIFTED |
| }; |
| |
| enum AddSubExtendedOp : uint32_t { |
| AddSubExtendedFixed = 0x0B200000, |
| AddSubExtendedFMask = 0x1F200000, |
| AddSubExtendedMask = 0xFFE00000, |
| #define ADD_SUB_EXTENDED(A) \ |
| A##_w_ext = AddSubExtendedFixed | A, \ |
| A##_x_ext = AddSubExtendedFixed | A | SixtyFourBits |
| ADD_SUB_OP_LIST(ADD_SUB_EXTENDED) |
| #undef ADD_SUB_EXTENDED |
| }; |
| |
| // Add/sub with carry. |
| enum AddSubWithCarryOp : uint32_t { |
| AddSubWithCarryFixed = 0x1A000000, |
| AddSubWithCarryFMask = 0x1FE00000, |
| AddSubWithCarryMask = 0xFFE0FC00, |
| ADC_w = AddSubWithCarryFixed | ADD, |
| ADC_x = AddSubWithCarryFixed | ADD | SixtyFourBits, |
| ADC = ADC_w, |
| ADCS_w = AddSubWithCarryFixed | ADDS, |
| ADCS_x = AddSubWithCarryFixed | ADDS | SixtyFourBits, |
| SBC_w = AddSubWithCarryFixed | SUB, |
| SBC_x = AddSubWithCarryFixed | SUB | SixtyFourBits, |
| SBC = SBC_w, |
| SBCS_w = AddSubWithCarryFixed | SUBS, |
| SBCS_x = AddSubWithCarryFixed | SUBS | SixtyFourBits |
| }; |
| |
| // Logical (immediate and shifted register). |
| enum LogicalOp : uint32_t { |
| LogicalOpMask = 0x60200000, |
| NOT = 0x00200000, |
| AND = 0x00000000, |
| BIC = AND | NOT, |
| ORR = 0x20000000, |
| ORN = ORR | NOT, |
| EOR = 0x40000000, |
| EON = EOR | NOT, |
| ANDS = 0x60000000, |
| BICS = ANDS | NOT |
| }; |
| |
| // Logical immediate. |
| enum LogicalImmediateOp : uint32_t { |
| LogicalImmediateFixed = 0x12000000, |
| LogicalImmediateFMask = 0x1F800000, |
| LogicalImmediateMask = 0xFF800000, |
| AND_w_imm = LogicalImmediateFixed | AND, |
| AND_x_imm = LogicalImmediateFixed | AND | SixtyFourBits, |
| ORR_w_imm = LogicalImmediateFixed | ORR, |
| ORR_x_imm = LogicalImmediateFixed | ORR | SixtyFourBits, |
| EOR_w_imm = LogicalImmediateFixed | EOR, |
| EOR_x_imm = LogicalImmediateFixed | EOR | SixtyFourBits, |
| ANDS_w_imm = LogicalImmediateFixed | ANDS, |
| ANDS_x_imm = LogicalImmediateFixed | ANDS | SixtyFourBits |
| }; |
| |
| // Logical shifted register. |
| enum LogicalShiftedOp : uint32_t { |
| LogicalShiftedFixed = 0x0A000000, |
| LogicalShiftedFMask = 0x1F000000, |
| LogicalShiftedMask = 0xFF200000, |
| AND_w = LogicalShiftedFixed | AND, |
| AND_x = LogicalShiftedFixed | AND | SixtyFourBits, |
| AND_shift = AND_w, |
| BIC_w = LogicalShiftedFixed | BIC, |
| BIC_x = LogicalShiftedFixed | BIC | SixtyFourBits, |
| BIC_shift = BIC_w, |
| ORR_w = LogicalShiftedFixed | ORR, |
| ORR_x = LogicalShiftedFixed | ORR | SixtyFourBits, |
| ORR_shift = ORR_w, |
| ORN_w = LogicalShiftedFixed | ORN, |
| ORN_x = LogicalShiftedFixed | ORN | SixtyFourBits, |
| ORN_shift = ORN_w, |
| EOR_w = LogicalShiftedFixed | EOR, |
| EOR_x = LogicalShiftedFixed | EOR | SixtyFourBits, |
| EOR_shift = EOR_w, |
| EON_w = LogicalShiftedFixed | EON, |
| EON_x = LogicalShiftedFixed | EON | SixtyFourBits, |
| EON_shift = EON_w, |
| ANDS_w = LogicalShiftedFixed | ANDS, |
| ANDS_x = LogicalShiftedFixed | ANDS | SixtyFourBits, |
| ANDS_shift = ANDS_w, |
| BICS_w = LogicalShiftedFixed | BICS, |
| BICS_x = LogicalShiftedFixed | BICS | SixtyFourBits, |
| BICS_shift = BICS_w |
| }; |
| |
| // Move wide immediate. |
| enum MoveWideImmediateOp : uint32_t { |
| MoveWideImmediateFixed = 0x12800000, |
| MoveWideImmediateFMask = 0x1F800000, |
| MoveWideImmediateMask = 0xFF800000, |
| MOVN = 0x00000000, |
| MOVZ = 0x40000000, |
| MOVK = 0x60000000, |
| MOVN_w = MoveWideImmediateFixed | MOVN, |
| MOVN_x = MoveWideImmediateFixed | MOVN | SixtyFourBits, |
| MOVZ_w = MoveWideImmediateFixed | MOVZ, |
| MOVZ_x = MoveWideImmediateFixed | MOVZ | SixtyFourBits, |
| MOVK_w = MoveWideImmediateFixed | MOVK, |
| MOVK_x = MoveWideImmediateFixed | MOVK | SixtyFourBits |
| }; |
| |
| // Bitfield. |
| const int kBitfieldNOffset = 22; |
| enum BitfieldOp : uint32_t { |
| BitfieldFixed = 0x13000000, |
| BitfieldFMask = 0x1F800000, |
| BitfieldMask = 0xFF800000, |
| SBFM_w = BitfieldFixed | 0x00000000, |
| SBFM_x = BitfieldFixed | 0x80000000, |
| SBFM = SBFM_w, |
| BFM_w = BitfieldFixed | 0x20000000, |
| BFM_x = BitfieldFixed | 0xA0000000, |
| BFM = BFM_w, |
| UBFM_w = BitfieldFixed | 0x40000000, |
| UBFM_x = BitfieldFixed | 0xC0000000, |
| UBFM = UBFM_w |
| // Bitfield N field. |
| }; |
| |
| // Extract. |
| enum ExtractOp : uint32_t { |
| ExtractFixed = 0x13800000, |
| ExtractFMask = 0x1F800000, |
| ExtractMask = 0xFFA00000, |
| EXTR_w = ExtractFixed | 0x00000000, |
| EXTR_x = ExtractFixed | 0x80000000, |
| EXTR = EXTR_w |
| }; |
| |
| // Unconditional branch. |
| enum UnconditionalBranchOp : uint32_t { |
| UnconditionalBranchFixed = 0x14000000, |
| UnconditionalBranchFMask = 0x7C000000, |
| UnconditionalBranchMask = 0xFC000000, |
| B = UnconditionalBranchFixed | 0x00000000, |
| BL = UnconditionalBranchFixed | 0x80000000 |
| }; |
| |
| // Unconditional branch to register. |
| enum UnconditionalBranchToRegisterOp : uint32_t { |
| UnconditionalBranchToRegisterFixed = 0xD6000000, |
| UnconditionalBranchToRegisterFMask = 0xFE000000, |
| UnconditionalBranchToRegisterMask = 0xFFFFFC1F, |
| BR = UnconditionalBranchToRegisterFixed | 0x001F0000, |
| BLR = UnconditionalBranchToRegisterFixed | 0x003F0000, |
| RET = UnconditionalBranchToRegisterFixed | 0x005F0000 |
| }; |
| |
| // Compare and branch. |
| enum CompareBranchOp : uint32_t { |
| CompareBranchFixed = 0x34000000, |
| CompareBranchFMask = 0x7E000000, |
| CompareBranchMask = 0xFF000000, |
| CBZ_w = CompareBranchFixed | 0x00000000, |
| CBZ_x = CompareBranchFixed | 0x80000000, |
| CBZ = CBZ_w, |
| CBNZ_w = CompareBranchFixed | 0x01000000, |
| CBNZ_x = CompareBranchFixed | 0x81000000, |
| CBNZ = CBNZ_w |
| }; |
| |
| // Test and branch. |
| enum TestBranchOp : uint32_t { |
| TestBranchFixed = 0x36000000, |
| TestBranchFMask = 0x7E000000, |
| TestBranchMask = 0x7F000000, |
| TBZ = TestBranchFixed | 0x00000000, |
| TBNZ = TestBranchFixed | 0x01000000 |
| }; |
| |
| // Conditional branch. |
| enum ConditionalBranchOp : uint32_t { |
| ConditionalBranchFixed = 0x54000000, |
| ConditionalBranchFMask = 0xFE000000, |
| ConditionalBranchMask = 0xFF000010, |
| B_cond = ConditionalBranchFixed | 0x00000000 |
| }; |
| |
| // System. |
| // System instruction encoding is complicated because some instructions use op |
| // and CR fields to encode parameters. To handle this cleanly, the system |
| // instructions are split into more than one enum. |
| |
| enum SystemOp : uint32_t { SystemFixed = 0xD5000000, SystemFMask = 0xFFC00000 }; |
| |
| enum SystemSysRegOp : uint32_t { |
| SystemSysRegFixed = 0xD5100000, |
| SystemSysRegFMask = 0xFFD00000, |
| SystemSysRegMask = 0xFFF00000, |
| MRS = SystemSysRegFixed | 0x00200000, |
| MSR = SystemSysRegFixed | 0x00000000 |
| }; |
| |
| enum SystemHintOp : uint32_t { |
| SystemHintFixed = 0xD503201F, |
| SystemHintFMask = 0xFFFFF01F, |
| SystemHintMask = 0xFFFFF01F, |
| HINT = SystemHintFixed | 0x00000000 |
| }; |
| |
| // Exception. |
| enum ExceptionOp : uint32_t { |
| ExceptionFixed = 0xD4000000, |
| ExceptionFMask = 0xFF000000, |
| ExceptionMask = 0xFFE0001F, |
| HLT = ExceptionFixed | 0x00400000, |
| BRK = ExceptionFixed | 0x00200000, |
| SVC = ExceptionFixed | 0x00000001, |
| HVC = ExceptionFixed | 0x00000002, |
| SMC = ExceptionFixed | 0x00000003, |
| DCPS1 = ExceptionFixed | 0x00A00001, |
| DCPS2 = ExceptionFixed | 0x00A00002, |
| DCPS3 = ExceptionFixed | 0x00A00003 |
| }; |
| // Code used to spot hlt instructions that should not be hit. |
| const int kHltBadCode = 0xbad; |
| |
| enum MemBarrierOp : uint32_t { |
| MemBarrierFixed = 0xD503309F, |
| MemBarrierFMask = 0xFFFFF09F, |
| MemBarrierMask = 0xFFFFF0FF, |
| DSB = MemBarrierFixed | 0x00000000, |
| DMB = MemBarrierFixed | 0x00000020, |
| ISB = MemBarrierFixed | 0x00000040 |
| }; |
| |
| enum SystemPAuthOp : uint32_t { |
| SystemPAuthFixed = 0xD503211F, |
| SystemPAuthFMask = 0xFFFFFD1F, |
| SystemPAuthMask = 0xFFFFFFFF, |
| PACIB1716 = SystemPAuthFixed | 0x00000140, |
| AUTIB1716 = SystemPAuthFixed | 0x000001C0, |
| PACIBSP = SystemPAuthFixed | 0x00000360, |
| AUTIBSP = SystemPAuthFixed | 0x000003E0 |
| }; |
| |
| // Any load or store (including pair). |
| enum LoadStoreAnyOp : uint32_t { |
| LoadStoreAnyFMask = 0x0a000000, |
| LoadStoreAnyFixed = 0x08000000 |
| }; |
| |
| // Any load pair or store pair. |
| enum LoadStorePairAnyOp : uint32_t { |
| LoadStorePairAnyFMask = 0x3a000000, |
| LoadStorePairAnyFixed = 0x28000000 |
| }; |
| |
| #define LOAD_STORE_PAIR_OP_LIST(V) \ |
| V(STP, w, 0x00000000) \ |
| , V(LDP, w, 0x00400000), V(LDPSW, x, 0x40400000), V(STP, x, 0x80000000), \ |
| V(LDP, x, 0x80400000), V(STP, s, 0x04000000), V(LDP, s, 0x04400000), \ |
| V(STP, d, 0x44000000), V(LDP, d, 0x44400000), V(STP, q, 0x84000000), \ |
| V(LDP, q, 0x84400000) |
| |
| // Load/store pair (post, pre and offset.) |
| enum LoadStorePairOp : uint32_t { |
| LoadStorePairMask = 0xC4400000, |
| LoadStorePairLBit = 1 << 22, |
| #define LOAD_STORE_PAIR(A, B, C) A##_##B = C |
| LOAD_STORE_PAIR_OP_LIST(LOAD_STORE_PAIR) |
| #undef LOAD_STORE_PAIR |
| }; |
| |
| enum LoadStorePairPostIndexOp : uint32_t { |
| LoadStorePairPostIndexFixed = 0x28800000, |
| LoadStorePairPostIndexFMask = 0x3B800000, |
| LoadStorePairPostIndexMask = 0xFFC00000, |
| #define LOAD_STORE_PAIR_POST_INDEX(A, B, C) \ |
| A##_##B##_post = LoadStorePairPostIndexFixed | A##_##B |
| LOAD_STORE_PAIR_OP_LIST(LOAD_STORE_PAIR_POST_INDEX) |
| #undef LOAD_STORE_PAIR_POST_INDEX |
| }; |
| |
| enum LoadStorePairPreIndexOp : uint32_t { |
| LoadStorePairPreIndexFixed = 0x29800000, |
| LoadStorePairPreIndexFMask = 0x3B800000, |
| LoadStorePairPreIndexMask = 0xFFC00000, |
| #define LOAD_STORE_PAIR_PRE_INDEX(A, B, C) \ |
| A##_##B##_pre = LoadStorePairPreIndexFixed | A##_##B |
| LOAD_STORE_PAIR_OP_LIST(LOAD_STORE_PAIR_PRE_INDEX) |
| #undef LOAD_STORE_PAIR_PRE_INDEX |
| }; |
| |
| enum LoadStorePairOffsetOp : uint32_t { |
| LoadStorePairOffsetFixed = 0x29000000, |
| LoadStorePairOffsetFMask = 0x3B800000, |
| LoadStorePairOffsetMask = 0xFFC00000, |
| #define LOAD_STORE_PAIR_OFFSET(A, B, C) \ |
| A##_##B##_off = LoadStorePairOffsetFixed | A##_##B |
| LOAD_STORE_PAIR_OP_LIST(LOAD_STORE_PAIR_OFFSET) |
| #undef LOAD_STORE_PAIR_OFFSET |
| }; |
| |
| // Load literal. |
| enum LoadLiteralOp : uint32_t { |
| LoadLiteralFixed = 0x18000000, |
| LoadLiteralFMask = 0x3B000000, |
| LoadLiteralMask = 0xFF000000, |
| LDR_w_lit = LoadLiteralFixed | 0x00000000, |
| LDR_x_lit = LoadLiteralFixed | 0x40000000, |
| LDRSW_x_lit = LoadLiteralFixed | 0x80000000, |
| PRFM_lit = LoadLiteralFixed | 0xC0000000, |
| LDR_s_lit = LoadLiteralFixed | 0x04000000, |
| LDR_d_lit = LoadLiteralFixed | 0x44000000 |
| }; |
| |
| // clang-format off |
| |
| #define LOAD_STORE_OP_LIST(V) \ |
| V(ST, RB, w, 0x00000000), \ |
| V(ST, RH, w, 0x40000000), \ |
| V(ST, R, w, 0x80000000), \ |
| V(ST, R, x, 0xC0000000), \ |
| V(LD, RB, w, 0x00400000), \ |
| V(LD, RH, w, 0x40400000), \ |
| V(LD, R, w, 0x80400000), \ |
| V(LD, R, x, 0xC0400000), \ |
| V(LD, RSB, x, 0x00800000), \ |
| V(LD, RSH, x, 0x40800000), \ |
| V(LD, RSW, x, 0x80800000), \ |
| V(LD, RSB, w, 0x00C00000), \ |
| V(LD, RSH, w, 0x40C00000), \ |
| V(ST, R, b, 0x04000000), \ |
| V(ST, R, h, 0x44000000), \ |
| V(ST, R, s, 0x84000000), \ |
| V(ST, R, d, 0xC4000000), \ |
| V(ST, R, q, 0x04800000), \ |
| V(LD, R, b, 0x04400000), \ |
| V(LD, R, h, 0x44400000), \ |
| V(LD, R, s, 0x84400000), \ |
| V(LD, R, d, 0xC4400000), \ |
| V(LD, R, q, 0x04C00000) |
| |
| // clang-format on |
| |
| // Load/store unscaled offset. |
| enum LoadStoreUnscaledOffsetOp : uint32_t { |
| LoadStoreUnscaledOffsetFixed = 0x38000000, |
| LoadStoreUnscaledOffsetFMask = 0x3B200C00, |
| LoadStoreUnscaledOffsetMask = 0xFFE00C00, |
| #define LOAD_STORE_UNSCALED(A, B, C, D) \ |
| A##U##B##_##C = LoadStoreUnscaledOffsetFixed | D |
| LOAD_STORE_OP_LIST(LOAD_STORE_UNSCALED) |
| #undef LOAD_STORE_UNSCALED |
| }; |
| |
| // Load/store (post, pre, offset and unsigned.) |
| enum LoadStoreOp : uint32_t { |
| LoadStoreMask = 0xC4C00000, |
| #define LOAD_STORE(A, B, C, D) A##B##_##C = D |
| LOAD_STORE_OP_LIST(LOAD_STORE), |
| #undef LOAD_STORE |
| PRFM = 0xC0800000 |
| }; |
| |
| // Load/store post index. |
| enum LoadStorePostIndex : uint32_t { |
| LoadStorePostIndexFixed = 0x38000400, |
| LoadStorePostIndexFMask = 0x3B200C00, |
| LoadStorePostIndexMask = 0xFFE00C00, |
| #define LOAD_STORE_POST_INDEX(A, B, C, D) \ |
| A##B##_##C##_post = LoadStorePostIndexFixed | D |
| LOAD_STORE_OP_LIST(LOAD_STORE_POST_INDEX) |
| #undef LOAD_STORE_POST_INDEX |
| }; |
| |
| // Load/store pre index. |
| enum LoadStorePreIndex : uint32_t { |
| LoadStorePreIndexFixed = 0x38000C00, |
| LoadStorePreIndexFMask = 0x3B200C00, |
| LoadStorePreIndexMask = 0xFFE00C00, |
| #define LOAD_STORE_PRE_INDEX(A, B, C, D) \ |
| A##B##_##C##_pre = LoadStorePreIndexFixed | D |
| LOAD_STORE_OP_LIST(LOAD_STORE_PRE_INDEX) |
| #undef LOAD_STORE_PRE_INDEX |
| }; |
| |
| // Load/store unsigned offset. |
| enum LoadStoreUnsignedOffset : uint32_t { |
| LoadStoreUnsignedOffsetFixed = 0x39000000, |
| LoadStoreUnsignedOffsetFMask = 0x3B000000, |
| LoadStoreUnsignedOffsetMask = 0xFFC00000, |
| PRFM_unsigned = LoadStoreUnsignedOffsetFixed | PRFM, |
| #define LOAD_STORE_UNSIGNED_OFFSET(A, B, C, D) \ |
| A##B##_##C##_unsigned = LoadStoreUnsignedOffsetFixed | D |
| LOAD_STORE_OP_LIST(LOAD_STORE_UNSIGNED_OFFSET) |
| #undef LOAD_STORE_UNSIGNED_OFFSET |
| }; |
| |
| // Load/store register offset. |
| enum LoadStoreRegisterOffset : uint32_t { |
| LoadStoreRegisterOffsetFixed = 0x38200800, |
| LoadStoreRegisterOffsetFMask = 0x3B200C00, |
| LoadStoreRegisterOffsetMask = 0xFFE00C00, |
| PRFM_reg = LoadStoreRegisterOffsetFixed | PRFM, |
| #define LOAD_STORE_REGISTER_OFFSET(A, B, C, D) \ |
| A##B##_##C##_reg = LoadStoreRegisterOffsetFixed | D |
| LOAD_STORE_OP_LIST(LOAD_STORE_REGISTER_OFFSET) |
| #undef LOAD_STORE_REGISTER_OFFSET |
| }; |
| |
| // Load/store acquire/release. |
| enum LoadStoreAcquireReleaseOp : uint32_t { |
| LoadStoreAcquireReleaseFixed = 0x08000000, |
| LoadStoreAcquireReleaseFMask = 0x3F000000, |
| LoadStoreAcquireReleaseMask = 0xCFC08000, |
| STLXR_b = LoadStoreAcquireReleaseFixed | 0x00008000, |
| LDAXR_b = LoadStoreAcquireReleaseFixed | 0x00408000, |
| STLR_b = LoadStoreAcquireReleaseFixed | 0x00808000, |
| LDAR_b = LoadStoreAcquireReleaseFixed | 0x00C08000, |
| STLXR_h = LoadStoreAcquireReleaseFixed | 0x40008000, |
| LDAXR_h = LoadStoreAcquireReleaseFixed | 0x40408000, |
| STLR_h = LoadStoreAcquireReleaseFixed | 0x40808000, |
| LDAR_h = LoadStoreAcquireReleaseFixed | 0x40C08000, |
| STLXR_w = LoadStoreAcquireReleaseFixed | 0x80008000, |
| LDAXR_w = LoadStoreAcquireReleaseFixed | 0x80408000, |
| STLR_w = LoadStoreAcquireReleaseFixed | 0x80808000, |
| LDAR_w = LoadStoreAcquireReleaseFixed | 0x80C08000, |
| STLXR_x = LoadStoreAcquireReleaseFixed | 0xC0008000, |
| LDAXR_x = LoadStoreAcquireReleaseFixed | 0xC0408000, |
| STLR_x = LoadStoreAcquireReleaseFixed | 0xC0808000, |
| LDAR_x = LoadStoreAcquireReleaseFixed | 0xC0C08000, |
| }; |
| |
| // Conditional compare. |
| enum ConditionalCompareOp : uint32_t { |
| ConditionalCompareMask = 0x60000000, |
| CCMN = 0x20000000, |
| CCMP = 0x60000000 |
| }; |
| |
| // Conditional compare register. |
| enum ConditionalCompareRegisterOp : uint32_t { |
| ConditionalCompareRegisterFixed = 0x1A400000, |
| ConditionalCompareRegisterFMask = 0x1FE00800, |
| ConditionalCompareRegisterMask = 0xFFE00C10, |
| CCMN_w = ConditionalCompareRegisterFixed | CCMN, |
| CCMN_x = ConditionalCompareRegisterFixed | SixtyFourBits | CCMN, |
| CCMP_w = ConditionalCompareRegisterFixed | CCMP, |
| CCMP_x = ConditionalCompareRegisterFixed | SixtyFourBits | CCMP |
| }; |
| |
| // Conditional compare immediate. |
| enum ConditionalCompareImmediateOp : uint32_t { |
| ConditionalCompareImmediateFixed = 0x1A400800, |
| ConditionalCompareImmediateFMask = 0x1FE00800, |
| ConditionalCompareImmediateMask = 0xFFE00C10, |
| CCMN_w_imm = ConditionalCompareImmediateFixed | CCMN, |
| CCMN_x_imm = ConditionalCompareImmediateFixed | SixtyFourBits | CCMN, |
| CCMP_w_imm = ConditionalCompareImmediateFixed | CCMP, |
| CCMP_x_imm = ConditionalCompareImmediateFixed | SixtyFourBits | CCMP |
| }; |
| |
| // Conditional select. |
| enum ConditionalSelectOp : uint32_t { |
| ConditionalSelectFixed = 0x1A800000, |
| ConditionalSelectFMask = 0x1FE00000, |
| ConditionalSelectMask = 0xFFE00C00, |
| CSEL_w = ConditionalSelectFixed | 0x00000000, |
| CSEL_x = ConditionalSelectFixed | 0x80000000, |
| CSEL = CSEL_w, |
| CSINC_w = ConditionalSelectFixed | 0x00000400, |
| CSINC_x = ConditionalSelectFixed | 0x80000400, |
| CSINC = CSINC_w, |
| CSINV_w = ConditionalSelectFixed | 0x40000000, |
| CSINV_x = ConditionalSelectFixed | 0xC0000000, |
| CSINV = CSINV_w, |
| CSNEG_w = ConditionalSelectFixed | 0x40000400, |
| CSNEG_x = ConditionalSelectFixed | 0xC0000400, |
| CSNEG = CSNEG_w |
| }; |
| |
| // Data processing 1 source. |
| enum DataProcessing1SourceOp : uint32_t { |
| DataProcessing1SourceFixed = 0x5AC00000, |
| DataProcessing1SourceFMask = 0x5FE00000, |
| DataProcessing1SourceMask = 0xFFFFFC00, |
| RBIT = DataProcessing1SourceFixed | 0x00000000, |
| RBIT_w = RBIT, |
| RBIT_x = RBIT | SixtyFourBits, |
| REV16 = DataProcessing1SourceFixed | 0x00000400, |
| REV16_w = REV16, |
| REV16_x = REV16 | SixtyFourBits, |
| REV = DataProcessing1SourceFixed | 0x00000800, |
| REV_w = REV, |
| REV32_x = REV | SixtyFourBits, |
| REV_x = DataProcessing1SourceFixed | SixtyFourBits | 0x00000C00, |
| CLZ = DataProcessing1SourceFixed | 0x00001000, |
| CLZ_w = CLZ, |
| CLZ_x = CLZ | SixtyFourBits, |
| CLS = DataProcessing1SourceFixed | 0x00001400, |
| CLS_w = CLS, |
| CLS_x = CLS | SixtyFourBits |
| }; |
| |
| // Data processing 2 source. |
| enum DataProcessing2SourceOp : uint32_t { |
| DataProcessing2SourceFixed = 0x1AC00000, |
| DataProcessing2SourceFMask = 0x5FE00000, |
| DataProcessing2SourceMask = 0xFFE0FC00, |
| UDIV_w = DataProcessing2SourceFixed | 0x00000800, |
| UDIV_x = DataProcessing2SourceFixed | 0x80000800, |
| UDIV = UDIV_w, |
| SDIV_w = DataProcessing2SourceFixed | 0x00000C00, |
| SDIV_x = DataProcessing2SourceFixed | 0x80000C00, |
| SDIV = SDIV_w, |
| LSLV_w = DataProcessing2SourceFixed | 0x00002000, |
| LSLV_x = DataProcessing2SourceFixed | 0x80002000, |
| LSLV = LSLV_w, |
| LSRV_w = DataProcessing2SourceFixed | 0x00002400, |
| LSRV_x = DataProcessing2SourceFixed | 0x80002400, |
| LSRV = LSRV_w, |
| ASRV_w = DataProcessing2SourceFixed | 0x00002800, |
| ASRV_x = DataProcessing2SourceFixed | 0x80002800, |
| ASRV = ASRV_w, |
| RORV_w = DataProcessing2SourceFixed | 0x00002C00, |
| RORV_x = DataProcessing2SourceFixed | 0x80002C00, |
| RORV = RORV_w, |
| CRC32B = DataProcessing2SourceFixed | 0x00004000, |
| CRC32H = DataProcessing2SourceFixed | 0x00004400, |
| CRC32W = DataProcessing2SourceFixed | 0x00004800, |
| CRC32X = DataProcessing2SourceFixed | SixtyFourBits | 0x00004C00, |
| CRC32CB = DataProcessing2SourceFixed | 0x00005000, |
| CRC32CH = DataProcessing2SourceFixed | 0x00005400, |
| CRC32CW = DataProcessing2SourceFixed | 0x00005800, |
| CRC32CX = DataProcessing2SourceFixed | SixtyFourBits | 0x00005C00 |
| }; |
| |
| // Data processing 3 source. |
| enum DataProcessing3SourceOp : uint32_t { |
| DataProcessing3SourceFixed = 0x1B000000, |
| DataProcessing3SourceFMask = 0x1F000000, |
| DataProcessing3SourceMask = 0xFFE08000, |
| MADD_w = DataProcessing3SourceFixed | 0x00000000, |
| MADD_x = DataProcessing3SourceFixed | 0x80000000, |
| MADD = MADD_w, |
| MSUB_w = DataProcessing3SourceFixed | 0x00008000, |
| MSUB_x = DataProcessing3SourceFixed | 0x80008000, |
| MSUB = MSUB_w, |
| SMADDL_x = DataProcessing3SourceFixed | 0x80200000, |
| SMSUBL_x = DataProcessing3SourceFixed | 0x80208000, |
| SMULH_x = DataProcessing3SourceFixed | 0x80400000, |
| UMADDL_x = DataProcessing3SourceFixed | 0x80A00000, |
| UMSUBL_x = DataProcessing3SourceFixed | 0x80A08000, |
| UMULH_x = DataProcessing3SourceFixed | 0x80C00000 |
| }; |
| |
| // Floating point compare. |
| enum FPCompareOp : uint32_t { |
| FPCompareFixed = 0x1E202000, |
| FPCompareFMask = 0x5F203C00, |
| FPCompareMask = 0xFFE0FC1F, |
| FCMP_s = FPCompareFixed | 0x00000000, |
| FCMP_d = FPCompareFixed | FP64 | 0x00000000, |
| FCMP = FCMP_s, |
| FCMP_s_zero = FPCompareFixed | 0x00000008, |
| FCMP_d_zero = FPCompareFixed | FP64 | 0x00000008, |
| FCMP_zero = FCMP_s_zero, |
| FCMPE_s = FPCompareFixed | 0x00000010, |
| FCMPE_d = FPCompareFixed | FP64 | 0x00000010, |
| FCMPE_s_zero = FPCompareFixed | 0x00000018, |
| FCMPE_d_zero = FPCompareFixed | FP64 | 0x00000018 |
| }; |
| |
| // Floating point conditional compare. |
| enum FPConditionalCompareOp : uint32_t { |
| FPConditionalCompareFixed = 0x1E200400, |
| FPConditionalCompareFMask = 0x5F200C00, |
| FPConditionalCompareMask = 0xFFE00C10, |
| FCCMP_s = FPConditionalCompareFixed | 0x00000000, |
| FCCMP_d = FPConditionalCompareFixed | FP64 | 0x00000000, |
| FCCMP = FCCMP_s, |
| FCCMPE_s = FPConditionalCompareFixed | 0x00000010, |
| FCCMPE_d = FPConditionalCompareFixed | FP64 | 0x00000010, |
| FCCMPE = FCCMPE_s |
| }; |
| |
| // Floating point conditional select. |
| enum FPConditionalSelectOp : uint32_t { |
| FPConditionalSelectFixed = 0x1E200C00, |
| FPConditionalSelectFMask = 0x5F200C00, |
| FPConditionalSelectMask = 0xFFE00C00, |
| FCSEL_s = FPConditionalSelectFixed | 0x00000000, |
| FCSEL_d = FPConditionalSelectFixed | FP64 | 0x00000000, |
| FCSEL = FCSEL_s |
| }; |
| |
| // Floating point immediate. |
| enum FPImmediateOp : uint32_t { |
| FPImmediateFixed = 0x1E201000, |
| FPImmediateFMask = 0x5F201C00, |
| FPImmediateMask = 0xFFE01C00, |
| FMOV_s_imm = FPImmediateFixed | 0x00000000, |
| FMOV_d_imm = FPImmediateFixed | FP64 | 0x00000000 |
| }; |
| |
| // Floating point data processing 1 source. |
| enum FPDataProcessing1SourceOp : uint32_t { |
| FPDataProcessing1SourceFixed = 0x1E204000, |
| FPDataProcessing1SourceFMask = 0x5F207C00, |
| FPDataProcessing1SourceMask = 0xFFFFFC00, |
| FMOV_s = FPDataProcessing1SourceFixed | 0x00000000, |
| FMOV_d = FPDataProcessing1SourceFixed | FP64 | 0x00000000, |
| FMOV = FMOV_s, |
| FABS_s = FPDataProcessing1SourceFixed | 0x00008000, |
| FABS_d = FPDataProcessing1SourceFixed | FP64 | 0x00008000, |
| FABS = FABS_s, |
| FNEG_s = FPDataProcessing1SourceFixed | 0x00010000, |
| FNEG_d = FPDataProcessing1SourceFixed | FP64 | 0x00010000, |
| FNEG = FNEG_s, |
| FSQRT_s = FPDataProcessing1SourceFixed | 0x00018000, |
| FSQRT_d = FPDataProcessing1SourceFixed | FP64 | 0x00018000, |
| FSQRT = FSQRT_s, |
| FCVT_ds = FPDataProcessing1SourceFixed | 0x00028000, |
| FCVT_sd = FPDataProcessing1SourceFixed | FP64 | 0x00020000, |
| FCVT_hs = FPDataProcessing1SourceFixed | 0x00038000, |
| FCVT_hd = FPDataProcessing1SourceFixed | FP64 | 0x00038000, |
| FCVT_sh = FPDataProcessing1SourceFixed | 0x00C20000, |
| FCVT_dh = FPDataProcessing1SourceFixed | 0x00C28000, |
| FRINTN_s = FPDataProcessing1SourceFixed | 0x00040000, |
| FRINTN_d = FPDataProcessing1SourceFixed | FP64 | 0x00040000, |
| FRINTN = FRINTN_s, |
| FRINTP_s = FPDataProcessing1SourceFixed | 0x00048000, |
| FRINTP_d = FPDataProcessing1SourceFixed | FP64 | 0x00048000, |
| FRINTP = FRINTP_s, |
| FRINTM_s = FPDataProcessing1SourceFixed | 0x00050000, |
| FRINTM_d = FPDataProcessing1SourceFixed | FP64 | 0x00050000, |
| FRINTM = FRINTM_s, |
| FRINTZ_s = FPDataProcessing1SourceFixed | 0x00058000, |
| FRINTZ_d = FPDataProcessing1SourceFixed | FP64 | 0x00058000, |
| FRINTZ = FRINTZ_s, |
| FRINTA_s = FPDataProcessing1SourceFixed | 0x00060000, |
| FRINTA_d = FPDataProcessing1SourceFixed | FP64 | 0x00060000, |
| FRINTA = FRINTA_s, |
| FRINTX_s = FPDataProcessing1SourceFixed | 0x00070000, |
| FRINTX_d = FPDataProcessing1SourceFixed | FP64 | 0x00070000, |
| FRINTX = FRINTX_s, |
| FRINTI_s = FPDataProcessing1SourceFixed | 0x00078000, |
| FRINTI_d = FPDataProcessing1SourceFixed | FP64 | 0x00078000, |
| FRINTI = FRINTI_s |
| }; |
| |
| // Floating point data processing 2 source. |
| enum FPDataProcessing2SourceOp : uint32_t { |
| FPDataProcessing2SourceFixed = 0x1E200800, |
| FPDataProcessing2SourceFMask = 0x5F200C00, |
| FPDataProcessing2SourceMask = 0xFFE0FC00, |
| FMUL = FPDataProcessing2SourceFixed | 0x00000000, |
| FMUL_s = FMUL, |
| FMUL_d = FMUL | FP64, |
| FDIV = FPDataProcessing2SourceFixed | 0x00001000, |
| FDIV_s = FDIV, |
| FDIV_d = FDIV | FP64, |
| FADD = FPDataProcessing2SourceFixed | 0x00002000, |
| FADD_s = FADD, |
| FADD_d = FADD | FP64, |
| FSUB = FPDataProcessing2SourceFixed | 0x00003000, |
| FSUB_s = FSUB, |
| FSUB_d = FSUB | FP64, |
| FMAX = FPDataProcessing2SourceFixed | 0x00004000, |
| FMAX_s = FMAX, |
| FMAX_d = FMAX | FP64, |
| FMIN = FPDataProcessing2SourceFixed | 0x00005000, |
| FMIN_s = FMIN, |
| FMIN_d = FMIN | FP64, |
| FMAXNM = FPDataProcessing2SourceFixed | 0x00006000, |
| FMAXNM_s = FMAXNM, |
| FMAXNM_d = FMAXNM | FP64, |
| FMINNM = FPDataProcessing2SourceFixed | 0x00007000, |
| FMINNM_s = FMINNM, |
| FMINNM_d = FMINNM | FP64, |
| FNMUL = FPDataProcessing2SourceFixed | 0x00008000, |
| FNMUL_s = FNMUL, |
| FNMUL_d = FNMUL | FP64 |
| }; |
| |
| // Floating point data processing 3 source. |
| enum FPDataProcessing3SourceOp : uint32_t { |
| FPDataProcessing3SourceFixed = 0x1F000000, |
| FPDataProcessing3SourceFMask = 0x5F000000, |
| FPDataProcessing3SourceMask = 0xFFE08000, |
| FMADD_s = FPDataProcessing3SourceFixed | 0x00000000, |
| FMSUB_s = FPDataProcessing3SourceFixed | 0x00008000, |
| FNMADD_s = FPDataProcessing3SourceFixed | 0x00200000, |
| FNMSUB_s = FPDataProcessing3SourceFixed | 0x00208000, |
| FMADD_d = FPDataProcessing3SourceFixed | 0x00400000, |
| FMSUB_d = FPDataProcessing3SourceFixed | 0x00408000, |
| FNMADD_d = FPDataProcessing3SourceFixed | 0x00600000, |
| FNMSUB_d = FPDataProcessing3SourceFixed | 0x00608000 |
| }; |
| |
| // Conversion between floating point and integer. |
| enum FPIntegerConvertOp : uint32_t { |
| FPIntegerConvertFixed = 0x1E200000, |
| FPIntegerConvertFMask = 0x5F20FC00, |
| FPIntegerConvertMask = 0xFFFFFC00, |
| FCVTNS = FPIntegerConvertFixed | 0x00000000, |
| FCVTNS_ws = FCVTNS, |
| FCVTNS_xs = FCVTNS | SixtyFourBits, |
| FCVTNS_wd = FCVTNS | FP64, |
| FCVTNS_xd = FCVTNS | SixtyFourBits | FP64, |
| FCVTNU = FPIntegerConvertFixed | 0x00010000, |
| FCVTNU_ws = FCVTNU, |
| FCVTNU_xs = FCVTNU | SixtyFourBits, |
| FCVTNU_wd = FCVTNU | FP64, |
| FCVTNU_xd = FCVTNU | SixtyFourBits | FP64, |
| FCVTPS = FPIntegerConvertFixed | 0x00080000, |
| FCVTPS_ws = FCVTPS, |
| FCVTPS_xs = FCVTPS | SixtyFourBits, |
| FCVTPS_wd = FCVTPS | FP64, |
| FCVTPS_xd = FCVTPS | SixtyFourBits | FP64, |
| FCVTPU = FPIntegerConvertFixed | 0x00090000, |
| FCVTPU_ws = FCVTPU, |
| FCVTPU_xs = FCVTPU | SixtyFourBits, |
| FCVTPU_wd = FCVTPU | FP64, |
| FCVTPU_xd = FCVTPU | SixtyFourBits | FP64, |
| FCVTMS = FPIntegerConvertFixed | 0x00100000, |
| FCVTMS_ws = FCVTMS, |
| FCVTMS_xs = FCVTMS | SixtyFourBits, |
| FCVTMS_wd = FCVTMS | FP64, |
| FCVTMS_xd = FCVTMS | SixtyFourBits | FP64, |
| FCVTMU = FPIntegerConvertFixed | 0x00110000, |
| FCVTMU_ws = FCVTMU, |
| FCVTMU_xs = FCVTMU | SixtyFourBits, |
| FCVTMU_wd = FCVTMU | FP64, |
| FCVTMU_xd = FCVTMU | SixtyFourBits | FP64, |
| FCVTZS = FPIntegerConvertFixed | 0x00180000, |
| FCVTZS_ws = FCVTZS, |
| FCVTZS_xs = FCVTZS | SixtyFourBits, |
| FCVTZS_wd = FCVTZS | FP64, |
| FCVTZS_xd = FCVTZS | SixtyFourBits | FP64, |
| FCVTZU = FPIntegerConvertFixed | 0x00190000, |
| FCVTZU_ws = FCVTZU, |
| FCVTZU_xs = FCVTZU | SixtyFourBits, |
| FCVTZU_wd = FCVTZU | FP64, |
| FCVTZU_xd = FCVTZU | SixtyFourBits | FP64, |
| SCVTF = FPIntegerConvertFixed | 0x00020000, |
| SCVTF_sw = SCVTF, |
| SCVTF_sx = SCVTF | SixtyFourBits, |
| SCVTF_dw = SCVTF | FP64, |
| SCVTF_dx = SCVTF | SixtyFourBits | FP64, |
| UCVTF = FPIntegerConvertFixed | 0x00030000, |
| UCVTF_sw = UCVTF, |
| UCVTF_sx = UCVTF | SixtyFourBits, |
| UCVTF_dw = UCVTF | FP64, |
| UCVTF_dx = UCVTF | SixtyFourBits | FP64, |
| FCVTAS = FPIntegerConvertFixed | 0x00040000, |
| FCVTAS_ws = FCVTAS, |
| FCVTAS_xs = FCVTAS | SixtyFourBits, |
| FCVTAS_wd = FCVTAS | FP64, |
| FCVTAS_xd = FCVTAS | SixtyFourBits | FP64, |
| FCVTAU = FPIntegerConvertFixed | 0x00050000, |
| FCVTAU_ws = FCVTAU, |
| FCVTAU_xs = FCVTAU | SixtyFourBits, |
| FCVTAU_wd = FCVTAU | FP64, |
| FCVTAU_xd = FCVTAU | SixtyFourBits | FP64, |
| FMOV_ws = FPIntegerConvertFixed | 0x00060000, |
| FMOV_sw = FPIntegerConvertFixed | 0x00070000, |
| FMOV_xd = FMOV_ws | SixtyFourBits | FP64, |
| FMOV_dx = FMOV_sw | SixtyFourBits | FP64, |
| FMOV_d1_x = FPIntegerConvertFixed | SixtyFourBits | 0x008F0000, |
| FMOV_x_d1 = FPIntegerConvertFixed | SixtyFourBits | 0x008E0000, |
| FJCVTZS = FPIntegerConvertFixed | FP64 | 0x001E0000 |
| }; |
| |
| // Conversion between fixed point and floating point. |
| enum FPFixedPointConvertOp : uint32_t { |
| FPFixedPointConvertFixed = 0x1E000000, |
| FPFixedPointConvertFMask = 0x5F200000, |
| FPFixedPointConvertMask = 0xFFFF0000, |
| FCVTZS_fixed = FPFixedPointConvertFixed | 0x00180000, |
| FCVTZS_ws_fixed = FCVTZS_fixed, |
| FCVTZS_xs_fixed = FCVTZS_fixed | SixtyFourBits, |
| FCVTZS_wd_fixed = FCVTZS_fixed | FP64, |
| FCVTZS_xd_fixed = FCVTZS_fixed | SixtyFourBits | FP64, |
| FCVTZU_fixed = FPFixedPointConvertFixed | 0x00190000, |
| FCVTZU_ws_fixed = FCVTZU_fixed, |
| FCVTZU_xs_fixed = FCVTZU_fixed | SixtyFourBits, |
| FCVTZU_wd_fixed = FCVTZU_fixed | FP64, |
| FCVTZU_xd_fixed = FCVTZU_fixed | SixtyFourBits | FP64, |
| SCVTF_fixed = FPFixedPointConvertFixed | 0x00020000, |
| SCVTF_sw_fixed = SCVTF_fixed, |
| SCVTF_sx_fixed = SCVTF_fixed | SixtyFourBits, |
| SCVTF_dw_fixed = SCVTF_fixed | FP64, |
| SCVTF_dx_fixed = SCVTF_fixed | SixtyFourBits | FP64, |
| UCVTF_fixed = FPFixedPointConvertFixed | 0x00030000, |
| UCVTF_sw_fixed = UCVTF_fixed, |
| UCVTF_sx_fixed = UCVTF_fixed | SixtyFourBits, |
| UCVTF_dw_fixed = UCVTF_fixed | FP64, |
| UCVTF_dx_fixed = UCVTF_fixed | SixtyFourBits | FP64 |
| }; |
| |
| // NEON instructions with two register operands. |
| enum NEON2RegMiscOp : uint32_t { |
| NEON2RegMiscFixed = 0x0E200800, |
| NEON2RegMiscFMask = 0x9F3E0C00, |
| NEON2RegMiscMask = 0xBF3FFC00, |
| NEON2RegMiscUBit = 0x20000000, |
| NEON_REV64 = NEON2RegMiscFixed | 0x00000000, |
| NEON_REV32 = NEON2RegMiscFixed | 0x20000000, |
| NEON_REV16 = NEON2RegMiscFixed | 0x00001000, |
| NEON_SADDLP = NEON2RegMiscFixed | 0x00002000, |
| NEON_UADDLP = NEON_SADDLP | NEON2RegMiscUBit, |
| NEON_SUQADD = NEON2RegMiscFixed | 0x00003000, |
| NEON_USQADD = NEON_SUQADD | NEON2RegMiscUBit, |
| NEON_CLS = NEON2RegMiscFixed | 0x00004000, |
| NEON_CLZ = NEON2RegMiscFixed | 0x20004000, |
| NEON_CNT = NEON2RegMiscFixed | 0x00005000, |
| NEON_RBIT_NOT = NEON2RegMiscFixed | 0x20005000, |
| NEON_SADALP = NEON2RegMiscFixed | 0x00006000, |
| NEON_UADALP = NEON_SADALP | NEON2RegMiscUBit, |
| NEON_SQABS = NEON2RegMiscFixed | 0x00007000, |
| NEON_SQNEG = NEON2RegMiscFixed | 0x20007000, |
| NEON_CMGT_zero = NEON2RegMiscFixed | 0x00008000, |
| NEON_CMGE_zero = NEON2RegMiscFixed | 0x20008000, |
| NEON_CMEQ_zero = NEON2RegMiscFixed | 0x00009000, |
| NEON_CMLE_zero = NEON2RegMiscFixed | 0x20009000, |
| NEON_CMLT_zero = NEON2RegMiscFixed | 0x0000A000, |
| NEON_ABS = NEON2RegMiscFixed | 0x0000B000, |
| NEON_NEG = NEON2RegMiscFixed | 0x2000B000, |
| NEON_XTN = NEON2RegMiscFixed | 0x00012000, |
| NEON_SQXTUN = NEON2RegMiscFixed | 0x20012000, |
| NEON_SHLL = NEON2RegMiscFixed | 0x20013000, |
| NEON_SQXTN = NEON2RegMiscFixed | 0x00014000, |
| NEON_UQXTN = NEON_SQXTN | NEON2RegMiscUBit, |
| |
| NEON2RegMiscOpcode = 0x0001F000, |
| NEON_RBIT_NOT_opcode = NEON_RBIT_NOT & NEON2RegMiscOpcode, |
| NEON_NEG_opcode = NEON_NEG & NEON2RegMiscOpcode, |
| NEON_XTN_opcode = NEON_XTN & NEON2RegMiscOpcode, |
| NEON_UQXTN_opcode = NEON_UQXTN & NEON2RegMiscOpcode, |
| |
| // These instructions use only one bit of the size field. The other bit is |
| // used to distinguish between instructions. |
| NEON2RegMiscFPMask = NEON2RegMiscMask | 0x00800000, |
| NEON_FABS = NEON2RegMiscFixed | 0x0080F000, |
| NEON_FNEG = NEON2RegMiscFixed | 0x2080F000, |
| NEON_FCVTN = NEON2RegMiscFixed | 0x00016000, |
| NEON_FCVTXN = NEON2RegMiscFixed | 0x20016000, |
| NEON_FCVTL = NEON2RegMiscFixed | 0x00017000, |
| NEON_FRINTN = NEON2RegMiscFixed | 0x00018000, |
| NEON_FRINTA = NEON2RegMiscFixed | 0x20018000, |
| NEON_FRINTP = NEON2RegMiscFixed | 0x00818000, |
| NEON_FRINTM = NEON2RegMiscFixed | 0x00019000, |
| NEON_FRINTX = NEON2RegMiscFixed | 0x20019000, |
| NEON_FRINTZ = NEON2RegMiscFixed | 0x00819000, |
| NEON_FRINTI = NEON2RegMiscFixed | 0x20819000, |
| NEON_FCVTNS = NEON2RegMiscFixed | 0x0001A000, |
| NEON_FCVTNU = NEON_FCVTNS | NEON2RegMiscUBit, |
| NEON_FCVTPS = NEON2RegMiscFixed | 0x0081A000, |
| NEON_FCVTPU = NEON_FCVTPS | NEON2RegMiscUBit, |
| NEON_FCVTMS = NEON2RegMiscFixed | 0x0001B000, |
| NEON_FCVTMU = NEON_FCVTMS | NEON2RegMiscUBit, |
| NEON_FCVTZS = NEON2RegMiscFixed | 0x0081B000, |
| NEON_FCVTZU = NEON_FCVTZS | NEON2RegMiscUBit, |
| NEON_FCVTAS = NEON2RegMiscFixed | 0x0001C000, |
| NEON_FCVTAU = NEON_FCVTAS | NEON2RegMiscUBit, |
| NEON_FSQRT = NEON2RegMiscFixed | 0x2081F000, |
| NEON_SCVTF = NEON2RegMiscFixed | 0x0001D000, |
| NEON_UCVTF = NEON_SCVTF | NEON2RegMiscUBit, |
| NEON_URSQRTE = NEON2RegMiscFixed | 0x2081C000, |
| NEON_URECPE = NEON2RegMiscFixed | 0x0081C000, |
| NEON_FRSQRTE = NEON2RegMiscFixed | 0x2081D000, |
| NEON_FRECPE = NEON2RegMiscFixed | 0x0081D000, |
| NEON_FCMGT_zero = NEON2RegMiscFixed | 0x0080C000, |
| NEON_FCMGE_zero = NEON2RegMiscFixed | 0x2080C000, |
| NEON_FCMEQ_zero = NEON2RegMiscFixed | 0x0080D000, |
| NEON_FCMLE_zero = NEON2RegMiscFixed | 0x2080D000, |
| NEON_FCMLT_zero = NEON2RegMiscFixed | 0x0080E000, |
| |
| NEON_FCVTL_opcode = NEON_FCVTL & NEON2RegMiscOpcode, |
| NEON_FCVTN_opcode = NEON_FCVTN & NEON2RegMiscOpcode |
| }; |
| |
| // NEON instructions with three same-type operands. |
| enum NEON3SameOp : uint32_t { |
| NEON3SameFixed = 0x0E200400, |
| NEON3SameFMask = 0x9F200400, |
| NEON3SameMask = 0xBF20FC00, |
| NEON3SameUBit = 0x20000000, |
| NEON_ADD = NEON3SameFixed | 0x00008000, |
| NEON_ADDP = NEON3SameFixed | 0x0000B800, |
| NEON_SHADD = NEON3SameFixed | 0x00000000, |
| NEON_SHSUB = NEON3SameFixed | 0x00002000, |
| NEON_SRHADD = NEON3SameFixed | 0x00001000, |
| NEON_CMEQ = NEON3SameFixed | NEON3SameUBit | 0x00008800, |
| NEON_CMGE = NEON3SameFixed | 0x00003800, |
| NEON_CMGT = NEON3SameFixed | 0x00003000, |
| NEON_CMHI = NEON3SameFixed | NEON3SameUBit | NEON_CMGT, |
| NEON_CMHS = NEON3SameFixed | NEON3SameUBit | NEON_CMGE, |
| NEON_CMTST = NEON3SameFixed | 0x00008800, |
| NEON_MLA = NEON3SameFixed | 0x00009000, |
| NEON_MLS = NEON3SameFixed | 0x20009000, |
| NEON_MUL = NEON3SameFixed | 0x00009800, |
| NEON_PMUL = NEON3SameFixed | 0x20009800, |
| NEON_SRSHL = NEON3SameFixed | 0x00005000, |
| NEON_SQSHL = NEON3SameFixed | 0x00004800, |
| NEON_SQRSHL = NEON3SameFixed | 0x00005800, |
| NEON_SSHL = NEON3SameFixed | 0x00004000, |
| NEON_SMAX = NEON3SameFixed | 0x00006000, |
| NEON_SMAXP = NEON3SameFixed | 0x0000A000, |
| NEON_SMIN = NEON3SameFixed | 0x00006800, |
| NEON_SMINP = NEON3SameFixed | 0x0000A800, |
| NEON_SABD = NEON3SameFixed | 0x00007000, |
| NEON_SABA = NEON3SameFixed | 0x00007800, |
| NEON_UABD = NEON3SameFixed | NEON3SameUBit | NEON_SABD, |
| NEON_UABA = NEON3SameFixed | NEON3SameUBit | NEON_SABA, |
| NEON_SQADD = NEON3SameFixed | 0x00000800, |
| NEON_SQSUB = NEON3SameFixed | 0x00002800, |
| NEON_SUB = NEON3SameFixed | NEON3SameUBit | 0x00008000, |
| NEON_UHADD = NEON3SameFixed | NEON3SameUBit | NEON_SHADD, |
| NEON_UHSUB = NEON3SameFixed | NEON3SameUBit | NEON_SHSUB, |
| NEON_URHADD = NEON3SameFixed | NEON3SameUBit | NEON_SRHADD, |
| NEON_UMAX = NEON3SameFixed | NEON3SameUBit | NEON_SMAX, |
| NEON_UMAXP = NEON3SameFixed | NEON3SameUBit | NEON_SMAXP, |
| NEON_UMIN = NEON3SameFixed | NEON3SameUBit | NEON_SMIN, |
| NEON_UMINP = NEON3SameFixed | NEON3SameUBit | NEON_SMINP, |
| NEON_URSHL = NEON3SameFixed | NEON3SameUBit | NEON_SRSHL, |
| NEON_UQADD = NEON3SameFixed | NEON3SameUBit | NEON_SQADD, |
| NEON_UQRSHL = NEON3SameFixed | NEON3SameUBit | NEON_SQRSHL, |
| NEON_UQSHL = NEON3SameFixed | NEON3SameUBit | NEON_SQSHL, |
| NEON_UQSUB = NEON3SameFixed | NEON3SameUBit | NEON_SQSUB, |
| NEON_USHL = NEON3SameFixed | NEON3SameUBit | NEON_SSHL, |
| NEON_SQDMULH = NEON3SameFixed | 0x0000B000, |
| NEON_SQRDMULH = NEON3SameFixed | 0x2000B000, |
| |
| // NEON floating point instructions with three same-type operands. |
| NEON3SameFPFixed = NEON3SameFixed | 0x0000C000, |
| NEON3SameFPFMask = NEON3SameFMask | 0x0000C000, |
| NEON3SameFPMask = NEON3SameMask | 0x00800000, |
| NEON_FADD = NEON3SameFixed | 0x0000D000, |
| NEON_FSUB = NEON3SameFixed | 0x0080D000, |
| NEON_FMUL = NEON3SameFixed | 0x2000D800, |
| NEON_FDIV = NEON3SameFixed | 0x2000F800, |
| NEON_FMAX = NEON3SameFixed | 0x0000F000, |
| NEON_FMAXNM = NEON3SameFixed | 0x0000C000, |
| NEON_FMAXP = NEON3SameFixed | 0x2000F000, |
| NEON_FMAXNMP = NEON3SameFixed | 0x2000C000, |
| NEON_FMIN = NEON3SameFixed | 0x0080F000, |
| NEON_FMINNM = NEON3SameFixed | 0x0080C000, |
| NEON_FMINP = NEON3SameFixed | 0x2080F000, |
| NEON_FMINNMP = NEON3SameFixed | 0x2080C000, |
| NEON_FMLA = NEON3SameFixed | 0x0000C800, |
| NEON_FMLS = NEON3SameFixed | 0x0080C800, |
| NEON_FMULX = NEON3SameFixed | 0x0000D800, |
| NEON_FRECPS = NEON3SameFixed | 0x0000F800, |
| NEON_FRSQRTS = NEON3SameFixed | 0x0080F800, |
| NEON_FABD = NEON3SameFixed | 0x2080D000, |
| NEON_FADDP = NEON3SameFixed | 0x2000D000, |
| NEON_FCMEQ = NEON3SameFixed | 0x0000E000, |
| NEON_FCMGE = NEON3SameFixed | 0x2000E000, |
| NEON_FCMGT = NEON3SameFixed | 0x2080E000, |
| NEON_FACGE = NEON3SameFixed | 0x2000E800, |
| NEON_FACGT = NEON3SameFixed | 0x2080E800, |
| |
| // NEON logical instructions with three same-type operands. |
| NEON3SameLogicalFixed = NEON3SameFixed | 0x00001800, |
| NEON3SameLogicalFMask = NEON3SameFMask | 0x0000F800, |
| NEON3SameLogicalMask = 0xBFE0FC00, |
| NEON3SameLogicalFormatMask = NEON_Q, |
| NEON_AND = NEON3SameLogicalFixed | 0x00000000, |
| NEON_ORR = NEON3SameLogicalFixed | 0x00A00000, |
| NEON_ORN = NEON3SameLogicalFixed | 0x00C00000, |
| NEON_EOR = NEON3SameLogicalFixed | 0x20000000, |
| NEON_BIC = NEON3SameLogicalFixed | 0x00400000, |
| NEON_BIF = NEON3SameLogicalFixed | 0x20C00000, |
| NEON_BIT = NEON3SameLogicalFixed | 0x20800000, |
| NEON_BSL = NEON3SameLogicalFixed | 0x20400000 |
| }; |
| |
| // NEON instructions with three different-type operands. |
| enum NEON3DifferentOp : uint32_t { |
| NEON3DifferentFixed = 0x0E200000, |
| NEON3DifferentFMask = 0x9F200C00, |
| NEON3DifferentMask = 0xFF20FC00, |
| NEON_ADDHN = NEON3DifferentFixed | 0x00004000, |
| NEON_ADDHN2 = NEON_ADDHN | NEON_Q, |
| NEON_PMULL = NEON3DifferentFixed | 0x0000E000, |
| NEON_PMULL2 = NEON_PMULL | NEON_Q, |
| NEON_RADDHN = NEON3DifferentFixed | 0x20004000, |
| NEON_RADDHN2 = NEON_RADDHN | NEON_Q, |
| NEON_RSUBHN = NEON3DifferentFixed | 0x20006000, |
| NEON_RSUBHN2 = NEON_RSUBHN | NEON_Q, |
| NEON_SABAL = NEON3DifferentFixed | 0x00005000, |
| NEON_SABAL2 = NEON_SABAL | NEON_Q, |
| NEON_SABDL = NEON3DifferentFixed | 0x00007000, |
| NEON_SABDL2 = NEON_SABDL | NEON_Q, |
| NEON_SADDL = NEON3DifferentFixed | 0x00000000, |
| NEON_SADDL2 = NEON_SADDL | NEON_Q, |
| NEON_SADDW = NEON3DifferentFixed | 0x00001000, |
| NEON_SADDW2 = NEON_SADDW | NEON_Q, |
| NEON_SMLAL = NEON3DifferentFixed | 0x00008000, |
| NEON_SMLAL2 = NEON_SMLAL | NEON_Q, |
| NEON_SMLSL = NEON3DifferentFixed | 0x0000A000, |
| NEON_SMLSL2 = NEON_SMLSL | NEON_Q, |
| NEON_SMULL = NEON3DifferentFixed | 0x0000C000, |
| NEON_SMULL2 = NEON_SMULL | NEON_Q, |
| NEON_SSUBL = NEON3DifferentFixed | 0x00002000, |
| NEON_SSUBL2 = NEON_SSUBL | NEON_Q, |
| NEON_SSUBW = NEON3DifferentFixed | 0x00003000, |
| NEON_SSUBW2 = NEON_SSUBW | NEON_Q, |
| NEON_SQDMLAL = NEON3DifferentFixed | 0x00009000, |
| NEON_SQDMLAL2 = NEON_SQDMLAL | NEON_Q, |
| NEON_SQDMLSL = NEON3DifferentFixed | 0x0000B000, |
| NEON_SQDMLSL2 = NEON_SQDMLSL | NEON_Q, |
| NEON_SQDMULL = NEON3DifferentFixed | 0x0000D000, |
| NEON_SQDMULL2 = NEON_SQDMULL | NEON_Q, |
| NEON_SUBHN = NEON3DifferentFixed | 0x00006000, |
| NEON_SUBHN2 = NEON_SUBHN | NEON_Q, |
| NEON_UABAL = NEON_SABAL | NEON3SameUBit, |
| NEON_UABAL2 = NEON_UABAL | NEON_Q, |
| NEON_UABDL = NEON_SABDL | NEON3SameUBit, |
| NEON_UABDL2 = NEON_UABDL | NEON_Q, |
| NEON_UADDL = NEON_SADDL | NEON3SameUBit, |
| NEON_UADDL2 = NEON_UADDL | NEON_Q, |
| NEON_UADDW = NEON_SADDW | NEON3SameUBit, |
| NEON_UADDW2 = NEON_UADDW | NEON_Q, |
| NEON_UMLAL = NEON_SMLAL | NEON3SameUBit, |
| NEON_UMLAL2 = NEON_UMLAL | NEON_Q, |
| NEON_UMLSL = NEON_SMLSL | NEON3SameUBit, |
| NEON_UMLSL2 = NEON_UMLSL | NEON_Q, |
| NEON_UMULL = NEON_SMULL | NEON3SameUBit, |
| NEON_UMULL2 = NEON_UMULL | NEON_Q, |
| NEON_USUBL = NEON_SSUBL | NEON3SameUBit, |
| NEON_USUBL2 = NEON_USUBL | NEON_Q, |
| NEON_USUBW = NEON_SSUBW | NEON3SameUBit, |
| NEON_USUBW2 = NEON_USUBW | NEON_Q |
| }; |
| |
| // NEON instructions operating across vectors. |
| enum NEONAcrossLanesOp : uint32_t { |
| NEONAcrossLanesFixed = 0x0E300800, |
| NEONAcrossLanesFMask = 0x9F3E0C00, |
| NEONAcrossLanesMask = 0xBF3FFC00, |
| NEON_ADDV = NEONAcrossLanesFixed | 0x0001B000, |
| NEON_SADDLV = NEONAcrossLanesFixed | 0x00003000, |
| NEON_UADDLV = NEONAcrossLanesFixed | 0x20003000, |
| NEON_SMAXV = NEONAcrossLanesFixed | 0x0000A000, |
| NEON_SMINV = NEONAcrossLanesFixed | 0x0001A000, |
| NEON_UMAXV = NEONAcrossLanesFixed | 0x2000A000, |
| NEON_UMINV = NEONAcrossLanesFixed | 0x2001A000, |
| |
| // NEON floating point across instructions. |
| NEONAcrossLanesFPFixed = NEONAcrossLanesFixed | 0x0000C000, |
| NEONAcrossLanesFPFMask = NEONAcrossLanesFMask | 0x0000C000, |
| NEONAcrossLanesFPMask = NEONAcrossLanesMask | 0x00800000, |
| |
| NEON_FMAXV = NEONAcrossLanesFPFixed | 0x2000F000, |
| NEON_FMINV = NEONAcrossLanesFPFixed | 0x2080F000, |
| NEON_FMAXNMV = NEONAcrossLanesFPFixed | 0x2000C000, |
| NEON_FMINNMV = NEONAcrossLanesFPFixed | 0x2080C000 |
| }; |
| |
| // NEON instructions with indexed element operand. |
| enum NEONByIndexedElementOp : uint32_t { |
| NEONByIndexedElementFixed = 0x0F000000, |
| NEONByIndexedElementFMask = 0x9F000400, |
| NEONByIndexedElementMask = 0xBF00F400, |
| NEON_MUL_byelement = NEONByIndexedElementFixed | 0x00008000, |
| NEON_MLA_byelement = NEONByIndexedElementFixed | 0x20000000, |
| NEON_MLS_byelement = NEONByIndexedElementFixed | 0x20004000, |
| NEON_SMULL_byelement = NEONByIndexedElementFixed | 0x0000A000, |
| NEON_SMLAL_byelement = NEONByIndexedElementFixed | 0x00002000, |
| NEON_SMLSL_byelement = NEONByIndexedElementFixed | 0x00006000, |
| NEON_UMULL_byelement = NEONByIndexedElementFixed | 0x2000A000, |
| NEON_UMLAL_byelement = NEONByIndexedElementFixed | 0x20002000, |
| NEON_UMLSL_byelement = NEONByIndexedElementFixed | 0x20006000, |
| NEON_SQDMULL_byelement = NEONByIndexedElementFixed | 0x0000B000, |
| NEON_SQDMLAL_byelement = NEONByIndexedElementFixed | 0x00003000, |
| NEON_SQDMLSL_byelement = NEONByIndexedElementFixed | 0x00007000, |
| NEON_SQDMULH_byelement = NEONByIndexedElementFixed | 0x0000C000, |
| NEON_SQRDMULH_byelement = NEONByIndexedElementFixed | 0x0000D000, |
| |
| // Floating point instructions. |
| NEONByIndexedElementFPFixed = NEONByIndexedElementFixed | 0x00800000, |
| NEONByIndexedElementFPMask = NEONByIndexedElementMask | 0x00800000, |
| NEON_FMLA_byelement = NEONByIndexedElementFPFixed | 0x00001000, |
| NEON_FMLS_byelement = NEONByIndexedElementFPFixed | 0x00005000, |
| NEON_FMUL_byelement = NEONByIndexedElementFPFixed | 0x00009000, |
| NEON_FMULX_byelement = NEONByIndexedElementFPFixed | 0x20009000 |
| }; |
| |
| // NEON modified immediate. |
| enum NEONModifiedImmediateOp : uint32_t { |
| NEONModifiedImmediateFixed = 0x0F000400, |
| NEONModifiedImmediateFMask = 0x9FF80400, |
| NEONModifiedImmediateOpBit = 0x20000000, |
| NEONModifiedImmediate_MOVI = NEONModifiedImmediateFixed | 0x00000000, |
| NEONModifiedImmediate_MVNI = NEONModifiedImmediateFixed | 0x20000000, |
| NEONModifiedImmediate_ORR = NEONModifiedImmediateFixed | 0x00001000, |
| NEONModifiedImmediate_BIC = NEONModifiedImmediateFixed | 0x20001000 |
| }; |
| |
| // NEON extract. |
| enum NEONExtractOp : uint32_t { |
| NEONExtractFixed = 0x2E000000, |
| NEONExtractFMask = 0xBF208400, |
| NEONExtractMask = 0xBFE08400, |
| NEON_EXT = NEONExtractFixed | 0x00000000 |
| }; |
| |
| enum NEONLoadStoreMultiOp : uint32_t { |
| NEONLoadStoreMultiL = 0x00400000, |
| NEONLoadStoreMulti1_1v = 0x00007000, |
| NEONLoadStoreMulti1_2v = 0x0000A000, |
| NEONLoadStoreMulti1_3v = 0x00006000, |
| NEONLoadStoreMulti1_4v = 0x00002000, |
| NEONLoadStoreMulti2 = 0x00008000, |
| NEONLoadStoreMulti3 = 0x00004000, |
| NEONLoadStoreMulti4 = 0x00000000 |
| }; |
| |
| // NEON load/store multiple structures. |
| enum NEONLoadStoreMultiStructOp : uint32_t { |
| NEONLoadStoreMultiStructFixed = 0x0C000000, |
| NEONLoadStoreMultiStructFMask = 0xBFBF0000, |
| NEONLoadStoreMultiStructMask = 0xBFFFF000, |
| NEONLoadStoreMultiStructStore = NEONLoadStoreMultiStructFixed, |
| NEONLoadStoreMultiStructLoad = |
| NEONLoadStoreMultiStructFixed | NEONLoadStoreMultiL, |
| NEON_LD1_1v = NEONLoadStoreMultiStructLoad | NEONLoadStoreMulti1_1v, |
| NEON_LD1_2v = NEONLoadStoreMultiStructLoad | NEONLoadStoreMulti1_2v, |
| NEON_LD1_3v = NEONLoadStoreMultiStructLoad | NEONLoadStoreMulti1_3v, |
| NEON_LD1_4v = NEONLoadStoreMultiStructLoad | NEONLoadStoreMulti1_4v, |
| NEON_LD2 = NEONLoadStoreMultiStructLoad | NEONLoadStoreMulti2, |
| NEON_LD3 = NEONLoadStoreMultiStructLoad | NEONLoadStoreMulti3, |
| NEON_LD4 = NEONLoadStoreMultiStructLoad | NEONLoadStoreMulti4, |
| NEON_ST1_1v = NEONLoadStoreMultiStructStore | NEONLoadStoreMulti1_1v, |
| NEON_ST1_2v = NEONLoadStoreMultiStructStore | NEONLoadStoreMulti1_2v, |
| NEON_ST1_3v = NEONLoadStoreMultiStructStore | NEONLoadStoreMulti1_3v, |
| NEON_ST1_4v = NEONLoadStoreMultiStructStore | NEONLoadStoreMulti1_4v, |
| NEON_ST2 = NEONLoadStoreMultiStructStore | NEONLoadStoreMulti2, |
| NEON_ST3 = NEONLoadStoreMultiStructStore | NEONLoadStoreMulti3, |
| NEON_ST4 = NEONLoadStoreMultiStructStore | NEONLoadStoreMulti4 |
| }; |
| |
| // NEON load/store multiple structures with post-index addressing. |
| enum NEONLoadStoreMultiStructPostIndexOp : uint32_t { |
| NEONLoadStoreMultiStructPostIndexFixed = 0x0C800000, |
| NEONLoadStoreMultiStructPostIndexFMask = 0xBFA00000, |
| NEONLoadStoreMultiStructPostIndexMask = 0xBFE0F000, |
| NEONLoadStoreMultiStructPostIndex = 0x00800000, |
| NEON_LD1_1v_post = NEON_LD1_1v | NEONLoadStoreMultiStructPostIndex, |
| NEON_LD1_2v_post = NEON_LD1_2v | NEONLoadStoreMultiStructPostIndex, |
| NEON_LD1_3v_post = NEON_LD1_3v | NEONLoadStoreMultiStructPostIndex, |
| NEON_LD1_4v_post = NEON_LD1_4v | NEONLoadStoreMultiStructPostIndex, |
| NEON_LD2_post = NEON_LD2 | NEONLoadStoreMultiStructPostIndex, |
| NEON_LD3_post = NEON_LD3 | NEONLoadStoreMultiStructPostIndex, |
| NEON_LD4_post = NEON_LD4 | NEONLoadStoreMultiStructPostIndex, |
| NEON_ST1_1v_post = NEON_ST1_1v | NEONLoadStoreMultiStructPostIndex, |
| NEON_ST1_2v_post = NEON_ST1_2v | NEONLoadStoreMultiStructPostIndex, |
| NEON_ST1_3v_post = NEON_ST1_3v | NEONLoadStoreMultiStructPostIndex, |
| NEON_ST1_4v_post = NEON_ST1_4v | NEONLoadStoreMultiStructPostIndex, |
| NEON_ST2_post = NEON_ST2 | NEONLoadStoreMultiStructPostIndex, |
| NEON_ST3_post = NEON_ST3 | NEONLoadStoreMultiStructPostIndex, |
| NEON_ST4_post = NEON_ST4 | NEONLoadStoreMultiStructPostIndex |
| }; |
| |
| enum NEONLoadStoreSingleOp : uint32_t { |
| NEONLoadStoreSingle1 = 0x00000000, |
| NEONLoadStoreSingle2 = 0x00200000, |
| NEONLoadStoreSingle3 = 0x00002000, |
| NEONLoadStoreSingle4 = 0x00202000, |
| NEONLoadStoreSingleL = 0x00400000, |
| NEONLoadStoreSingle_b = 0x00000000, |
| NEONLoadStoreSingle_h = 0x00004000, |
| NEONLoadStoreSingle_s = 0x00008000, |
| NEONLoadStoreSingle_d = 0x00008400, |
| NEONLoadStoreSingleAllLanes = 0x0000C000, |
| NEONLoadStoreSingleLenMask = 0x00202000 |
| }; |
| |
| // NEON load/store single structure. |
| enum NEONLoadStoreSingleStructOp : uint32_t { |
| NEONLoadStoreSingleStructFixed = 0x0D000000, |
| NEONLoadStoreSingleStructFMask = 0xBF9F0000, |
| NEONLoadStoreSingleStructMask = 0xBFFFE000, |
| NEONLoadStoreSingleStructStore = NEONLoadStoreSingleStructFixed, |
| NEONLoadStoreSingleStructLoad = |
| NEONLoadStoreSingleStructFixed | NEONLoadStoreSingleL, |
| NEONLoadStoreSingleStructLoad1 = |
| NEONLoadStoreSingle1 | NEONLoadStoreSingleStructLoad, |
| NEONLoadStoreSingleStructLoad2 = |
| NEONLoadStoreSingle2 | NEONLoadStoreSingleStructLoad, |
| NEONLoadStoreSingleStructLoad3 = |
| NEONLoadStoreSingle3 | NEONLoadStoreSingleStructLoad, |
| NEONLoadStoreSingleStructLoad4 = |
| NEONLoadStoreSingle4 | NEONLoadStoreSingleStructLoad, |
| NEONLoadStoreSingleStructStore1 = |
| NEONLoadStoreSingle1 | NEONLoadStoreSingleStructFixed, |
| NEONLoadStoreSingleStructStore2 = |
| NEONLoadStoreSingle2 | NEONLoadStoreSingleStructFixed, |
| NEONLoadStoreSingleStructStore3 = |
| NEONLoadStoreSingle3 | NEONLoadStoreSingleStructFixed, |
| NEONLoadStoreSingleStructStore4 = |
| NEONLoadStoreSingle4 | NEONLoadStoreSingleStructFixed, |
| NEON_LD1_b = NEONLoadStoreSingleStructLoad1 | NEONLoadStoreSingle_b, |
| NEON_LD1_h = NEONLoadStoreSingleStructLoad1 | NEONLoadStoreSingle_h, |
| NEON_LD1_s = NEONLoadStoreSingleStructLoad1 | NEONLoadStoreSingle_s, |
| NEON_LD1_d = NEONLoadStoreSingleStructLoad1 | NEONLoadStoreSingle_d, |
| NEON_LD1R = NEONLoadStoreSingleStructLoad1 | NEONLoadStoreSingleAllLanes, |
| NEON_ST1_b = NEONLoadStoreSingleStructStore1 | NEONLoadStoreSingle_b, |
| NEON_ST1_h = NEONLoadStoreSingleStructStore1 | NEONLoadStoreSingle_h, |
| NEON_ST1_s = NEONLoadStoreSingleStructStore1 | NEONLoadStoreSingle_s, |
| NEON_ST1_d = NEONLoadStoreSingleStructStore1 | NEONLoadStoreSingle_d, |
| |
| NEON_LD2_b = NEONLoadStoreSingleStructLoad2 | NEONLoadStoreSingle_b, |
| NEON_LD2_h = NEONLoadStoreSingleStructLoad2 | NEONLoadStoreSingle_h, |
| NEON_LD2_s = NEONLoadStoreSingleStructLoad2 | NEONLoadStoreSingle_s, |
| NEON_LD2_d = NEONLoadStoreSingleStructLoad2 | NEONLoadStoreSingle_d, |
| NEON_LD2R = NEONLoadStoreSingleStructLoad2 | NEONLoadStoreSingleAllLanes, |
| NEON_ST2_b = NEONLoadStoreSingleStructStore2 | NEONLoadStoreSingle_b, |
| NEON_ST2_h = NEONLoadStoreSingleStructStore2 | NEONLoadStoreSingle_h, |
| NEON_ST2_s = NEONLoadStoreSingleStructStore2 | NEONLoadStoreSingle_s, |
| NEON_ST2_d = NEONLoadStoreSingleStructStore2 | NEONLoadStoreSingle_d, |
| |
| NEON_LD3_b = NEONLoadStoreSingleStructLoad3 | NEONLoadStoreSingle_b, |
| NEON_LD3_h = NEONLoadStoreSingleStructLoad3 | NEONLoadStoreSingle_h, |
| NEON_LD3_s = NEONLoadStoreSingleStructLoad3 | NEONLoadStoreSingle_s, |
| NEON_LD3_d = NEONLoadStoreSingleStructLoad3 | NEONLoadStoreSingle_d, |
| NEON_LD3R = NEONLoadStoreSingleStructLoad3 | NEONLoadStoreSingleAllLanes, |
| NEON_ST3_b = NEONLoadStoreSingleStructStore3 | NEONLoadStoreSingle_b, |
| NEON_ST3_h = NEONLoadStoreSingleStructStore3 | NEONLoadStoreSingle_h, |
| NEON_ST3_s = NEONLoadStoreSingleStructStore3 | NEONLoadStoreSingle_s, |
| NEON_ST3_d = NEONLoadStoreSingleStructStore3 | NEONLoadStoreSingle_d, |
| |
| NEON_LD4_b = NEONLoadStoreSingleStructLoad4 | NEONLoadStoreSingle_b, |
| NEON_LD4_h = NEONLoadStoreSingleStructLoad4 | NEONLoadStoreSingle_h, |
| NEON_LD4_s = NEONLoadStoreSingleStructLoad4 | NEONLoadStoreSingle_s, |
| NEON_LD4_d = NEONLoadStoreSingleStructLoad4 | NEONLoadStoreSingle_d, |
| NEON_LD4R = NEONLoadStoreSingleStructLoad4 | NEONLoadStoreSingleAllLanes, |
| NEON_ST4_b = NEONLoadStoreSingleStructStore4 | NEONLoadStoreSingle_b, |
| NEON_ST4_h = NEONLoadStoreSingleStructStore4 | NEONLoadStoreSingle_h, |
| NEON_ST4_s = NEONLoadStoreSingleStructStore4 | NEONLoadStoreSingle_s, |
| NEON_ST4_d = NEONLoadStoreSingleStructStore4 | NEONLoadStoreSingle_d |
| }; |
| |
| // NEON load/store single structure with post-index addressing. |
| enum NEONLoadStoreSingleStructPostIndexOp : uint32_t { |
| NEONLoadStoreSingleStructPostIndexFixed = 0x0D800000, |
| NEONLoadStoreSingleStructPostIndexFMask = 0xBF800000, |
| NEONLoadStoreSingleStructPostIndexMask = 0xBFE0E000, |
| NEONLoadStoreSingleStructPostIndex = 0x00800000, |
| NEON_LD1_b_post = NEON_LD1_b | NEONLoadStoreSingleStructPostIndex, |
| NEON_LD1_h_post = NEON_LD1_h | NEONLoadStoreSingleStructPostIndex, |
| NEON_LD1_s_post = NEON_LD1_s | NEONLoadStoreSingleStructPostIndex, |
| NEON_LD1_d_post = NEON_LD1_d | NEONLoadStoreSingleStructPostIndex, |
| NEON_LD1R_post = NEON_LD1R | NEONLoadStoreSingleStructPostIndex, |
| NEON_ST1_b_post = NEON_ST1_b | NEONLoadStoreSingleStructPostIndex, |
| NEON_ST1_h_post = NEON_ST1_h | NEONLoadStoreSingleStructPostIndex, |
| NEON_ST1_s_post = NEON_ST1_s | NEONLoadStoreSingleStructPostIndex, |
| NEON_ST1_d_post = NEON_ST1_d | NEONLoadStoreSingleStructPostIndex, |
| |
| NEON_LD2_b_post = NEON_LD2_b | NEONLoadStoreSingleStructPostIndex, |
| NEON_LD2_h_post = NEON_LD2_h | NEONLoadStoreSingleStructPostIndex, |
| NEON_LD2_s_post = NEON_LD2_s | NEONLoadStoreSingleStructPostIndex, |
| NEON_LD2_d_post = NEON_LD2_d | NEONLoadStoreSingleStructPostIndex, |
| NEON_LD2R_post = NEON_LD2R | NEONLoadStoreSingleStructPostIndex, |
| NEON_ST2_b_post = NEON_ST2_b | NEONLoadStoreSingleStructPostIndex, |
| NEON_ST2_h_post = NEON_ST2_h | NEONLoadStoreSingleStructPostIndex, |
| NEON_ST2_s_post = NEON_ST2_s | NEONLoadStoreSingleStructPostIndex, |
| NEON_ST2_d_post = NEON_ST2_d | NEONLoadStoreSingleStructPostIndex, |
| |
| NEON_LD3_b_post = NEON_LD3_b | NEONLoadStoreSingleStructPostIndex, |
| NEON_LD3_h_post = NEON_LD3_h | NEONLoadStoreSingleStructPostIndex, |
| NEON_LD3_s_post = NEON_LD3_s | NEONLoadStoreSingleStructPostIndex, |
| NEON_LD3_d_post = NEON_LD3_d | NEONLoadStoreSingleStructPostIndex, |
| NEON_LD3R_post = NEON_LD3R | NEONLoadStoreSingleStructPostIndex, |
| NEON_ST3_b_post = NEON_ST3_b | NEONLoadStoreSingleStructPostIndex, |
| NEON_ST3_h_post = NEON_ST3_h | NEONLoadStoreSingleStructPostIndex, |
| NEON_ST3_s_post = NEON_ST3_s | NEONLoadStoreSingleStructPostIndex, |
| NEON_ST3_d_post = NEON_ST3_d | NEONLoadStoreSingleStructPostIndex, |
| |
| NEON_LD4_b_post = NEON_LD4_b | NEONLoadStoreSingleStructPostIndex, |
| NEON_LD4_h_post = NEON_LD4_h | NEONLoadStoreSingleStructPostIndex, |
| NEON_LD4_s_post = NEON_LD4_s | NEONLoadStoreSingleStructPostIndex, |
| NEON_LD4_d_post = NEON_LD4_d | NEONLoadStoreSingleStructPostIndex, |
| NEON_LD4R_post = NEON_LD4R | NEONLoadStoreSingleStructPostIndex, |
| NEON_ST4_b_post = NEON_ST4_b | NEONLoadStoreSingleStructPostIndex, |
| NEON_ST4_h_post = NEON_ST4_h | NEONLoadStoreSingleStructPostIndex, |
| NEON_ST4_s_post = NEON_ST4_s | NEONLoadStoreSingleStructPostIndex, |
| NEON_ST4_d_post = NEON_ST4_d | NEONLoadStoreSingleStructPostIndex |
| }; |
| |
| // NEON register copy. |
| enum NEONCopyOp : uint32_t { |
| NEONCopyFixed = 0x0E000400, |
| NEONCopyFMask = 0x9FE08400, |
| NEONCopyMask = 0x3FE08400, |
| NEONCopyInsElementMask = NEONCopyMask | 0x40000000, |
| NEONCopyInsGeneralMask = NEONCopyMask | 0x40007800, |
| NEONCopyDupElementMask = NEONCopyMask | 0x20007800, |
| NEONCopyDupGeneralMask = NEONCopyDupElementMask, |
| NEONCopyUmovMask = NEONCopyMask | 0x20007800, |
| NEONCopySmovMask = NEONCopyMask | 0x20007800, |
| NEON_INS_ELEMENT = NEONCopyFixed | 0x60000000, |
| NEON_INS_GENERAL = NEONCopyFixed | 0x40001800, |
| NEON_DUP_ELEMENT = NEONCopyFixed | 0x00000000, |
| NEON_DUP_GENERAL = NEONCopyFixed | 0x00000800, |
| NEON_SMOV = NEONCopyFixed | 0x00002800, |
| NEON_UMOV = NEONCopyFixed | 0x00003800 |
| }; |
| |
| // NEON scalar instructions with indexed element operand. |
| enum NEONScalarByIndexedElementOp : uint32_t { |
| NEONScalarByIndexedElementFixed = 0x5F000000, |
| NEONScalarByIndexedElementFMask = 0xDF000400, |
| NEONScalarByIndexedElementMask = 0xFF00F400, |
| NEON_SQDMLAL_byelement_scalar = NEON_Q | NEONScalar | NEON_SQDMLAL_byelement, |
| NEON_SQDMLSL_byelement_scalar = NEON_Q | NEONScalar | NEON_SQDMLSL_byelement, |
| NEON_SQDMULL_byelement_scalar = NEON_Q | NEONScalar | NEON_SQDMULL_byelement, |
| NEON_SQDMULH_byelement_scalar = NEON_Q | NEONScalar | NEON_SQDMULH_byelement, |
| NEON_SQRDMULH_byelement_scalar = |
| NEON_Q | NEONScalar | NEON_SQRDMULH_byelement, |
| |
| // Floating point instructions. |
| NEONScalarByIndexedElementFPFixed = |
| NEONScalarByIndexedElementFixed | 0x00800000, |
| NEONScalarByIndexedElementFPMask = |
| NEONScalarByIndexedElementMask | 0x00800000, |
| NEON_FMLA_byelement_scalar = NEON_Q | NEONScalar | NEON_FMLA_byelement, |
| NEON_FMLS_byelement_scalar = NEON_Q | NEONScalar | NEON_FMLS_byelement, |
| NEON_FMUL_byelement_scalar = NEON_Q | NEONScalar | NEON_FMUL_byelement, |
| NEON_FMULX_byelement_scalar = NEON_Q | NEONScalar | NEON_FMULX_byelement |
| }; |
| |
| // NEON shift immediate. |
| enum NEONShiftImmediateOp : uint32_t { |
| NEONShiftImmediateFixed = 0x0F000400, |
| NEONShiftImmediateFMask = 0x9F800400, |
| NEONShiftImmediateMask = 0xBF80FC00, |
| NEONShiftImmediateUBit = 0x20000000, |
| NEON_SHL = NEONShiftImmediateFixed | 0x00005000, |
| NEON_SSHLL = NEONShiftImmediateFixed | 0x0000A000, |
| NEON_USHLL = NEONShiftImmediateFixed | 0x2000A000, |
| NEON_SLI = NEONShiftImmediateFixed | 0x20005000, |
| NEON_SRI = NEONShiftImmediateFixed | 0x20004000, |
| NEON_SHRN = NEONShiftImmediateFixed | 0x00008000, |
| NEON_RSHRN = NEONShiftImmediateFixed | 0x00008800, |
| NEON_UQSHRN = NEONShiftImmediateFixed | 0x20009000, |
| NEON_UQRSHRN = NEONShiftImmediateFixed | 0x20009800, |
| NEON_SQSHRN = NEONShiftImmediateFixed | 0x00009000, |
| NEON_SQRSHRN = NEONShiftImmediateFixed | 0x00009800, |
| NEON_SQSHRUN = NEONShiftImmediateFixed | 0x20008000, |
| NEON_SQRSHRUN = NEONShiftImmediateFixed | 0x20008800, |
| NEON_SSHR = NEONShiftImmediateFixed | 0x00000000, |
| NEON_SRSHR = NEONShiftImmediateFixed | 0x00002000, |
| NEON_USHR = NEONShiftImmediateFixed | 0x20000000, |
| NEON_URSHR = NEONShiftImmediateFixed | 0x20002000, |
| NEON_SSRA = NEONShiftImmediateFixed | 0x00001000, |
| NEON_SRSRA = NEONShiftImmediateFixed | 0x00003000, |
| NEON_USRA = NEONShiftImmediateFixed | 0x20001000, |
| NEON_URSRA = NEONShiftImmediateFixed | 0x20003000, |
| NEON_SQSHLU = NEONShiftImmediateFixed | 0x20006000, |
| NEON_SCVTF_imm = NEONShiftImmediateFixed | 0x0000E000, |
| NEON_UCVTF_imm = NEONShiftImmediateFixed | 0x2000E000, |
| NEON_FCVTZS_imm = NEONShiftImmediateFixed | 0x0000F800, |
| NEON_FCVTZU_imm = NEONShiftImmediateFixed | 0x2000F800, |
| NEON_SQSHL_imm = NEONShiftImmediateFixed | 0x00007000, |
| NEON_UQSHL_imm = NEONShiftImmediateFixed | 0x20007000 |
| }; |
| |
| // NEON scalar register copy. |
| enum NEONScalarCopyOp : uint32_t { |
| NEONScalarCopyFixed = 0x5E000400, |
| NEONScalarCopyFMask = 0xDFE08400, |
| NEONScalarCopyMask = 0xFFE0FC00, |
| NEON_DUP_ELEMENT_scalar = NEON_Q | NEONScalar | NEON_DUP_ELEMENT |
| }; |
| |
| // NEON scalar pairwise instructions. |
| enum NEONScalarPairwiseOp : uint32_t { |
| NEONScalarPairwiseFixed = 0x5E300800, |
| NEONScalarPairwiseFMask = 0xDF3E0C00, |
| NEONScalarPairwiseMask = 0xFFB1F800, |
| NEON_ADDP_scalar = NEONScalarPairwiseFixed | 0x0081B000, |
| NEON_FMAXNMP_scalar = NEONScalarPairwiseFixed | 0x2000C000, |
| NEON_FMINNMP_scalar = NEONScalarPairwiseFixed | 0x2080C000, |
| NEON_FADDP_scalar = NEONScalarPairwiseFixed | 0x2000D000, |
| NEON_FMAXP_scalar = NEONScalarPairwiseFixed | 0x2000F000, |
| NEON_FMINP_scalar = NEONScalarPairwiseFixed | 0x2080F000 |
| }; |
| |
| // NEON scalar shift immediate. |
| enum NEONScalarShiftImmediateOp : uint32_t { |
| NEONScalarShiftImmediateFixed = 0x5F000400, |
| NEONScalarShiftImmediateFMask = 0xDF800400, |
| NEONScalarShiftImmediateMask = 0xFF80FC00, |
| NEON_SHL_scalar = NEON_Q | NEONScalar | NEON_SHL, |
| NEON_SLI_scalar = NEON_Q | NEONScalar | NEON_SLI, |
| NEON_SRI_scalar = NEON_Q | NEONScalar | NEON_SRI, |
| NEON_SSHR_scalar = NEON_Q | NEONScalar | NEON_SSHR, |
| NEON_USHR_scalar = NEON_Q | NEONScalar | NEON_USHR, |
| NEON_SRSHR_scalar = NEON_Q | NEONScalar | NEON_SRSHR, |
| NEON_URSHR_scalar = NEON_Q | NEONScalar | NEON_URSHR, |
| NEON_SSRA_scalar = NEON_Q | NEONScalar | NEON_SSRA, |
| NEON_USRA_scalar = NEON_Q | NEONScalar | NEON_USRA, |
| NEON_SRSRA_scalar = NEON_Q | NEONScalar | NEON_SRSRA, |
| NEON_URSRA_scalar = NEON_Q | NEONScalar | NEON_URSRA, |
| NEON_UQSHRN_scalar = NEON_Q | NEONScalar | NEON_UQSHRN, |
| NEON_UQRSHRN_scalar = NEON_Q | NEONScalar | NEON_UQRSHRN, |
| NEON_SQSHRN_scalar = NEON_Q | NEONScalar | NEON_SQSHRN, |
| NEON_SQRSHRN_scalar = NEON_Q | NEONScalar | NEON_SQRSHRN, |
| NEON_SQSHRUN_scalar = NEON_Q | NEONScalar | NEON_SQSHRUN, |
| NEON_SQRSHRUN_scalar = NEON_Q | NEONScalar | NEON_SQRSHRUN, |
| NEON_SQSHLU_scalar = NEON_Q | NEONScalar | NEON_SQSHLU, |
| NEON_SQSHL_imm_scalar = NEON_Q | NEONScalar | NEON_SQSHL_imm, |
| NEON_UQSHL_imm_scalar = NEON_Q | NEONScalar | NEON_UQSHL_imm, |
| NEON_SCVTF_imm_scalar = NEON_Q | NEONScalar | NEON_SCVTF_imm, |
| NEON_UCVTF_imm_scalar = NEON_Q | NEONScalar | NEON_UCVTF_imm, |
| NEON_FCVTZS_imm_scalar = NEON_Q | NEONScalar | NEON_FCVTZS_imm, |
| NEON_FCVTZU_imm_scalar = NEON_Q | NEONScalar | NEON_FCVTZU_imm |
| }; |
| |
| // NEON table. |
| enum NEONTableOp : uint32_t { |
| NEONTableFixed = 0x0E000000, |
| NEONTableFMask = 0xBF208C00, |
| NEONTableExt = 0x00001000, |
| NEONTableMask = 0xBF20FC00, |
| NEON_TBL_1v = NEONTableFixed | 0x00000000, |
| NEON_TBL_2v = NEONTableFixed | 0x00002000, |
| NEON_TBL_3v = NEONTableFixed | 0x00004000, |
| NEON_TBL_4v = NEONTableFixed | 0x00006000, |
| NEON_TBX_1v = NEON_TBL_1v | NEONTableExt, |
| NEON_TBX_2v = NEON_TBL_2v | NEONTableExt, |
| NEON_TBX_3v = NEON_TBL_3v | NEONTableExt, |
| NEON_TBX_4v = NEON_TBL_4v | NEONTableExt |
| }; |
| |
| // NEON perm. |
| enum NEONPermOp : uint32_t { |
| NEONPermFixed = 0x0E000800, |
| NEONPermFMask = 0xBF208C00, |
| NEONPermMask = 0x3F20FC00, |
| NEON_UZP1 = NEONPermFixed | 0x00001000, |
| NEON_TRN1 = NEONPermFixed | 0x00002000, |
| NEON_ZIP1 = NEONPermFixed | 0x00003000, |
| NEON_UZP2 = NEONPermFixed | 0x00005000, |
| NEON_TRN2 = NEONPermFixed | 0x00006000, |
| NEON_ZIP2 = NEONPermFixed | 0x00007000 |
| }; |
| |
| // NEON scalar instructions with two register operands. |
| enum NEONScalar2RegMiscOp : uint32_t { |
| NEONScalar2RegMiscFixed = 0x5E200800, |
| NEONScalar2RegMiscFMask = 0xDF3E0C00, |
| NEONScalar2RegMiscMask = NEON_Q | NEONScalar | NEON2RegMiscMask, |
| NEON_CMGT_zero_scalar = NEON_Q | NEONScalar | NEON_CMGT_zero, |
| NEON_CMEQ_zero_scalar = NEON_Q | NEONScalar | NEON_CMEQ_zero, |
| NEON_CMLT_zero_scalar = NEON_Q | NEONScalar | NEON_CMLT_zero, |
| NEON_CMGE_zero_scalar = NEON_Q | NEONScalar | NEON_CMGE_zero, |
| NEON_CMLE_zero_scalar = NEON_Q | NEONScalar | NEON_CMLE_zero, |
| NEON_ABS_scalar = NEON_Q | NEONScalar | NEON_ABS, |
| NEON_SQABS_scalar = NEON_Q | NEONScalar | NEON_SQABS, |
| NEON_NEG_scalar = NEON_Q | NEONScalar | NEON_NEG, |
| NEON_SQNEG_scalar = NEON_Q | NEONScalar | NEON_SQNEG, |
| NEON_SQXTN_scalar = NEON_Q | NEONScalar | NEON_SQXTN, |
| NEON_UQXTN_scalar = NEON_Q | NEONScalar | NEON_UQXTN, |
| NEON_SQXTUN_scalar = NEON_Q | NEONScalar | NEON_SQXTUN, |
| NEON_SUQADD_scalar = NEON_Q | NEONScalar | NEON_SUQADD, |
| NEON_USQADD_scalar = NEON_Q | NEONScalar | NEON_USQADD, |
| |
| NEONScalar2RegMiscOpcode = NEON2RegMiscOpcode, |
| NEON_NEG_scalar_opcode = NEON_NEG_scalar & NEONScalar2RegMiscOpcode, |
| |
| NEONScalar2RegMiscFPMask = NEONScalar2RegMiscMask | 0x00800000, |
| NEON_FRSQRTE_scalar = NEON_Q | NEONScalar | NEON_FRSQRTE, |
| NEON_FRECPE_scalar = NEON_Q | NEONScalar | NEON_FRECPE, |
| NEON_SCVTF_scalar = NEON_Q | NEONScalar | NEON_SCVTF, |
| NEON_UCVTF_scalar = NEON_Q | NEONScalar | NEON_UCVTF, |
| NEON_FCMGT_zero_scalar = NEON_Q | NEONScalar | NEON_FCMGT_zero, |
| NEON_FCMEQ_zero_scalar = NEON_Q | NEONScalar | NEON_FCMEQ_zero, |
| NEON_FCMLT_zero_scalar = NEON_Q | NEONScalar | NEON_FCMLT_zero, |
| NEON_FCMGE_zero_scalar = NEON_Q | NEONScalar | NEON_FCMGE_zero, |
| NEON_FCMLE_zero_scalar = NEON_Q | NEONScalar | NEON_FCMLE_zero, |
| NEON_FRECPX_scalar = NEONScalar2RegMiscFixed | 0x0081F000, |
| NEON_FCVTNS_scalar = NEON_Q | NEONScalar | NEON_FCVTNS, |
| NEON_FCVTNU_scalar = NEON_Q | NEONScalar | NEON_FCVTNU, |
| NEON_FCVTPS_scalar = NEON_Q | NEONScalar | NEON_FCVTPS, |
| NEON_FCVTPU_scalar = NEON_Q | NEONScalar | NEON_FCVTPU, |
| NEON_FCVTMS_scalar = NEON_Q | NEONScalar | NEON_FCVTMS, |
| NEON_FCVTMU_scalar = NEON_Q | NEONScalar | NEON_FCVTMU, |
| NEON_FCVTZS_scalar = NEON_Q | NEONScalar | NEON_FCVTZS, |
| NEON_FCVTZU_scalar = NEON_Q | NEONScalar | NEON_FCVTZU, |
| NEON_FCVTAS_scalar = NEON_Q | NEONScalar | NEON_FCVTAS, |
| NEON_FCVTAU_scalar = NEON_Q | NEONScalar | NEON_FCVTAU, |
| NEON_FCVTXN_scalar = NEON_Q | NEONScalar | NEON_FCVTXN |
| }; |
| |
| // NEON scalar instructions with three same-type operands. |
| enum NEONScalar3SameOp : uint32_t { |
| NEONScalar3SameFixed = 0x5E200400, |
| NEONScalar3SameFMask = 0xDF200400, |
| NEONScalar3SameMask = 0xFF20FC00, |
| NEON_ADD_scalar = NEON_Q | NEONScalar | NEON_ADD, |
| NEON_CMEQ_scalar = NEON_Q | NEONScalar | NEON_CMEQ, |
| NEON_CMGE_scalar = NEON_Q | NEONScalar | NEON_CMGE, |
| NEON_CMGT_scalar = NEON_Q | NEONScalar | NEON_CMGT, |
| NEON_CMHI_scalar = NEON_Q | NEONScalar | NEON_CMHI, |
| NEON_CMHS_scalar = NEON_Q | NEONScalar | NEON_CMHS, |
| NEON_CMTST_scalar = NEON_Q | NEONScalar | NEON_CMTST, |
| NEON_SUB_scalar = NEON_Q | NEONScalar | NEON_SUB, |
| NEON_UQADD_scalar = NEON_Q | NEONScalar | NEON_UQADD, |
| NEON_SQADD_scalar = NEON_Q | NEONScalar | NEON_SQADD, |
| NEON_UQSUB_scalar = NEON_Q | NEONScalar | NEON_UQSUB, |
| NEON_SQSUB_scalar = NEON_Q | NEONScalar | NEON_SQSUB, |
| NEON_USHL_scalar = NEON_Q | NEONScalar | NEON_USHL, |
| NEON_SSHL_scalar = NEON_Q | NEONScalar | NEON_SSHL, |
| NEON_UQSHL_scalar = NEON_Q | NEONScalar | NEON_UQSHL, |
| NEON_SQSHL_scalar = NEON_Q | NEONScalar | NEON_SQSHL, |
| NEON_URSHL_scalar = NEON_Q | NEONScalar | NEON_URSHL, |
| NEON_SRSHL_scalar = NEON_Q | NEONScalar | NEON_SRSHL, |
| NEON_UQRSHL_scalar = NEON_Q | NEONScalar | NEON_UQRSHL, |
| NEON_SQRSHL_scalar = NEON_Q | NEONScalar | NEON_SQRSHL, |
| NEON_SQDMULH_scalar = NEON_Q | NEONScalar | NEON_SQDMULH, |
| NEON_SQRDMULH_scalar = NEON_Q | NEONScalar | NEON_SQRDMULH, |
| |
| // NEON floating point scalar instructions with three same-type operands. |
| NEONScalar3SameFPFixed = NEONScalar3SameFixed | 0x0000C000, |
| NEONScalar3SameFPFMask = NEONScalar3SameFMask | 0x0000C000, |
| NEONScalar3SameFPMask = NEONScalar3SameMask | 0x00800000, |
| NEON_FACGE_scalar = NEON_Q | NEONScalar | NEON_FACGE, |
| NEON_FACGT_scalar = NEON_Q | NEONScalar | NEON_FACGT, |
| NEON_FCMEQ_scalar = NEON_Q | NEONScalar | NEON_FCMEQ, |
| NEON_FCMGE_scalar = NEON_Q | NEONScalar | NEON_FCMGE, |
| NEON_FCMGT_scalar = NEON_Q | NEONScalar | NEON_FCMGT, |
| NEON_FMULX_scalar = NEON_Q | NEONScalar | NEON_FMULX, |
| NEON_FRECPS_scalar = NEON_Q | NEONScalar | NEON_FRECPS, |
| NEON_FRSQRTS_scalar = NEON_Q | NEONScalar | NEON_FRSQRTS, |
| NEON_FABD_scalar = NEON_Q | NEONScalar | NEON_FABD |
| }; |
| |
| // NEON scalar instructions with three different-type operands. |
| enum NEONScalar3DiffOp : uint32_t { |
| NEONScalar3DiffFixed = 0x5E200000, |
| NEONScalar3DiffFMask = 0xDF200C00, |
| NEONScalar3DiffMask = NEON_Q | NEONScalar | NEON3DifferentMask, |
| NEON_SQDMLAL_scalar = NEON_Q | NEONScalar | NEON_SQDMLAL, |
| NEON_SQDMLSL_scalar = NEON_Q | NEONScalar | NEON_SQDMLSL, |
| NEON_SQDMULL_scalar = NEON_Q | NEONScalar | NEON_SQDMULL |
| }; |
| |
| // Unimplemented and unallocated instructions. These are defined to make fixed |
| // bit assertion easier. |
| enum UnimplementedOp : uint32_t { |
| UnimplementedFixed = 0x00000000, |
| UnimplementedFMask = 0x00000000 |
| }; |
| |
| enum UnallocatedOp : uint32_t { |
| UnallocatedFixed = 0x00000000, |
| UnallocatedFMask = 0x00000000 |
| }; |
| |
| } // namespace internal |
| } // namespace v8 |
| |
| #endif // V8_CODEGEN_ARM64_CONSTANTS_ARM64_H_ |