1436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
2436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov/*---------------------------------------------------------------*/
3436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov/*--- begin                                 host_arm64_defs.h ---*/
4436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov/*---------------------------------------------------------------*/
5436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
6436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov/*
7436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   This file is part of Valgrind, a dynamic binary instrumentation
8436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   framework.
9436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
10436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   Copyright (C) 2013-2013 OpenWorks
11436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      info@open-works.net
12436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
13436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   This program is free software; you can redistribute it and/or
14436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   modify it under the terms of the GNU General Public License as
15436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   published by the Free Software Foundation; either version 2 of the
16436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   License, or (at your option) any later version.
17436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
18436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   This program is distributed in the hope that it will be useful, but
19436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   WITHOUT ANY WARRANTY; without even the implied warranty of
20436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
21436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   General Public License for more details.
22436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
23436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   You should have received a copy of the GNU General Public License
24436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   along with this program; if not, write to the Free Software
25436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
26436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   02110-1301, USA.
27436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
28436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   The GNU General Public License is contained in the file COPYING.
29436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov*/
30436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
31436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#ifndef __VEX_HOST_ARM64_DEFS_H
32436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define __VEX_HOST_ARM64_DEFS_H
33436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
34436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#include "libvex_basictypes.h"
35436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#include "libvex.h"                      // VexArch
36436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#include "host_generic_regs.h"           // HReg
37436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
38436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ extern UInt arm_hwcaps;
39436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
40436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
41436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov/* --------- Registers. --------- */
42436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
43436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ /* The usual HReg abstraction.
44436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    There are 16 general purpose regs.
45436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ */
46436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
47436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovextern void ppHRegARM64 ( HReg );
48436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
49436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovextern HReg hregARM64_X0  ( void );
50436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovextern HReg hregARM64_X1  ( void );
51436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovextern HReg hregARM64_X2  ( void );
52436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovextern HReg hregARM64_X3  ( void );
53436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovextern HReg hregARM64_X4  ( void );
54436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovextern HReg hregARM64_X5  ( void );
55436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovextern HReg hregARM64_X6  ( void );
56436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovextern HReg hregARM64_X7  ( void );
57436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ extern HReg hregARM_R8  ( void );
58436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovextern HReg hregARM64_X9  ( void );
59436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovextern HReg hregARM64_X10 ( void );
60436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovextern HReg hregARM64_X11 ( void );
61436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovextern HReg hregARM64_X12 ( void );
62436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovextern HReg hregARM64_X13 ( void );
63436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovextern HReg hregARM64_X14 ( void );
64436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovextern HReg hregARM64_X15 ( void );
65436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovextern HReg hregARM64_X21 ( void );
66436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovextern HReg hregARM64_X22 ( void );
67436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovextern HReg hregARM64_X23 ( void );
68436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovextern HReg hregARM64_X24 ( void );
69436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovextern HReg hregARM64_X25 ( void );
70436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovextern HReg hregARM64_X26 ( void );
71436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovextern HReg hregARM64_X27 ( void );
72436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovextern HReg hregARM64_X28 ( void );
73436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovextern HReg hregARM64_D8  ( void );
74436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovextern HReg hregARM64_D9  ( void );
75436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovextern HReg hregARM64_D10 ( void );
76436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovextern HReg hregARM64_D11 ( void );
77436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovextern HReg hregARM64_D12 ( void );
78436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovextern HReg hregARM64_D13 ( void );
79436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovextern HReg hregARM64_Q16 ( void );
80436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovextern HReg hregARM64_Q17 ( void );
81436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovextern HReg hregARM64_Q18 ( void );
82436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
83436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov/* Number of registers used arg passing in function calls */
84436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define ARM64_N_ARGREGS 8   /* x0 .. x7 */
85436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
86436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
87436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov/* --------- Condition codes. --------- */
88436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
89436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovtypedef
90436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   enum {
91436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      ARM64cc_EQ  = 0,  /* equal                         : Z=1 */
92436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      ARM64cc_NE  = 1,  /* not equal                     : Z=0 */
93436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
94436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      ARM64cc_CS  = 2,  /* >=u (higher or same)          : C=1 */
95436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      ARM64cc_CC  = 3,  /* <u  (lower)                   : C=0 */
96436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
97436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      ARM64cc_MI  = 4,  /* minus (negative)              : N=1 */
98436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      ARM64cc_PL  = 5,  /* plus (zero or +ve)            : N=0 */
99436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
100436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      ARM64cc_VS  = 6,  /* overflow                      : V=1 */
101436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      ARM64cc_VC  = 7,  /* no overflow                   : V=0 */
102436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
103436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      ARM64cc_HI  = 8,  /* >u   (higher)                 :   C=1 && Z=0 */
104436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      ARM64cc_LS  = 9,  /* <=u  (lower or same)          : !(C=1 && Z=0) */
105436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
106436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      ARM64cc_GE  = 10, /* >=s (signed greater or equal) :   N=V */
107436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      ARM64cc_LT  = 11, /* <s  (signed less than)        : !(N=V) */
108436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
109436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      ARM64cc_GT  = 12, /* >s  (signed greater)          :   Z=0 && N=V */
110436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      ARM64cc_LE  = 13, /* <=s (signed less or equal)    : !(Z=0 && N=V) */
111436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
112436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      ARM64cc_AL  = 14, /* always (unconditional) */
113436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      ARM64cc_NV  = 15  /* in 64-bit mode also means "always" */
114436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   }
115436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   ARM64CondCode;
116436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
117436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
118436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov/* --------- Memory address expressions (amodes). --------- */
119436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
120436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovtypedef
121436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   enum {
122436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      ARM64am_RI9=10, /* reg + simm9 */
123436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      ARM64am_RI12,   /* reg + uimm12 * szB (iow, scaled by access size) */
124436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      ARM64am_RR      /* reg1 + reg2 */
125436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   }
126436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   ARM64AModeTag;
127436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
128436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovtypedef
129436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   struct {
130436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      ARM64AModeTag tag;
131436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      union {
132436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         struct {
133436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            HReg reg;
134436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            Int  simm9; /* -256 .. +255 */
135436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         } RI9;
136436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         struct {
137436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            HReg  reg;
138436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            UInt  uimm12; /* 0 .. 4095 */
139436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            UChar szB;    /* 1, 2, 4, 8 (16 ?) */
140436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         } RI12;
141436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         struct {
142436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            HReg base;
143436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            HReg index;
144436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         } RR;
145436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      } ARM64am;
146436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   }
147436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   ARM64AMode;
148436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
149436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovextern ARM64AMode* ARM64AMode_RI9  ( HReg reg, Int simm9 );
150436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovextern ARM64AMode* ARM64AMode_RI12 ( HReg reg, Int uimm12, UChar szB );
151436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovextern ARM64AMode* ARM64AMode_RR   ( HReg base, HReg index );
152436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
153436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
154436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov/* --------- Reg or uimm12 or (uimm12 << 12) operands --------- */
155436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
156436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovtypedef
157436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   enum {
158436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      ARM64riA_I12=20, /* uimm12 << 0 or 12 only */
159436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      ARM64riA_R       /* reg */
160436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   }
161436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   ARM64RIATag;
162436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
163436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovtypedef
164436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   struct {
165436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      ARM64RIATag tag;
166436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      union {
167436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         struct {
168436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            UShort imm12;  /* 0 .. 4095 */
169436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            UChar  shift;  /* 0 or 12 only */
170436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         } I12;
171436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         struct {
172436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            HReg reg;
173436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         } R;
174436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      } ARM64riA;
175436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   }
176436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   ARM64RIA;
177436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
178436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovextern ARM64RIA* ARM64RIA_I12 ( UShort imm12, UChar shift );
179436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovextern ARM64RIA* ARM64RIA_R   ( HReg );
180436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
181436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
182436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov/* --------- Reg or "bitfield" (logic immediate) operands --------- */
183436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
184436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovtypedef
185436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   enum {
186436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      ARM64riL_I13=6, /* wierd-o bitfield immediate, 13 bits in total */
187436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      ARM64riL_R      /* reg */
188436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   }
189436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   ARM64RILTag;
190436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
191436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovtypedef
192436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   struct {
193436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      ARM64RILTag tag;
194436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      union {
195436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         struct {
196436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            UChar bitN; /* 0 .. 1 */
197436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            UChar immR; /* 0 .. 63 */
198436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            UChar immS; /* 0 .. 63 */
199436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         } I13;
200436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         struct {
201436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            HReg reg;
202436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         } R;
203436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      } ARM64riL;
204436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   }
205436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   ARM64RIL;
206436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
207436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovextern ARM64RIL* ARM64RIL_I13 ( UChar bitN, UChar immR, UChar immS );
208436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovextern ARM64RIL* ARM64RIL_R   ( HReg );
209436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
210436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
211436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov/* --------------- Reg or uimm6 operands --------------- */
212436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
213436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovtypedef
214436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   enum {
215436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      ARM64ri6_I6=30, /* uimm6, 1 .. 63 only */
216436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      ARM64ri6_R      /* reg */
217436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   }
218436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   ARM64RI6Tag;
219436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
220436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovtypedef
221436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   struct {
222436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      ARM64RI6Tag tag;
223436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      union {
224436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         struct {
225436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            UInt imm6;   /* 1 .. 63 */
226436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         } I6;
227436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         struct {
228436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            HReg reg;
229436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         } R;
230436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      } ARM64ri6;
231436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   }
232436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   ARM64RI6;
233436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
234436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovextern ARM64RI6* ARM64RI6_I6 ( UInt imm6 );
235436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovextern ARM64RI6* ARM64RI6_R  ( HReg );
236436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
237436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
238436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov/* --------------------- Instructions --------------------- */
239436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
240436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovtypedef
241436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   enum {
242436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      ARM64lo_AND=40,
243436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      ARM64lo_OR,
244436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      ARM64lo_XOR
245436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   }
246436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   ARM64LogicOp;
247436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
248436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovtypedef
249436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   enum {
250436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      ARM64sh_SHL=50,
251436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      ARM64sh_SHR,
252436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      ARM64sh_SAR
253436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   }
254436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   ARM64ShiftOp;
255436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
256436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovtypedef
257436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   enum {
258436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      ARM64un_NEG=60,
259436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      ARM64un_NOT,
260436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      ARM64un_CLZ,
261436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   }
262436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   ARM64UnaryOp;
263436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
264436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovtypedef
265436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   enum {
266436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      ARM64mul_PLAIN=70, /* lo64(64 * 64)  */
267436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      ARM64mul_ZX,       /* hi64(64 *u 64) */
268436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      ARM64mul_SX        /* hi64(64 *s 64) */
269436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   }
270436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   ARM64MulOp;
271436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
272436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovtypedef
273436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   /* These characterise an integer-FP conversion, but don't imply any
274436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      particular direction. */
275436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   enum {
276436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      ARM64cvt_F32_I32S=80,
277436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      ARM64cvt_F64_I32S,
278436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      ARM64cvt_F32_I64S,
279436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      ARM64cvt_F64_I64S,
280436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      ARM64cvt_F32_I32U,
281436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      ARM64cvt_F64_I32U,
282436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      ARM64cvt_F32_I64U,
283436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      ARM64cvt_F64_I64U,
284436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      ARM64cvt_INVALID
285436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   }
286436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   ARM64CvtOp;
287436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
288436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovtypedef
289436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   enum {
290436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      ARM64fpb_ADD=100,
291436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      ARM64fpb_SUB,
292436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      ARM64fpb_MUL,
293436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      ARM64fpb_DIV,
294436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      ARM64fpb_INVALID
295436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   }
296436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   ARM64FpBinOp;
297436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
298436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovtypedef
299436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   enum {
300436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      ARM64fpu_NEG=110,
301436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      ARM64fpu_ABS,
302436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      ARM64fpu_SQRT,
303436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      ARM64fpu_RINT,
304436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      ARM64fpu_INVALID
305436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   }
306436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   ARM64FpUnaryOp;
307436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
308436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovtypedef
309436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   enum {
310436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      ARM64vecb_ADD64x2=120,
311436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      ARM64vecb_ADD32x4,
312436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      ARM64vecb_ADD16x8,
313eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov      ARM64vecb_ADD8x16,
314436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      ARM64vecb_SUB64x2,
315436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      ARM64vecb_SUB32x4,
316436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      ARM64vecb_SUB16x8,
317eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov      ARM64vecb_SUB8x16,
318436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      ARM64vecb_MUL32x4,
319436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      ARM64vecb_MUL16x8,
320eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov      ARM64vecb_MUL8x16,
321436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      ARM64vecb_FADD64x2,
322436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      ARM64vecb_FSUB64x2,
323436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      ARM64vecb_FMUL64x2,
324436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      ARM64vecb_FDIV64x2,
325436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      ARM64vecb_FADD32x4,
326436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      ARM64vecb_FSUB32x4,
327436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      ARM64vecb_FMUL32x4,
328436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      ARM64vecb_FDIV32x4,
329436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      ARM64vecb_UMAX32x4,
330436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      ARM64vecb_UMAX16x8,
331436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      ARM64vecb_UMAX8x16,
332436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      ARM64vecb_UMIN32x4,
333436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      ARM64vecb_UMIN16x8,
334436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      ARM64vecb_UMIN8x16,
3350a8046eb0993fb7e155b03cc5ef3323fca3467c0Dmitriy Ivanov      ARM64vecb_UMULL32x2,
3360a8046eb0993fb7e155b03cc5ef3323fca3467c0Dmitriy Ivanov      ARM64vecb_UMULL16x4,
3370a8046eb0993fb7e155b03cc5ef3323fca3467c0Dmitriy Ivanov      ARM64vecb_UMULL8x8,
338436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      ARM64vecb_SMAX32x4,
339436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      ARM64vecb_SMAX16x8,
340436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      ARM64vecb_SMAX8x16,
341436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      ARM64vecb_SMIN32x4,
342436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      ARM64vecb_SMIN16x8,
343436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      ARM64vecb_SMIN8x16,
344436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      ARM64vecb_AND,
345436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      ARM64vecb_ORR,
346436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      ARM64vecb_XOR,
347436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      ARM64vecb_CMEQ64x2,
3482ca80a6a6fc069acdb73186e8e578dbf8f46af80Dmitriy Ivanov      ARM64vecb_CMEQ32x4,
3492ca80a6a6fc069acdb73186e8e578dbf8f46af80Dmitriy Ivanov      ARM64vecb_CMEQ16x8,
3502ca80a6a6fc069acdb73186e8e578dbf8f46af80Dmitriy Ivanov      ARM64vecb_CMEQ8x16,
351eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov      ARM64vecb_CMHI64x2, /* >u */
352eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov      ARM64vecb_CMHI32x4,
353eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov      ARM64vecb_CMHI16x8,
354eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov      ARM64vecb_CMHI8x16,
355eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov      ARM64vecb_CMGT64x2, /* >s */
356eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov      ARM64vecb_CMGT32x4,
357eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov      ARM64vecb_CMGT16x8,
358eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov      ARM64vecb_CMGT8x16,
359eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov      ARM64vecb_FCMEQ64x2,
360eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov      ARM64vecb_FCMEQ32x4,
361eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov      ARM64vecb_FCMGE64x2,
362eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov      ARM64vecb_FCMGE32x4,
363eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov      ARM64vecb_FCMGT64x2,
364eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov      ARM64vecb_FCMGT32x4,
365eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov      ARM64vecb_TBL1,
366436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      ARM64vecb_INVALID
367436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   }
368436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   ARM64VecBinOp;
369436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
370436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovtypedef
371436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   enum {
372436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      ARM64vecu_FNEG64x2=300,
373436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      ARM64vecu_FNEG32x4,
374436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      ARM64vecu_FABS64x2,
375436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      ARM64vecu_FABS32x4,
3760a8046eb0993fb7e155b03cc5ef3323fca3467c0Dmitriy Ivanov      ARM64vecu_VMOVL8U,
3770a8046eb0993fb7e155b03cc5ef3323fca3467c0Dmitriy Ivanov      ARM64vecu_VMOVL16U,
3780a8046eb0993fb7e155b03cc5ef3323fca3467c0Dmitriy Ivanov      ARM64vecu_VMOVL32U,
3790a8046eb0993fb7e155b03cc5ef3323fca3467c0Dmitriy Ivanov      ARM64vecu_VMOVL8S,
3800a8046eb0993fb7e155b03cc5ef3323fca3467c0Dmitriy Ivanov      ARM64vecu_VMOVL16S,
3810a8046eb0993fb7e155b03cc5ef3323fca3467c0Dmitriy Ivanov      ARM64vecu_VMOVL32S,
382436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      ARM64vecu_NOT,
3836d9b01c06e645ea0b0a3544e968961aaa7bc6a66Dmitriy Ivanov      ARM64vecu_CNT,
384051d3b5d6376aa10a65793c3c2267d6ab233b896Dmitriy Ivanov      ARM64vecu_UADDLV8x16,
385051d3b5d6376aa10a65793c3c2267d6ab233b896Dmitriy Ivanov      ARM64vecu_UADDLV16x8,
386051d3b5d6376aa10a65793c3c2267d6ab233b896Dmitriy Ivanov      ARM64vecu_UADDLV32x4,
387051d3b5d6376aa10a65793c3c2267d6ab233b896Dmitriy Ivanov      ARM64vecu_SADDLV8x16,
388051d3b5d6376aa10a65793c3c2267d6ab233b896Dmitriy Ivanov      ARM64vecu_SADDLV16x8,
389051d3b5d6376aa10a65793c3c2267d6ab233b896Dmitriy Ivanov      ARM64vecu_SADDLV32x4,
390436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      ARM64vecu_INVALID
391436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   }
392436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   ARM64VecUnaryOp;
393436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
394436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovtypedef
395436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   enum {
396436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      ARM64vecsh_USHR64x2=350,
397eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov      ARM64vecsh_USHR32x4,
3982ca80a6a6fc069acdb73186e8e578dbf8f46af80Dmitriy Ivanov      ARM64vecsh_USHR16x8,
399eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov      ARM64vecsh_USHR8x16,
400436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      ARM64vecsh_SSHR64x2,
401eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov      ARM64vecsh_SSHR32x4,
402eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov      ARM64vecsh_SSHR16x8,
403eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov      ARM64vecsh_SSHR8x16,
404eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov      ARM64vecsh_SHL64x2,
405436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      ARM64vecsh_SHL32x4,
406eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov      ARM64vecsh_SHL16x8,
407eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov      ARM64vecsh_SHL8x16,
408436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      ARM64vecsh_INVALID
409436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   }
410436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   ARM64VecShiftOp;
411436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
412436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ extern const HChar* showARMVfpUnaryOp ( ARMVfpUnaryOp op );
413436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ
414436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ typedef
415436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    enum {
416436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       ARMneon_VAND=90,
417436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       ARMneon_VORR,
418436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       ARMneon_VXOR,
419436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       ARMneon_VADD,
420436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       ARMneon_VADDFP,
421436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       ARMneon_VRHADDS,
422436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       ARMneon_VRHADDU,
423436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       ARMneon_VPADDFP,
424436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       ARMneon_VABDFP,
425436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       ARMneon_VSUB,
426436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       ARMneon_VSUBFP,
427436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       ARMneon_VMAXU,
428436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       ARMneon_VMAXS,
429436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       ARMneon_VMAXF,
430436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       ARMneon_VMINU,
431436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       ARMneon_VMINS,
432436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       ARMneon_VMINF,
433436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       ARMneon_VQADDU,
434436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       ARMneon_VQADDS,
435436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       ARMneon_VQSUBU,
436436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       ARMneon_VQSUBS,
437436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       ARMneon_VCGTU,
438436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       ARMneon_VCGTS,
439436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       ARMneon_VCGEU,
440436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       ARMneon_VCGES,
441436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       ARMneon_VCGTF,
442436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       ARMneon_VCGEF,
443436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       ARMneon_VCEQ,
444436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       ARMneon_VCEQF,
445436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       ARMneon_VEXT,
446436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       ARMneon_VMUL,
447436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       ARMneon_VMULFP,
448436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       ARMneon_VMULLU,
449436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       ARMneon_VMULLS,
450436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       ARMneon_VMULP,
451436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       ARMneon_VMULLP,
452436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       ARMneon_VQDMULH,
453436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       ARMneon_VQRDMULH,
454436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       ARMneon_VPADD,
455436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       ARMneon_VPMINU,
456436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       ARMneon_VPMINS,
457436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       ARMneon_VPMINF,
458436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       ARMneon_VPMAXU,
459436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       ARMneon_VPMAXS,
460436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       ARMneon_VPMAXF,
461436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       ARMneon_VTBL,
462436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       ARMneon_VQDMULL,
463436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       ARMneon_VRECPS,
464436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       ARMneon_VRSQRTS,
465436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       /* ... */
466436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    }
467436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    ARMNeonBinOp;
468436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ
469436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ typedef
470436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    enum {
471436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       ARMneon_VSHL=150,
472436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       ARMneon_VSAL, /* Yah, not SAR but SAL */
473436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       ARMneon_VQSHL,
474436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       ARMneon_VQSAL
475436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    }
476436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    ARMNeonShiftOp;
477436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ
478436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ typedef
479436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    enum {
480436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       ARMneon_COPY=160,
481436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       ARMneon_COPYLU,
482436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       ARMneon_COPYLS,
483436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       ARMneon_COPYN,
484436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       ARMneon_COPYQNSS,
485436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       ARMneon_COPYQNUS,
486436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       ARMneon_COPYQNUU,
487436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       ARMneon_NOT,
488436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       ARMneon_EQZ,
489436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       ARMneon_DUP,
490436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       ARMneon_PADDLS,
491436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       ARMneon_PADDLU,
492436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       ARMneon_CNT,
493436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       ARMneon_CLZ,
494436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       ARMneon_CLS,
495436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       ARMneon_VCVTxFPxINT,
496436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       ARMneon_VQSHLNSS,
497436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       ARMneon_VQSHLNUU,
498436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       ARMneon_VQSHLNUS,
499436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       ARMneon_VCVTFtoU,
500436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       ARMneon_VCVTFtoS,
501436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       ARMneon_VCVTUtoF,
502436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       ARMneon_VCVTStoF,
503436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       ARMneon_VCVTFtoFixedU,
504436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       ARMneon_VCVTFtoFixedS,
505436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       ARMneon_VCVTFixedUtoF,
506436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       ARMneon_VCVTFixedStoF,
507436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       ARMneon_VCVTF16toF32,
508436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       ARMneon_VCVTF32toF16,
509436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       ARMneon_REV16,
510436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       ARMneon_REV32,
511436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       ARMneon_REV64,
512436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       ARMneon_ABS,
513436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       ARMneon_VNEGF,
514436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       ARMneon_VRECIP,
515436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       ARMneon_VRECIPF,
516436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       ARMneon_VABSFP,
517436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       ARMneon_VRSQRTEFP,
518436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       ARMneon_VRSQRTE
519436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       /* ... */
520436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    }
521436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    ARMNeonUnOp;
522436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ
523436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ typedef
524436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    enum {
525436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       ARMneon_SETELEM=200,
526436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       ARMneon_GETELEMU,
527436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       ARMneon_GETELEMS,
528436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       ARMneon_VDUP,
529436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    }
530436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    ARMNeonUnOpS;
531436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ
532436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ typedef
533436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    enum {
534436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       ARMneon_TRN=210,
535436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       ARMneon_ZIP,
536436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       ARMneon_UZP
537436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       /* ... */
538436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    }
539436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    ARMNeonDualOp;
540436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ
541436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ extern const HChar* showARMNeonBinOp ( ARMNeonBinOp op );
542436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ extern const HChar* showARMNeonUnOp ( ARMNeonUnOp op );
543436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ extern const HChar* showARMNeonUnOpS ( ARMNeonUnOpS op );
544436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ extern const HChar* showARMNeonShiftOp ( ARMNeonShiftOp op );
545436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ extern const HChar* showARMNeonDualOp ( ARMNeonDualOp op );
546436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ extern const HChar* showARMNeonBinOpDataType ( ARMNeonBinOp op );
547436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ extern const HChar* showARMNeonUnOpDataType ( ARMNeonUnOp op );
548436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ extern const HChar* showARMNeonUnOpSDataType ( ARMNeonUnOpS op );
549436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ extern const HChar* showARMNeonShiftOpDataType ( ARMNeonShiftOp op );
550436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ extern const HChar* showARMNeonDualOpDataType ( ARMNeonDualOp op );
551436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
552436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovtypedef
553436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   enum {
554436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      /* baseline */
555436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      ARM64in_Arith=1220,
556436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      ARM64in_Cmp,
557436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      ARM64in_Logic,
558436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      ARM64in_Test,
559436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      ARM64in_Shift,
560436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      ARM64in_Unary,
561436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      ARM64in_MovI,        /* int reg-reg move */
562436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      ARM64in_Imm64,
563436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      ARM64in_LdSt64,
564436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      ARM64in_LdSt32,      /* w/ ZX loads */
565436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      ARM64in_LdSt16,      /* w/ ZX loads */
566436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      ARM64in_LdSt8,       /* w/ ZX loads */
567436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      ARM64in_XDirect,     /* direct transfer to GA */
568436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      ARM64in_XIndir,      /* indirect transfer to GA */
569436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      ARM64in_XAssisted,   /* assisted transfer to GA */
570436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      ARM64in_CSel,
571436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      ARM64in_Call,
572436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      ARM64in_AddToSP,     /* move SP by small, signed constant */
573436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      ARM64in_FromSP,      /* move SP to integer register */
574436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      ARM64in_Mul,
575436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      ARM64in_LdrEX,
576436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      ARM64in_StrEX,
577436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      ARM64in_MFence,
578436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       ARMin_CLREX,
579436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      /* ARM64in_V*: scalar ops involving vector registers */
580436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      ARM64in_VLdStS,   /* 32-bit FP load/store, with imm offset  */
581436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      ARM64in_VLdStD,   /* 64-bit FP load/store, with imm offset  */
582436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      ARM64in_VLdStQ,
583436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      ARM64in_VCvtI2F,
584436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      ARM64in_VCvtF2I,
585436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      ARM64in_VCvtSD,
586436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      ARM64in_VUnaryD,
587436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      ARM64in_VUnaryS,
588436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      ARM64in_VBinD,
589436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      ARM64in_VBinS,
590436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      ARM64in_VCmpD,
591436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      ARM64in_VCmpS,
592436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      ARM64in_FPCR,
593436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      /* ARM64in_V*V: vector ops on vector registers */
594436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      ARM64in_VBinV,
595436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      ARM64in_VUnaryV,
596436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      ARM64in_VNarrowV,
597436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      ARM64in_VShiftImmV,
598436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       ARMin_VAluS,
599436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       ARMin_VCMovD,
600436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       ARMin_VCMovS,
601436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       ARMin_VXferD,
602436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       ARMin_VXferS,
603436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       ARMin_VCvtID,
604436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       /* Neon */
605436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       ARMin_NLdStD,
606436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       ARMin_NUnary,
607436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       ARMin_NUnaryS,
608436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       ARMin_NDual,
609436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       ARMin_NBinary,
610436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       ARMin_NBinaryS,
611436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       ARMin_NShift,
612436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       ARMin_NShl64, // special case 64-bit shift of Dreg by immediate
613436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      ARM64in_VImmQ,
614436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      ARM64in_VDfromX,    /* Move an Xreg to a Dreg */
615436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      ARM64in_VQfromXX,   /* Move 2 Xregs to a Qreg */
616436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      ARM64in_VXfromQ,    /* Move half a Qreg to an Xreg */
617436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      ARM64in_VMov,       /* vector reg-reg move, 16, 8 or 4 bytes */
618436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      /* infrastructure */
619436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      ARM64in_EvCheck,     /* Event check */
620436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       ARMin_ProfInc      /* 64-bit profile counter increment */
621436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   }
622436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   ARM64InstrTag;
623436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
624436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov/* Destinations are on the LEFT (first operand) */
625436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
626436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovtypedef
627436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   struct {
628436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      ARM64InstrTag tag;
629436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      union {
630436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         /* --- INTEGER INSTRUCTIONS --- */
631436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         /* 64 bit ADD/SUB reg, reg or uimm12<<{0,12} */
632436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         struct {
633436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            HReg      dst;
634436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            HReg      argL;
635436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            ARM64RIA* argR;
636436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            Bool      isAdd;
637436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         } Arith;
638436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         /* 64 or 32 bit CMP reg, reg or aimm (SUB and set flags) */
639436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         struct {
640436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            HReg      argL;
641436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            ARM64RIA* argR;
642436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            Bool      is64;
643436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         } Cmp;
644436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         /* 64 bit AND/OR/XOR reg, reg or bitfield-immediate */
645436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         struct {
646436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            HReg         dst;
647436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            HReg         argL;
648436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            ARM64RIL*    argR;
649436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            ARM64LogicOp op;
650436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         } Logic;
651436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         /* 64 bit TST reg, reg or bimm (AND and set flags) */
652436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         struct {
653436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            HReg      argL;
654436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            ARM64RIL* argR;
655436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         } Test;
656436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         /* 64 bit SHL/SHR/SAR, 2nd arg is reg or imm */
657436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         struct {
658436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            HReg         dst;
659436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            HReg         argL;
660436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            ARM64RI6*    argR;
661436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            ARM64ShiftOp op;
662436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         } Shift;
663436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         /* NOT/NEG/CLZ, 64 bit only */
664436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         struct {
665436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            HReg         dst;
666436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            HReg         src;
667436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            ARM64UnaryOp op;
668436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         } Unary;
669436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         /* MOV dst, src -- reg-reg move for integer registers */
670436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         struct {
671436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            HReg dst;
672436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            HReg src;
673436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         } MovI;
674436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         /* Pseudo-insn; make a 64-bit immediate */
675436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         struct {
676436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            HReg  dst;
677436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            ULong imm64;
678436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         } Imm64;
679436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         /* 64-bit load or store */
680436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         struct {
681436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            Bool        isLoad;
682436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            HReg        rD;
683436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            ARM64AMode* amode;
684436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         } LdSt64;
685436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         /* zx-32-to-64-bit load, or 32-bit store */
686436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         struct {
687436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            Bool        isLoad;
688436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            HReg        rD;
689436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            ARM64AMode* amode;
690436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         } LdSt32;
691436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         /* zx-16-to-64-bit load, or 16-bit store */
692436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         struct {
693436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            Bool        isLoad;
694436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            HReg        rD;
695436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            ARM64AMode* amode;
696436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         } LdSt16;
697436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         /* zx-8-to-64-bit load, or 8-bit store */
698436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         struct {
699436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            Bool        isLoad;
700436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            HReg        rD;
701436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            ARM64AMode* amode;
702436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         } LdSt8;
703436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         /* Update the guest PC value, then exit requesting to chain
704436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            to it.  May be conditional.  Urr, use of Addr64 implicitly
705436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            assumes that wordsize(guest) == wordsize(host). */
706436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         struct {
707436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            Addr64        dstGA;    /* next guest address */
708436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            ARM64AMode*   amPC;     /* amode in guest state for PC */
709436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            ARM64CondCode cond;     /* can be ARM64cc_AL */
710436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            Bool          toFastEP; /* chain to the slow or fast point? */
711436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         } XDirect;
712436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         /* Boring transfer to a guest address not known at JIT time.
713436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            Not chainable.  May be conditional. */
714436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         struct {
715436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            HReg          dstGA;
716436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            ARM64AMode*   amPC;
717436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            ARM64CondCode cond; /* can be ARM64cc_AL */
718436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         } XIndir;
719436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         /* Assisted transfer to a guest address, most general case.
720436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            Not chainable.  May be conditional. */
721436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         struct {
722436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            HReg          dstGA;
723436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            ARM64AMode*   amPC;
724436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            ARM64CondCode cond; /* can be ARM64cc_AL */
725436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            IRJumpKind    jk;
726436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         } XAssisted;
727436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         /* CSEL: dst = if cond then argL else argR.  cond may be anything. */
728436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov          struct {
729436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            HReg          dst;
730436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            HReg          argL;
731436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            HReg          argR;
732436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            ARM64CondCode cond;
733436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         } CSel;
734436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         /* Pseudo-insn.  Call target (an absolute address), on given
735436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            condition (which could be ARM64cc_AL). */
736436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         struct {
737436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            RetLoc        rloc;     /* where the return value will be */
738436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            HWord         target;
739436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            ARM64CondCode cond;
740436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            Int           nArgRegs; /* # regs carrying args: 0 .. 8 */
741436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         } Call;
742436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         /* move SP by small, signed constant */
743436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         struct {
744436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            Int simm; /* needs to be 0 % 16 and in the range -4095
745436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                         .. 4095 inclusive */
746436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         } AddToSP;
747436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         /* move SP to integer register */
748436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         struct {
749436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            HReg dst;
750436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         } FromSP;
751436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         /* Integer multiply, with 3 variants:
752436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov              (PLAIN) lo64(64 *  64)
753436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov              (ZX)    hi64(64 *u 64)
754436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov              (SX)    hi64(64 *s 64)
755436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         */
756436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         struct {
757436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            HReg       dst;
758436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            HReg       argL;
759436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            HReg       argR;
760436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            ARM64MulOp op;
761436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         } Mul;
762436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         /* LDXR{,H,B} x2, [x4] */
763436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         struct {
764436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            Int  szB; /* 1, 2, 4 or 8 */
765436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         } LdrEX;
766436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         /* STXR{,H,B} w0, x2, [x4] */
767436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         struct {
768436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            Int  szB; /* 1, 2, 4 or 8 */
769436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         } StrEX;
770436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         /* Mem fence.  An insn which fences all loads and stores as
771436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            much as possible before continuing.  On ARM64 we emit the
772436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            sequence "dsb sy ; dmb sy ; isb sy", which is probably
773436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            total nuclear overkill, but better safe than sorry. */
774436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         struct {
775436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         } MFence;
776436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          /* A CLREX instruction. */
777436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          struct {
778436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          } CLREX;
779436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         /* --- INSTRUCTIONS INVOLVING VECTOR REGISTERS --- */
780436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         /* 32-bit Fp load/store */
781436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         struct {
782436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            Bool isLoad;
783436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            HReg sD;
784436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            HReg rN;
785436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            UInt uimm12;  /* 0 .. 16380 inclusive, 0 % 4 */
786436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         } VLdStS;
787436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         /* 64-bit Fp load/store */
788436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         struct {
789436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            Bool isLoad;
790436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            HReg dD;
791436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            HReg rN;
792436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            UInt uimm12;  /* 0 .. 32760 inclusive, 0 % 8 */
793436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         } VLdStD;
794436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         /* 128-bit Vector load/store. */
795436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         struct {
796436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            Bool isLoad;
797436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            HReg rQ; // data
798436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            HReg rN; // address
799436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         } VLdStQ;
800436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         /* Scalar conversion of int to float. */
801436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         struct {
802436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            ARM64CvtOp how;
803436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            HReg       rD; // dst, a D or S register
804436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            HReg       rS; // src, a W or X register
805436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         } VCvtI2F;
806436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         /* Scalar conversion of float to int, w/ specified RM. */
807436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         struct {
808436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            ARM64CvtOp how;
809436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            HReg       rD; // dst, a W or X register
810436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            HReg       rS; // src, a D or S register
811436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            UChar      armRM; // ARM encoded RM:
812436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                              // 00=nearest, 01=+inf, 10=-inf, 11=zero
813436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         } VCvtF2I;
814436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         /* Convert between 32-bit and 64-bit FP values (both
815436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            ways). (FCVT) */
816436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         struct {
817436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            Bool sToD; /* True: F32->F64.  False: F64->F32 */
818436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            HReg dst;
819436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            HReg src;
820436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         } VCvtSD;
821436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         /* 64-bit FP unary */
822436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         struct {
823436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            ARM64FpUnaryOp op;
824436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            HReg           dst;
825436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            HReg           src;
826436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         } VUnaryD;
827436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         /* 32-bit FP unary */
828436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         struct {
829436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            ARM64FpUnaryOp op;
830436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            HReg           dst;
831436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            HReg           src;
832436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         } VUnaryS;
833436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         /* 64-bit FP binary arithmetic */
834436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         struct {
835436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            ARM64FpBinOp op;
836436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            HReg         dst;
837436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            HReg         argL;
838436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            HReg         argR;
839436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         } VBinD;
840436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         /* 32-bit FP binary arithmetic */
841436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         struct {
842436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            ARM64FpBinOp op;
843436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            HReg         dst;
844436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            HReg         argL;
845436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            HReg         argR;
846436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         } VBinS;
847436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         /* 64-bit FP compare */
848436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         struct {
849436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            HReg argL;
850436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            HReg argR;
851436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         } VCmpD;
852436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         /* 32-bit FP compare */
853436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         struct {
854436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            HReg argL;
855436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            HReg argR;
856436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         } VCmpS;
857436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         /* Move a 32-bit value to/from the FPCR */
858436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         struct {
859436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            Bool toFPCR;
860436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            HReg iReg;
861436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         } FPCR;
862436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         /* binary vector operation on vector registers */
863436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         struct {
864436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            ARM64VecBinOp op;
865436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            HReg          dst;
866436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            HReg          argL;
867436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            HReg          argR;
868436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         } VBinV;
869436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         /* unary vector operation on vector registers */
870436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         struct {
871436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            ARM64VecUnaryOp op;
872436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            HReg            dst;
873436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            HReg            arg;
874436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         } VUnaryV;
875436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         /* vector narrowing, Q -> Q.  Result goes in the bottom half
876436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            of dst and the top half is zeroed out.  Iow is XTN. */
877436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov        struct {
878436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov           UInt dszBlg2; // 0: 16to8_x8  1: 32to16_x4  2: 64to32_x2
879436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov           HReg dst;     // Q reg
880436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov           HReg src;     // Q reg
881436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov        } VNarrowV;
882436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov        /* Vector shift by immediate.  |amt| needs to be > 0 and <
883436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov           implied lane size of |op|.  Zero shifts and out of range
884436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov           shifts are not allowed. */
885436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov        struct {
886436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov           ARM64VecShiftOp op;
887436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov           HReg            dst;
888436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov           HReg            src;
889436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov           UInt            amt;
890436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov        } VShiftImmV;
891436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          /* 32-bit FP binary arithmetic */
892436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          struct {
893436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             ARMVfpOp op;
894436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             HReg     dst;
895436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             HReg     argL;
896436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             HReg     argR;
897436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          } VAluS;
898436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          /* 64-bit FP mov src to dst on the given condition, which may
899436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             not be ARMcc_AL. */
900436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          struct {
901436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             ARMCondCode cond;
902436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             HReg        dst;
903436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             HReg        src;
904436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          } VCMovD;
905436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          /* 32-bit FP mov src to dst on the given condition, which may
906436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             not be ARMcc_AL. */
907436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          struct {
908436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             ARMCondCode cond;
909436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             HReg        dst;
910436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             HReg        src;
911436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          } VCMovS;
912436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          /* Transfer a VFP D reg to/from two integer registers (VMOV) */
913436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          struct {
914436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             Bool toD;
915436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             HReg dD;
916436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             HReg rHi;
917436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             HReg rLo;
918436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          } VXferD;
919436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          /* Transfer a VFP S reg to/from an integer register (VMOV) */
920436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          struct {
921436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             Bool toS;
922436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             HReg fD;
923436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             HReg rLo;
924436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          } VXferS;
925436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          /* Convert between 32-bit ints and 64-bit FP values (both ways
926436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             and both signednesses). (FSITOD, FUITOD, FTOSID, FTOUID) */
927436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          struct {
928436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             Bool iToD; /* True: I32->F64.  False: F64->I32 */
929436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             Bool syned; /* True: I32 is signed.  False: I32 is unsigned */
930436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             HReg dst;
931436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             HReg src;
932436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          } VCvtID;
933436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          /* Neon data processing instruction: 3 registers of the same
934436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             length */
935436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          struct {
936436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             ARMNeonBinOp op;
937436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             HReg dst;
938436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             HReg argL;
939436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             HReg argR;
940436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             UInt size;
941436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             Bool Q;
942436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          } NBinary;
943436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          struct {
944436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             ARMNeonBinOp op;
945436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             ARMNRS* dst;
946436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             ARMNRS* argL;
947436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             ARMNRS* argR;
948436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             UInt size;
949436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             Bool Q;
950436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          } NBinaryS;
951436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          struct {
952436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             ARMNeonShiftOp op;
953436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             HReg dst;
954436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             HReg argL;
955436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             HReg argR;
956436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             UInt size;
957436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             Bool Q;
958436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          } NShift;
959436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          struct {
960436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             HReg dst;
961436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             HReg src;
962436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             UInt amt; /* 1..63 only */
963436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          } NShl64;
964436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          struct {
965436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             Bool isLoad;
966436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             HReg dD;
967436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             ARMAModeN *amode;
968436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          } NLdStD
969436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          struct {
970436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             ARMNeonUnOpS op;
971436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             ARMNRS*  dst;
972436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             ARMNRS*  src;
973436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             UInt size;
974436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             Bool Q;
975436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          } NUnaryS;
976436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          struct {
977436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             ARMNeonUnOp op;
978436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             HReg  dst;
979436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             HReg  src;
980436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             UInt size;
981436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             Bool Q;
982436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          } NUnary;
983436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          /* Takes two arguments and modifies them both. */
984436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          struct {
985436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             ARMNeonDualOp op;
986436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             HReg  arg1;
987436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             HReg  arg2;
988436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             UInt size;
989436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             Bool Q;
990436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          } NDual;
991436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         struct {
992436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            HReg   rQ;
993436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            UShort imm; /* Same 1-bit-per-byte encoding as IR */
994436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         } VImmQ;
995436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         struct {
996436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            HReg rD;
997436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            HReg rX;
998436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         } VDfromX;
999436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         struct {
1000436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            HReg rQ;
1001436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            HReg rXhi;
1002436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            HReg rXlo;
1003436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         } VQfromXX;
1004436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         struct {
1005436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            HReg rX;
1006436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            HReg rQ;
1007436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            UInt laneNo; /* either 0 or 1 */
1008436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         } VXfromQ;
1009436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         /* MOV dst, src -- reg-reg move for vector registers */
1010436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         struct {
1011436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            UInt szB; // 16=mov qD,qS;  8=mov dD,dS;  4=mov sD,sS
1012436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            HReg dst;
1013436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            HReg src;
1014436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         } VMov;
1015436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         struct {
1016436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            ARM64AMode* amCounter;
1017436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            ARM64AMode* amFailAddr;
1018436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         } EvCheck;
1019436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          struct {
1020436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             /* No fields.  The address of the counter to inc is
1021436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                installed later, post-translation, by patching it in,
1022436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                as it is not known at translation time. */
1023436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          } ProfInc;
1024436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      } ARM64in;
1025436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   }
1026436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   ARM64Instr;
1027436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
1028436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ
1029436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovextern ARM64Instr* ARM64Instr_Arith   ( HReg, HReg, ARM64RIA*, Bool isAdd );
1030436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovextern ARM64Instr* ARM64Instr_Cmp     ( HReg, ARM64RIA*, Bool is64 );
1031436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovextern ARM64Instr* ARM64Instr_Logic   ( HReg, HReg, ARM64RIL*, ARM64LogicOp );
1032436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovextern ARM64Instr* ARM64Instr_Test    ( HReg, ARM64RIL* );
1033436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovextern ARM64Instr* ARM64Instr_Shift   ( HReg, HReg, ARM64RI6*, ARM64ShiftOp );
1034436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovextern ARM64Instr* ARM64Instr_Unary   ( HReg, HReg, ARM64UnaryOp );
1035436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ extern ARMInstr* ARMInstr_CmpOrTst ( Bool isCmp, HReg, ARMRI84* );
1036436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovextern ARM64Instr* ARM64Instr_MovI    ( HReg, HReg );
1037436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovextern ARM64Instr* ARM64Instr_Imm64   ( HReg, ULong );
1038436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovextern ARM64Instr* ARM64Instr_LdSt64  ( Bool isLoad, HReg, ARM64AMode* );
1039436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovextern ARM64Instr* ARM64Instr_LdSt32  ( Bool isLoad, HReg, ARM64AMode* );
1040436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovextern ARM64Instr* ARM64Instr_LdSt16  ( Bool isLoad, HReg, ARM64AMode* );
1041436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovextern ARM64Instr* ARM64Instr_LdSt8   ( Bool isLoad, HReg, ARM64AMode* );
1042436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ extern ARMInstr* ARMInstr_Ld8S     ( ARMCondCode, HReg, ARMAMode2* );
1043436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovextern ARM64Instr* ARM64Instr_XDirect ( Addr64 dstGA, ARM64AMode* amPC,
1044436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                        ARM64CondCode cond, Bool toFastEP );
1045436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovextern ARM64Instr* ARM64Instr_XIndir  ( HReg dstGA, ARM64AMode* amPC,
1046436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                        ARM64CondCode cond );
1047436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovextern ARM64Instr* ARM64Instr_XAssisted ( HReg dstGA, ARM64AMode* amPC,
1048436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                          ARM64CondCode cond, IRJumpKind jk );
1049436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovextern ARM64Instr* ARM64Instr_CSel    ( HReg dst, HReg argL, HReg argR,
1050436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                        ARM64CondCode cond );
1051436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovextern ARM64Instr* ARM64Instr_Call    ( ARM64CondCode, HWord, Int nArgRegs,
1052436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                        RetLoc rloc );
1053436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovextern ARM64Instr* ARM64Instr_AddToSP ( Int simm );
1054436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovextern ARM64Instr* ARM64Instr_FromSP  ( HReg dst );
1055436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovextern ARM64Instr* ARM64Instr_Mul     ( HReg dst, HReg argL, HReg argR,
1056436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                        ARM64MulOp op );
1057436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovextern ARM64Instr* ARM64Instr_LdrEX   ( Int szB );
1058436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovextern ARM64Instr* ARM64Instr_StrEX   ( Int szB );
1059436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovextern ARM64Instr* ARM64Instr_MFence  ( void );
1060436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ extern ARMInstr* ARMInstr_CLREX    ( void );
1061436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovextern ARM64Instr* ARM64Instr_VLdStS  ( Bool isLoad, HReg sD, HReg rN,
1062436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                        UInt uimm12 /* 0 .. 16380, 0 % 4 */ );
1063436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovextern ARM64Instr* ARM64Instr_VLdStD  ( Bool isLoad, HReg dD, HReg rN,
1064436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                        UInt uimm12 /* 0 .. 32760, 0 % 8 */ );
1065436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovextern ARM64Instr* ARM64Instr_VLdStQ  ( Bool isLoad, HReg rQ, HReg rN );
1066436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovextern ARM64Instr* ARM64Instr_VCvtI2F ( ARM64CvtOp how, HReg rD, HReg rS );
1067436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovextern ARM64Instr* ARM64Instr_VCvtF2I ( ARM64CvtOp how, HReg rD, HReg rS,
1068436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                        UChar armRM );
1069436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovextern ARM64Instr* ARM64Instr_VCvtSD  ( Bool sToD, HReg dst, HReg src );
1070436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovextern ARM64Instr* ARM64Instr_VUnaryD ( ARM64FpUnaryOp op, HReg dst, HReg src );
1071436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovextern ARM64Instr* ARM64Instr_VUnaryS ( ARM64FpUnaryOp op, HReg dst, HReg src );
1072436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovextern ARM64Instr* ARM64Instr_VBinD   ( ARM64FpBinOp op, HReg, HReg, HReg );
1073436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovextern ARM64Instr* ARM64Instr_VBinS   ( ARM64FpBinOp op, HReg, HReg, HReg );
1074436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovextern ARM64Instr* ARM64Instr_VCmpD   ( HReg argL, HReg argR );
1075436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovextern ARM64Instr* ARM64Instr_VCmpS   ( HReg argL, HReg argR );
1076436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovextern ARM64Instr* ARM64Instr_FPCR    ( Bool toFPCR, HReg iReg );
1077436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovextern ARM64Instr* ARM64Instr_VBinV   ( ARM64VecBinOp op, HReg, HReg, HReg );
1078436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovextern ARM64Instr* ARM64Instr_VUnaryV ( ARM64VecUnaryOp op, HReg, HReg );
1079436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovextern ARM64Instr* ARM64Instr_VNarrowV ( UInt dszBlg2, HReg dst, HReg src );
1080436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovextern ARM64Instr* ARM64Instr_VShiftImmV ( ARM64VecShiftOp op,
1081436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           HReg dst, HReg src, UInt amt );
1082436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ extern ARMInstr* ARMInstr_VAluS    ( ARMVfpOp op, HReg, HReg, HReg );
1083436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ extern ARMInstr* ARMInstr_VCMovD   ( ARMCondCode, HReg dst, HReg src );
1084436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ extern ARMInstr* ARMInstr_VCMovS   ( ARMCondCode, HReg dst, HReg src );
1085436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ extern ARMInstr* ARMInstr_VXferD   ( Bool toD, HReg dD, HReg rHi, HReg rLo );
1086436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ extern ARMInstr* ARMInstr_VXferS   ( Bool toS, HReg fD, HReg rLo );
1087436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ extern ARMInstr* ARMInstr_VCvtID   ( Bool iToD, Bool syned,
1088436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                                      HReg dst, HReg src );
1089436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ extern ARMInstr* ARMInstr_NLdStD   ( Bool isLoad, HReg, ARMAModeN* );
1090436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ extern ARMInstr* ARMInstr_NUnary   ( ARMNeonUnOp, HReg, HReg, UInt, Bool );
1091436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ extern ARMInstr* ARMInstr_NUnaryS  ( ARMNeonUnOpS, ARMNRS*, ARMNRS*,
1092436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                                      UInt, Bool );
1093436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ extern ARMInstr* ARMInstr_NDual    ( ARMNeonDualOp, HReg, HReg, UInt, Bool );
1094436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ extern ARMInstr* ARMInstr_NBinary  ( ARMNeonBinOp, HReg, HReg, HReg,
1095436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                                      UInt, Bool );
1096436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ extern ARMInstr* ARMInstr_NShift   ( ARMNeonShiftOp, HReg, HReg, HReg,
1097436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                                      UInt, Bool );
1098436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ extern ARMInstr* ARMInstr_NShl64   ( HReg, HReg, UInt );
1099436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovextern ARM64Instr* ARM64Instr_VImmQ   ( HReg, UShort );
1100436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovextern ARM64Instr* ARM64Instr_VDfromX ( HReg rD, HReg rX );
1101436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovextern ARM64Instr* ARM64Instr_VQfromXX( HReg rQ, HReg rXhi, HReg rXlo );
1102436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovextern ARM64Instr* ARM64Instr_VXfromQ ( HReg rX, HReg rQ, UInt laneNo );
1103436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovextern ARM64Instr* ARM64Instr_VMov    ( UInt szB, HReg dst, HReg src );
1104436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
1105436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovextern ARM64Instr* ARM64Instr_EvCheck ( ARM64AMode* amCounter,
1106436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                        ARM64AMode* amFailAddr );
1107436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ extern ARMInstr* ARMInstr_ProfInc  ( void );
1108436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
1109436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovextern void ppARM64Instr ( ARM64Instr* );
1110436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
1111436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
1112436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov/* Some functions that insulate the register allocator from details
1113436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   of the underlying instruction set. */
1114436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovextern void getRegUsage_ARM64Instr ( HRegUsage*, ARM64Instr*, Bool );
1115436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovextern void mapRegs_ARM64Instr     ( HRegRemap*, ARM64Instr*, Bool );
1116436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovextern Bool isMove_ARM64Instr      ( ARM64Instr*, HReg*, HReg* );
1117436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovextern Int  emit_ARM64Instr        ( /*MB_MOD*/Bool* is_profInc,
1118436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     UChar* buf, Int nbuf, ARM64Instr* i,
1119436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     Bool mode64,
1120436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     void* disp_cp_chain_me_to_slowEP,
1121436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     void* disp_cp_chain_me_to_fastEP,
1122436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     void* disp_cp_xindir,
1123436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     void* disp_cp_xassisted );
1124436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
1125436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovextern void genSpill_ARM64  ( /*OUT*/HInstr** i1, /*OUT*/HInstr** i2,
1126436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                              HReg rreg, Int offset, Bool );
1127436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovextern void genReload_ARM64 ( /*OUT*/HInstr** i1, /*OUT*/HInstr** i2,
1128436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                              HReg rreg, Int offset, Bool );
1129436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
1130436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovextern void getAllocableRegs_ARM64 ( Int*, HReg** );
1131436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovextern HInstrArray* iselSB_ARM64 ( IRSB*,
1132436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                   VexArch,
1133436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                   VexArchInfo*,
1134436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                   VexAbiInfo*,
1135436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                   Int offs_Host_EvC_Counter,
1136436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                   Int offs_Host_EvC_FailAddr,
1137436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                   Bool chainingAllowed,
1138436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                   Bool addProfInc,
1139436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                   Addr64 max_ga );
1140436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
1141436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov/* How big is an event check?  This is kind of a kludge because it
1142436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   depends on the offsets of host_EvC_FAILADDR and
1143436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   host_EvC_COUNTER. */
1144436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovextern Int evCheckSzB_ARM64 ( void );
1145436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
1146436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov/* Perform a chaining and unchaining of an XDirect jump. */
1147436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovextern VexInvalRange chainXDirect_ARM64 ( void* place_to_chain,
1148436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                          void* disp_cp_chain_me_EXPECTED,
1149436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                          void* place_to_jump_to );
1150436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
1151436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovextern VexInvalRange unchainXDirect_ARM64 ( void* place_to_unchain,
1152436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            void* place_to_jump_to_EXPECTED,
1153436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            void* disp_cp_chain_me );
1154436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
1155436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ /* Patch the counter location into an existing ProfInc point. */
1156436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ extern VexInvalRange patchProfInc_ARM ( void*  place_to_patch,
1157436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                                         ULong* location_of_counter );
1158436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
1159436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
1160436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#endif /* ndef __VEX_HOST_ARM64_DEFS_H */
1161436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
1162436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov/*---------------------------------------------------------------*/
1163436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov/*--- end                                   host_arm64_defs.h ---*/
1164436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov/*---------------------------------------------------------------*/
1165