1b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Copyright 2013 the V8 project authors. All rights reserved.
2b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Use of this source code is governed by a BSD-style license that can be
3b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// found in the LICENSE file.
4b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
5b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#ifndef V8_ARM64_CONSTANTS_ARM64_H_
6b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#define V8_ARM64_CONSTANTS_ARM64_H_
7b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
8014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "src/base/macros.h"
9014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "src/globals.h"
10b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
11b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Assert that this is an LP64 system.
12014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochSTATIC_ASSERT(sizeof(int) == sizeof(int32_t));
13b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochSTATIC_ASSERT(sizeof(long) == sizeof(int64_t));    // NOLINT(runtime/int)
14014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochSTATIC_ASSERT(sizeof(void *) == sizeof(int64_t));
15014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochSTATIC_ASSERT(sizeof(1) == sizeof(int32_t));
16014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochSTATIC_ASSERT(sizeof(1L) == sizeof(int64_t));
17b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
18b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
19b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Get the standard printf format macros for C99 stdint types.
20b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#ifndef __STDC_FORMAT_MACROS
21b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#define __STDC_FORMAT_MACROS
22b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#endif
23b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include <inttypes.h>
24b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
25b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
26b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochnamespace v8 {
27b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochnamespace internal {
28b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
29b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
30b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochconst unsigned kInstructionSize = 4;
31b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochconst unsigned kInstructionSizeLog2 = 2;
32b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochconst unsigned kLoadLiteralScaleLog2 = 2;
33b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochconst unsigned kMaxLoadLiteralRange = 1 * MB;
34b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
35014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochconst int kNumberOfRegisters = 32;
36014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochconst int kNumberOfFPRegisters = 32;
37b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Callee saved registers are x19-x30(lr).
38b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochconst int kNumberOfCalleeSavedRegisters = 11;
39b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochconst int kFirstCalleeSavedRegisterIndex = 19;
40b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Callee saved FP registers are d8-d15.
41b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochconst int kNumberOfCalleeSavedFPRegisters = 8;
42b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochconst int kFirstCalleeSavedFPRegisterIndex = 8;
43b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Callee saved registers with no specific purpose in JS are x19-x25.
44b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochconst unsigned kJSCalleeSavedRegList = 0x03f80000;
45014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochconst int kWRegSizeInBits = 32;
46014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochconst int kWRegSizeInBitsLog2 = 5;
47014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochconst int kWRegSize = kWRegSizeInBits >> 3;
48014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochconst int kWRegSizeLog2 = kWRegSizeInBitsLog2 - 3;
49014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochconst int kXRegSizeInBits = 64;
50014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochconst int kXRegSizeInBitsLog2 = 6;
51014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochconst int kXRegSize = kXRegSizeInBits >> 3;
52014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochconst int kXRegSizeLog2 = kXRegSizeInBitsLog2 - 3;
53014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochconst int kSRegSizeInBits = 32;
54014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochconst int kSRegSizeInBitsLog2 = 5;
55014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochconst int kSRegSize = kSRegSizeInBits >> 3;
56014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochconst int kSRegSizeLog2 = kSRegSizeInBitsLog2 - 3;
57014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochconst int kDRegSizeInBits = 64;
58014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochconst int kDRegSizeInBitsLog2 = 6;
59014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochconst int kDRegSize = kDRegSizeInBits >> 3;
60014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochconst int kDRegSizeLog2 = kDRegSizeInBitsLog2 - 3;
61b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochconst int64_t kWRegMask = 0x00000000ffffffffL;
62b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochconst int64_t kXRegMask = 0xffffffffffffffffL;
63b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochconst int64_t kSRegMask = 0x00000000ffffffffL;
64b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochconst int64_t kDRegMask = 0xffffffffffffffffL;
65b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// TODO(all) check if the expression below works on all compilers or if it
66b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// triggers an overflow error.
67b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochconst int64_t kDSignBit = 63;
68b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochconst int64_t kDSignMask = 0x1L << kDSignBit;
69b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochconst int64_t kSSignBit = 31;
70b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochconst int64_t kSSignMask = 0x1L << kSSignBit;
71b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochconst int64_t kXSignBit = 63;
72b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochconst int64_t kXSignMask = 0x1L << kXSignBit;
73b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochconst int64_t kWSignBit = 31;
74b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochconst int64_t kWSignMask = 0x1L << kWSignBit;
75b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochconst int64_t kDQuietNanBit = 51;
76b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochconst int64_t kDQuietNanMask = 0x1L << kDQuietNanBit;
77b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochconst int64_t kSQuietNanBit = 22;
78b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochconst int64_t kSQuietNanMask = 0x1L << kSQuietNanBit;
79b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochconst int64_t kByteMask = 0xffL;
80b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochconst int64_t kHalfWordMask = 0xffffL;
81b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochconst int64_t kWordMask = 0xffffffffL;
82b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochconst uint64_t kXMaxUInt = 0xffffffffffffffffUL;
83b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochconst uint64_t kWMaxUInt = 0xffffffffUL;
84b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochconst int64_t kXMaxInt = 0x7fffffffffffffffL;
85b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochconst int64_t kXMinInt = 0x8000000000000000L;
86b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochconst int32_t kWMaxInt = 0x7fffffff;
87b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochconst int32_t kWMinInt = 0x80000000;
88014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochconst int kIp0Code = 16;
89014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochconst int kIp1Code = 17;
90014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochconst int kFramePointerRegCode = 29;
91014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochconst int kLinkRegCode = 30;
92014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochconst int kZeroRegCode = 31;
93014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochconst int kJSSPCode = 28;
94014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochconst int kSPRegInternalCode = 63;
95b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochconst unsigned kRegCodeMask = 0x1f;
96b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochconst unsigned kShiftAmountWRegMask = 0x1f;
97b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochconst unsigned kShiftAmountXRegMask = 0x3f;
98b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Standard machine types defined by AAPCS64.
99b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochconst unsigned kByteSize = 8;
100b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochconst unsigned kByteSizeInBytes = kByteSize >> 3;
101b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochconst unsigned kHalfWordSize = 16;
102b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochconst unsigned kHalfWordSizeLog2 = 4;
103b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochconst unsigned kHalfWordSizeInBytes = kHalfWordSize >> 3;
104b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochconst unsigned kHalfWordSizeInBytesLog2 = kHalfWordSizeLog2 - 3;
105b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochconst unsigned kWordSize = 32;
106b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochconst unsigned kWordSizeLog2 = 5;
107b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochconst unsigned kWordSizeInBytes = kWordSize >> 3;
108b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochconst unsigned kWordSizeInBytesLog2 = kWordSizeLog2 - 3;
109b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochconst unsigned kDoubleWordSize = 64;
110b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochconst unsigned kDoubleWordSizeInBytes = kDoubleWordSize >> 3;
111b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochconst unsigned kQuadWordSize = 128;
112b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochconst unsigned kQuadWordSizeInBytes = kQuadWordSize >> 3;
113b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// AArch64 floating-point specifics. These match IEEE-754.
114b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochconst unsigned kDoubleMantissaBits = 52;
115b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochconst unsigned kDoubleExponentBits = 11;
116b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochconst unsigned kDoubleExponentBias = 1023;
117b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochconst unsigned kFloatMantissaBits = 23;
118b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochconst unsigned kFloatExponentBits = 8;
119b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
12013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch#define INSTRUCTION_FIELDS_LIST(V_)                     \
12113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  /* Register fields */                                 \
12213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  V_(Rd, 4, 0, Bits)    /* Destination register.     */ \
12313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  V_(Rn, 9, 5, Bits)    /* First source register.    */ \
12413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  V_(Rm, 20, 16, Bits)  /* Second source register.   */ \
12513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  V_(Ra, 14, 10, Bits)  /* Third source register.    */ \
12613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  V_(Rt, 4, 0, Bits)    /* Load dest / store source. */ \
12713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  V_(Rt2, 14, 10, Bits) /* Load second dest /        */ \
12813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch                        /* store second source.      */ \
12913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  V_(Rs, 20, 16, Bits)  /* Store-exclusive status */    \
13013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  V_(PrefetchMode, 4, 0, Bits)                          \
13113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch                                                        \
13213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  /* Common bits */                                     \
13313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  V_(SixtyFourBits, 31, 31, Bits)                       \
13413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  V_(FlagsUpdate, 29, 29, Bits)                         \
13513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch                                                        \
13613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  /* PC relative addressing */                          \
13713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  V_(ImmPCRelHi, 23, 5, SignedBits)                     \
13813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  V_(ImmPCRelLo, 30, 29, Bits)                          \
13913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch                                                        \
14013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  /* Add/subtract/logical shift register */             \
14113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  V_(ShiftDP, 23, 22, Bits)                             \
14213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  V_(ImmDPShift, 15, 10, Bits)                          \
14313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch                                                        \
14413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  /* Add/subtract immediate */                          \
14513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  V_(ImmAddSub, 21, 10, Bits)                           \
14613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  V_(ShiftAddSub, 23, 22, Bits)                         \
14713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch                                                        \
14813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  /* Add/substract extend */                            \
14913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  V_(ImmExtendShift, 12, 10, Bits)                      \
15013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  V_(ExtendMode, 15, 13, Bits)                          \
15113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch                                                        \
15213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  /* Move wide */                                       \
15313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  V_(ImmMoveWide, 20, 5, Bits)                          \
15413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  V_(ShiftMoveWide, 22, 21, Bits)                       \
15513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch                                                        \
15613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  /* Logical immediate, bitfield and extract */         \
15713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  V_(BitN, 22, 22, Bits)                                \
15813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  V_(ImmRotate, 21, 16, Bits)                           \
15913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  V_(ImmSetBits, 15, 10, Bits)                          \
16013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  V_(ImmR, 21, 16, Bits)                                \
16113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  V_(ImmS, 15, 10, Bits)                                \
16213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch                                                        \
16313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  /* Test and branch immediate */                       \
16413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  V_(ImmTestBranch, 18, 5, SignedBits)                  \
16513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  V_(ImmTestBranchBit40, 23, 19, Bits)                  \
16613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  V_(ImmTestBranchBit5, 31, 31, Bits)                   \
16713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch                                                        \
16813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  /* Conditionals */                                    \
16913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  V_(Condition, 15, 12, Bits)                           \
17013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  V_(ConditionBranch, 3, 0, Bits)                       \
17113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  V_(Nzcv, 3, 0, Bits)                                  \
17213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  V_(ImmCondCmp, 20, 16, Bits)                          \
17313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  V_(ImmCondBranch, 23, 5, SignedBits)                  \
17413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch                                                        \
17513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  /* Floating point */                                  \
17613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  V_(FPType, 23, 22, Bits)                              \
17713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  V_(ImmFP, 20, 13, Bits)                               \
17813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  V_(FPScale, 15, 10, Bits)                             \
17913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch                                                        \
18013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  /* Load Store */                                      \
18113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  V_(ImmLS, 20, 12, SignedBits)                         \
18213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  V_(ImmLSUnsigned, 21, 10, Bits)                       \
18313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  V_(ImmLSPair, 21, 15, SignedBits)                     \
18413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  V_(SizeLS, 31, 30, Bits)                              \
18513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  V_(ImmShiftLS, 12, 12, Bits)                          \
18613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch                                                        \
18713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  /* Other immediates */                                \
18813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  V_(ImmUncondBranch, 25, 0, SignedBits)                \
18913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  V_(ImmCmpBranch, 23, 5, SignedBits)                   \
19013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  V_(ImmLLiteral, 23, 5, SignedBits)                    \
19113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  V_(ImmException, 20, 5, Bits)                         \
19213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  V_(ImmHint, 11, 5, Bits)                              \
19313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  V_(ImmBarrierDomain, 11, 10, Bits)                    \
19413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  V_(ImmBarrierType, 9, 8, Bits)                        \
19513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch                                                        \
19613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  /* System (MRS, MSR) */                               \
19713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  V_(ImmSystemRegister, 19, 5, Bits)                    \
19813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  V_(SysO0, 19, 19, Bits)                               \
19913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  V_(SysOp1, 18, 16, Bits)                              \
20013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  V_(SysOp2, 7, 5, Bits)                                \
20113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  V_(CRn, 15, 12, Bits)                                 \
20213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  V_(CRm, 11, 8, Bits)
203b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
204b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#define SYSTEM_REGISTER_FIELDS_LIST(V_, M_)                                    \
205b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch/* NZCV */                                                                     \
206b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochV_(Flags, 31, 28, Bits, uint32_t)                                              \
207b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochV_(N,     31, 31, Bits, bool)                                                  \
208b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochV_(Z,     30, 30, Bits, bool)                                                  \
209b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochV_(C,     29, 29, Bits, bool)                                                  \
210b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochV_(V,     28, 28, Bits, uint32_t)                                              \
211b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochM_(NZCV, Flags_mask)                                                           \
212b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                                                               \
213b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch/* FPCR */                                                                     \
214b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochV_(AHP,   26, 26, Bits, bool)                                                  \
215b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochV_(DN,    25, 25, Bits, bool)                                                  \
216b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochV_(FZ,    24, 24, Bits, bool)                                                  \
217b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochV_(RMode, 23, 22, Bits, FPRounding)                                            \
218b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochM_(FPCR, AHP_mask | DN_mask | FZ_mask | RMode_mask)
219b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
220b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
221b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Fields offsets.
222b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#define DECLARE_FIELDS_OFFSETS(Name, HighBit, LowBit, unused_1, unused_2)      \
223b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  const int Name##_offset = LowBit;                                            \
224b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  const int Name##_width = HighBit - LowBit + 1;                               \
225b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  const uint32_t Name##_mask = ((1 << Name##_width) - 1) << LowBit;
226b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#define DECLARE_INSTRUCTION_FIELDS_OFFSETS(Name, HighBit, LowBit, unused_1)    \
227b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_FIELDS_OFFSETS(Name, HighBit, LowBit, unused_1, unused_2)
228b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#define NOTHING(A, B)
229b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochINSTRUCTION_FIELDS_LIST(DECLARE_INSTRUCTION_FIELDS_OFFSETS)
230b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochSYSTEM_REGISTER_FIELDS_LIST(DECLARE_FIELDS_OFFSETS, NOTHING)
231b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#undef NOTHING
232b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#undef DECLARE_FIELDS_OFFSETS
233b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#undef DECLARE_INSTRUCTION_FIELDS_OFFSETS
234b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
235b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// ImmPCRel is a compound field (not present in INSTRUCTION_FIELDS_LIST), formed
236b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// from ImmPCRelLo and ImmPCRelHi.
237b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochconst int ImmPCRel_mask = ImmPCRelLo_mask | ImmPCRelHi_mask;
238b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
239b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Condition codes.
240b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochenum Condition {
241b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  eq = 0,
242b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  ne = 1,
243b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  hs = 2, cs = hs,
244b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  lo = 3, cc = lo,
245b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  mi = 4,
246b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  pl = 5,
247b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  vs = 6,
248b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  vc = 7,
249b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  hi = 8,
250b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  ls = 9,
251b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  ge = 10,
252b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  lt = 11,
253b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  gt = 12,
254b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  le = 13,
255b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  al = 14,
256b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  nv = 15  // Behaves as always/al.
257b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch};
258b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
259b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochinline Condition NegateCondition(Condition cond) {
260b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Conditions al and nv behave identically, as "always true". They can't be
261b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // inverted, because there is no never condition.
262b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK((cond != al) && (cond != nv));
263b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return static_cast<Condition>(cond ^ 1);
264b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
265b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
266b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Commute a condition such that {a cond b == b cond' a}.
267b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochinline Condition CommuteCondition(Condition cond) {
268b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  switch (cond) {
269b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case lo:
270b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return hi;
271b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case hi:
272b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return lo;
273b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case hs:
274b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return ls;
275b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case ls:
276b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return hs;
277b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case lt:
278b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return gt;
279b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case gt:
280b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return lt;
281b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case ge:
282b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return le;
283b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case le:
284b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return ge;
285b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case eq:
286b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return eq;
287b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    default:
288b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      // In practice this function is only used with a condition coming from
289b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      // TokenToCondition in lithium-codegen-arm64.cc. Any other condition is
290b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      // invalid as it doesn't necessary make sense to reverse it (consider
291b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      // 'mi' for instance).
292b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      UNREACHABLE();
293b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return nv;
294b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
295b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
296b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
297b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochenum FlagsUpdate {
298b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  SetFlags   = 1,
299b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LeaveFlags = 0
300b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch};
301b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
302b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochenum StatusFlags {
303b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  NoFlag    = 0,
304b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
305b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Derive the flag combinations from the system register bit descriptions.
306b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  NFlag     = N_mask,
307b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  ZFlag     = Z_mask,
308b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CFlag     = C_mask,
309b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  VFlag     = V_mask,
310b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  NZFlag    = NFlag | ZFlag,
311b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  NCFlag    = NFlag | CFlag,
312b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  NVFlag    = NFlag | VFlag,
313b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  ZCFlag    = ZFlag | CFlag,
314b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  ZVFlag    = ZFlag | VFlag,
315b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CVFlag    = CFlag | VFlag,
316b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  NZCFlag   = NFlag | ZFlag | CFlag,
317b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  NZVFlag   = NFlag | ZFlag | VFlag,
318b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  NCVFlag   = NFlag | CFlag | VFlag,
319b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  ZCVFlag   = ZFlag | CFlag | VFlag,
320b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  NZCVFlag  = NFlag | ZFlag | CFlag | VFlag,
321b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
322b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Floating-point comparison results.
323b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  FPEqualFlag       = ZCFlag,
324b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  FPLessThanFlag    = NFlag,
325b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  FPGreaterThanFlag = CFlag,
326b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  FPUnorderedFlag   = CVFlag
327b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch};
328b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
329b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochenum Shift {
330b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  NO_SHIFT = -1,
331b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LSL = 0x0,
332b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LSR = 0x1,
333b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  ASR = 0x2,
334b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  ROR = 0x3
335b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch};
336b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
337b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochenum Extend {
338b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  NO_EXTEND = -1,
339b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  UXTB      = 0,
340b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  UXTH      = 1,
341b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  UXTW      = 2,
342b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  UXTX      = 3,
343b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  SXTB      = 4,
344b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  SXTH      = 5,
345b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  SXTW      = 6,
346b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  SXTX      = 7
347b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch};
348b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
349b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochenum SystemHint {
350b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  NOP   = 0,
351b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  YIELD = 1,
352b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  WFE   = 2,
353b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  WFI   = 3,
354b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  SEV   = 4,
355b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  SEVL  = 5
356b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch};
357b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
358b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochenum BarrierDomain {
359b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  OuterShareable = 0,
360b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  NonShareable   = 1,
361b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  InnerShareable = 2,
362b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  FullSystem     = 3
363b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch};
364b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
365b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochenum BarrierType {
366b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  BarrierOther  = 0,
367b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  BarrierReads  = 1,
368b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  BarrierWrites = 2,
369b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  BarrierAll    = 3
370b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch};
371b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
372b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// System/special register names.
373b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// This information is not encoded as one field but as the concatenation of
374b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// multiple fields (Op0<0>, Op1, Crn, Crm, Op2).
375b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochenum SystemRegister {
376b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  NZCV = ((0x1 << SysO0_offset) |
377b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          (0x3 << SysOp1_offset) |
378b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          (0x4 << CRn_offset) |
379b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          (0x2 << CRm_offset) |
380b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          (0x0 << SysOp2_offset)) >> ImmSystemRegister_offset,
381b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  FPCR = ((0x1 << SysO0_offset) |
382b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          (0x3 << SysOp1_offset) |
383b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          (0x4 << CRn_offset) |
384b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          (0x4 << CRm_offset) |
385b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          (0x0 << SysOp2_offset)) >> ImmSystemRegister_offset
386b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch};
387b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
388b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Instruction enumerations.
389b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch//
390b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// These are the masks that define a class of instructions, and the list of
391b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// instructions within each class. Each enumeration has a Fixed, FMask and
392b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Mask value.
393b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch//
394b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Fixed: The fixed bits in this instruction class.
395b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// FMask: The mask used to extract the fixed bits in the class.
396b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Mask:  The mask used to identify the instructions within a class.
397b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch//
398b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// The enumerations can be used like this:
399b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch//
400b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// DCHECK(instr->Mask(PCRelAddressingFMask) == PCRelAddressingFixed);
401b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// switch(instr->Mask(PCRelAddressingMask)) {
402b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch//   case ADR:  Format("adr 'Xd, 'AddrPCRelByte"); break;
403b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch//   case ADRP: Format("adrp 'Xd, 'AddrPCRelPage"); break;
404b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch//   default:   printf("Unknown instruction\n");
405b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// }
406b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
407b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
408b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Generic fields.
409b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochenum GenericInstrField {
410b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  SixtyFourBits        = 0x80000000,
411b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  ThirtyTwoBits        = 0x00000000,
412b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  FP32                 = 0x00000000,
413b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  FP64                 = 0x00400000
414b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch};
415b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
416b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// PC relative addressing.
417b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochenum PCRelAddressingOp {
418b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  PCRelAddressingFixed = 0x10000000,
419b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  PCRelAddressingFMask = 0x1F000000,
420b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  PCRelAddressingMask  = 0x9F000000,
421b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  ADR                  = PCRelAddressingFixed | 0x00000000,
422b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  ADRP                 = PCRelAddressingFixed | 0x80000000
423b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch};
424b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
425b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Add/sub (immediate, shifted and extended.)
426b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochconst int kSFOffset = 31;
427b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochenum AddSubOp {
428b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  AddSubOpMask      = 0x60000000,
429b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  AddSubSetFlagsBit = 0x20000000,
430b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  ADD               = 0x00000000,
431b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  ADDS              = ADD | AddSubSetFlagsBit,
432b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  SUB               = 0x40000000,
433b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  SUBS              = SUB | AddSubSetFlagsBit
434b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch};
435b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
436b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#define ADD_SUB_OP_LIST(V)  \
437b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(ADD),                   \
438b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(ADDS),                  \
439b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(SUB),                   \
440b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(SUBS)
441b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
442b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochenum AddSubImmediateOp {
443b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  AddSubImmediateFixed = 0x11000000,
444b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  AddSubImmediateFMask = 0x1F000000,
445b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  AddSubImmediateMask  = 0xFF000000,
446b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  #define ADD_SUB_IMMEDIATE(A)           \
447b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  A##_w_imm = AddSubImmediateFixed | A,  \
448b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  A##_x_imm = AddSubImmediateFixed | A | SixtyFourBits
449b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  ADD_SUB_OP_LIST(ADD_SUB_IMMEDIATE)
450b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  #undef ADD_SUB_IMMEDIATE
451b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch};
452b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
453b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochenum AddSubShiftedOp {
454b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  AddSubShiftedFixed   = 0x0B000000,
455b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  AddSubShiftedFMask   = 0x1F200000,
456b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  AddSubShiftedMask    = 0xFF200000,
457b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  #define ADD_SUB_SHIFTED(A)             \
458b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  A##_w_shift = AddSubShiftedFixed | A,  \
459b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  A##_x_shift = AddSubShiftedFixed | A | SixtyFourBits
460b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  ADD_SUB_OP_LIST(ADD_SUB_SHIFTED)
461b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  #undef ADD_SUB_SHIFTED
462b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch};
463b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
464b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochenum AddSubExtendedOp {
465b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  AddSubExtendedFixed  = 0x0B200000,
466b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  AddSubExtendedFMask  = 0x1F200000,
467b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  AddSubExtendedMask   = 0xFFE00000,
468b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  #define ADD_SUB_EXTENDED(A)           \
469b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  A##_w_ext = AddSubExtendedFixed | A,  \
470b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  A##_x_ext = AddSubExtendedFixed | A | SixtyFourBits
471b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  ADD_SUB_OP_LIST(ADD_SUB_EXTENDED)
472b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  #undef ADD_SUB_EXTENDED
473b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch};
474b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
475b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Add/sub with carry.
476b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochenum AddSubWithCarryOp {
477b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  AddSubWithCarryFixed = 0x1A000000,
478b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  AddSubWithCarryFMask = 0x1FE00000,
479b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  AddSubWithCarryMask  = 0xFFE0FC00,
480b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  ADC_w                = AddSubWithCarryFixed | ADD,
481b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  ADC_x                = AddSubWithCarryFixed | ADD | SixtyFourBits,
482b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  ADC                  = ADC_w,
483b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  ADCS_w               = AddSubWithCarryFixed | ADDS,
484b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  ADCS_x               = AddSubWithCarryFixed | ADDS | SixtyFourBits,
485b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  SBC_w                = AddSubWithCarryFixed | SUB,
486b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  SBC_x                = AddSubWithCarryFixed | SUB | SixtyFourBits,
487b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  SBC                  = SBC_w,
488b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  SBCS_w               = AddSubWithCarryFixed | SUBS,
489b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  SBCS_x               = AddSubWithCarryFixed | SUBS | SixtyFourBits
490b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch};
491b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
492b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
493b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Logical (immediate and shifted register).
494b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochenum LogicalOp {
495b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LogicalOpMask = 0x60200000,
496b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  NOT   = 0x00200000,
497b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  AND   = 0x00000000,
498b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  BIC   = AND | NOT,
499b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  ORR   = 0x20000000,
500b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  ORN   = ORR | NOT,
501b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EOR   = 0x40000000,
502b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EON   = EOR | NOT,
503b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  ANDS  = 0x60000000,
504b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  BICS  = ANDS | NOT
505b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch};
506b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
507b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Logical immediate.
508b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochenum LogicalImmediateOp {
509b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LogicalImmediateFixed = 0x12000000,
510b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LogicalImmediateFMask = 0x1F800000,
511b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LogicalImmediateMask  = 0xFF800000,
512b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  AND_w_imm   = LogicalImmediateFixed | AND,
513b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  AND_x_imm   = LogicalImmediateFixed | AND | SixtyFourBits,
514b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  ORR_w_imm   = LogicalImmediateFixed | ORR,
515b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  ORR_x_imm   = LogicalImmediateFixed | ORR | SixtyFourBits,
516b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EOR_w_imm   = LogicalImmediateFixed | EOR,
517b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EOR_x_imm   = LogicalImmediateFixed | EOR | SixtyFourBits,
518b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  ANDS_w_imm  = LogicalImmediateFixed | ANDS,
519b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  ANDS_x_imm  = LogicalImmediateFixed | ANDS | SixtyFourBits
520b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch};
521b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
522b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Logical shifted register.
523b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochenum LogicalShiftedOp {
524b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LogicalShiftedFixed = 0x0A000000,
525b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LogicalShiftedFMask = 0x1F000000,
526b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LogicalShiftedMask  = 0xFF200000,
527b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  AND_w               = LogicalShiftedFixed | AND,
528b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  AND_x               = LogicalShiftedFixed | AND | SixtyFourBits,
529b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  AND_shift           = AND_w,
530b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  BIC_w               = LogicalShiftedFixed | BIC,
531b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  BIC_x               = LogicalShiftedFixed | BIC | SixtyFourBits,
532b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  BIC_shift           = BIC_w,
533b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  ORR_w               = LogicalShiftedFixed | ORR,
534b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  ORR_x               = LogicalShiftedFixed | ORR | SixtyFourBits,
535b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  ORR_shift           = ORR_w,
536b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  ORN_w               = LogicalShiftedFixed | ORN,
537b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  ORN_x               = LogicalShiftedFixed | ORN | SixtyFourBits,
538b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  ORN_shift           = ORN_w,
539b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EOR_w               = LogicalShiftedFixed | EOR,
540b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EOR_x               = LogicalShiftedFixed | EOR | SixtyFourBits,
541b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EOR_shift           = EOR_w,
542b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EON_w               = LogicalShiftedFixed | EON,
543b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EON_x               = LogicalShiftedFixed | EON | SixtyFourBits,
544b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EON_shift           = EON_w,
545b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  ANDS_w              = LogicalShiftedFixed | ANDS,
546b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  ANDS_x              = LogicalShiftedFixed | ANDS | SixtyFourBits,
547b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  ANDS_shift          = ANDS_w,
548b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  BICS_w              = LogicalShiftedFixed | BICS,
549b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  BICS_x              = LogicalShiftedFixed | BICS | SixtyFourBits,
550b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  BICS_shift          = BICS_w
551b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch};
552b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
553b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Move wide immediate.
554b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochenum MoveWideImmediateOp {
555b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  MoveWideImmediateFixed = 0x12800000,
556b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  MoveWideImmediateFMask = 0x1F800000,
557b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  MoveWideImmediateMask  = 0xFF800000,
558b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  MOVN                   = 0x00000000,
559b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  MOVZ                   = 0x40000000,
560b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  MOVK                   = 0x60000000,
561b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  MOVN_w                 = MoveWideImmediateFixed | MOVN,
562b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  MOVN_x                 = MoveWideImmediateFixed | MOVN | SixtyFourBits,
563b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  MOVZ_w                 = MoveWideImmediateFixed | MOVZ,
564b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  MOVZ_x                 = MoveWideImmediateFixed | MOVZ | SixtyFourBits,
565b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  MOVK_w                 = MoveWideImmediateFixed | MOVK,
566b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  MOVK_x                 = MoveWideImmediateFixed | MOVK | SixtyFourBits
567b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch};
568b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
569b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Bitfield.
570b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochconst int kBitfieldNOffset = 22;
571b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochenum BitfieldOp {
572b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  BitfieldFixed = 0x13000000,
573b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  BitfieldFMask = 0x1F800000,
574b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  BitfieldMask  = 0xFF800000,
575b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  SBFM_w        = BitfieldFixed | 0x00000000,
576b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  SBFM_x        = BitfieldFixed | 0x80000000,
577b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  SBFM          = SBFM_w,
578b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  BFM_w         = BitfieldFixed | 0x20000000,
579b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  BFM_x         = BitfieldFixed | 0xA0000000,
580b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  BFM           = BFM_w,
581b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  UBFM_w        = BitfieldFixed | 0x40000000,
582b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  UBFM_x        = BitfieldFixed | 0xC0000000,
583b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  UBFM          = UBFM_w
584b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Bitfield N field.
585b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch};
586b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
587b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Extract.
588b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochenum ExtractOp {
589b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  ExtractFixed = 0x13800000,
590b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  ExtractFMask = 0x1F800000,
591b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  ExtractMask  = 0xFFA00000,
592b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EXTR_w       = ExtractFixed | 0x00000000,
593b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EXTR_x       = ExtractFixed | 0x80000000,
594b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EXTR         = EXTR_w
595b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch};
596b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
597b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Unconditional branch.
598b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochenum UnconditionalBranchOp {
599b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  UnconditionalBranchFixed = 0x14000000,
600b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  UnconditionalBranchFMask = 0x7C000000,
601b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  UnconditionalBranchMask  = 0xFC000000,
602b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  B                        = UnconditionalBranchFixed | 0x00000000,
603b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  BL                       = UnconditionalBranchFixed | 0x80000000
604b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch};
605b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
606b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Unconditional branch to register.
607b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochenum UnconditionalBranchToRegisterOp {
608b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  UnconditionalBranchToRegisterFixed = 0xD6000000,
609b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  UnconditionalBranchToRegisterFMask = 0xFE000000,
610b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  UnconditionalBranchToRegisterMask  = 0xFFFFFC1F,
611b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  BR      = UnconditionalBranchToRegisterFixed | 0x001F0000,
612b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  BLR     = UnconditionalBranchToRegisterFixed | 0x003F0000,
613b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  RET     = UnconditionalBranchToRegisterFixed | 0x005F0000
614b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch};
615b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
616b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Compare and branch.
617b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochenum CompareBranchOp {
618b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CompareBranchFixed = 0x34000000,
619b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CompareBranchFMask = 0x7E000000,
620b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CompareBranchMask  = 0xFF000000,
621b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CBZ_w              = CompareBranchFixed | 0x00000000,
622b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CBZ_x              = CompareBranchFixed | 0x80000000,
623b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CBZ                = CBZ_w,
624b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CBNZ_w             = CompareBranchFixed | 0x01000000,
625b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CBNZ_x             = CompareBranchFixed | 0x81000000,
626b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CBNZ               = CBNZ_w
627b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch};
628b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
629b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Test and branch.
630b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochenum TestBranchOp {
631b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  TestBranchFixed = 0x36000000,
632b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  TestBranchFMask = 0x7E000000,
633b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  TestBranchMask  = 0x7F000000,
634b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  TBZ             = TestBranchFixed | 0x00000000,
635b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  TBNZ            = TestBranchFixed | 0x01000000
636b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch};
637b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
638b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Conditional branch.
639b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochenum ConditionalBranchOp {
640b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  ConditionalBranchFixed = 0x54000000,
641b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  ConditionalBranchFMask = 0xFE000000,
642b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  ConditionalBranchMask  = 0xFF000010,
643b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  B_cond                 = ConditionalBranchFixed | 0x00000000
644b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch};
645b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
646b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// System.
647b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// System instruction encoding is complicated because some instructions use op
648b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// and CR fields to encode parameters. To handle this cleanly, the system
649b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// instructions are split into more than one enum.
650b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
651b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochenum SystemOp {
652b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  SystemFixed = 0xD5000000,
653b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  SystemFMask = 0xFFC00000
654b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch};
655b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
656b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochenum SystemSysRegOp {
657b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  SystemSysRegFixed = 0xD5100000,
658b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  SystemSysRegFMask = 0xFFD00000,
659b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  SystemSysRegMask  = 0xFFF00000,
660b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  MRS               = SystemSysRegFixed | 0x00200000,
661b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  MSR               = SystemSysRegFixed | 0x00000000
662b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch};
663b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
664b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochenum SystemHintOp {
665b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  SystemHintFixed = 0xD503201F,
666b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  SystemHintFMask = 0xFFFFF01F,
667b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  SystemHintMask  = 0xFFFFF01F,
668b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HINT            = SystemHintFixed | 0x00000000
669b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch};
670b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
671b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Exception.
672b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochenum ExceptionOp {
673b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  ExceptionFixed = 0xD4000000,
674b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  ExceptionFMask = 0xFF000000,
675b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  ExceptionMask  = 0xFFE0001F,
676b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HLT            = ExceptionFixed | 0x00400000,
677b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  BRK            = ExceptionFixed | 0x00200000,
678b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  SVC            = ExceptionFixed | 0x00000001,
679b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HVC            = ExceptionFixed | 0x00000002,
680b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  SMC            = ExceptionFixed | 0x00000003,
681b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCPS1          = ExceptionFixed | 0x00A00001,
682b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCPS2          = ExceptionFixed | 0x00A00002,
683b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCPS3          = ExceptionFixed | 0x00A00003
684b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch};
685b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Code used to spot hlt instructions that should not be hit.
686b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochconst int kHltBadCode = 0xbad;
687b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
688b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochenum MemBarrierOp {
689b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  MemBarrierFixed = 0xD503309F,
690b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  MemBarrierFMask = 0xFFFFF09F,
691b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  MemBarrierMask  = 0xFFFFF0FF,
692b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DSB             = MemBarrierFixed | 0x00000000,
693b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DMB             = MemBarrierFixed | 0x00000020,
694b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  ISB             = MemBarrierFixed | 0x00000040
695b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch};
696b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
697b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Any load or store (including pair).
698b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochenum LoadStoreAnyOp {
699b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LoadStoreAnyFMask = 0x0a000000,
700b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LoadStoreAnyFixed = 0x08000000
701b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch};
702b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
703b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Any load pair or store pair.
704b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochenum LoadStorePairAnyOp {
705b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LoadStorePairAnyFMask = 0x3a000000,
706b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LoadStorePairAnyFixed = 0x28000000
707b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch};
708b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
709b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#define LOAD_STORE_PAIR_OP_LIST(V)  \
710b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(STP, w,   0x00000000),          \
711b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(LDP, w,   0x00400000),          \
712b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(LDPSW, x, 0x40400000),          \
713b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(STP, x,   0x80000000),          \
714b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(LDP, x,   0x80400000),          \
715b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(STP, s,   0x04000000),          \
716b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(LDP, s,   0x04400000),          \
717b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(STP, d,   0x44000000),          \
718b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(LDP, d,   0x44400000)
719b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
720b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Load/store pair (post, pre and offset.)
721b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochenum LoadStorePairOp {
722b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LoadStorePairMask = 0xC4400000,
723b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LoadStorePairLBit = 1 << 22,
724b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  #define LOAD_STORE_PAIR(A, B, C) \
725b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  A##_##B = C
726b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOAD_STORE_PAIR_OP_LIST(LOAD_STORE_PAIR)
727b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  #undef LOAD_STORE_PAIR
728b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch};
729b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
730b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochenum LoadStorePairPostIndexOp {
731b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LoadStorePairPostIndexFixed = 0x28800000,
732b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LoadStorePairPostIndexFMask = 0x3B800000,
733b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LoadStorePairPostIndexMask  = 0xFFC00000,
734b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  #define LOAD_STORE_PAIR_POST_INDEX(A, B, C)  \
735b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  A##_##B##_post = LoadStorePairPostIndexFixed | A##_##B
736b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOAD_STORE_PAIR_OP_LIST(LOAD_STORE_PAIR_POST_INDEX)
737b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  #undef LOAD_STORE_PAIR_POST_INDEX
738b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch};
739b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
740b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochenum LoadStorePairPreIndexOp {
741b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LoadStorePairPreIndexFixed = 0x29800000,
742b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LoadStorePairPreIndexFMask = 0x3B800000,
743b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LoadStorePairPreIndexMask  = 0xFFC00000,
744b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  #define LOAD_STORE_PAIR_PRE_INDEX(A, B, C)  \
745b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  A##_##B##_pre = LoadStorePairPreIndexFixed | A##_##B
746b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOAD_STORE_PAIR_OP_LIST(LOAD_STORE_PAIR_PRE_INDEX)
747b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  #undef LOAD_STORE_PAIR_PRE_INDEX
748b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch};
749b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
750b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochenum LoadStorePairOffsetOp {
751b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LoadStorePairOffsetFixed = 0x29000000,
752b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LoadStorePairOffsetFMask = 0x3B800000,
753b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LoadStorePairOffsetMask  = 0xFFC00000,
754b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  #define LOAD_STORE_PAIR_OFFSET(A, B, C)  \
755b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  A##_##B##_off = LoadStorePairOffsetFixed | A##_##B
756b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOAD_STORE_PAIR_OP_LIST(LOAD_STORE_PAIR_OFFSET)
757b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  #undef LOAD_STORE_PAIR_OFFSET
758b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch};
759b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
760b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Load literal.
761b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochenum LoadLiteralOp {
762b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LoadLiteralFixed = 0x18000000,
763b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LoadLiteralFMask = 0x3B000000,
764b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LoadLiteralMask  = 0xFF000000,
765b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LDR_w_lit        = LoadLiteralFixed | 0x00000000,
766b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LDR_x_lit        = LoadLiteralFixed | 0x40000000,
767b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LDRSW_x_lit      = LoadLiteralFixed | 0x80000000,
768b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  PRFM_lit         = LoadLiteralFixed | 0xC0000000,
769b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LDR_s_lit        = LoadLiteralFixed | 0x04000000,
770b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LDR_d_lit        = LoadLiteralFixed | 0x44000000
771b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch};
772b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
773b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#define LOAD_STORE_OP_LIST(V)     \
774b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(ST, RB, w,  0x00000000),  \
775b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(ST, RH, w,  0x40000000),  \
776b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(ST, R, w,   0x80000000),  \
777b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(ST, R, x,   0xC0000000),  \
778b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(LD, RB, w,  0x00400000),  \
779b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(LD, RH, w,  0x40400000),  \
780b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(LD, R, w,   0x80400000),  \
781b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(LD, R, x,   0xC0400000),  \
782b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(LD, RSB, x, 0x00800000),  \
783b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(LD, RSH, x, 0x40800000),  \
784b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(LD, RSW, x, 0x80800000),  \
785b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(LD, RSB, w, 0x00C00000),  \
786b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(LD, RSH, w, 0x40C00000),  \
787b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(ST, R, s,   0x84000000),  \
788b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(ST, R, d,   0xC4000000),  \
789b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(LD, R, s,   0x84400000),  \
790b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(LD, R, d,   0xC4400000)
791b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
792b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
793b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Load/store unscaled offset.
794b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochenum LoadStoreUnscaledOffsetOp {
795b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LoadStoreUnscaledOffsetFixed = 0x38000000,
796b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LoadStoreUnscaledOffsetFMask = 0x3B200C00,
797b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LoadStoreUnscaledOffsetMask  = 0xFFE00C00,
798b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  #define LOAD_STORE_UNSCALED(A, B, C, D)  \
799b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  A##U##B##_##C = LoadStoreUnscaledOffsetFixed | D
800b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOAD_STORE_OP_LIST(LOAD_STORE_UNSCALED)
801b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  #undef LOAD_STORE_UNSCALED
802b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch};
803b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
804b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Load/store (post, pre, offset and unsigned.)
805b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochenum LoadStoreOp {
806b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LoadStoreOpMask   = 0xC4C00000,
807b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  #define LOAD_STORE(A, B, C, D)  \
808b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  A##B##_##C = D
809b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOAD_STORE_OP_LIST(LOAD_STORE),
810b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  #undef LOAD_STORE
811b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  PRFM = 0xC0800000
812b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch};
813b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
814b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Load/store post index.
815b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochenum LoadStorePostIndex {
816b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LoadStorePostIndexFixed = 0x38000400,
817b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LoadStorePostIndexFMask = 0x3B200C00,
818b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LoadStorePostIndexMask  = 0xFFE00C00,
819b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  #define LOAD_STORE_POST_INDEX(A, B, C, D)  \
820b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  A##B##_##C##_post = LoadStorePostIndexFixed | D
821b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOAD_STORE_OP_LIST(LOAD_STORE_POST_INDEX)
822b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  #undef LOAD_STORE_POST_INDEX
823b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch};
824b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
825b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Load/store pre index.
826b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochenum LoadStorePreIndex {
827b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LoadStorePreIndexFixed = 0x38000C00,
828b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LoadStorePreIndexFMask = 0x3B200C00,
829b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LoadStorePreIndexMask  = 0xFFE00C00,
830b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  #define LOAD_STORE_PRE_INDEX(A, B, C, D)  \
831b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  A##B##_##C##_pre = LoadStorePreIndexFixed | D
832b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOAD_STORE_OP_LIST(LOAD_STORE_PRE_INDEX)
833b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  #undef LOAD_STORE_PRE_INDEX
834b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch};
835b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
836b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Load/store unsigned offset.
837b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochenum LoadStoreUnsignedOffset {
838b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LoadStoreUnsignedOffsetFixed = 0x39000000,
839b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LoadStoreUnsignedOffsetFMask = 0x3B000000,
840b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LoadStoreUnsignedOffsetMask  = 0xFFC00000,
841b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  PRFM_unsigned                = LoadStoreUnsignedOffsetFixed | PRFM,
842b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  #define LOAD_STORE_UNSIGNED_OFFSET(A, B, C, D) \
843b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  A##B##_##C##_unsigned = LoadStoreUnsignedOffsetFixed | D
844b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOAD_STORE_OP_LIST(LOAD_STORE_UNSIGNED_OFFSET)
845b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  #undef LOAD_STORE_UNSIGNED_OFFSET
846b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch};
847b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
848b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Load/store register offset.
849b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochenum LoadStoreRegisterOffset {
850b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LoadStoreRegisterOffsetFixed = 0x38200800,
851b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LoadStoreRegisterOffsetFMask = 0x3B200C00,
852b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LoadStoreRegisterOffsetMask  = 0xFFE00C00,
853b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  PRFM_reg                     = LoadStoreRegisterOffsetFixed | PRFM,
854b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  #define LOAD_STORE_REGISTER_OFFSET(A, B, C, D) \
855b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  A##B##_##C##_reg = LoadStoreRegisterOffsetFixed | D
856b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOAD_STORE_OP_LIST(LOAD_STORE_REGISTER_OFFSET)
857b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  #undef LOAD_STORE_REGISTER_OFFSET
858b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch};
859b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
86013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch// Load/store acquire/release
86113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdochenum LoadStoreAcquireReleaseOp {
86213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  LoadStoreAcquireReleaseFixed = 0x08000000,
86313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  LoadStoreAcquireReleaseFMask = 0x3F000000,
86413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  LoadStoreAcquireReleaseMask = 0xCFC08000,
86513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  STLXR_b = LoadStoreAcquireReleaseFixed | 0x00008000,
86613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  LDAXR_b = LoadStoreAcquireReleaseFixed | 0x00408000,
86713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  STLR_b  = LoadStoreAcquireReleaseFixed | 0x00808000,
86813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  LDAR_b  = LoadStoreAcquireReleaseFixed | 0x00C08000,
86913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  STLXR_h = LoadStoreAcquireReleaseFixed | 0x40008000,
87013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  LDAXR_h = LoadStoreAcquireReleaseFixed | 0x40408000,
87113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  STLR_h  = LoadStoreAcquireReleaseFixed | 0x40808000,
87213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  LDAR_h  = LoadStoreAcquireReleaseFixed | 0x40C08000,
87313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  STLXR_w = LoadStoreAcquireReleaseFixed | 0x80008000,
87413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  LDAXR_w = LoadStoreAcquireReleaseFixed | 0x80408000,
87513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  STLR_w  = LoadStoreAcquireReleaseFixed | 0x80808000,
87613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  LDAR_w  = LoadStoreAcquireReleaseFixed | 0x80C08000,
87713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  STLXR_x = LoadStoreAcquireReleaseFixed | 0xC0008000,
87813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  LDAXR_x = LoadStoreAcquireReleaseFixed | 0xC0408000,
87913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  STLR_x  = LoadStoreAcquireReleaseFixed | 0xC0808000,
88013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  LDAR_x  = LoadStoreAcquireReleaseFixed | 0xC0C08000,
88113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch};
88213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch
883b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Conditional compare.
884b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochenum ConditionalCompareOp {
885b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  ConditionalCompareMask = 0x60000000,
886b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CCMN                   = 0x20000000,
887b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CCMP                   = 0x60000000
888b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch};
889b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
890b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Conditional compare register.
891b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochenum ConditionalCompareRegisterOp {
892b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  ConditionalCompareRegisterFixed = 0x1A400000,
893b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  ConditionalCompareRegisterFMask = 0x1FE00800,
894b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  ConditionalCompareRegisterMask  = 0xFFE00C10,
895b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CCMN_w = ConditionalCompareRegisterFixed | CCMN,
896b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CCMN_x = ConditionalCompareRegisterFixed | SixtyFourBits | CCMN,
897b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CCMP_w = ConditionalCompareRegisterFixed | CCMP,
898b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CCMP_x = ConditionalCompareRegisterFixed | SixtyFourBits | CCMP
899b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch};
900b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
901b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Conditional compare immediate.
902b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochenum ConditionalCompareImmediateOp {
903b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  ConditionalCompareImmediateFixed = 0x1A400800,
904b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  ConditionalCompareImmediateFMask = 0x1FE00800,
905b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  ConditionalCompareImmediateMask  = 0xFFE00C10,
906b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CCMN_w_imm = ConditionalCompareImmediateFixed | CCMN,
907b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CCMN_x_imm = ConditionalCompareImmediateFixed | SixtyFourBits | CCMN,
908b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CCMP_w_imm = ConditionalCompareImmediateFixed | CCMP,
909b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CCMP_x_imm = ConditionalCompareImmediateFixed | SixtyFourBits | CCMP
910b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch};
911b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
912b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Conditional select.
913b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochenum ConditionalSelectOp {
914b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  ConditionalSelectFixed = 0x1A800000,
915b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  ConditionalSelectFMask = 0x1FE00000,
916b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  ConditionalSelectMask  = 0xFFE00C00,
917b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CSEL_w                 = ConditionalSelectFixed | 0x00000000,
918b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CSEL_x                 = ConditionalSelectFixed | 0x80000000,
919b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CSEL                   = CSEL_w,
920b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CSINC_w                = ConditionalSelectFixed | 0x00000400,
921b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CSINC_x                = ConditionalSelectFixed | 0x80000400,
922b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CSINC                  = CSINC_w,
923b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CSINV_w                = ConditionalSelectFixed | 0x40000000,
924b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CSINV_x                = ConditionalSelectFixed | 0xC0000000,
925b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CSINV                  = CSINV_w,
926b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CSNEG_w                = ConditionalSelectFixed | 0x40000400,
927b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CSNEG_x                = ConditionalSelectFixed | 0xC0000400,
928b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CSNEG                  = CSNEG_w
929b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch};
930b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
931b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Data processing 1 source.
932b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochenum DataProcessing1SourceOp {
933b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DataProcessing1SourceFixed = 0x5AC00000,
934b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DataProcessing1SourceFMask = 0x5FE00000,
935b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DataProcessing1SourceMask  = 0xFFFFFC00,
936b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  RBIT    = DataProcessing1SourceFixed | 0x00000000,
937b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  RBIT_w  = RBIT,
938b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  RBIT_x  = RBIT | SixtyFourBits,
939b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  REV16   = DataProcessing1SourceFixed | 0x00000400,
940b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  REV16_w = REV16,
941b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  REV16_x = REV16 | SixtyFourBits,
942b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  REV     = DataProcessing1SourceFixed | 0x00000800,
943b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  REV_w   = REV,
944b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  REV32_x = REV | SixtyFourBits,
945b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  REV_x   = DataProcessing1SourceFixed | SixtyFourBits | 0x00000C00,
946b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CLZ     = DataProcessing1SourceFixed | 0x00001000,
947b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CLZ_w   = CLZ,
948b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CLZ_x   = CLZ | SixtyFourBits,
949b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CLS     = DataProcessing1SourceFixed | 0x00001400,
950b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CLS_w   = CLS,
951b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CLS_x   = CLS | SixtyFourBits
952b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch};
953b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
954b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Data processing 2 source.
955b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochenum DataProcessing2SourceOp {
956b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DataProcessing2SourceFixed = 0x1AC00000,
957b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DataProcessing2SourceFMask = 0x5FE00000,
958b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DataProcessing2SourceMask  = 0xFFE0FC00,
959b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  UDIV_w  = DataProcessing2SourceFixed | 0x00000800,
960b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  UDIV_x  = DataProcessing2SourceFixed | 0x80000800,
961b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  UDIV    = UDIV_w,
962b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  SDIV_w  = DataProcessing2SourceFixed | 0x00000C00,
963b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  SDIV_x  = DataProcessing2SourceFixed | 0x80000C00,
964b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  SDIV    = SDIV_w,
965b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LSLV_w  = DataProcessing2SourceFixed | 0x00002000,
966b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LSLV_x  = DataProcessing2SourceFixed | 0x80002000,
967b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LSLV    = LSLV_w,
968b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LSRV_w  = DataProcessing2SourceFixed | 0x00002400,
969b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LSRV_x  = DataProcessing2SourceFixed | 0x80002400,
970b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LSRV    = LSRV_w,
971b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  ASRV_w  = DataProcessing2SourceFixed | 0x00002800,
972b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  ASRV_x  = DataProcessing2SourceFixed | 0x80002800,
973b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  ASRV    = ASRV_w,
974b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  RORV_w  = DataProcessing2SourceFixed | 0x00002C00,
975b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  RORV_x  = DataProcessing2SourceFixed | 0x80002C00,
976b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  RORV    = RORV_w,
977b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CRC32B  = DataProcessing2SourceFixed | 0x00004000,
978b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CRC32H  = DataProcessing2SourceFixed | 0x00004400,
979b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CRC32W  = DataProcessing2SourceFixed | 0x00004800,
980b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CRC32X  = DataProcessing2SourceFixed | SixtyFourBits | 0x00004C00,
981b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CRC32CB = DataProcessing2SourceFixed | 0x00005000,
982b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CRC32CH = DataProcessing2SourceFixed | 0x00005400,
983b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CRC32CW = DataProcessing2SourceFixed | 0x00005800,
984b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CRC32CX = DataProcessing2SourceFixed | SixtyFourBits | 0x00005C00
985b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch};
986b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
987b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Data processing 3 source.
988b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochenum DataProcessing3SourceOp {
989b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DataProcessing3SourceFixed = 0x1B000000,
990b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DataProcessing3SourceFMask = 0x1F000000,
991b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DataProcessing3SourceMask  = 0xFFE08000,
992b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  MADD_w                     = DataProcessing3SourceFixed | 0x00000000,
993b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  MADD_x                     = DataProcessing3SourceFixed | 0x80000000,
994b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  MADD                       = MADD_w,
995b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  MSUB_w                     = DataProcessing3SourceFixed | 0x00008000,
996b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  MSUB_x                     = DataProcessing3SourceFixed | 0x80008000,
997b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  MSUB                       = MSUB_w,
998b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  SMADDL_x                   = DataProcessing3SourceFixed | 0x80200000,
999b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  SMSUBL_x                   = DataProcessing3SourceFixed | 0x80208000,
1000b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  SMULH_x                    = DataProcessing3SourceFixed | 0x80400000,
1001b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  UMADDL_x                   = DataProcessing3SourceFixed | 0x80A00000,
1002b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  UMSUBL_x                   = DataProcessing3SourceFixed | 0x80A08000,
1003b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  UMULH_x                    = DataProcessing3SourceFixed | 0x80C00000
1004b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch};
1005b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1006b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Floating point compare.
1007b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochenum FPCompareOp {
1008b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  FPCompareFixed = 0x1E202000,
1009b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  FPCompareFMask = 0x5F203C00,
1010b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  FPCompareMask  = 0xFFE0FC1F,
1011b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  FCMP_s         = FPCompareFixed | 0x00000000,
1012b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  FCMP_d         = FPCompareFixed | FP64 | 0x00000000,
1013b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  FCMP           = FCMP_s,
1014b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  FCMP_s_zero    = FPCompareFixed | 0x00000008,
1015b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  FCMP_d_zero    = FPCompareFixed | FP64 | 0x00000008,
1016b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  FCMP_zero      = FCMP_s_zero,
1017b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  FCMPE_s        = FPCompareFixed | 0x00000010,
1018b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  FCMPE_d        = FPCompareFixed | FP64 | 0x00000010,
1019b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  FCMPE_s_zero   = FPCompareFixed | 0x00000018,
1020b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  FCMPE_d_zero   = FPCompareFixed | FP64 | 0x00000018
1021b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch};
1022b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1023b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Floating point conditional compare.
1024b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochenum FPConditionalCompareOp {
1025b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  FPConditionalCompareFixed = 0x1E200400,
1026b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  FPConditionalCompareFMask = 0x5F200C00,
1027b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  FPConditionalCompareMask  = 0xFFE00C10,
1028b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  FCCMP_s                   = FPConditionalCompareFixed | 0x00000000,
1029b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  FCCMP_d                   = FPConditionalCompareFixed | FP64 | 0x00000000,
1030b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  FCCMP                     = FCCMP_s,
1031b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  FCCMPE_s                  = FPConditionalCompareFixed | 0x00000010,
1032b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  FCCMPE_d                  = FPConditionalCompareFixed | FP64 | 0x00000010,
1033b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  FCCMPE                    = FCCMPE_s
1034b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch};
1035b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1036b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Floating point conditional select.
1037b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochenum FPConditionalSelectOp {
1038b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  FPConditionalSelectFixed = 0x1E200C00,
1039b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  FPConditionalSelectFMask = 0x5F200C00,
1040b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  FPConditionalSelectMask  = 0xFFE00C00,
1041b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  FCSEL_s                  = FPConditionalSelectFixed | 0x00000000,
1042b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  FCSEL_d                  = FPConditionalSelectFixed | FP64 | 0x00000000,
1043b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  FCSEL                    = FCSEL_s
1044b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch};
1045b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1046b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Floating point immediate.
1047b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochenum FPImmediateOp {
1048b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  FPImmediateFixed = 0x1E201000,
1049b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  FPImmediateFMask = 0x5F201C00,
1050b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  FPImmediateMask  = 0xFFE01C00,
1051b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  FMOV_s_imm       = FPImmediateFixed | 0x00000000,
1052b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  FMOV_d_imm       = FPImmediateFixed | FP64 | 0x00000000
1053b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch};
1054b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1055b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Floating point data processing 1 source.
1056b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochenum FPDataProcessing1SourceOp {
1057b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  FPDataProcessing1SourceFixed = 0x1E204000,
1058b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  FPDataProcessing1SourceFMask = 0x5F207C00,
1059b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  FPDataProcessing1SourceMask  = 0xFFFFFC00,
1060b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  FMOV_s   = FPDataProcessing1SourceFixed | 0x00000000,
1061b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  FMOV_d   = FPDataProcessing1SourceFixed | FP64 | 0x00000000,
1062b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  FMOV     = FMOV_s,
1063b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  FABS_s   = FPDataProcessing1SourceFixed | 0x00008000,
1064b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  FABS_d   = FPDataProcessing1SourceFixed | FP64 | 0x00008000,
1065b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  FABS     = FABS_s,
1066b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  FNEG_s   = FPDataProcessing1SourceFixed | 0x00010000,
1067b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  FNEG_d   = FPDataProcessing1SourceFixed | FP64 | 0x00010000,
1068b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  FNEG     = FNEG_s,
1069b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  FSQRT_s  = FPDataProcessing1SourceFixed | 0x00018000,
1070b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  FSQRT_d  = FPDataProcessing1SourceFixed | FP64 | 0x00018000,
1071b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  FSQRT    = FSQRT_s,
1072b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  FCVT_ds  = FPDataProcessing1SourceFixed | 0x00028000,
1073b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  FCVT_sd  = FPDataProcessing1SourceFixed | FP64 | 0x00020000,
1074b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  FRINTN_s = FPDataProcessing1SourceFixed | 0x00040000,
1075b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  FRINTN_d = FPDataProcessing1SourceFixed | FP64 | 0x00040000,
1076b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  FRINTN   = FRINTN_s,
1077b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  FRINTP_s = FPDataProcessing1SourceFixed | 0x00048000,
1078b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  FRINTP_d = FPDataProcessing1SourceFixed | FP64 | 0x00048000,
1079b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  FRINTP   = FRINTP_s,
1080b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  FRINTM_s = FPDataProcessing1SourceFixed | 0x00050000,
1081b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  FRINTM_d = FPDataProcessing1SourceFixed | FP64 | 0x00050000,
1082b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  FRINTM   = FRINTM_s,
1083b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  FRINTZ_s = FPDataProcessing1SourceFixed | 0x00058000,
1084b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  FRINTZ_d = FPDataProcessing1SourceFixed | FP64 | 0x00058000,
1085b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  FRINTZ   = FRINTZ_s,
1086b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  FRINTA_s = FPDataProcessing1SourceFixed | 0x00060000,
1087b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  FRINTA_d = FPDataProcessing1SourceFixed | FP64 | 0x00060000,
1088b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  FRINTA   = FRINTA_s,
1089b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  FRINTX_s = FPDataProcessing1SourceFixed | 0x00070000,
1090b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  FRINTX_d = FPDataProcessing1SourceFixed | FP64 | 0x00070000,
1091b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  FRINTX   = FRINTX_s,
1092b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  FRINTI_s = FPDataProcessing1SourceFixed | 0x00078000,
1093b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  FRINTI_d = FPDataProcessing1SourceFixed | FP64 | 0x00078000,
1094b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  FRINTI   = FRINTI_s
1095b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch};
1096b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1097b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Floating point data processing 2 source.
1098b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochenum FPDataProcessing2SourceOp {
1099b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  FPDataProcessing2SourceFixed = 0x1E200800,
1100b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  FPDataProcessing2SourceFMask = 0x5F200C00,
1101b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  FPDataProcessing2SourceMask  = 0xFFE0FC00,
1102b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  FMUL     = FPDataProcessing2SourceFixed | 0x00000000,
1103b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  FMUL_s   = FMUL,
1104b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  FMUL_d   = FMUL | FP64,
1105b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  FDIV     = FPDataProcessing2SourceFixed | 0x00001000,
1106b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  FDIV_s   = FDIV,
1107b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  FDIV_d   = FDIV | FP64,
1108b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  FADD     = FPDataProcessing2SourceFixed | 0x00002000,
1109b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  FADD_s   = FADD,
1110b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  FADD_d   = FADD | FP64,
1111b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  FSUB     = FPDataProcessing2SourceFixed | 0x00003000,
1112b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  FSUB_s   = FSUB,
1113b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  FSUB_d   = FSUB | FP64,
1114b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  FMAX     = FPDataProcessing2SourceFixed | 0x00004000,
1115b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  FMAX_s   = FMAX,
1116b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  FMAX_d   = FMAX | FP64,
1117b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  FMIN     = FPDataProcessing2SourceFixed | 0x00005000,
1118b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  FMIN_s   = FMIN,
1119b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  FMIN_d   = FMIN | FP64,
1120b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  FMAXNM   = FPDataProcessing2SourceFixed | 0x00006000,
1121b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  FMAXNM_s = FMAXNM,
1122b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  FMAXNM_d = FMAXNM | FP64,
1123b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  FMINNM   = FPDataProcessing2SourceFixed | 0x00007000,
1124b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  FMINNM_s = FMINNM,
1125b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  FMINNM_d = FMINNM | FP64,
1126b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  FNMUL    = FPDataProcessing2SourceFixed | 0x00008000,
1127b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  FNMUL_s  = FNMUL,
1128b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  FNMUL_d  = FNMUL | FP64
1129b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch};
1130b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1131b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Floating point data processing 3 source.
1132b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochenum FPDataProcessing3SourceOp {
1133b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  FPDataProcessing3SourceFixed = 0x1F000000,
1134b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  FPDataProcessing3SourceFMask = 0x5F000000,
1135b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  FPDataProcessing3SourceMask  = 0xFFE08000,
1136b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  FMADD_s                      = FPDataProcessing3SourceFixed | 0x00000000,
1137b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  FMSUB_s                      = FPDataProcessing3SourceFixed | 0x00008000,
1138b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  FNMADD_s                     = FPDataProcessing3SourceFixed | 0x00200000,
1139b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  FNMSUB_s                     = FPDataProcessing3SourceFixed | 0x00208000,
1140b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  FMADD_d                      = FPDataProcessing3SourceFixed | 0x00400000,
1141b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  FMSUB_d                      = FPDataProcessing3SourceFixed | 0x00408000,
1142b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  FNMADD_d                     = FPDataProcessing3SourceFixed | 0x00600000,
1143b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  FNMSUB_d                     = FPDataProcessing3SourceFixed | 0x00608000
1144b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch};
1145b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1146b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Conversion between floating point and integer.
1147b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochenum FPIntegerConvertOp {
1148b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  FPIntegerConvertFixed = 0x1E200000,
1149b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  FPIntegerConvertFMask = 0x5F20FC00,
1150b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  FPIntegerConvertMask  = 0xFFFFFC00,
1151b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  FCVTNS    = FPIntegerConvertFixed | 0x00000000,
1152b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  FCVTNS_ws = FCVTNS,
1153b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  FCVTNS_xs = FCVTNS | SixtyFourBits,
1154b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  FCVTNS_wd = FCVTNS | FP64,
1155b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  FCVTNS_xd = FCVTNS | SixtyFourBits | FP64,
1156b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  FCVTNU    = FPIntegerConvertFixed | 0x00010000,
1157b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  FCVTNU_ws = FCVTNU,
1158b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  FCVTNU_xs = FCVTNU | SixtyFourBits,
1159b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  FCVTNU_wd = FCVTNU | FP64,
1160b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  FCVTNU_xd = FCVTNU | SixtyFourBits | FP64,
1161b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  FCVTPS    = FPIntegerConvertFixed | 0x00080000,
1162b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  FCVTPS_ws = FCVTPS,
1163b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  FCVTPS_xs = FCVTPS | SixtyFourBits,
1164b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  FCVTPS_wd = FCVTPS | FP64,
1165b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  FCVTPS_xd = FCVTPS | SixtyFourBits | FP64,
1166b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  FCVTPU    = FPIntegerConvertFixed | 0x00090000,
1167b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  FCVTPU_ws = FCVTPU,
1168b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  FCVTPU_xs = FCVTPU | SixtyFourBits,
1169b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  FCVTPU_wd = FCVTPU | FP64,
1170b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  FCVTPU_xd = FCVTPU | SixtyFourBits | FP64,
1171b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  FCVTMS    = FPIntegerConvertFixed | 0x00100000,
1172b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  FCVTMS_ws = FCVTMS,
1173b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  FCVTMS_xs = FCVTMS | SixtyFourBits,
1174b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  FCVTMS_wd = FCVTMS | FP64,
1175b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  FCVTMS_xd = FCVTMS | SixtyFourBits | FP64,
1176b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  FCVTMU    = FPIntegerConvertFixed | 0x00110000,
1177b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  FCVTMU_ws = FCVTMU,
1178b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  FCVTMU_xs = FCVTMU | SixtyFourBits,
1179b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  FCVTMU_wd = FCVTMU | FP64,
1180b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  FCVTMU_xd = FCVTMU | SixtyFourBits | FP64,
1181b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  FCVTZS    = FPIntegerConvertFixed | 0x00180000,
1182b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  FCVTZS_ws = FCVTZS,
1183b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  FCVTZS_xs = FCVTZS | SixtyFourBits,
1184b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  FCVTZS_wd = FCVTZS | FP64,
1185b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  FCVTZS_xd = FCVTZS | SixtyFourBits | FP64,
1186b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  FCVTZU    = FPIntegerConvertFixed | 0x00190000,
1187b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  FCVTZU_ws = FCVTZU,
1188b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  FCVTZU_xs = FCVTZU | SixtyFourBits,
1189b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  FCVTZU_wd = FCVTZU | FP64,
1190b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  FCVTZU_xd = FCVTZU | SixtyFourBits | FP64,
1191b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  SCVTF     = FPIntegerConvertFixed | 0x00020000,
1192b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  SCVTF_sw  = SCVTF,
1193b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  SCVTF_sx  = SCVTF | SixtyFourBits,
1194b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  SCVTF_dw  = SCVTF | FP64,
1195b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  SCVTF_dx  = SCVTF | SixtyFourBits | FP64,
1196b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  UCVTF     = FPIntegerConvertFixed | 0x00030000,
1197b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  UCVTF_sw  = UCVTF,
1198b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  UCVTF_sx  = UCVTF | SixtyFourBits,
1199b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  UCVTF_dw  = UCVTF | FP64,
1200b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  UCVTF_dx  = UCVTF | SixtyFourBits | FP64,
1201b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  FCVTAS    = FPIntegerConvertFixed | 0x00040000,
1202b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  FCVTAS_ws = FCVTAS,
1203b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  FCVTAS_xs = FCVTAS | SixtyFourBits,
1204b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  FCVTAS_wd = FCVTAS | FP64,
1205b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  FCVTAS_xd = FCVTAS | SixtyFourBits | FP64,
1206b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  FCVTAU    = FPIntegerConvertFixed | 0x00050000,
1207b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  FCVTAU_ws = FCVTAU,
1208b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  FCVTAU_xs = FCVTAU | SixtyFourBits,
1209b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  FCVTAU_wd = FCVTAU | FP64,
1210b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  FCVTAU_xd = FCVTAU | SixtyFourBits | FP64,
1211b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  FMOV_ws   = FPIntegerConvertFixed | 0x00060000,
1212b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  FMOV_sw   = FPIntegerConvertFixed | 0x00070000,
1213b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  FMOV_xd   = FMOV_ws | SixtyFourBits | FP64,
1214b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  FMOV_dx   = FMOV_sw | SixtyFourBits | FP64
1215b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch};
1216b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1217b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Conversion between fixed point and floating point.
1218b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochenum FPFixedPointConvertOp {
1219b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  FPFixedPointConvertFixed = 0x1E000000,
1220b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  FPFixedPointConvertFMask = 0x5F200000,
1221b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  FPFixedPointConvertMask  = 0xFFFF0000,
1222b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  FCVTZS_fixed    = FPFixedPointConvertFixed | 0x00180000,
1223b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  FCVTZS_ws_fixed = FCVTZS_fixed,
1224b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  FCVTZS_xs_fixed = FCVTZS_fixed | SixtyFourBits,
1225b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  FCVTZS_wd_fixed = FCVTZS_fixed | FP64,
1226b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  FCVTZS_xd_fixed = FCVTZS_fixed | SixtyFourBits | FP64,
1227b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  FCVTZU_fixed    = FPFixedPointConvertFixed | 0x00190000,
1228b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  FCVTZU_ws_fixed = FCVTZU_fixed,
1229b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  FCVTZU_xs_fixed = FCVTZU_fixed | SixtyFourBits,
1230b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  FCVTZU_wd_fixed = FCVTZU_fixed | FP64,
1231b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  FCVTZU_xd_fixed = FCVTZU_fixed | SixtyFourBits | FP64,
1232b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  SCVTF_fixed     = FPFixedPointConvertFixed | 0x00020000,
1233b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  SCVTF_sw_fixed  = SCVTF_fixed,
1234b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  SCVTF_sx_fixed  = SCVTF_fixed | SixtyFourBits,
1235b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  SCVTF_dw_fixed  = SCVTF_fixed | FP64,
1236b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  SCVTF_dx_fixed  = SCVTF_fixed | SixtyFourBits | FP64,
1237b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  UCVTF_fixed     = FPFixedPointConvertFixed | 0x00030000,
1238b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  UCVTF_sw_fixed  = UCVTF_fixed,
1239b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  UCVTF_sx_fixed  = UCVTF_fixed | SixtyFourBits,
1240b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  UCVTF_dw_fixed  = UCVTF_fixed | FP64,
1241b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  UCVTF_dx_fixed  = UCVTF_fixed | SixtyFourBits | FP64
1242b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch};
1243b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1244b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Unimplemented and unallocated instructions. These are defined to make fixed
1245b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// bit assertion easier.
1246b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochenum UnimplementedOp {
1247b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  UnimplementedFixed = 0x00000000,
1248b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  UnimplementedFMask = 0x00000000
1249b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch};
1250b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1251b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochenum UnallocatedOp {
1252b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  UnallocatedFixed = 0x00000000,
1253b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  UnallocatedFMask = 0x00000000
1254b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch};
1255b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1256014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}  // namespace internal
1257014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}  // namespace v8
1258b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1259b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#endif  // V8_ARM64_CONSTANTS_ARM64_H_
1260