1ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*---------------------------------------------------------------*/
2ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*--- begin                                   host_arm_defs.h ---*/
3ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*---------------------------------------------------------------*/
4ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*
6ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   This file is part of Valgrind, a dynamic binary instrumentation
7ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   framework.
8ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
9b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   Copyright (C) 2004-2011 OpenWorks LLP
10ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      info@open-works.net
11ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
12ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   This program is free software; you can redistribute it and/or
13ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   modify it under the terms of the GNU General Public License as
14ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   published by the Free Software Foundation; either version 2 of the
15ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   License, or (at your option) any later version.
16ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
17ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   This program is distributed in the hope that it will be useful, but
18ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   WITHOUT ANY WARRANTY; without even the implied warranty of
19ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
20ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   General Public License for more details.
21ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
22ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   You should have received a copy of the GNU General Public License
23ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   along with this program; if not, write to the Free Software
24ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
25ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   02110-1301, USA.
26ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
27ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   The GNU General Public License is contained in the file COPYING.
28ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown*/
29ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
30ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#ifndef __VEX_HOST_ARM_DEFS_H
31ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define __VEX_HOST_ARM_DEFS_H
32ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
33ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern UInt arm_hwcaps;
34ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
35ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
36ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* --------- Registers. --------- */
37ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
38ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* The usual HReg abstraction.
39ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   There are 16 general purpose regs.
40ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown*/
41ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
42ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern void ppHRegARM ( HReg );
43ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
44ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregARM_R0  ( void );
45ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregARM_R1  ( void );
46ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregARM_R2  ( void );
47ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregARM_R3  ( void );
48ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregARM_R4  ( void );
49ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregARM_R5  ( void );
50ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregARM_R6  ( void );
51ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregARM_R7  ( void );
52ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregARM_R8  ( void );
53ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregARM_R9  ( void );
54ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregARM_R10 ( void );
55ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregARM_R11 ( void );
56ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregARM_R12 ( void );
57ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregARM_R13 ( void );
58ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregARM_R14 ( void );
59ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregARM_R15 ( void );
60ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregARM_D8  ( void );
61ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregARM_D9  ( void );
62ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregARM_D10 ( void );
63ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregARM_D11 ( void );
64ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregARM_D12 ( void );
65ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregARM_S26 ( void );
66ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregARM_S27 ( void );
67ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregARM_S28 ( void );
68ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregARM_S29 ( void );
69ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregARM_S30 ( void );
70ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregARM_Q8  ( void );
71ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregARM_Q9  ( void );
72ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregARM_Q10 ( void );
73ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregARM_Q11 ( void );
74ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregARM_Q12 ( void );
75ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregARM_Q13 ( void );
76ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregARM_Q14 ( void );
77ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregARM_Q15 ( void );
78ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
79ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Number of registers used arg passing in function calls */
80ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define ARM_N_ARGREGS 4   /* r0, r1, r2, r3 */
81ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
82ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
83ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* --------- Condition codes. --------- */
84ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
85ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntypedef
86ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   enum {
87ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ARMcc_EQ  = 0,  /* equal                          : Z=1 */
88ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ARMcc_NE  = 1,  /* not equal                      : Z=0 */
89ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
90ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ARMcc_HS  = 2,  /* >=u (higher or same)           : C=1 */
91ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ARMcc_LO  = 3,  /* <u  (lower)                    : C=0 */
92ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
93ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ARMcc_MI  = 4,  /* minus (negative)               : N=1 */
94ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ARMcc_PL  = 5,  /* plus (zero or +ve)             : N=0 */
95ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
96ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ARMcc_VS  = 6,  /* overflow                       : V=1 */
97ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ARMcc_VC  = 7,  /* no overflow                    : V=0 */
98ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
99ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ARMcc_HI  = 8,  /* >u   (higher)                  : C=1 && Z=0 */
100ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ARMcc_LS  = 9,  /* <=u  (lower or same)           : C=0 || Z=1 */
101ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
102ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ARMcc_GE  = 10, /* >=s (signed greater or equal)  : N=V */
103ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ARMcc_LT  = 11, /* <s  (signed less than)         : N!=V */
104ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
105ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ARMcc_GT  = 12, /* >s  (signed greater)           : Z=0 && N=V */
106ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ARMcc_LE  = 13, /* <=s (signed less or equal)     : Z=1 || N!=V */
107ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
108ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ARMcc_AL  = 14, /* always (unconditional) */
109ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ARMcc_NV  = 15  /* never (basically undefined meaning), deprecated */
110ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
111ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ARMCondCode;
112ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
113ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HChar* showARMCondCode ( ARMCondCode );
114ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
115ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
116ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
117ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* --------- Memory address expressions (amodes). --------- */
118ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
119ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* --- Addressing Mode 1 --- */
120ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntypedef
121ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   enum {
122ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ARMam1_RI=1,   /* reg +/- imm12 */
123ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ARMam1_RRS     /* reg1 + (reg2 << 0, 1 2 or 3) */
124ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
125ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ARMAMode1Tag;
126ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
127ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntypedef
128ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   struct {
129ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ARMAMode1Tag tag;
130ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      union {
131ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         struct {
132ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg reg;
133ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            Int  simm13; /* -4095 .. +4095 */
134ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         } RI;
135ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         struct {
136ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg base;
137ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg index;
138ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            UInt shift; /* 0, 1 2 or 3 */
139ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         } RRS;
140ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      } ARMam1;
141ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
142ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ARMAMode1;
143ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
144ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern ARMAMode1* ARMAMode1_RI  ( HReg reg, Int simm13 );
145ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern ARMAMode1* ARMAMode1_RRS ( HReg base, HReg index, UInt shift );
146ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
147ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern void ppARMAMode1 ( ARMAMode1* );
148ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
149ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
150ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* --- Addressing Mode 2 --- */
151ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntypedef
152ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   enum {
153ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ARMam2_RI=3,   /* reg +/- imm8 */
154ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ARMam2_RR      /* reg1 + reg2 */
155ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
156ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ARMAMode2Tag;
157ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
158ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntypedef
159ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   struct {
160ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ARMAMode2Tag tag;
161ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      union {
162ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         struct {
163ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg reg;
164ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            Int  simm9; /* -255 .. 255 */
165ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         } RI;
166ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         struct {
167ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg base;
168ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg index;
169ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         } RR;
170ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      } ARMam2;
171ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
172ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ARMAMode2;
173ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
174ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern ARMAMode2* ARMAMode2_RI ( HReg reg, Int simm9 );
175ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern ARMAMode2* ARMAMode2_RR ( HReg base, HReg index );
176ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
177ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern void ppARMAMode2 ( ARMAMode2* );
178ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
179ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
180ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* --- Addressing Mode suitable for VFP --- */
181ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* The simm11 is encoded as 8 bits + 1 sign bit,
182ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   so can only be 0 % 4. */
183ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntypedef
184ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   struct {
185ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      HReg reg;
186ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Int  simm11; /* -1020, -1016 .. 1016, 1020 */
187ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
188ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ARMAModeV;
189ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
190ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern ARMAModeV* mkARMAModeV ( HReg reg, Int simm11 );
191ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
192ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern void ppARMAModeV ( ARMAModeV* );
193ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
194ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* --- Addressing Mode suitable for Neon --- */
195ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntypedef
196ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   enum {
197ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ARMamN_R=5,
198ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ARMamN_RR
199ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* ... */
200ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
201ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ARMAModeNTag;
202ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
203ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntypedef
204ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   struct {
205ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ARMAModeNTag tag;
206ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      union {
207ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         struct {
208ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg rN;
209ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg rM;
210ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         } RR;
211ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         struct {
212ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg rN;
213ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         } R;
214ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         /* ... */
215ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      } ARMamN;
216ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
217ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ARMAModeN;
218ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
219ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern ARMAModeN* mkARMAModeN_RR ( HReg, HReg );
220ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern ARMAModeN* mkARMAModeN_R ( HReg );
221ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern void ppARMAModeN ( ARMAModeN* );
222ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
223ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* --------- Reg or imm-8x4 operands --------- */
224ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* a.k.a (a very restricted form of) Shifter Operand,
225ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   in the ARM parlance. */
226ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
227ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntypedef
228ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   enum {
229ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ARMri84_I84=7,   /* imm8 `ror` (2 * imm4) */
230ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ARMri84_R        /* reg */
231ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
232ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ARMRI84Tag;
233ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
234ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntypedef
235ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   struct {
236ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ARMRI84Tag tag;
237ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      union {
238ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         struct {
239ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            UShort imm8;
240ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            UShort imm4;
241ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         } I84;
242ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         struct {
243ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg reg;
244ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         } R;
245ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      } ARMri84;
246ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
247ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ARMRI84;
248ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
249ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern ARMRI84* ARMRI84_I84 ( UShort imm8, UShort imm4 );
250ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern ARMRI84* ARMRI84_R   ( HReg );
251ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
252ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern void ppARMRI84 ( ARMRI84* );
253ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
254ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
255ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* --------- Reg or imm5 operands --------- */
256ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntypedef
257ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   enum {
258ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ARMri5_I5=9,   /* imm5, 1 .. 31 only (no zero!) */
259ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ARMri5_R       /* reg */
260ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
261ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ARMRI5Tag;
262ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
263ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntypedef
264ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   struct {
265ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ARMRI5Tag tag;
266ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      union {
267ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         struct {
268ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            UInt imm5;
269ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         } I5;
270ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         struct {
271ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg reg;
272ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         } R;
273ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      } ARMri5;
274ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
275ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ARMRI5;
276ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
277ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern ARMRI5* ARMRI5_I5 ( UInt imm5 );
278ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern ARMRI5* ARMRI5_R  ( HReg );
279ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
280ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern void ppARMRI5 ( ARMRI5* );
281ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
282ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* -------- Neon Immediate operand -------- */
283ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
284ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* imm8 = abcdefgh, B = NOT(b);
285ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
286ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntype | value (64bit binary)
287ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown-----+-------------------------------------------------------------------------
288ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   0 | 00000000 00000000 00000000 abcdefgh 00000000 00000000 00000000 abcdefgh
289ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   1 | 00000000 00000000 abcdefgh 00000000 00000000 00000000 abcdefgh 00000000
290ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   2 | 00000000 abcdefgh 00000000 00000000 00000000 abcdefgh 00000000 00000000
291ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   3 | abcdefgh 00000000 00000000 00000000 abcdefgh 00000000 00000000 00000000
292ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   4 | 00000000 abcdefgh 00000000 abcdefgh 00000000 abcdefgh 00000000 abcdefgh
293ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   5 | abcdefgh 00000000 abcdefgh 00000000 abcdefgh 00000000 abcdefgh 00000000
294ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   6 | abcdefgh abcdefgh abcdefgh abcdefgh abcdefgh abcdefgh abcdefgh abcdefgh
295ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   7 | 00000000 00000000 abcdefgh 11111111 00000000 00000000 abcdefgh 11111111
296ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   8 | 00000000 abcdefgh 11111111 11111111 00000000 abcdefgh 11111111 11111111
297ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   9 | aaaaaaaa bbbbbbbb cccccccc dddddddd eeeeeeee ffffffff gggggggg hhhhhhhh
298ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  10 | aBbbbbbc defgh000 00000000 00000000 aBbbbbbc defgh000 00000000 00000000
299ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown-----+-------------------------------------------------------------------------
300ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
301ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownType 10 is:
302ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   (-1)^S * 2^exp * mantissa
303ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownwhere S = a, exp = UInt(B:c:d) - 3, mantissa = (16 + UInt(e:f:g:h)) / 16
304ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown*/
305ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
306ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntypedef
307ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   struct {
308ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UInt type;
309ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UInt imm8;
310ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
311ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ARMNImm;
312ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
313ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern ARMNImm* ARMNImm_TI ( UInt type, UInt imm8 );
314ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern ULong ARMNImm_to_Imm64 ( ARMNImm* );
315ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern ARMNImm* Imm64_to_ARMNImm ( ULong );
316ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
317ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern void ppARMNImm ( ARMNImm* );
318ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
319ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* ------ Neon Register or Scalar Operand ------ */
320ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
321ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntypedef
322ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   enum {
323ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ARMNRS_Reg=11,
324ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ARMNRS_Scalar
325ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
326ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ARMNRS_tag;
327ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
328ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntypedef
329ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   struct {
330ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ARMNRS_tag tag;
331ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      HReg reg;
332ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UInt index;
333ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
334ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ARMNRS;
335ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
336ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern ARMNRS* mkARMNRS(ARMNRS_tag, HReg reg, UInt index);
337ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern void ppARMNRS ( ARMNRS* );
338ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
339ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* --------- Instructions. --------- */
340ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
341ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* --------- */
342ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntypedef
343ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   enum {
344ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ARMalu_ADD=20,   /* plain 32-bit add */
345ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ARMalu_ADDS,     /* 32-bit add, and set the flags */
346ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ARMalu_ADC,      /* 32-bit add with carry */
347ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ARMalu_SUB,      /* plain 32-bit subtract */
348ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ARMalu_SUBS,     /* 32-bit subtract, and set the flags */
349ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ARMalu_SBC,      /* 32-bit subtract with carry */
350ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ARMalu_AND,
351ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ARMalu_BIC,
352ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ARMalu_OR,
353ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ARMalu_XOR
354ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
355ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ARMAluOp;
356ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
357ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HChar* showARMAluOp ( ARMAluOp op );
358ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
359ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
360ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntypedef
361ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   enum {
362ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ARMsh_SHL=40,
363ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ARMsh_SHR,
364ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ARMsh_SAR
365ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
366ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ARMShiftOp;
367ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
368ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HChar* showARMShiftOp ( ARMShiftOp op );
369ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
370ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
371ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntypedef
372ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   enum {
373ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ARMun_NEG=50,
374ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ARMun_NOT,
375ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ARMun_CLZ
376ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
377ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ARMUnaryOp;
378ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
379ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HChar* showARMUnaryOp ( ARMUnaryOp op );
380ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
381ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
382ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntypedef
383ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   enum {
384ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ARMmul_PLAIN=60,
385ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ARMmul_ZX,
386ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ARMmul_SX
387ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
388ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ARMMulOp;
389ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
390ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HChar* showARMMulOp ( ARMMulOp op );
391ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
392ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
393ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntypedef
394ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   enum {
395ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ARMvfp_ADD=70,
396ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ARMvfp_SUB,
397ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ARMvfp_MUL,
398ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ARMvfp_DIV
399ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
400ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ARMVfpOp;
401ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
402ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HChar* showARMVfpOp ( ARMVfpOp op );
403ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
404ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
405ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntypedef
406ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   enum {
407ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ARMvfpu_COPY=80,
408ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ARMvfpu_NEG,
409ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ARMvfpu_ABS,
410ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ARMvfpu_SQRT
411ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
412ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ARMVfpUnaryOp;
413ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
414ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HChar* showARMVfpUnaryOp ( ARMVfpUnaryOp op );
415ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
416ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntypedef
417ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   enum {
418ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ARMneon_VAND=90,
419ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ARMneon_VORR,
420ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ARMneon_VXOR,
421ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ARMneon_VADD,
422ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ARMneon_VADDFP,
423ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ARMneon_VRHADDS,
424ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ARMneon_VRHADDU,
425ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ARMneon_VPADDFP,
426ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ARMneon_VABDFP,
427ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ARMneon_VSUB,
428ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ARMneon_VSUBFP,
429ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ARMneon_VMAXU,
430ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ARMneon_VMAXS,
431ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ARMneon_VMAXF,
432ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ARMneon_VMINU,
433ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ARMneon_VMINS,
434ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ARMneon_VMINF,
435ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ARMneon_VQADDU,
436ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ARMneon_VQADDS,
437ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ARMneon_VQSUBU,
438ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ARMneon_VQSUBS,
439ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ARMneon_VCGTU,
440ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ARMneon_VCGTS,
441ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ARMneon_VCGEU,
442ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ARMneon_VCGES,
443ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ARMneon_VCGTF,
444ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ARMneon_VCGEF,
445ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ARMneon_VCEQ,
446ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ARMneon_VCEQF,
447ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ARMneon_VEXT,
448ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ARMneon_VMUL,
449ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ARMneon_VMULFP,
450ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ARMneon_VMULLU,
451ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ARMneon_VMULLS,
452ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ARMneon_VMULP,
453ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ARMneon_VMULLP,
454ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ARMneon_VQDMULH,
455ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ARMneon_VQRDMULH,
456ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ARMneon_VPADD,
457ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ARMneon_VPMINU,
458ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ARMneon_VPMINS,
459ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ARMneon_VPMINF,
460ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ARMneon_VPMAXU,
461ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ARMneon_VPMAXS,
462ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ARMneon_VPMAXF,
463ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ARMneon_VTBL,
464ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ARMneon_VQDMULL,
465ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ARMneon_VRECPS,
466ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ARMneon_VRSQRTS,
467ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* ... */
468ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
469ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ARMNeonBinOp;
470ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
471ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntypedef
472ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   enum {
473ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ARMneon_VSHL=150,
474ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ARMneon_VSAL, /* Yah, not SAR but SAL */
475ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ARMneon_VQSHL,
476ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ARMneon_VQSAL
477ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
478ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ARMNeonShiftOp;
479ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
480ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntypedef
481ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   enum {
482ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ARMneon_COPY=160,
483ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ARMneon_COPYLU,
484ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ARMneon_COPYLS,
485ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ARMneon_COPYN,
486ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ARMneon_COPYQNSS,
487ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ARMneon_COPYQNUS,
488ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ARMneon_COPYQNUU,
489ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ARMneon_NOT,
490ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ARMneon_EQZ,
491ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ARMneon_DUP,
492ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ARMneon_PADDLS,
493ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ARMneon_PADDLU,
494ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ARMneon_CNT,
495ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ARMneon_CLZ,
496ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ARMneon_CLS,
497ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ARMneon_VCVTxFPxINT,
498ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ARMneon_VQSHLNSS,
499ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ARMneon_VQSHLNUU,
500ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ARMneon_VQSHLNUS,
501ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ARMneon_VCVTFtoU,
502ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ARMneon_VCVTFtoS,
503ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ARMneon_VCVTUtoF,
504ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ARMneon_VCVTStoF,
505ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ARMneon_VCVTFtoFixedU,
506ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ARMneon_VCVTFtoFixedS,
507ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ARMneon_VCVTFixedUtoF,
508ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ARMneon_VCVTFixedStoF,
509ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ARMneon_VCVTF16toF32,
510ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ARMneon_VCVTF32toF16,
511ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ARMneon_REV16,
512ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ARMneon_REV32,
513ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ARMneon_REV64,
514ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ARMneon_ABS,
515ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ARMneon_VNEGF,
516ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ARMneon_VRECIP,
517ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ARMneon_VRECIPF,
518ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ARMneon_VABSFP,
519ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ARMneon_VRSQRTEFP,
520ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ARMneon_VRSQRTE
521ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* ... */
522ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
523ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ARMNeonUnOp;
524ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
525ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntypedef
526ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   enum {
527ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ARMneon_SETELEM=200,
528ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ARMneon_GETELEMU,
529ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ARMneon_GETELEMS,
530ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ARMneon_VDUP,
531ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
532ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ARMNeonUnOpS;
533ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
534ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntypedef
535ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   enum {
536ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ARMneon_TRN=210,
537ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ARMneon_ZIP,
538ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ARMneon_UZP
539ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* ... */
540ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
541ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ARMNeonDualOp;
542ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
543ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HChar* showARMNeonBinOp ( ARMNeonBinOp op );
544ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HChar* showARMNeonUnOp ( ARMNeonUnOp op );
545ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HChar* showARMNeonUnOpS ( ARMNeonUnOpS op );
546ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HChar* showARMNeonShiftOp ( ARMNeonShiftOp op );
547ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HChar* showARMNeonDualOp ( ARMNeonDualOp op );
548ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HChar* showARMNeonBinOpDataType ( ARMNeonBinOp op );
549ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HChar* showARMNeonUnOpDataType ( ARMNeonUnOp op );
550ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HChar* showARMNeonUnOpSDataType ( ARMNeonUnOpS op );
551ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HChar* showARMNeonShiftOpDataType ( ARMNeonShiftOp op );
552ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HChar* showARMNeonDualOpDataType ( ARMNeonDualOp op );
553ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
554ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntypedef
555ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   enum {
556ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* baseline */
557ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ARMin_Alu=220,
558ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ARMin_Shift,
559ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ARMin_Unary,
560ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ARMin_CmpOrTst,
561ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ARMin_Mov,
562ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ARMin_Imm32,
563ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ARMin_LdSt32,
564ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ARMin_LdSt16,
565ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ARMin_LdSt8U,
566ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ARMin_Ld8S,
567ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ARMin_Goto,
568ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ARMin_CMov,
569ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ARMin_Call,
570ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ARMin_Mul,
571ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ARMin_LdrEX,
572ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ARMin_StrEX,
573ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* vfp */
574ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ARMin_VLdStD,
575ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ARMin_VLdStS,
576ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ARMin_VAluD,
577ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ARMin_VAluS,
578ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ARMin_VUnaryD,
579ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ARMin_VUnaryS,
580ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ARMin_VCmpD,
581ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ARMin_VCMovD,
582ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ARMin_VCMovS,
583ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ARMin_VCvtSD,
584ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ARMin_VXferD,
585ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ARMin_VXferS,
586ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ARMin_VCvtID,
587ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ARMin_FPSCR,
588ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ARMin_MFence,
589b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      ARMin_CLREX,
590ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* Neon */
591ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ARMin_NLdStQ,
592ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ARMin_NLdStD,
593ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ARMin_NUnary,
594ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ARMin_NUnaryS,
595ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ARMin_NDual,
596ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ARMin_NBinary,
597ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ARMin_NBinaryS,
598ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ARMin_NShift,
599ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ARMin_NeonImm,
600ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ARMin_NCMovQ,
601ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* This is not a NEON instruction. Actually there is no corresponding
602ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         instruction in ARM instruction set at all. We need this one to
603ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         generate spill/reload of 128-bit registers since current register
604ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         allocator demands them to consist of no more than two instructions.
605ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         We will split this instruction into 2 or 3 ARM instructions on the
606ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         emiting phase.
607ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
608ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         NOTE: source and destination registers should be different! */
609ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ARMin_Add32
610ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
611ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ARMInstrTag;
612ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
613ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Destinations are on the LEFT (first operand) */
614ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
615ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntypedef
616ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   struct {
617ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ARMInstrTag tag;
618ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      union {
619ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         /* ADD/SUB/AND/OR/XOR, vanilla ALU op */
620ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         struct {
621ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            ARMAluOp op;
622ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg     dst;
623ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg     argL;
624ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            ARMRI84* argR;
625ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         } Alu;
626ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         /* SHL/SHR/SAR, 2nd arg is reg or imm */
627ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         struct {
628ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            ARMShiftOp op;
629ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg       dst;
630ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg       argL;
631ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            ARMRI5*    argR;
632ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         } Shift;
633ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         /* NOT/NEG/CLZ */
634ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         struct {
635ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            ARMUnaryOp op;
636ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg       dst;
637ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg       src;
638ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         } Unary;
639ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         /* CMP/TST; subtract/and, discard result, set NZCV */
640ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         struct {
641ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            Bool     isCmp;
642ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg     argL;
643ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            ARMRI84* argR;
644ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         } CmpOrTst;
645ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         /* MOV dst, src -- reg-reg (or reg-imm8x4) move */
646ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         struct {
647ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg     dst;
648ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            ARMRI84* src;
649ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         } Mov;
650ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         /* Pseudo-insn; make a 32-bit immediate */
651ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         struct {
652ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg dst;
653ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            UInt imm32;
654ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         } Imm32;
655ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         /* 32-bit load or store */
656ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         struct {
657ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            Bool       isLoad;
658ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg       rD;
659ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            ARMAMode1* amode;
660ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         } LdSt32;
661ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         /* 16-bit load or store */
662ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         struct {
663ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            Bool       isLoad;
664ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            Bool       signedLoad;
665ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg       rD;
666ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            ARMAMode2* amode;
667ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         } LdSt16;
668ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         /* 8-bit (unsigned) load or store */
669ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         struct {
670ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            Bool       isLoad;
671ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg       rD;
672ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            ARMAMode1* amode;
673ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         } LdSt8U;
674ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         /* 8-bit signed load */
675ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         struct {
676ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg       rD;
677ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            ARMAMode2* amode;
678ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         } Ld8S;
679ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         /* Pseudo-insn.  Go to guest address gnext, on given
680ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            condition, which could be ARMcc_AL. */
681ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         struct {
682ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            IRJumpKind  jk;
683ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            ARMCondCode cond;
684ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg        gnext;
685ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         } Goto;
686ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         /* Mov src to dst on the given condition, which may not
687ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            be ARMcc_AL. */
688ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         struct {
689ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            ARMCondCode cond;
690ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg        dst;
691ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            ARMRI84*    src;
692ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         } CMov;
693ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         /* Pseudo-insn.  Call target (an absolute address), on given
694ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            condition (which could be ARMcc_AL). */
695ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         struct {
696ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            ARMCondCode cond;
697ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HWord       target;
698ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            Int         nArgRegs; /* # regs carrying args: 0 .. 4 */
699ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         } Call;
700ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         /* (PLAIN) 32 *  32 -> 32:  r0    = r2 * r3
701ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            (ZX)    32 *u 32 -> 64:  r1:r0 = r2 *u r3
702ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            (SX)    32 *s 32 -> 64:  r1:r0 = r2 *s r3
703ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            Why hardwired registers?  Because the ARM ARM specifies
704ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            (eg for straight MUL) the result (Rd) and the left arg (Rm)
705ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            may not be the same register.  That's not a constraint we
706ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            can enforce in the register allocator (without mucho extra
707ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            complexity).  Hence hardwire it.  At least using caller-saves
708ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            registers, which are less likely to be in use. */
709ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         struct {
710ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            ARMMulOp op;
711ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         } Mul;
712b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         /* LDREX{,H,B} r2, [r4]  and
713b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            LDREXD r2, r3, [r4]   (on LE hosts, transferred value is r3:r2)
714ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            Again, hardwired registers since this is not performance
715ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            critical, and there are possibly constraints on the
716ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            registers that we can't express in the register allocator.*/
717ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         struct {
718b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            Int  szB; /* 1, 2, 4 or 8 */
719ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         } LdrEX;
720b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         /* STREX{,H,B} r0, r2, [r4]  and
721b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            STREXD r0, r2, r3, [r4]   (on LE hosts, transferred value is r3:r2)
722b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            r0 = SC( [r4] = r2 )      (8, 16, 32 bit transfers)
723b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            r0 = SC( [r4] = r3:r2)    (64 bit transfers)
724ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            Ditto comment re fixed registers. */
725ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         struct {
726b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            Int  szB; /* 1, 2, 4 or 8 */
727ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         } StrEX;
728ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         /* VFP INSTRUCTIONS */
729ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         /* 64-bit Fp load/store */
730ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         struct {
731ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            Bool       isLoad;
732ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg       dD;
733ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            ARMAModeV* amode;
734ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         } VLdStD;
735ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         /* 32-bit Fp load/store */
736ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         struct {
737ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            Bool       isLoad;
738ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg       fD;
739ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            ARMAModeV* amode;
740ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         } VLdStS;
741ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         /* 64-bit FP binary arithmetic */
742ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         struct {
743ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            ARMVfpOp op;
744ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg     dst;
745ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg     argL;
746ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg     argR;
747ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         } VAluD;
748ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         /* 32-bit FP binary arithmetic */
749ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         struct {
750ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            ARMVfpOp op;
751ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg     dst;
752ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg     argL;
753ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg     argR;
754ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         } VAluS;
755ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         /* 64-bit FP unary, also reg-reg move */
756ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         struct {
757ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            ARMVfpUnaryOp op;
758ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg          dst;
759ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg          src;
760ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         } VUnaryD;
761ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         /* 32-bit FP unary, also reg-reg move */
762ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         struct {
763ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            ARMVfpUnaryOp op;
764ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg          dst;
765ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg          src;
766ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         } VUnaryS;
767ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         /* 64-bit FP compare and move results to CPSR (FCMPD;FMSTAT) */
768ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         struct {
769ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg argL;
770ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg argR;
771ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         } VCmpD;
772ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         /* 64-bit FP mov src to dst on the given condition, which may
773ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            not be ARMcc_AL. */
774ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         struct {
775ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            ARMCondCode cond;
776ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg        dst;
777ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg        src;
778ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         } VCMovD;
779ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         /* 32-bit FP mov src to dst on the given condition, which may
780ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            not be ARMcc_AL. */
781ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         struct {
782ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            ARMCondCode cond;
783ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg        dst;
784ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg        src;
785ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         } VCMovS;
786ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         /* Convert between 32-bit and 64-bit FP values (both ways).
787ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            (FCVTSD, FCVTDS) */
788ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         struct {
789ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            Bool sToD; /* True: F32->F64.  False: F64->F32 */
790ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg dst;
791ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg src;
792ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         } VCvtSD;
793ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         /* Transfer a VFP D reg to/from two integer registers (VMOV) */
794ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         struct {
795ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            Bool toD;
796ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg dD;
797ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg rHi;
798ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg rLo;
799ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         } VXferD;
800ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         /* Transfer a VFP S reg to/from an integer register (VMOV) */
801ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         struct {
802ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            Bool toS;
803ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg fD;
804ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg rLo;
805ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         } VXferS;
806ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         /* Convert between 32-bit ints and 64-bit FP values (both ways
807ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            and both signednesses). (FSITOD, FUITOD, FTOSID, FTOUID) */
808ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         struct {
809ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            Bool iToD; /* True: I32->F64.  False: F64->I32 */
810ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            Bool syned; /* True: I32 is signed.  False: I32 is unsigned */
811ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg dst;
812ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg src;
813ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         } VCvtID;
814ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         /* Move a 32-bit value to/from the FPSCR (FMXR, FMRX) */
815ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         struct {
816ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            Bool toFPSCR;
817ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg iReg;
818ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         } FPSCR;
819ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         /* Mem fence.  An insn which fences all loads and stores as
820ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            much as possible before continuing.  On ARM we emit the
821ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            sequence
822ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               mcr 15,0,r0,c7,c10,4 (DSB)
823ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               mcr 15,0,r0,c7,c10,5 (DMB)
824ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               mcr 15,0,r0,c7,c5,4 (ISB)
825ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            which is probably total overkill, but better safe than
826ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            sorry.
827ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         */
828ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         struct {
829ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         } MFence;
830b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         /* A CLREX instruction. */
831b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         struct {
832b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         } CLREX;
833ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         /* Neon data processing instruction: 3 registers of the same
834ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            length */
835ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         struct {
836ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            ARMNeonBinOp op;
837ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg dst;
838ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg argL;
839ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg argR;
840ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            UInt size;
841ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            Bool Q;
842ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         } NBinary;
843ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         struct {
844ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            ARMNeonBinOp op;
845ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            ARMNRS* dst;
846ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            ARMNRS* argL;
847ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            ARMNRS* argR;
848ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            UInt size;
849ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            Bool Q;
850ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         } NBinaryS;
851ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         struct {
852ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            ARMNeonShiftOp op;
853ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg dst;
854ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg argL;
855ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg argR;
856ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            UInt size;
857ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            Bool Q;
858ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         } NShift;
859ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         struct {
860ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            Bool isLoad;
861ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg dQ;
862ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            ARMAModeN *amode;
863ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         } NLdStQ;
864ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         struct {
865ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            Bool isLoad;
866ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg dD;
867ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            ARMAModeN *amode;
868ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         } NLdStD;
869ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         struct {
870ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            ARMNeonUnOpS op;
871ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            ARMNRS*  dst;
872ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            ARMNRS*  src;
873ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            UInt size;
874ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            Bool Q;
875ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         } NUnaryS;
876ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         struct {
877ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            ARMNeonUnOp op;
878ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg  dst;
879ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg  src;
880ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            UInt size;
881ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            Bool Q;
882ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         } NUnary;
883ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         /* Takes two arguments and modifies them both. */
884ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         struct {
885ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            ARMNeonDualOp op;
886ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg  arg1;
887ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg  arg2;
888ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            UInt size;
889ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            Bool Q;
890ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         } NDual;
891ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         struct {
892ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg dst;
893ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            ARMNImm* imm;
894ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         } NeonImm;
895ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         /* 128-bit Neon move src to dst on the given condition, which
896ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            may not be ARMcc_AL. */
897ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         struct {
898ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            ARMCondCode cond;
899ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg        dst;
900ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg        src;
901ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         } NCMovQ;
902ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         struct {
903ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            /* Note: rD != rN */
904ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg rD;
905ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg rN;
906ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            UInt imm32;
907ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         } Add32;
908ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      } ARMin;
909ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
910ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ARMInstr;
911ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
912ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
913ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern ARMInstr* ARMInstr_Alu      ( ARMAluOp, HReg, HReg, ARMRI84* );
914ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern ARMInstr* ARMInstr_Shift    ( ARMShiftOp, HReg, HReg, ARMRI5* );
915ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern ARMInstr* ARMInstr_Unary    ( ARMUnaryOp, HReg, HReg );
916ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern ARMInstr* ARMInstr_CmpOrTst ( Bool isCmp, HReg, ARMRI84* );
917ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern ARMInstr* ARMInstr_Mov      ( HReg, ARMRI84* );
918ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern ARMInstr* ARMInstr_Imm32    ( HReg, UInt );
919ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern ARMInstr* ARMInstr_LdSt32   ( Bool isLoad, HReg, ARMAMode1* );
920ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern ARMInstr* ARMInstr_LdSt16   ( Bool isLoad, Bool signedLoad,
921ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                                     HReg, ARMAMode2* );
922ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern ARMInstr* ARMInstr_LdSt8U   ( Bool isLoad, HReg, ARMAMode1* );
923ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern ARMInstr* ARMInstr_Ld8S     ( HReg, ARMAMode2* );
924ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern ARMInstr* ARMInstr_Goto     ( IRJumpKind, ARMCondCode, HReg gnext );
925ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern ARMInstr* ARMInstr_CMov     ( ARMCondCode, HReg dst, ARMRI84* src );
926ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern ARMInstr* ARMInstr_Call     ( ARMCondCode, HWord, Int nArgRegs );
927ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern ARMInstr* ARMInstr_Mul      ( ARMMulOp op );
928ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern ARMInstr* ARMInstr_LdrEX    ( Int szB );
929ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern ARMInstr* ARMInstr_StrEX    ( Int szB );
930ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern ARMInstr* ARMInstr_VLdStD   ( Bool isLoad, HReg, ARMAModeV* );
931ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern ARMInstr* ARMInstr_VLdStS   ( Bool isLoad, HReg, ARMAModeV* );
932ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern ARMInstr* ARMInstr_VAluD    ( ARMVfpOp op, HReg, HReg, HReg );
933ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern ARMInstr* ARMInstr_VAluS    ( ARMVfpOp op, HReg, HReg, HReg );
934ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern ARMInstr* ARMInstr_VUnaryD  ( ARMVfpUnaryOp, HReg dst, HReg src );
935ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern ARMInstr* ARMInstr_VUnaryS  ( ARMVfpUnaryOp, HReg dst, HReg src );
936ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern ARMInstr* ARMInstr_VCmpD    ( HReg argL, HReg argR );
937ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern ARMInstr* ARMInstr_VCMovD   ( ARMCondCode, HReg dst, HReg src );
938ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern ARMInstr* ARMInstr_VCMovS   ( ARMCondCode, HReg dst, HReg src );
939ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern ARMInstr* ARMInstr_VCvtSD   ( Bool sToD, HReg dst, HReg src );
940ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern ARMInstr* ARMInstr_VXferD   ( Bool toD, HReg dD, HReg rHi, HReg rLo );
941ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern ARMInstr* ARMInstr_VXferS   ( Bool toS, HReg fD, HReg rLo );
942ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern ARMInstr* ARMInstr_VCvtID   ( Bool iToD, Bool syned,
943ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                                     HReg dst, HReg src );
944ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern ARMInstr* ARMInstr_FPSCR    ( Bool toFPSCR, HReg iReg );
945ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern ARMInstr* ARMInstr_MFence   ( void );
946b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovextern ARMInstr* ARMInstr_CLREX    ( void );
947ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern ARMInstr* ARMInstr_NLdStQ   ( Bool isLoad, HReg, ARMAModeN* );
948ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern ARMInstr* ARMInstr_NLdStD   ( Bool isLoad, HReg, ARMAModeN* );
949ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern ARMInstr* ARMInstr_NUnary   ( ARMNeonUnOp, HReg, HReg, UInt, Bool );
950b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovextern ARMInstr* ARMInstr_NUnaryS  ( ARMNeonUnOpS, ARMNRS*, ARMNRS*,
951ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                                     UInt, Bool );
952ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern ARMInstr* ARMInstr_NDual    ( ARMNeonDualOp, HReg, HReg, UInt, Bool );
953ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern ARMInstr* ARMInstr_NBinary  ( ARMNeonBinOp, HReg, HReg, HReg,
954ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                                     UInt, Bool );
955ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern ARMInstr* ARMInstr_NShift   ( ARMNeonShiftOp, HReg, HReg, HReg,
956ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                                     UInt, Bool );
957ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern ARMInstr* ARMInstr_NeonImm  ( HReg, ARMNImm* );
958ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern ARMInstr* ARMInstr_NCMovQ   ( ARMCondCode, HReg, HReg );
959ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern ARMInstr* ARMInstr_Add32    ( HReg rD, HReg rN, UInt imm32 );
960ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
961ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern void ppARMInstr ( ARMInstr* );
962ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
963ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
964ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Some functions that insulate the register allocator from details
965ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   of the underlying instruction set. */
966ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern void getRegUsage_ARMInstr ( HRegUsage*, ARMInstr*, Bool );
967ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern void mapRegs_ARMInstr     ( HRegRemap*, ARMInstr*, Bool );
968ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern Bool isMove_ARMInstr      ( ARMInstr*, HReg*, HReg* );
969ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern Int  emit_ARMInstr        ( UChar* buf, Int nbuf, ARMInstr*,
970b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                   Bool,
971b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                   void* dispatch_unassisted,
972b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                   void* dispatch_assisted );
973ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
974ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern void genSpill_ARM  ( /*OUT*/HInstr** i1, /*OUT*/HInstr** i2,
975ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                            HReg rreg, Int offset, Bool );
976ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern void genReload_ARM ( /*OUT*/HInstr** i1, /*OUT*/HInstr** i2,
977ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                            HReg rreg, Int offset, Bool );
978ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
979ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern void getAllocableRegs_ARM ( Int*, HReg** );
980ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HInstrArray* iselSB_ARM   ( IRSB*, VexArch,
981ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                                   VexArchInfo*, VexAbiInfo* );
982ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
983ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif /* ndef __VEX_HOST_ARM_DEFS_H */
984ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
985ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*---------------------------------------------------------------*/
986ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*--- end                                     host_arm_defs.h ---*/
987ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*---------------------------------------------------------------*/
988