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