1436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
2436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov/*---------------------------------------------------------------*/
3436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov/*--- begin                                 host_arm64_defs.c ---*/
4436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov/*---------------------------------------------------------------*/
5436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
6436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov/*
7436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   This file is part of Valgrind, a dynamic binary instrumentation
8436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   framework.
9436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
10436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   Copyright (C) 2013-2013 OpenWorks
11436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      info@open-works.net
12436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
13436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   This program is free software; you can redistribute it and/or
14436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   modify it under the terms of the GNU General Public License as
15436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   published by the Free Software Foundation; either version 2 of the
16436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   License, or (at your option) any later version.
17436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
18436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   This program is distributed in the hope that it will be useful, but
19436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   WITHOUT ANY WARRANTY; without even the implied warranty of
20436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
21436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   General Public License for more details.
22436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
23436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   You should have received a copy of the GNU General Public License
24436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   along with this program; if not, write to the Free Software
25436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
26436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   02110-1301, USA.
27436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
28436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   The GNU General Public License is contained in the file COPYING.
29436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov*/
30436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
31436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#include "libvex_basictypes.h"
32436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#include "libvex.h"
33436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#include "libvex_trc_values.h"
34436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
35436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#include "main_util.h"
36436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#include "host_generic_regs.h"
37436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#include "host_arm64_defs.h"
38436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
39436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ UInt arm_hwcaps = 0;
40436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
41436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
42436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov/* --------- Registers. --------- */
43436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
44436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov/* The usual HReg abstraction.  We use the following classes only:
45436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov     X regs (64 bit int)
46436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov     D regs (64 bit float, also used for 32 bit float)
47436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov     Q regs (128 bit vector)
48436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov*/
49436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
50436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovvoid ppHRegARM64 ( HReg reg )  {
51436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   Int r;
52436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   /* Be generic for all virtual regs. */
53436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   if (hregIsVirtual(reg)) {
54436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      ppHReg(reg);
55436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      return;
56436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   }
57436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   /* But specific for real regs. */
58436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   switch (hregClass(reg)) {
59436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case HRcInt64:
60436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         r = hregNumber(reg);
61436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         vassert(r >= 0 && r < 31);
62436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         vex_printf("x%d", r);
63436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         return;
64436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case HRcFlt64:
65436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         r = hregNumber(reg);
66436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         vassert(r >= 0 && r < 32);
67436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         vex_printf("d%d", r);
68436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         return;
69436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case HRcVec128:
70436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         r = hregNumber(reg);
71436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         vassert(r >= 0 && r < 32);
72436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         vex_printf("q%d", r);
73436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         return;
74436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      default:
75436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         vpanic("ppHRegARM64");
76436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   }
77436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
78436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
79436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic void ppHRegARM64asSreg ( HReg reg ) {
80436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   ppHRegARM64(reg);
81436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   vex_printf("(S-reg)");
82436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
83436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
84436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovHReg hregARM64_X0  ( void ) { return mkHReg(0,  HRcInt64, False); }
85436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovHReg hregARM64_X1  ( void ) { return mkHReg(1,  HRcInt64, False); }
86436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovHReg hregARM64_X2  ( void ) { return mkHReg(2,  HRcInt64, False); }
87436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovHReg hregARM64_X3  ( void ) { return mkHReg(3,  HRcInt64, False); }
88436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovHReg hregARM64_X4  ( void ) { return mkHReg(4,  HRcInt64, False); }
89436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovHReg hregARM64_X5  ( void ) { return mkHReg(5,  HRcInt64, False); }
90436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovHReg hregARM64_X6  ( void ) { return mkHReg(6,  HRcInt64, False); }
91436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovHReg hregARM64_X7  ( void ) { return mkHReg(7,  HRcInt64, False); }
92436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ HReg hregARM_R8  ( void ) { return mkHReg(8,  HRcInt32, False); }
93436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovHReg hregARM64_X9  ( void ) { return mkHReg(9,  HRcInt64, False); }
94436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovHReg hregARM64_X10 ( void ) { return mkHReg(10, HRcInt64, False); }
95436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovHReg hregARM64_X11 ( void ) { return mkHReg(11, HRcInt64, False); }
96436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovHReg hregARM64_X12 ( void ) { return mkHReg(12, HRcInt64, False); }
97436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovHReg hregARM64_X13 ( void ) { return mkHReg(13, HRcInt64, False); }
98436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovHReg hregARM64_X14 ( void ) { return mkHReg(14, HRcInt64, False); }
99436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovHReg hregARM64_X15 ( void ) { return mkHReg(15, HRcInt64, False); }
100436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovHReg hregARM64_X21 ( void ) { return mkHReg(21, HRcInt64, False); }
101436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovHReg hregARM64_X22 ( void ) { return mkHReg(22, HRcInt64, False); }
102436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovHReg hregARM64_X23 ( void ) { return mkHReg(23, HRcInt64, False); }
103436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovHReg hregARM64_X24 ( void ) { return mkHReg(24, HRcInt64, False); }
104436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovHReg hregARM64_X25 ( void ) { return mkHReg(25, HRcInt64, False); }
105436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovHReg hregARM64_X26 ( void ) { return mkHReg(26, HRcInt64, False); }
106436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovHReg hregARM64_X27 ( void ) { return mkHReg(27, HRcInt64, False); }
107436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovHReg hregARM64_X28 ( void ) { return mkHReg(28, HRcInt64, False); }
108436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
109436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov// Should really use D8 .. D15 for class F64, since they are callee
110436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov// save
111436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovHReg hregARM64_D8  ( void ) { return mkHReg(8,  HRcFlt64, False); }
112436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovHReg hregARM64_D9  ( void ) { return mkHReg(9,  HRcFlt64, False); }
113436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovHReg hregARM64_D10 ( void ) { return mkHReg(10, HRcFlt64, False); }
114436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovHReg hregARM64_D11 ( void ) { return mkHReg(11, HRcFlt64, False); }
115436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovHReg hregARM64_D12 ( void ) { return mkHReg(12, HRcFlt64, False); }
116436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovHReg hregARM64_D13 ( void ) { return mkHReg(13, HRcFlt64, False); }
117436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ HReg hregARM_S26 ( void ) { return mkHReg(26, HRcFlt32, False); }
118436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ HReg hregARM_S27 ( void ) { return mkHReg(27, HRcFlt32, False); }
119436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ HReg hregARM_S28 ( void ) { return mkHReg(28, HRcFlt32, False); }
120436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ HReg hregARM_S29 ( void ) { return mkHReg(29, HRcFlt32, False); }
121436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ HReg hregARM_S30 ( void ) { return mkHReg(30, HRcFlt32, False); }
122436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovHReg hregARM64_Q16 ( void ) { return mkHReg(16, HRcVec128, False); }
123436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovHReg hregARM64_Q17 ( void ) { return mkHReg(17, HRcVec128, False); }
124436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovHReg hregARM64_Q18 ( void ) { return mkHReg(18, HRcVec128, False); }
125436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ HReg hregARM_Q11 ( void ) { return mkHReg(11, HRcVec128, False); }
126436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ HReg hregARM_Q12 ( void ) { return mkHReg(12, HRcVec128, False); }
127436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ HReg hregARM_Q13 ( void ) { return mkHReg(13, HRcVec128, False); }
128436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ HReg hregARM_Q14 ( void ) { return mkHReg(14, HRcVec128, False); }
129436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ HReg hregARM_Q15 ( void ) { return mkHReg(15, HRcVec128, False); }
130436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
131436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovvoid getAllocableRegs_ARM64 ( Int* nregs, HReg** arr )
132436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
133436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   Int i = 0;
134436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   *nregs = 24;
135436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   *arr = LibVEX_Alloc(*nregs * sizeof(HReg));
136436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
137436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   // callee saves ones (22 to 28) are listed first, since we prefer
138436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   // them if they're available
139436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   (*arr)[i++] = hregARM64_X22();
140436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   (*arr)[i++] = hregARM64_X23();
141436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   (*arr)[i++] = hregARM64_X24();
142436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   (*arr)[i++] = hregARM64_X25();
143436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   (*arr)[i++] = hregARM64_X26();
144436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   (*arr)[i++] = hregARM64_X27();
145436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   (*arr)[i++] = hregARM64_X28();
146436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
147436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   (*arr)[i++] = hregARM64_X0();
148436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   (*arr)[i++] = hregARM64_X1();
149436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   (*arr)[i++] = hregARM64_X2();
150436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   (*arr)[i++] = hregARM64_X3();
151436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   (*arr)[i++] = hregARM64_X4();
152436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   (*arr)[i++] = hregARM64_X5();
153436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   (*arr)[i++] = hregARM64_X6();
154436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   (*arr)[i++] = hregARM64_X7();
155436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   // X8 .. who knows.
156436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   // X9 is a chaining/spill temporary, not available to regalloc.
157436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
158436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   // Do we really need all these?
159436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   //(*arr)[i++] = hregARM64_X10();
160436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   //(*arr)[i++] = hregARM64_X11();
161436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   //(*arr)[i++] = hregARM64_X12();
162436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   //(*arr)[i++] = hregARM64_X13();
163436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   //(*arr)[i++] = hregARM64_X14();
164436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   //(*arr)[i++] = hregARM64_X15();
165436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   // X21 is the guest state pointer, not available to regalloc.
166436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
167436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   // vector regs.  Unfortunately not callee-saved.
168436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   (*arr)[i++] = hregARM64_Q16();
169436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   (*arr)[i++] = hregARM64_Q17();
170436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   (*arr)[i++] = hregARM64_Q18();
171436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
172436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   // F64 regs, all of which are callee-saved
173436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   (*arr)[i++] = hregARM64_D8();
174436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   (*arr)[i++] = hregARM64_D9();
175436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   (*arr)[i++] = hregARM64_D10();
176436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   (*arr)[i++] = hregARM64_D11();
177436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   (*arr)[i++] = hregARM64_D12();
178436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   (*arr)[i++] = hregARM64_D13();
179436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
180436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   // unavail: x21 as GSP
181436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   // x9 is used as a spill/reload/chaining/call temporary
182436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   // x8 is unassigned
183436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   // x30 as LR
184436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   // x31 because dealing with the SP-vs-ZR overloading is too
185436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   // confusing, and we don't need to do so, so let's just avoid
186436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   // the problem
187436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   //
188436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   // Currently, we have 15 allocatable integer registers:
189436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   // 0 1 2 3 4 5 6 7 22 23 24 25 26 27 28
190436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   //
191436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   // Hence for the allocatable integer registers we have:
192436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   //
193436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   // callee-saved: 22 23 24 25 26 27 28
194436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   // caller-saved: 0 1 2 3 4 5 6 7
195436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   //
196436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   // If the set of available registers changes or if the e/r status
197436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   // changes, be sure to re-check/sync the definition of
198436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   // getHRegUsage for ARMInstr_Call too.
199436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   vassert(i == *nregs);
200436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
201436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
202436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
203436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov/* --------- Condition codes, ARM64 encoding. --------- */
204436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
205436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar* showARM64CondCode ( ARM64CondCode cond ) {
206436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   switch (cond) {
207436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov       case ARM64cc_EQ:  return "eq";
208436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov       case ARM64cc_NE:  return "ne";
209436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov       case ARM64cc_CS:  return "cs";
210436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov       case ARM64cc_CC:  return "cc";
211436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov       case ARM64cc_MI:  return "mi";
212436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov       case ARM64cc_PL:  return "pl";
213436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov       case ARM64cc_VS:  return "vs";
214436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov       case ARM64cc_VC:  return "vc";
215436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov       case ARM64cc_HI:  return "hi";
216436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov       case ARM64cc_LS:  return "ls";
217436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov       case ARM64cc_GE:  return "ge";
218436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov       case ARM64cc_LT:  return "lt";
219436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov       case ARM64cc_GT:  return "gt";
220436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov       case ARM64cc_LE:  return "le";
221436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov       case ARM64cc_AL:  return "al"; // default
222436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov       case ARM64cc_NV:  return "nv";
223436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov       default: vpanic("showARM64CondCode");
224436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   }
225436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
226436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
227436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
228436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov/* --------- Memory address expressions (amodes). --------- */
229436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
230436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovARM64AMode* ARM64AMode_RI9  ( HReg reg, Int simm9 ) {
231436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   ARM64AMode* am        = LibVEX_Alloc(sizeof(ARM64AMode));
232436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   am->tag               = ARM64am_RI9;
233436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   am->ARM64am.RI9.reg   = reg;
234436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   am->ARM64am.RI9.simm9 = simm9;
235436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   vassert(-256 <= simm9 && simm9 <= 255);
236436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   return am;
237436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
238436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
239436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovARM64AMode* ARM64AMode_RI12 ( HReg reg, Int uimm12, UChar szB ) {
240436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   ARM64AMode* am          = LibVEX_Alloc(sizeof(ARM64AMode));
241436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   am->tag                 = ARM64am_RI12;
242436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   am->ARM64am.RI12.reg    = reg;
243436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   am->ARM64am.RI12.uimm12 = uimm12;
244436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   am->ARM64am.RI12.szB    = szB;
245436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   vassert(uimm12 >= 0 && uimm12 <= 4095);
246436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   switch (szB) {
247436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case 1: case 2: case 4: case 8: break;
248436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      default: vassert(0);
249436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   }
250436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   return am;
251436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
252436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
253436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovARM64AMode* ARM64AMode_RR ( HReg base, HReg index ) {
254436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   ARM64AMode* am       = LibVEX_Alloc(sizeof(ARM64AMode));
255436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   am->tag              = ARM64am_RR;
256436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   am->ARM64am.RR.base  = base;
257436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   am->ARM64am.RR.index = index;
258436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   return am;
259436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
260436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
261436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic void ppARM64AMode ( ARM64AMode* am ) {
262436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   switch (am->tag) {
263436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case ARM64am_RI9:
264436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         vex_printf("%d(", am->ARM64am.RI9.simm9);
265436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         ppHRegARM64(am->ARM64am.RI9.reg);
266436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         vex_printf(")");
267436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         break;
268436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case ARM64am_RI12:
269436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         vex_printf("%u(", (UInt)am->ARM64am.RI12.szB
270436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                           * (UInt)am->ARM64am.RI12.uimm12);
271436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         ppHRegARM64(am->ARM64am.RI12.reg);
272436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         vex_printf(")");
273436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         break;
274436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case ARM64am_RR:
275436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         vex_printf("(");
276436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         ppHRegARM64(am->ARM64am.RR.base);
277436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         vex_printf(",");
278436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         ppHRegARM64(am->ARM64am.RR.index);
279436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         vex_printf(")");
280436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         break;
281436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      default:
282436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         vassert(0);
283436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   }
284436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
285436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
286436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic void addRegUsage_ARM64AMode ( HRegUsage* u, ARM64AMode* am ) {
287436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   switch (am->tag) {
288436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case ARM64am_RI9:
289436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         addHRegUse(u, HRmRead, am->ARM64am.RI9.reg);
290436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         return;
291436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case ARM64am_RI12:
292436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         addHRegUse(u, HRmRead, am->ARM64am.RI12.reg);
293436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         return;
294436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case ARM64am_RR:
295436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         addHRegUse(u, HRmRead, am->ARM64am.RR.base);
296436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         addHRegUse(u, HRmRead, am->ARM64am.RR.index);
297436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         return;
298436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      default:
299436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         vpanic("addRegUsage_ARM64Amode");
300436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   }
301436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
302436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
303436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic void mapRegs_ARM64AMode ( HRegRemap* m, ARM64AMode* am ) {
304436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   switch (am->tag) {
305436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case ARM64am_RI9:
306436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         am->ARM64am.RI9.reg = lookupHRegRemap(m, am->ARM64am.RI9.reg);
307436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         return;
308436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case ARM64am_RI12:
309436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         am->ARM64am.RI12.reg = lookupHRegRemap(m, am->ARM64am.RI12.reg);
310436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         return;
311436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case ARM64am_RR:
312436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         am->ARM64am.RR.base  = lookupHRegRemap(m, am->ARM64am.RR.base);
313436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         am->ARM64am.RR.index = lookupHRegRemap(m, am->ARM64am.RR.index);
314436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         return;
315436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      default:
316436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         vpanic("mapRegs_ARM64Amode");
317436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   }
318436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
319436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
320436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
321436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ /* --------- Mem AModes: Addressing Mode 2 --------- */
322436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ
323436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ ARMAMode2* ARMAMode2_RI ( HReg reg, Int simm9 ) {
324436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    ARMAMode2* am       = LibVEX_Alloc(sizeof(ARMAMode2));
325436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    am->tag             = ARMam2_RI;
326436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    am->ARMam2.RI.reg   = reg;
327436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    am->ARMam2.RI.simm9 = simm9;
328436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    vassert(-255 <= simm9 && simm9 <= 255);
329436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    return am;
330436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ }
331436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ ARMAMode2* ARMAMode2_RR ( HReg base, HReg index ) {
332436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    ARMAMode2* am       = LibVEX_Alloc(sizeof(ARMAMode2));
333436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    am->tag             = ARMam2_RR;
334436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    am->ARMam2.RR.base  = base;
335436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    am->ARMam2.RR.index = index;
336436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    return am;
337436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ }
338436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ
339436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ void ppARMAMode2 ( ARMAMode2* am ) {
340436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    switch (am->tag) {
341436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMam2_RI:
342436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          vex_printf("%d(", am->ARMam2.RI.simm9);
343436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          ppHRegARM(am->ARMam2.RI.reg);
344436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          vex_printf(")");
345436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          break;
346436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMam2_RR:
347436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          vex_printf("(");
348436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          ppHRegARM(am->ARMam2.RR.base);
349436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          vex_printf(",");
350436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          ppHRegARM(am->ARMam2.RR.index);
351436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          vex_printf(")");
352436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          break;
353436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       default:
354436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          vassert(0);
355436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    }
356436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ }
357436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ
358436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ static void addRegUsage_ARMAMode2 ( HRegUsage* u, ARMAMode2* am ) {
359436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    switch (am->tag) {
360436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMam2_RI:
361436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          addHRegUse(u, HRmRead, am->ARMam2.RI.reg);
362436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          return;
363436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMam2_RR:
364436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          //    addHRegUse(u, HRmRead, am->ARMam2.RR.base);
365436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          //    addHRegUse(u, HRmRead, am->ARMam2.RR.index);
366436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          //   return;
367436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       default:
368436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          vpanic("addRegUsage_ARMAmode2");
369436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    }
370436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ }
371436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ
372436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ static void mapRegs_ARMAMode2 ( HRegRemap* m, ARMAMode2* am ) {
373436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    switch (am->tag) {
374436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMam2_RI:
375436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          am->ARMam2.RI.reg = lookupHRegRemap(m, am->ARMam2.RI.reg);
376436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          return;
377436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMam2_RR:
378436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          //am->ARMam2.RR.base =lookupHRegRemap(m, am->ARMam2.RR.base);
379436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          //am->ARMam2.RR.index = lookupHRegRemap(m, am->ARMam2.RR.index);
380436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          //return;
381436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       default:
382436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          vpanic("mapRegs_ARMAmode2");
383436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    }
384436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ }
385436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ
386436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ
387436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ /* --------- Mem AModes: Addressing Mode VFP --------- */
388436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ
389436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ ARMAModeV* mkARMAModeV ( HReg reg, Int simm11 ) {
390436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    ARMAModeV* am = LibVEX_Alloc(sizeof(ARMAModeV));
391436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    vassert(simm11 >= -1020 && simm11 <= 1020);
392436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    vassert(0 == (simm11 & 3));
393436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    am->reg    = reg;
394436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    am->simm11 = simm11;
395436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    return am;
396436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ }
397436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ
398436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ void ppARMAModeV ( ARMAModeV* am ) {
399436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    vex_printf("%d(", am->simm11);
400436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    ppHRegARM(am->reg);
401436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    vex_printf(")");
402436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ }
403436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ
404436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ static void addRegUsage_ARMAModeV ( HRegUsage* u, ARMAModeV* am ) {
405436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    addHRegUse(u, HRmRead, am->reg);
406436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ }
407436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ
408436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ static void mapRegs_ARMAModeV ( HRegRemap* m, ARMAModeV* am ) {
409436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    am->reg = lookupHRegRemap(m, am->reg);
410436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ }
411436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ
412436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ
413436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ /* --------- Mem AModes: Addressing Mode Neon ------- */
414436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ
415436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ ARMAModeN *mkARMAModeN_RR ( HReg rN, HReg rM ) {
416436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    ARMAModeN* am = LibVEX_Alloc(sizeof(ARMAModeN));
417436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    am->tag = ARMamN_RR;
418436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    am->ARMamN.RR.rN = rN;
419436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    am->ARMamN.RR.rM = rM;
420436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    return am;
421436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ }
422436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ
423436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ ARMAModeN *mkARMAModeN_R ( HReg rN ) {
424436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    ARMAModeN* am = LibVEX_Alloc(sizeof(ARMAModeN));
425436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    am->tag = ARMamN_R;
426436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    am->ARMamN.R.rN = rN;
427436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    return am;
428436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ }
429436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ
430436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ static void addRegUsage_ARMAModeN ( HRegUsage* u, ARMAModeN* am ) {
431436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    if (am->tag == ARMamN_R) {
432436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       addHRegUse(u, HRmRead, am->ARMamN.R.rN);
433436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    } else {
434436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       addHRegUse(u, HRmRead, am->ARMamN.RR.rN);
435436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       addHRegUse(u, HRmRead, am->ARMamN.RR.rM);
436436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    }
437436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ }
438436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ
439436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ static void mapRegs_ARMAModeN ( HRegRemap* m, ARMAModeN* am ) {
440436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    if (am->tag == ARMamN_R) {
441436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       am->ARMamN.R.rN = lookupHRegRemap(m, am->ARMamN.R.rN);
442436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    } else {
443436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       am->ARMamN.RR.rN = lookupHRegRemap(m, am->ARMamN.RR.rN);
444436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       am->ARMamN.RR.rM = lookupHRegRemap(m, am->ARMamN.RR.rM);
445436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    }
446436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ }
447436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ
448436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ void ppARMAModeN ( ARMAModeN* am ) {
449436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    vex_printf("[");
450436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    if (am->tag == ARMamN_R) {
451436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       ppHRegARM(am->ARMamN.R.rN);
452436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    } else {
453436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       ppHRegARM(am->ARMamN.RR.rN);
454436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    }
455436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    vex_printf("]");
456436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    if (am->tag == ARMamN_RR) {
457436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       vex_printf(", ");
458436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       ppHRegARM(am->ARMamN.RR.rM);
459436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    }
460436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ }
461436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
462436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
463436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov/* --------- Reg or uimm12<<{0,12} operands --------- */
464436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
465436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovARM64RIA* ARM64RIA_I12 ( UShort imm12, UChar shift ) {
466436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   ARM64RIA* riA           = LibVEX_Alloc(sizeof(ARM64RIA));
467436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   riA->tag                = ARM64riA_I12;
468436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   riA->ARM64riA.I12.imm12 = imm12;
469436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   riA->ARM64riA.I12.shift = shift;
470436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   vassert(imm12 < 4096);
471436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   vassert(shift == 0 || shift == 12);
472436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   return riA;
473436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
474436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovARM64RIA* ARM64RIA_R ( HReg reg ) {
475436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   ARM64RIA* riA       = LibVEX_Alloc(sizeof(ARM64RIA));
476436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   riA->tag            = ARM64riA_R;
477436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   riA->ARM64riA.R.reg = reg;
478436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   return riA;
479436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
480436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
481436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic void ppARM64RIA ( ARM64RIA* riA ) {
482436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   switch (riA->tag) {
483436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case ARM64riA_I12:
484436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         vex_printf("#%u",(UInt)(riA->ARM64riA.I12.imm12
485436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                 << riA->ARM64riA.I12.shift));
486436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         break;
487436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case ARM64riA_R:
488436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         ppHRegARM64(riA->ARM64riA.R.reg);
489436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         break;
490436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      default:
491436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         vassert(0);
492436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   }
493436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
494436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
495436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic void addRegUsage_ARM64RIA ( HRegUsage* u, ARM64RIA* riA ) {
496436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   switch (riA->tag) {
497436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case ARM64riA_I12:
498436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         return;
499436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case ARM64riA_R:
500436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         addHRegUse(u, HRmRead, riA->ARM64riA.R.reg);
501436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         return;
502436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      default:
503436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         vpanic("addRegUsage_ARM64RIA");
504436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   }
505436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
506436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
507436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic void mapRegs_ARM64RIA ( HRegRemap* m, ARM64RIA* riA ) {
508436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   switch (riA->tag) {
509436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case ARM64riA_I12:
510436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         return;
511436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case ARM64riA_R:
512436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         riA->ARM64riA.R.reg = lookupHRegRemap(m, riA->ARM64riA.R.reg);
513436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         return;
514436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      default:
515436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         vpanic("mapRegs_ARM64RIA");
516436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   }
517436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
518436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
519436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
520436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov/* --------- Reg or "bitfield" (logic immediate) operands --------- */
521436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
522436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovARM64RIL* ARM64RIL_I13 ( UChar bitN, UChar immR, UChar immS ) {
523436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   ARM64RIL* riL          = LibVEX_Alloc(sizeof(ARM64RIL));
524436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   riL->tag               = ARM64riL_I13;
525436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   riL->ARM64riL.I13.bitN = bitN;
526436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   riL->ARM64riL.I13.immR = immR;
527436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   riL->ARM64riL.I13.immS = immS;
528436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   vassert(bitN < 2);
529436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   vassert(immR < 64);
530436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   vassert(immS < 64);
531436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   return riL;
532436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
533436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovARM64RIL* ARM64RIL_R ( HReg reg ) {
534436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   ARM64RIL* riL       = LibVEX_Alloc(sizeof(ARM64RIL));
535436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   riL->tag            = ARM64riL_R;
536436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   riL->ARM64riL.R.reg = reg;
537436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   return riL;
538436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
539436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
540436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic void ppARM64RIL ( ARM64RIL* riL ) {
541436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   switch (riL->tag) {
542436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case ARM64riL_I13:
543436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         vex_printf("#nrs(%u,%u,%u)",
544436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     (UInt)riL->ARM64riL.I13.bitN,
545436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     (UInt)riL->ARM64riL.I13.immR,
546436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     (UInt)riL->ARM64riL.I13.immS);
547436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         break;
548436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case ARM64riL_R:
549436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         ppHRegARM64(riL->ARM64riL.R.reg);
550436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         break;
551436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      default:
552436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         vassert(0);
553436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   }
554436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
555436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
556436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic void addRegUsage_ARM64RIL ( HRegUsage* u, ARM64RIL* riL ) {
557436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   switch (riL->tag) {
558436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case ARM64riL_I13:
559436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         return;
560436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case ARM64riL_R:
561436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         addHRegUse(u, HRmRead, riL->ARM64riL.R.reg);
562436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         return;
563436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      default:
564436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         vpanic("addRegUsage_ARM64RIL");
565436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   }
566436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
567436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
568436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic void mapRegs_ARM64RIL ( HRegRemap* m, ARM64RIL* riL ) {
569436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   switch (riL->tag) {
570436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case ARM64riL_I13:
571436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         return;
572436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case ARM64riL_R:
573436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         riL->ARM64riL.R.reg = lookupHRegRemap(m, riL->ARM64riL.R.reg);
574436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         return;
575436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      default:
576436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         vpanic("mapRegs_ARM64RIL");
577436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   }
578436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
579436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
580436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
581436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov/* --------------- Reg or uimm6 operands --------------- */
582436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
583436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovARM64RI6* ARM64RI6_I6 ( UInt imm6 ) {
584436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   ARM64RI6* ri6         = LibVEX_Alloc(sizeof(ARM64RI6));
585436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   ri6->tag              = ARM64ri6_I6;
586436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   ri6->ARM64ri6.I6.imm6 = imm6;
587436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   vassert(imm6 > 0 && imm6 < 64);
588436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   return ri6;
589436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
590436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovARM64RI6* ARM64RI6_R ( HReg reg ) {
591436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   ARM64RI6* ri6       = LibVEX_Alloc(sizeof(ARM64RI6));
592436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   ri6->tag            = ARM64ri6_R;
593436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   ri6->ARM64ri6.R.reg = reg;
594436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   return ri6;
595436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
596436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
597436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic void ppARM64RI6 ( ARM64RI6* ri6 ) {
598436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   switch (ri6->tag) {
599436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case ARM64ri6_I6:
600436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         vex_printf("#%u", ri6->ARM64ri6.I6.imm6);
601436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         break;
602436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case ARM64ri6_R:
603436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         ppHRegARM64(ri6->ARM64ri6.R.reg);
604436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         break;
605436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      default:
606436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         vassert(0);
607436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   }
608436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
609436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
610436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic void addRegUsage_ARM64RI6 ( HRegUsage* u, ARM64RI6* ri6 ) {
611436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   switch (ri6->tag) {
612436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case ARM64ri6_I6:
613436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         return;
614436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case ARM64ri6_R:
615436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         addHRegUse(u, HRmRead, ri6->ARM64ri6.R.reg);
616436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         return;
617436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      default:
618436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         vpanic("addRegUsage_ARM64RI6");
619436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   }
620436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
621436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
622436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic void mapRegs_ARM64RI6 ( HRegRemap* m, ARM64RI6* ri6 ) {
623436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   switch (ri6->tag) {
624436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case ARM64ri6_I6:
625436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         return;
626436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case ARM64ri6_R:
627436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         ri6->ARM64ri6.R.reg = lookupHRegRemap(m, ri6->ARM64ri6.R.reg);
628436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         return;
629436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      default:
630436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         vpanic("mapRegs_ARM64RI6");
631436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   }
632436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
633436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
634436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
635436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ /* -------- Neon Immediate operatnd --------- */
636436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ
637436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ ARMNImm* ARMNImm_TI ( UInt type, UInt imm8 ) {
638436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    ARMNImm* i = LibVEX_Alloc(sizeof(ARMNImm));
639436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    i->type = type;
640436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    i->imm8 = imm8;
641436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    return i;
642436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ }
643436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ
644436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ ULong ARMNImm_to_Imm64 ( ARMNImm* imm ) {
645436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    int i, j;
646436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    ULong y, x = imm->imm8;
647436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    switch (imm->type) {
648436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case 3:
649436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          x = x << 8; /* fallthrough */
650436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case 2:
651436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          x = x << 8; /* fallthrough */
652436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case 1:
653436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          x = x << 8; /* fallthrough */
654436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case 0:
655436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          return (x << 32) | x;
656436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case 5:
657436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case 6:
658436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          if (imm->type == 5)
659436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             x = x << 8;
660436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          else
661436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             x = (x << 8) | x;
662436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          /* fallthrough */
663436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case 4:
664436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          x = (x << 16) | x;
665436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          return (x << 32) | x;
666436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case 8:
667436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          x = (x << 8) | 0xFF;
668436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          /* fallthrough */
669436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case 7:
670436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          x = (x << 8) | 0xFF;
671436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          return (x << 32) | x;
672436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case 9:
673436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          x = 0;
674436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          for (i = 7; i >= 0; i--) {
675436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             y = ((ULong)imm->imm8 >> i) & 1;
676436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             for (j = 0; j < 8; j++) {
677436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                x = (x << 1) | y;
678436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             }
679436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          }
680436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          return x;
681436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case 10:
682436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          x |= (x & 0x80) << 5;
683436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          x |= (~x & 0x40) << 5;
684436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          x &= 0x187F; /* 0001 1000 0111 1111 */
685436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          x |= (x & 0x40) << 4;
686436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          x |= (x & 0x40) << 3;
687436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          x |= (x & 0x40) << 2;
688436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          x |= (x & 0x40) << 1;
689436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          x = x << 19;
690436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          x = (x << 32) | x;
691436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          return x;
692436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       default:
693436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          vpanic("ARMNImm_to_Imm64");
694436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    }
695436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ }
696436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ
697436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ ARMNImm* Imm64_to_ARMNImm ( ULong x ) {
698436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    ARMNImm tmp;
699436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    if ((x & 0xFFFFFFFF) == (x >> 32)) {
700436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       if ((x & 0xFFFFFF00) == 0)
701436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          return ARMNImm_TI(0, x & 0xFF);
702436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       if ((x & 0xFFFF00FF) == 0)
703436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          return ARMNImm_TI(1, (x >> 8) & 0xFF);
704436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       if ((x & 0xFF00FFFF) == 0)
705436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          return ARMNImm_TI(2, (x >> 16) & 0xFF);
706436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       if ((x & 0x00FFFFFF) == 0)
707436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          return ARMNImm_TI(3, (x >> 24) & 0xFF);
708436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       if ((x & 0xFFFF00FF) == 0xFF)
709436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          return ARMNImm_TI(7, (x >> 8) & 0xFF);
710436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       if ((x & 0xFF00FFFF) == 0xFFFF)
711436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          return ARMNImm_TI(8, (x >> 16) & 0xFF);
712436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       if ((x & 0xFFFF) == ((x >> 16) & 0xFFFF)) {
713436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          if ((x & 0xFF00) == 0)
714436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             return ARMNImm_TI(4, x & 0xFF);
715436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          if ((x & 0x00FF) == 0)
716436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             return ARMNImm_TI(5, (x >> 8) & 0xFF);
717436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          if ((x & 0xFF) == ((x >> 8) & 0xFF))
718436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             return ARMNImm_TI(6, x & 0xFF);
719436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       }
720436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       if ((x & 0x7FFFF) == 0) {
721436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          tmp.type = 10;
722436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          tmp.imm8 = ((x >> 19) & 0x7F) | ((x >> 24) & 0x80);
723436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          if (ARMNImm_to_Imm64(&tmp) == x)
724436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             return ARMNImm_TI(tmp.type, tmp.imm8);
725436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       }
726436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    } else {
727436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       /* This can only be type 9. */
728436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       tmp.imm8 = (((x >> 56) & 1) << 7)
729436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                | (((x >> 48) & 1) << 6)
730436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                | (((x >> 40) & 1) << 5)
731436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                | (((x >> 32) & 1) << 4)
732436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                | (((x >> 24) & 1) << 3)
733436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                | (((x >> 16) & 1) << 2)
734436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                | (((x >>  8) & 1) << 1)
735436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                | (((x >>  0) & 1) << 0);
736436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       tmp.type = 9;
737436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       if (ARMNImm_to_Imm64 (&tmp) == x)
738436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          return ARMNImm_TI(tmp.type, tmp.imm8);
739436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    }
740436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    return NULL;
741436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ }
742436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ
743436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ void ppARMNImm (ARMNImm* i) {
744436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    ULong x = ARMNImm_to_Imm64(i);
745436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    vex_printf("0x%llX%llX", x, x);
746436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ }
747436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ
748436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ /* -- Register or scalar operand --- */
749436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ
750436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ ARMNRS* mkARMNRS(ARMNRS_tag tag, HReg reg, UInt index)
751436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ {
752436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    ARMNRS *p = LibVEX_Alloc(sizeof(ARMNRS));
753436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    p->tag = tag;
754436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    p->reg = reg;
755436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    p->index = index;
756436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    return p;
757436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ }
758436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ
759436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ void ppARMNRS(ARMNRS *p)
760436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ {
761436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    ppHRegARM(p->reg);
762436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    if (p->tag == ARMNRS_Scalar) {
763436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       vex_printf("[%d]", p->index);
764436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    }
765436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ }
766436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
767436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov/* --------- Instructions. --------- */
768436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
769436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar* showARM64LogicOp ( ARM64LogicOp op ) {
770436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   switch (op) {
771436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case ARM64lo_AND: return "and";
772436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case ARM64lo_OR:  return "orr";
773436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case ARM64lo_XOR: return "eor";
774436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      default: vpanic("showARM64LogicOp");
775436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   }
776436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
777436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
778436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar* showARM64ShiftOp ( ARM64ShiftOp op ) {
779436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   switch (op) {
780436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case ARM64sh_SHL: return "lsl";
781436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case ARM64sh_SHR: return "lsr";
782436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case ARM64sh_SAR: return "asr";
783436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      default: vpanic("showARM64ShiftOp");
784436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   }
785436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
786436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
787436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar* showARM64UnaryOp ( ARM64UnaryOp op ) {
788436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   switch (op) {
789436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case ARM64un_NEG: return "neg";
790436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case ARM64un_NOT: return "not";
791436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case ARM64un_CLZ: return "clz";
792436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      default: vpanic("showARM64UnaryOp");
793436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   }
794436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
795436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
796436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar* showARM64MulOp ( ARM64MulOp op ) {
797436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   switch (op) {
798436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case ARM64mul_PLAIN: return "mul  ";
799436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case ARM64mul_ZX:    return "umulh";
800436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case ARM64mul_SX:    return "smulh";
801436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      default: vpanic("showARM64MulOp");
802436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   }
803436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
804436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
805436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic void characteriseARM64CvtOp ( /*OUT*/HChar* syn,
806436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     /*OUT*/UInt* fszB, /*OUT*/UInt* iszB,
807436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     ARM64CvtOp op ) {
808436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   switch (op) {
809436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case ARM64cvt_F32_I32S:
810436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         *syn = 's'; *fszB = 4; *iszB = 4; break;
811436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case ARM64cvt_F64_I32S:
812436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         *syn = 's'; *fszB = 8; *iszB = 4; break;
813436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case ARM64cvt_F32_I64S:
814436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         *syn = 's'; *fszB = 4; *iszB = 8; break;
815436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case ARM64cvt_F64_I64S:
816436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         *syn = 's'; *fszB = 8; *iszB = 8; break;
817436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case ARM64cvt_F32_I32U:
818436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         *syn = 'u'; *fszB = 4; *iszB = 4; break;
819436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case ARM64cvt_F64_I32U:
820436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         *syn = 'u'; *fszB = 8; *iszB = 4; break;
821436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case ARM64cvt_F32_I64U:
822436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         *syn = 'u'; *fszB = 4; *iszB = 8; break;
823436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case ARM64cvt_F64_I64U:
824436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         *syn = 'u'; *fszB = 8; *iszB = 8; break;
825436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      default:
826436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         vpanic("characteriseARM64CvtOp");
827436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  }
828436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
829436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
830436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar* showARM64FpBinOp ( ARM64FpBinOp op ) {
831436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   switch (op) {
832436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case ARM64fpb_ADD: return "add";
833436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case ARM64fpb_SUB: return "sub";
834436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case ARM64fpb_MUL: return "mul";
835436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case ARM64fpb_DIV: return "div";
836436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      default: vpanic("showARM64FpBinOp");
837436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   }
838436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
839436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
840436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar* showARM64FpUnaryOp ( ARM64FpUnaryOp op ) {
841436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   switch (op) {
842436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case ARM64fpu_NEG:  return "neg  ";
843436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case ARM64fpu_ABS:  return "abs  ";
844436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case ARM64fpu_SQRT: return "sqrt ";
845436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case ARM64fpu_RINT: return "rinti";
846436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      default: vpanic("showARM64FpUnaryOp");
847436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   }
848436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
849436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
850436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic void showARM64VecBinOp(/*OUT*/const HChar** nm,
851436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                              /*OUT*/const HChar** ar, ARM64VecBinOp op ) {
852436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   switch (op) {
853eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov      case ARM64vecb_ADD64x2:   *nm = "add ";  *ar = "2d";  return;
854eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov      case ARM64vecb_ADD32x4:   *nm = "add ";  *ar = "4s";  return;
855eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov      case ARM64vecb_ADD16x8:   *nm = "add ";  *ar = "8h";  return;
856eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov      case ARM64vecb_ADD8x16:   *nm = "add ";  *ar = "16b"; return;
857eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov      case ARM64vecb_SUB64x2:   *nm = "sub ";  *ar = "2d";  return;
858eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov      case ARM64vecb_SUB32x4:   *nm = "sub ";  *ar = "4s";  return;
859eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov      case ARM64vecb_SUB16x8:   *nm = "sub ";  *ar = "8h";  return;
860eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov      case ARM64vecb_SUB8x16:   *nm = "sub ";  *ar = "16b"; return;
861eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov      case ARM64vecb_MUL32x4:   *nm = "mul ";  *ar = "4s";  return;
862eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov      case ARM64vecb_MUL16x8:   *nm = "mul ";  *ar = "8h";  return;
863eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov      case ARM64vecb_MUL8x16:   *nm = "mul ";  *ar = "16b"; return;
864eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov      case ARM64vecb_FADD64x2:  *nm = "fadd";  *ar = "2d";  return;
865eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov      case ARM64vecb_FSUB64x2:  *nm = "fsub";  *ar = "2d";  return;
866eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov      case ARM64vecb_FMUL64x2:  *nm = "fmul";  *ar = "2d";  return;
867eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov      case ARM64vecb_FDIV64x2:  *nm = "fdiv";  *ar = "2d";  return;
868eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov      case ARM64vecb_FADD32x4:  *nm = "fadd";  *ar = "4s";  return;
869eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov      case ARM64vecb_FSUB32x4:  *nm = "fsub";  *ar = "4s";  return;
870eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov      case ARM64vecb_FMUL32x4:  *nm = "fmul";  *ar = "4s";  return;
871eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov      case ARM64vecb_FDIV32x4:  *nm = "fdiv";  *ar = "4s";  return;
872eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov      case ARM64vecb_UMAX32x4:  *nm = "umax";  *ar = "4s";  return;
873eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov      case ARM64vecb_UMAX16x8:  *nm = "umax";  *ar = "8h";  return;
874eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov      case ARM64vecb_UMAX8x16:  *nm = "umax";  *ar = "16b"; return;
875eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov      case ARM64vecb_UMIN32x4:  *nm = "umin";  *ar = "4s";  return;
876eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov      case ARM64vecb_UMIN16x8:  *nm = "umin";  *ar = "8h";  return;
877eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov      case ARM64vecb_UMIN8x16:  *nm = "umin";  *ar = "16b"; return;
8780a8046eb0993fb7e155b03cc5ef3323fca3467c0Dmitriy Ivanov      case ARM64vecb_UMULL32x2: *nm = "umull"; *ar = "2d"; return;
8790a8046eb0993fb7e155b03cc5ef3323fca3467c0Dmitriy Ivanov      case ARM64vecb_UMULL16x4: *nm = "umull"; *ar = "4s"; return;
8800a8046eb0993fb7e155b03cc5ef3323fca3467c0Dmitriy Ivanov      case ARM64vecb_UMULL8x8:  *nm = "umull"; *ar = "8b"; return;
881eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov      case ARM64vecb_SMAX32x4:  *nm = "smax";  *ar = "4s";  return;
882eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov      case ARM64vecb_SMAX16x8:  *nm = "smax";  *ar = "8h";  return;
883eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov      case ARM64vecb_SMAX8x16:  *nm = "smax";  *ar = "16b"; return;
884eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov      case ARM64vecb_SMIN32x4:  *nm = "smin";  *ar = "4s";  return;
885eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov      case ARM64vecb_SMIN16x8:  *nm = "smin";  *ar = "8h";  return;
886eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov      case ARM64vecb_SMIN8x16:  *nm = "smin";  *ar = "16b"; return;
887eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov      case ARM64vecb_AND:       *nm = "and ";  *ar = "all"; return;
888eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov      case ARM64vecb_ORR:       *nm = "orr ";  *ar = "all"; return;
889eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov      case ARM64vecb_XOR:       *nm = "eor ";  *ar = "all"; return;
890eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov      case ARM64vecb_CMEQ64x2:  *nm = "cmeq";  *ar = "2d";  return;
891eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov      case ARM64vecb_CMEQ32x4:  *nm = "cmeq";  *ar = "4s";  return;
892eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov      case ARM64vecb_CMEQ16x8:  *nm = "cmeq";  *ar = "8h";  return;
893eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov      case ARM64vecb_CMEQ8x16:  *nm = "cmeq";  *ar = "16b"; return;
894eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov      case ARM64vecb_CMHI64x2:  *nm = "cmhi";  *ar = "2d";  return;
895eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov      case ARM64vecb_CMHI32x4:  *nm = "cmhi";  *ar = "4s";  return;
896eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov      case ARM64vecb_CMHI16x8:  *nm = "cmhi";  *ar = "8h";  return;
897eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov      case ARM64vecb_CMHI8x16:  *nm = "cmhi";  *ar = "16b"; return;
898eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov      case ARM64vecb_CMGT64x2:  *nm = "cmgt";  *ar = "2d";  return;
899eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov      case ARM64vecb_CMGT32x4:  *nm = "cmgt";  *ar = "4s";  return;
900eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov      case ARM64vecb_CMGT16x8:  *nm = "cmgt";  *ar = "8h";  return;
901eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov      case ARM64vecb_CMGT8x16:  *nm = "cmgt";  *ar = "16b"; return;
902eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov      case ARM64vecb_FCMEQ64x2: *nm = "fcmeq"; *ar = "2d"; return;
903eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov      case ARM64vecb_FCMEQ32x4: *nm = "fcmeq"; *ar = "4s"; return;
904eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov      case ARM64vecb_FCMGE64x2: *nm = "fcmge"; *ar = "2d"; return;
905eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov      case ARM64vecb_FCMGE32x4: *nm = "fcmge"; *ar = "4s"; return;
906eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov      case ARM64vecb_FCMGT64x2: *nm = "fcmgt"; *ar = "2d"; return;
907eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov      case ARM64vecb_FCMGT32x4: *nm = "fcmgt"; *ar = "4s"; return;
908eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov      case ARM64vecb_TBL1:      *nm = "tbl ";  *ar = "16b"; return;
909436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      default: vpanic("showARM64VecBinOp");
910436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   }
911436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
912436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
913436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic void showARM64VecUnaryOp(/*OUT*/const HChar** nm,
914436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                /*OUT*/const HChar** ar, ARM64VecUnaryOp op )
915436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
916436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   switch (op) {
917051d3b5d6376aa10a65793c3c2267d6ab233b896Dmitriy Ivanov      case ARM64vecu_FNEG64x2:   *nm = "fneg   "; *ar = "2d";  return;
918051d3b5d6376aa10a65793c3c2267d6ab233b896Dmitriy Ivanov      case ARM64vecu_FNEG32x4:   *nm = "fneg   "; *ar = "4s";  return;
919051d3b5d6376aa10a65793c3c2267d6ab233b896Dmitriy Ivanov      case ARM64vecu_FABS64x2:   *nm = "fabs   "; *ar = "2d";  return;
920051d3b5d6376aa10a65793c3c2267d6ab233b896Dmitriy Ivanov      case ARM64vecu_FABS32x4:   *nm = "fabs   "; *ar = "4s";  return;
9210a8046eb0993fb7e155b03cc5ef3323fca3467c0Dmitriy Ivanov      case ARM64vecu_VMOVL8U:    *nm = "vmovl.u8"; *ar = "all"; return;
9220a8046eb0993fb7e155b03cc5ef3323fca3467c0Dmitriy Ivanov      case ARM64vecu_VMOVL16U:   *nm = "vmovl.u16"; *ar = "all"; return;
9230a8046eb0993fb7e155b03cc5ef3323fca3467c0Dmitriy Ivanov      case ARM64vecu_VMOVL32U:   *nm = "vmovl.u32"; *ar = "all"; return;
9240a8046eb0993fb7e155b03cc5ef3323fca3467c0Dmitriy Ivanov      case ARM64vecu_VMOVL8S:    *nm = "vmovl.s8"; *ar = "all"; return;
9250a8046eb0993fb7e155b03cc5ef3323fca3467c0Dmitriy Ivanov      case ARM64vecu_VMOVL16S:   *nm = "vmovl.s16"; *ar = "all"; return;
9260a8046eb0993fb7e155b03cc5ef3323fca3467c0Dmitriy Ivanov      case ARM64vecu_VMOVL32S:   *nm = "vmovl.s32"; *ar = "all"; return;
927051d3b5d6376aa10a65793c3c2267d6ab233b896Dmitriy Ivanov      case ARM64vecu_NOT:        *nm = "not    "; *ar = "all"; return;
928051d3b5d6376aa10a65793c3c2267d6ab233b896Dmitriy Ivanov      case ARM64vecu_CNT:        *nm = "cnt    "; *ar = "16b"; return;
929051d3b5d6376aa10a65793c3c2267d6ab233b896Dmitriy Ivanov      case ARM64vecu_UADDLV8x16: *nm = "uaddlv "; *ar = "16b"; return;
930051d3b5d6376aa10a65793c3c2267d6ab233b896Dmitriy Ivanov      case ARM64vecu_UADDLV16x8: *nm = "uaddlv "; *ar = "8h"; return;
931051d3b5d6376aa10a65793c3c2267d6ab233b896Dmitriy Ivanov      case ARM64vecu_UADDLV32x4: *nm = "uaddlv "; *ar = "4s"; return;
932051d3b5d6376aa10a65793c3c2267d6ab233b896Dmitriy Ivanov      case ARM64vecu_SADDLV8x16: *nm = "saddlv "; *ar = "16b"; return;
933051d3b5d6376aa10a65793c3c2267d6ab233b896Dmitriy Ivanov      case ARM64vecu_SADDLV16x8: *nm = "saddlv "; *ar = "8h"; return;
934051d3b5d6376aa10a65793c3c2267d6ab233b896Dmitriy Ivanov      case ARM64vecu_SADDLV32x4: *nm = "saddlv "; *ar = "4s"; return;
935436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      default: vpanic("showARM64VecUnaryOp");
936436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   }
937436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
938436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
939436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic void showARM64VecShiftOp(/*OUT*/const HChar** nm,
940436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                /*OUT*/const HChar** ar,
941436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                ARM64VecShiftOp op )
942436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
943436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   switch (op) {
944436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case ARM64vecsh_USHR64x2: *nm = "ushr  "; *ar = "2d";  return;
945eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov      case ARM64vecsh_USHR32x4: *nm = "ushr  "; *ar = "4s";  return;
9462ca80a6a6fc069acdb73186e8e578dbf8f46af80Dmitriy Ivanov      case ARM64vecsh_USHR16x8: *nm = "ushr  "; *ar = "8h";  return;
947eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov      case ARM64vecsh_USHR8x16: *nm = "ushr  "; *ar = "16b"; return;
948436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case ARM64vecsh_SSHR64x2: *nm = "sshr  "; *ar = "2d";  return;
949eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov      case ARM64vecsh_SSHR32x4: *nm = "sshr  "; *ar = "4s";  return;
950eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov      case ARM64vecsh_SSHR16x8: *nm = "sshr  "; *ar = "8h";  return;
951eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov      case ARM64vecsh_SSHR8x16: *nm = "sshr  "; *ar = "16b"; return;
952eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov      case ARM64vecsh_SHL64x2:  *nm = "shl   "; *ar = "2d";  return;
953436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case ARM64vecsh_SHL32x4:  *nm = "shl   "; *ar = "4s";  return;
954eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov      case ARM64vecsh_SHL16x8:  *nm = "shl   "; *ar = "8h";  return;
955eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov      case ARM64vecsh_SHL8x16:  *nm = "shl   "; *ar = "16b"; return;
956436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      default: vpanic("showARM64VecShiftImmOp");
957436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   }
958436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
959436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
960436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ const HChar* showARMNeonBinOp ( ARMNeonBinOp op ) {
961436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    switch (op) {
962436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMneon_VAND: return "vand";
963436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMneon_VORR: return "vorr";
964436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMneon_VXOR: return "veor";
965436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMneon_VADD: return "vadd";
966436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMneon_VRHADDS: return "vrhadd";
967436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMneon_VRHADDU: return "vrhadd";
968436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMneon_VADDFP: return "vadd";
969436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMneon_VPADDFP: return "vpadd";
970436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMneon_VABDFP: return "vabd";
971436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMneon_VSUB: return "vsub";
972436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMneon_VSUBFP: return "vsub";
973436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMneon_VMINU: return "vmin";
974436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMneon_VMINS: return "vmin";
975436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMneon_VMINF: return "vmin";
976436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMneon_VMAXU: return "vmax";
977436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMneon_VMAXS: return "vmax";
978436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMneon_VMAXF: return "vmax";
979436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMneon_VQADDU: return "vqadd";
980436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMneon_VQADDS: return "vqadd";
981436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMneon_VQSUBU: return "vqsub";
982436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMneon_VQSUBS: return "vqsub";
983436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMneon_VCGTU:  return "vcgt";
984436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMneon_VCGTS:  return "vcgt";
985436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMneon_VCGTF:  return "vcgt";
986436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMneon_VCGEF:  return "vcgt";
987436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMneon_VCGEU:  return "vcge";
988436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMneon_VCGES:  return "vcge";
989436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMneon_VCEQ:  return "vceq";
990436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMneon_VCEQF:  return "vceq";
991436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMneon_VPADD:   return "vpadd";
992436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMneon_VPMINU:   return "vpmin";
993436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMneon_VPMINS:   return "vpmin";
994436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMneon_VPMINF:   return "vpmin";
995436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMneon_VPMAXU:   return "vpmax";
996436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMneon_VPMAXS:   return "vpmax";
997436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMneon_VPMAXF:   return "vpmax";
998436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMneon_VEXT:   return "vext";
999436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMneon_VMUL:   return "vmuli";
1000436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMneon_VMULLU:   return "vmull";
1001436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMneon_VMULLS:   return "vmull";
1002436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMneon_VMULP:  return "vmul";
1003436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMneon_VMULFP:  return "vmul";
1004436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMneon_VMULLP:  return "vmul";
1005436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMneon_VQDMULH: return "vqdmulh";
1006436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMneon_VQRDMULH: return "vqrdmulh";
1007436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMneon_VQDMULL: return "vqdmull";
1008436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMneon_VTBL: return "vtbl";
1009436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMneon_VRECPS: return "vrecps";
1010436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMneon_VRSQRTS: return "vrecps";
1011436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       /* ... */
1012436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       default: vpanic("showARMNeonBinOp");
1013436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    }
1014436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ }
1015436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ
1016436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ const HChar* showARMNeonBinOpDataType ( ARMNeonBinOp op ) {
1017436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    switch (op) {
1018436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMneon_VAND:
1019436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMneon_VORR:
1020436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMneon_VXOR:
1021436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          return "";
1022436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMneon_VADD:
1023436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMneon_VSUB:
1024436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMneon_VEXT:
1025436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMneon_VMUL:
1026436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMneon_VPADD:
1027436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMneon_VTBL:
1028436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMneon_VCEQ:
1029436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          return ".i";
1030436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMneon_VRHADDU:
1031436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMneon_VMINU:
1032436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMneon_VMAXU:
1033436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMneon_VQADDU:
1034436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMneon_VQSUBU:
1035436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMneon_VCGTU:
1036436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMneon_VCGEU:
1037436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMneon_VMULLU:
1038436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMneon_VPMINU:
1039436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMneon_VPMAXU:
1040436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          return ".u";
1041436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMneon_VRHADDS:
1042436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMneon_VMINS:
1043436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMneon_VMAXS:
1044436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMneon_VQADDS:
1045436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMneon_VQSUBS:
1046436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMneon_VCGTS:
1047436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMneon_VCGES:
1048436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMneon_VQDMULL:
1049436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMneon_VMULLS:
1050436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMneon_VPMINS:
1051436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMneon_VPMAXS:
1052436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMneon_VQDMULH:
1053436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMneon_VQRDMULH:
1054436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          return ".s";
1055436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMneon_VMULP:
1056436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMneon_VMULLP:
1057436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          return ".p";
1058436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMneon_VADDFP:
1059436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMneon_VABDFP:
1060436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMneon_VPADDFP:
1061436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMneon_VSUBFP:
1062436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMneon_VMULFP:
1063436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMneon_VMINF:
1064436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMneon_VMAXF:
1065436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMneon_VPMINF:
1066436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMneon_VPMAXF:
1067436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMneon_VCGTF:
1068436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMneon_VCGEF:
1069436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMneon_VCEQF:
1070436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMneon_VRECPS:
1071436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMneon_VRSQRTS:
1072436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          return ".f";
1073436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       /* ... */
1074436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       default: vpanic("showARMNeonBinOpDataType");
1075436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    }
1076436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ }
1077436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ
1078436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ const HChar* showARMNeonUnOp ( ARMNeonUnOp op ) {
1079436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    switch (op) {
1080436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMneon_COPY: return "vmov";
1081436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMneon_COPYLS: return "vmov";
1082436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMneon_COPYLU: return "vmov";
1083436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMneon_COPYN: return "vmov";
1084436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMneon_COPYQNSS: return "vqmovn";
1085436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMneon_COPYQNUS: return "vqmovun";
1086436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMneon_COPYQNUU: return "vqmovn";
1087436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMneon_NOT: return "vmvn";
1088436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMneon_EQZ: return "vceq";
1089436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMneon_CNT: return "vcnt";
1090436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMneon_CLS: return "vcls";
1091436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMneon_CLZ: return "vclz";
1092436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMneon_DUP: return "vdup";
1093436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMneon_PADDLS: return "vpaddl";
1094436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMneon_PADDLU: return "vpaddl";
1095436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMneon_VQSHLNSS: return "vqshl";
1096436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMneon_VQSHLNUU: return "vqshl";
1097436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMneon_VQSHLNUS: return "vqshlu";
1098436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMneon_REV16: return "vrev16";
1099436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMneon_REV32: return "vrev32";
1100436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMneon_REV64: return "vrev64";
1101436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMneon_VCVTFtoU: return "vcvt";
1102436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMneon_VCVTFtoS: return "vcvt";
1103436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMneon_VCVTUtoF: return "vcvt";
1104436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMneon_VCVTStoF: return "vcvt";
1105436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMneon_VCVTFtoFixedU: return "vcvt";
1106436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMneon_VCVTFtoFixedS: return "vcvt";
1107436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMneon_VCVTFixedUtoF: return "vcvt";
1108436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMneon_VCVTFixedStoF: return "vcvt";
1109436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMneon_VCVTF32toF16: return "vcvt";
1110436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMneon_VCVTF16toF32: return "vcvt";
1111436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMneon_VRECIP: return "vrecip";
1112436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMneon_VRECIPF: return "vrecipf";
1113436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMneon_VNEGF: return "vneg";
1114436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMneon_ABS: return "vabs";
1115436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMneon_VABSFP: return "vabsfp";
1116436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMneon_VRSQRTEFP: return "vrsqrtefp";
1117436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMneon_VRSQRTE: return "vrsqrte";
1118436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       /* ... */
1119436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       default: vpanic("showARMNeonUnOp");
1120436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    }
1121436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ }
1122436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ
1123436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ const HChar* showARMNeonUnOpDataType ( ARMNeonUnOp op ) {
1124436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    switch (op) {
1125436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMneon_COPY:
1126436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMneon_NOT:
1127436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          return "";
1128436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMneon_COPYN:
1129436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMneon_EQZ:
1130436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMneon_CNT:
1131436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMneon_DUP:
1132436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMneon_REV16:
1133436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMneon_REV32:
1134436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMneon_REV64:
1135436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          return ".i";
1136436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMneon_COPYLU:
1137436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMneon_PADDLU:
1138436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMneon_COPYQNUU:
1139436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMneon_VQSHLNUU:
1140436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMneon_VRECIP:
1141436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMneon_VRSQRTE:
1142436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          return ".u";
1143436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMneon_CLS:
1144436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMneon_CLZ:
1145436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMneon_COPYLS:
1146436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMneon_PADDLS:
1147436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMneon_COPYQNSS:
1148436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMneon_COPYQNUS:
1149436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMneon_VQSHLNSS:
1150436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMneon_VQSHLNUS:
1151436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMneon_ABS:
1152436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          return ".s";
1153436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMneon_VRECIPF:
1154436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMneon_VNEGF:
1155436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMneon_VABSFP:
1156436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMneon_VRSQRTEFP:
1157436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          return ".f";
1158436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMneon_VCVTFtoU: return ".u32.f32";
1159436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMneon_VCVTFtoS: return ".s32.f32";
1160436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMneon_VCVTUtoF: return ".f32.u32";
1161436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMneon_VCVTStoF: return ".f32.s32";
1162436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMneon_VCVTF16toF32: return ".f32.f16";
1163436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMneon_VCVTF32toF16: return ".f16.f32";
1164436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMneon_VCVTFtoFixedU: return ".u32.f32";
1165436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMneon_VCVTFtoFixedS: return ".s32.f32";
1166436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMneon_VCVTFixedUtoF: return ".f32.u32";
1167436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMneon_VCVTFixedStoF: return ".f32.s32";
1168436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       /* ... */
1169436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       default: vpanic("showARMNeonUnOpDataType");
1170436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    }
1171436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ }
1172436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ
1173436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ const HChar* showARMNeonUnOpS ( ARMNeonUnOpS op ) {
1174436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    switch (op) {
1175436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMneon_SETELEM: return "vmov";
1176436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMneon_GETELEMU: return "vmov";
1177436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMneon_GETELEMS: return "vmov";
1178436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMneon_VDUP: return "vdup";
1179436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       /* ... */
1180436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       default: vpanic("showARMNeonUnarySOp");
1181436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    }
1182436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ }
1183436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ
1184436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ const HChar* showARMNeonUnOpSDataType ( ARMNeonUnOpS op ) {
1185436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    switch (op) {
1186436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMneon_SETELEM:
1187436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMneon_VDUP:
1188436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          return ".i";
1189436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMneon_GETELEMS:
1190436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          return ".s";
1191436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMneon_GETELEMU:
1192436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          return ".u";
1193436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       /* ... */
1194436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       default: vpanic("showARMNeonUnarySOp");
1195436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    }
1196436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ }
1197436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ
1198436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ const HChar* showARMNeonShiftOp ( ARMNeonShiftOp op ) {
1199436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    switch (op) {
1200436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMneon_VSHL: return "vshl";
1201436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMneon_VSAL: return "vshl";
1202436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMneon_VQSHL: return "vqshl";
1203436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMneon_VQSAL: return "vqshl";
1204436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       /* ... */
1205436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       default: vpanic("showARMNeonShiftOp");
1206436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    }
1207436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ }
1208436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ
1209436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ const HChar* showARMNeonShiftOpDataType ( ARMNeonShiftOp op ) {
1210436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    switch (op) {
1211436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMneon_VSHL:
1212436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMneon_VQSHL:
1213436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          return ".u";
1214436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMneon_VSAL:
1215436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMneon_VQSAL:
1216436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          return ".s";
1217436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       /* ... */
1218436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       default: vpanic("showARMNeonShiftOpDataType");
1219436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    }
1220436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ }
1221436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ
1222436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ const HChar* showARMNeonDualOp ( ARMNeonDualOp op ) {
1223436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    switch (op) {
1224436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMneon_TRN: return "vtrn";
1225436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMneon_ZIP: return "vzip";
1226436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMneon_UZP: return "vuzp";
1227436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       /* ... */
1228436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       default: vpanic("showARMNeonDualOp");
1229436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    }
1230436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ }
1231436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ
1232436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ const HChar* showARMNeonDualOpDataType ( ARMNeonDualOp op ) {
1233436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    switch (op) {
1234436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMneon_TRN:
1235436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMneon_ZIP:
1236436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMneon_UZP:
1237436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          return "i";
1238436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       /* ... */
1239436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       default: vpanic("showARMNeonDualOp");
1240436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    }
1241436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ }
1242436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ
1243436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ static const HChar* showARMNeonDataSize_wrk ( UInt size )
1244436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ {
1245436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    switch (size) {
1246436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case 0: return "8";
1247436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case 1: return "16";
1248436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case 2: return "32";
1249436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case 3: return "64";
1250436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       default: vpanic("showARMNeonDataSize");
1251436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    }
1252436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ }
1253436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ
1254436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ static const HChar* showARMNeonDataSize ( ARMInstr* i )
1255436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ {
1256436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    switch (i->tag) {
1257436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMin_NBinary:
1258436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          if (i->ARMin.NBinary.op == ARMneon_VEXT)
1259436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             return "8";
1260436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          if (i->ARMin.NBinary.op == ARMneon_VAND ||
1261436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ              i->ARMin.NBinary.op == ARMneon_VORR ||
1262436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ              i->ARMin.NBinary.op == ARMneon_VXOR)
1263436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             return "";
1264436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          return showARMNeonDataSize_wrk(i->ARMin.NBinary.size);
1265436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMin_NUnary:
1266436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          if (i->ARMin.NUnary.op == ARMneon_COPY ||
1267436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ              i->ARMin.NUnary.op == ARMneon_NOT ||
1268436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ              i->ARMin.NUnary.op == ARMneon_VCVTF32toF16||
1269436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ              i->ARMin.NUnary.op == ARMneon_VCVTF16toF32||
1270436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ              i->ARMin.NUnary.op == ARMneon_VCVTFtoFixedS ||
1271436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ              i->ARMin.NUnary.op == ARMneon_VCVTFtoFixedU ||
1272436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ              i->ARMin.NUnary.op == ARMneon_VCVTFixedStoF ||
1273436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ              i->ARMin.NUnary.op == ARMneon_VCVTFixedUtoF ||
1274436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ              i->ARMin.NUnary.op == ARMneon_VCVTFtoS ||
1275436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ              i->ARMin.NUnary.op == ARMneon_VCVTFtoU ||
1276436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ              i->ARMin.NUnary.op == ARMneon_VCVTStoF ||
1277436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ              i->ARMin.NUnary.op == ARMneon_VCVTUtoF)
1278436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             return "";
1279436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          if (i->ARMin.NUnary.op == ARMneon_VQSHLNSS ||
1280436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ              i->ARMin.NUnary.op == ARMneon_VQSHLNUU ||
1281436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ              i->ARMin.NUnary.op == ARMneon_VQSHLNUS) {
1282436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             UInt size;
1283436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             size = i->ARMin.NUnary.size;
1284436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             if (size & 0x40)
1285436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                return "64";
1286436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             if (size & 0x20)
1287436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                return "32";
1288436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             if (size & 0x10)
1289436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                return "16";
1290436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             if (size & 0x08)
1291436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                return "8";
1292436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             vpanic("showARMNeonDataSize");
1293436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          }
1294436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          return showARMNeonDataSize_wrk(i->ARMin.NUnary.size);
1295436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMin_NUnaryS:
1296436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          if (i->ARMin.NUnaryS.op == ARMneon_VDUP) {
1297436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             int size;
1298436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             size = i->ARMin.NUnaryS.size;
1299436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             if ((size & 1) == 1)
1300436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                return "8";
1301436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             if ((size & 3) == 2)
1302436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                return "16";
1303436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             if ((size & 7) == 4)
1304436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                return "32";
1305436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             vpanic("showARMNeonDataSize");
1306436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          }
1307436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          return showARMNeonDataSize_wrk(i->ARMin.NUnaryS.size);
1308436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMin_NShift:
1309436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          return showARMNeonDataSize_wrk(i->ARMin.NShift.size);
1310436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMin_NDual:
1311436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          return showARMNeonDataSize_wrk(i->ARMin.NDual.size);
1312436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       default:
1313436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          vpanic("showARMNeonDataSize");
1314436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    }
1315436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ }
1316436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
1317436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovARM64Instr* ARM64Instr_Arith ( HReg dst,
1318436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                               HReg argL, ARM64RIA* argR, Bool isAdd ) {
1319436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   ARM64Instr* i = LibVEX_Alloc(sizeof(ARM64Instr));
1320436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   i->tag                 = ARM64in_Arith;
1321436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   i->ARM64in.Arith.dst   = dst;
1322436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   i->ARM64in.Arith.argL  = argL;
1323436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   i->ARM64in.Arith.argR  = argR;
1324436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   i->ARM64in.Arith.isAdd = isAdd;
1325436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   return i;
1326436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
1327436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovARM64Instr* ARM64Instr_Cmp ( HReg argL, ARM64RIA* argR, Bool is64 ) {
1328436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   ARM64Instr* i = LibVEX_Alloc(sizeof(ARM64Instr));
1329436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   i->tag              = ARM64in_Cmp;
1330436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   i->ARM64in.Cmp.argL = argL;
1331436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   i->ARM64in.Cmp.argR = argR;
1332436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   i->ARM64in.Cmp.is64 = is64;
1333436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   return i;
1334436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
1335436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovARM64Instr* ARM64Instr_Logic ( HReg dst,
1336436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                               HReg argL, ARM64RIL* argR, ARM64LogicOp op ) {
1337436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   ARM64Instr* i = LibVEX_Alloc(sizeof(ARM64Instr));
1338436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   i->tag                 = ARM64in_Logic;
1339436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   i->ARM64in.Logic.dst   = dst;
1340436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   i->ARM64in.Logic.argL  = argL;
1341436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   i->ARM64in.Logic.argR  = argR;
1342436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   i->ARM64in.Logic.op    = op;
1343436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   return i;
1344436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
1345436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovARM64Instr* ARM64Instr_Test ( HReg argL, ARM64RIL* argR ) {
1346436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   ARM64Instr* i = LibVEX_Alloc(sizeof(ARM64Instr));
1347436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   i->tag               = ARM64in_Test;
1348436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   i->ARM64in.Test.argL = argL;
1349436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   i->ARM64in.Test.argR = argR;
1350436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   return i;
1351436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
1352436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovARM64Instr* ARM64Instr_Shift ( HReg dst,
1353436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                               HReg argL, ARM64RI6* argR, ARM64ShiftOp op ) {
1354436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   ARM64Instr* i = LibVEX_Alloc(sizeof(ARM64Instr));
1355436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   i->tag                = ARM64in_Shift;
1356436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   i->ARM64in.Shift.dst  = dst;
1357436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   i->ARM64in.Shift.argL = argL;
1358436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   i->ARM64in.Shift.argR = argR;
1359436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   i->ARM64in.Shift.op   = op;
1360436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   return i;
1361436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
1362436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovARM64Instr* ARM64Instr_Unary ( HReg dst, HReg src, ARM64UnaryOp op ) {
1363436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   ARM64Instr* i = LibVEX_Alloc(sizeof(ARM64Instr));
1364436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   i->tag               = ARM64in_Unary;
1365436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   i->ARM64in.Unary.dst = dst;
1366436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   i->ARM64in.Unary.src = src;
1367436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   i->ARM64in.Unary.op  = op;
1368436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   return i;
1369436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
1370436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovARM64Instr* ARM64Instr_MovI ( HReg dst, HReg src ) {
1371436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   ARM64Instr* i      = LibVEX_Alloc(sizeof(ARM64Instr));
1372436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   i->tag             = ARM64in_MovI;
1373436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   i->ARM64in.MovI.dst = dst;
1374436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   i->ARM64in.MovI.src = src;
1375436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   vassert(hregClass(src) == HRcInt64);
1376436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   vassert(hregClass(dst) == HRcInt64);
1377436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   return i;
1378436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
1379436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovARM64Instr* ARM64Instr_Imm64 ( HReg dst, ULong imm64 ) {
1380436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   ARM64Instr* i = LibVEX_Alloc(sizeof(ARM64Instr));
1381436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   i->tag                 = ARM64in_Imm64;
1382436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   i->ARM64in.Imm64.dst   = dst;
1383436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   i->ARM64in.Imm64.imm64 = imm64;
1384436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   return i;
1385436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
1386436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovARM64Instr* ARM64Instr_LdSt64 ( Bool isLoad, HReg rD, ARM64AMode* amode ) {
1387436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   ARM64Instr* i = LibVEX_Alloc(sizeof(ARM64Instr));
1388436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   i->tag                   = ARM64in_LdSt64;
1389436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   i->ARM64in.LdSt64.isLoad = isLoad;
1390436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   i->ARM64in.LdSt64.rD     = rD;
1391436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   i->ARM64in.LdSt64.amode  = amode;
1392436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   return i;
1393436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
1394436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovARM64Instr* ARM64Instr_LdSt32 ( Bool isLoad, HReg rD, ARM64AMode* amode ) {
1395436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   ARM64Instr* i = LibVEX_Alloc(sizeof(ARM64Instr));
1396436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   i->tag                   = ARM64in_LdSt32;
1397436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   i->ARM64in.LdSt32.isLoad = isLoad;
1398436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   i->ARM64in.LdSt32.rD     = rD;
1399436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   i->ARM64in.LdSt32.amode  = amode;
1400436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   return i;
1401436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
1402436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovARM64Instr* ARM64Instr_LdSt16 ( Bool isLoad, HReg rD, ARM64AMode* amode ) {
1403436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   ARM64Instr* i = LibVEX_Alloc(sizeof(ARM64Instr));
1404436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   i->tag                   = ARM64in_LdSt16;
1405436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   i->ARM64in.LdSt16.isLoad = isLoad;
1406436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   i->ARM64in.LdSt16.rD     = rD;
1407436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   i->ARM64in.LdSt16.amode  = amode;
1408436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   return i;
1409436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
1410436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovARM64Instr* ARM64Instr_LdSt8 ( Bool isLoad, HReg rD, ARM64AMode* amode ) {
1411436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   ARM64Instr* i = LibVEX_Alloc(sizeof(ARM64Instr));
1412436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   i->tag                  = ARM64in_LdSt8;
1413436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   i->ARM64in.LdSt8.isLoad = isLoad;
1414436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   i->ARM64in.LdSt8.rD     = rD;
1415436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   i->ARM64in.LdSt8.amode  = amode;
1416436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   return i;
1417436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
1418436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovARM64Instr* ARM64Instr_XDirect ( Addr64 dstGA, ARM64AMode* amPC,
1419436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                 ARM64CondCode cond, Bool toFastEP ) {
1420436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   ARM64Instr* i               = LibVEX_Alloc(sizeof(ARM64Instr));
1421436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   i->tag                      = ARM64in_XDirect;
1422436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   i->ARM64in.XDirect.dstGA    = dstGA;
1423436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   i->ARM64in.XDirect.amPC     = amPC;
1424436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   i->ARM64in.XDirect.cond     = cond;
1425436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   i->ARM64in.XDirect.toFastEP = toFastEP;
1426436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   return i;
1427436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
1428436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovARM64Instr* ARM64Instr_XIndir ( HReg dstGA, ARM64AMode* amPC,
1429436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                ARM64CondCode cond ) {
1430436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   ARM64Instr* i           = LibVEX_Alloc(sizeof(ARM64Instr));
1431436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   i->tag                  = ARM64in_XIndir;
1432436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   i->ARM64in.XIndir.dstGA = dstGA;
1433436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   i->ARM64in.XIndir.amPC  = amPC;
1434436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   i->ARM64in.XIndir.cond  = cond;
1435436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   return i;
1436436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
1437436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovARM64Instr* ARM64Instr_XAssisted ( HReg dstGA, ARM64AMode* amPC,
1438436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                   ARM64CondCode cond, IRJumpKind jk ) {
1439436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   ARM64Instr* i              = LibVEX_Alloc(sizeof(ARM64Instr));
1440436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   i->tag                     = ARM64in_XAssisted;
1441436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   i->ARM64in.XAssisted.dstGA = dstGA;
1442436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   i->ARM64in.XAssisted.amPC  = amPC;
1443436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   i->ARM64in.XAssisted.cond  = cond;
1444436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   i->ARM64in.XAssisted.jk    = jk;
1445436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   return i;
1446436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
1447436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovARM64Instr* ARM64Instr_CSel ( HReg dst, HReg argL, HReg argR,
1448436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                              ARM64CondCode cond ) {
1449436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   ARM64Instr* i        = LibVEX_Alloc(sizeof(ARM64Instr));
1450436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   i->tag               = ARM64in_CSel;
1451436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   i->ARM64in.CSel.dst  = dst;
1452436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   i->ARM64in.CSel.argL = argL;
1453436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   i->ARM64in.CSel.argR = argR;
1454436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   i->ARM64in.CSel.cond = cond;
1455436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   return i;
1456436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
1457436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovARM64Instr* ARM64Instr_Call ( ARM64CondCode cond, HWord target, Int nArgRegs,
1458436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                              RetLoc rloc ) {
1459436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   ARM64Instr* i = LibVEX_Alloc(sizeof(ARM64Instr));
1460436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   i->tag                   = ARM64in_Call;
1461436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   i->ARM64in.Call.cond     = cond;
1462436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   i->ARM64in.Call.target   = target;
1463436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   i->ARM64in.Call.nArgRegs = nArgRegs;
1464436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   i->ARM64in.Call.rloc     = rloc;
1465436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   vassert(is_sane_RetLoc(rloc));
1466436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   return i;
1467436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
1468436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovextern ARM64Instr* ARM64Instr_AddToSP ( Int simm ) {
1469436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   ARM64Instr* i = LibVEX_Alloc(sizeof(ARM64Instr));
1470436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   i->tag                  = ARM64in_AddToSP;
1471436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   i->ARM64in.AddToSP.simm = simm;
1472436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   vassert(-4096 < simm && simm < 4096);
1473436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   vassert(0 == (simm & 0xF));
1474436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   return i;
1475436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
1476436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovextern ARM64Instr* ARM64Instr_FromSP  ( HReg dst ) {
1477436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   ARM64Instr* i = LibVEX_Alloc(sizeof(ARM64Instr));
1478436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   i->tag                = ARM64in_FromSP;
1479436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   i->ARM64in.FromSP.dst = dst;
1480436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   return i;
1481436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
1482436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovARM64Instr* ARM64Instr_Mul ( HReg dst, HReg argL, HReg argR,
1483436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                             ARM64MulOp op ) {
1484436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   ARM64Instr* i = LibVEX_Alloc(sizeof(ARM64Instr));
1485436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   i->tag              = ARM64in_Mul;
1486436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   i->ARM64in.Mul.dst  = dst;
1487436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   i->ARM64in.Mul.argL = argL;
1488436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   i->ARM64in.Mul.argR = argR;
1489436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   i->ARM64in.Mul.op   = op;
1490436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   return i;
1491436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
1492436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovARM64Instr* ARM64Instr_LdrEX ( Int szB ) {
1493436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   ARM64Instr* i = LibVEX_Alloc(sizeof(ARM64Instr));
1494436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   i->tag               = ARM64in_LdrEX;
1495436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   i->ARM64in.LdrEX.szB = szB;
1496436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   vassert(szB == 8 || szB == 4 || szB == 2 || szB == 1);
1497436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   return i;
1498436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
1499436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovARM64Instr* ARM64Instr_StrEX ( Int szB ) {
1500436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   ARM64Instr* i = LibVEX_Alloc(sizeof(ARM64Instr));
1501436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   i->tag               = ARM64in_StrEX;
1502436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   i->ARM64in.StrEX.szB = szB;
1503436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   vassert(szB == 8 || szB == 4 || szB == 2 || szB == 1);
1504436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   return i;
1505436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
1506436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovARM64Instr* ARM64Instr_MFence ( void ) {
1507436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   ARM64Instr* i = LibVEX_Alloc(sizeof(ARM64Instr));
1508436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   i->tag        = ARM64in_MFence;
1509436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   return i;
1510436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
1511436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ ARM64Instr* ARM64Instr_CLREX( void ) {
1512436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    ARM64Instr* i = LibVEX_Alloc(sizeof(ARM64Instr));
1513436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    i->tag        = ARM64in_CLREX;
1514436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    return i;
1515436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ }
1516436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovARM64Instr* ARM64Instr_VLdStS ( Bool isLoad, HReg sD, HReg rN, UInt uimm12 ) {
1517436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   ARM64Instr* i = LibVEX_Alloc(sizeof(ARM64Instr));
1518436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   i->tag                  = ARM64in_VLdStS;
1519436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   i->ARM64in.VLdStS.isLoad = isLoad;
1520436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   i->ARM64in.VLdStS.sD     = sD;
1521436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   i->ARM64in.VLdStS.rN     = rN;
1522436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   i->ARM64in.VLdStS.uimm12 = uimm12;
1523436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   vassert(uimm12 < 16384 && 0 == (uimm12 & 3));
1524436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   return i;
1525436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
1526436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovARM64Instr* ARM64Instr_VLdStD ( Bool isLoad, HReg dD, HReg rN, UInt uimm12 ) {
1527436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   ARM64Instr* i = LibVEX_Alloc(sizeof(ARM64Instr));
1528436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   i->tag                  = ARM64in_VLdStD;
1529436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   i->ARM64in.VLdStD.isLoad = isLoad;
1530436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   i->ARM64in.VLdStD.dD     = dD;
1531436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   i->ARM64in.VLdStD.rN     = rN;
1532436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   i->ARM64in.VLdStD.uimm12 = uimm12;
1533436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   vassert(uimm12 < 32768 && 0 == (uimm12 & 7));
1534436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   return i;
1535436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
1536436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovARM64Instr* ARM64Instr_VLdStQ ( Bool isLoad, HReg rQ, HReg rN ) {
1537436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   ARM64Instr* i = LibVEX_Alloc(sizeof(ARM64Instr));
1538436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   i->tag                   = ARM64in_VLdStQ;
1539436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   i->ARM64in.VLdStQ.isLoad = isLoad;
1540436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   i->ARM64in.VLdStQ.rQ     = rQ;
1541436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   i->ARM64in.VLdStQ.rN     = rN;
1542436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   return i;
1543436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
1544436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovARM64Instr* ARM64Instr_VCvtI2F ( ARM64CvtOp how, HReg rD, HReg rS ) {
1545436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   ARM64Instr* i = LibVEX_Alloc(sizeof(ARM64Instr));
1546436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   i->tag                 = ARM64in_VCvtI2F;
1547436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   i->ARM64in.VCvtI2F.how = how;
1548436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   i->ARM64in.VCvtI2F.rD  = rD;
1549436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   i->ARM64in.VCvtI2F.rS  = rS;
1550436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   return i;
1551436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
1552436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovARM64Instr* ARM64Instr_VCvtF2I ( ARM64CvtOp how, HReg rD, HReg rS,
1553436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                 UChar armRM ) {
1554436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   ARM64Instr* i = LibVEX_Alloc(sizeof(ARM64Instr));
1555436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   i->tag                   = ARM64in_VCvtF2I;
1556436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   i->ARM64in.VCvtF2I.how   = how;
1557436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   i->ARM64in.VCvtF2I.rD    = rD;
1558436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   i->ARM64in.VCvtF2I.rS    = rS;
1559436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   i->ARM64in.VCvtF2I.armRM = armRM;
1560436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   vassert(armRM <= 3);
1561436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   return i;
1562436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
1563436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovARM64Instr* ARM64Instr_VCvtSD ( Bool sToD, HReg dst, HReg src ) {
1564436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   ARM64Instr* i = LibVEX_Alloc(sizeof(ARM64Instr));
1565436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   i->tag               = ARM64in_VCvtSD;
1566436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   i->ARM64in.VCvtSD.sToD = sToD;
1567436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   i->ARM64in.VCvtSD.dst  = dst;
1568436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   i->ARM64in.VCvtSD.src  = src;
1569436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   return i;
1570436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
1571436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovARM64Instr* ARM64Instr_VUnaryD ( ARM64FpUnaryOp op, HReg dst, HReg src ) {
1572436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   ARM64Instr* i = LibVEX_Alloc(sizeof(ARM64Instr));
1573436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   i->tag                 = ARM64in_VUnaryD;
1574436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   i->ARM64in.VUnaryD.op  = op;
1575436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   i->ARM64in.VUnaryD.dst = dst;
1576436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   i->ARM64in.VUnaryD.src = src;
1577436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   return i;
1578436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
1579436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovARM64Instr* ARM64Instr_VUnaryS ( ARM64FpUnaryOp op, HReg dst, HReg src ) {
1580436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   ARM64Instr* i = LibVEX_Alloc(sizeof(ARM64Instr));
1581436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   i->tag                 = ARM64in_VUnaryS;
1582436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   i->ARM64in.VUnaryS.op  = op;
1583436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   i->ARM64in.VUnaryS.dst = dst;
1584436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   i->ARM64in.VUnaryS.src = src;
1585436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   return i;
1586436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
1587436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovARM64Instr* ARM64Instr_VBinD ( ARM64FpBinOp op,
1588436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                               HReg dst, HReg argL, HReg argR ) {
1589436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   ARM64Instr* i = LibVEX_Alloc(sizeof(ARM64Instr));
1590436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   i->tag                = ARM64in_VBinD;
1591436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   i->ARM64in.VBinD.op   = op;
1592436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   i->ARM64in.VBinD.dst  = dst;
1593436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   i->ARM64in.VBinD.argL = argL;
1594436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   i->ARM64in.VBinD.argR = argR;
1595436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   return i;
1596436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
1597436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovARM64Instr* ARM64Instr_VBinS ( ARM64FpBinOp op,
1598436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                               HReg dst, HReg argL, HReg argR ) {
1599436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   ARM64Instr* i = LibVEX_Alloc(sizeof(ARM64Instr));
1600436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   i->tag                = ARM64in_VBinS;
1601436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   i->ARM64in.VBinS.op   = op;
1602436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   i->ARM64in.VBinS.dst  = dst;
1603436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   i->ARM64in.VBinS.argL = argL;
1604436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   i->ARM64in.VBinS.argR = argR;
1605436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   return i;
1606436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
1607436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovARM64Instr* ARM64Instr_VCmpD ( HReg argL, HReg argR ) {
1608436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   ARM64Instr* i = LibVEX_Alloc(sizeof(ARM64Instr));
1609436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   i->tag                = ARM64in_VCmpD;
1610436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   i->ARM64in.VCmpD.argL = argL;
1611436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   i->ARM64in.VCmpD.argR = argR;
1612436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   return i;
1613436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
1614436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovARM64Instr* ARM64Instr_VCmpS ( HReg argL, HReg argR ) {
1615436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   ARM64Instr* i = LibVEX_Alloc(sizeof(ARM64Instr));
1616436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   i->tag                = ARM64in_VCmpS;
1617436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   i->ARM64in.VCmpS.argL = argL;
1618436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   i->ARM64in.VCmpS.argR = argR;
1619436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   return i;
1620436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
1621436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovARM64Instr* ARM64Instr_FPCR ( Bool toFPCR, HReg iReg ) {
1622436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   ARM64Instr* i = LibVEX_Alloc(sizeof(ARM64Instr));
1623436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   i->tag                 = ARM64in_FPCR;
1624436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   i->ARM64in.FPCR.toFPCR = toFPCR;
1625436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   i->ARM64in.FPCR.iReg   = iReg;
1626436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   return i;
1627436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
1628436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovARM64Instr* ARM64Instr_VBinV ( ARM64VecBinOp op,
1629436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                               HReg dst, HReg argL, HReg argR ) {
1630436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   ARM64Instr* i = LibVEX_Alloc(sizeof(ARM64Instr));
1631436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   i->tag                = ARM64in_VBinV;
1632436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   i->ARM64in.VBinV.op   = op;
1633436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   i->ARM64in.VBinV.dst  = dst;
1634436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   i->ARM64in.VBinV.argL = argL;
1635436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   i->ARM64in.VBinV.argR = argR;
1636436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   return i;
1637436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
1638436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovARM64Instr* ARM64Instr_VUnaryV ( ARM64VecUnaryOp op, HReg dst, HReg arg ) {
1639436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   ARM64Instr* i = LibVEX_Alloc(sizeof(ARM64Instr));
1640436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   i->tag                 = ARM64in_VUnaryV;
1641436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   i->ARM64in.VUnaryV.op  = op;
1642436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   i->ARM64in.VUnaryV.dst = dst;
1643436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   i->ARM64in.VUnaryV.arg = arg;
1644436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   return i;
1645436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
1646436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovARM64Instr* ARM64Instr_VNarrowV ( UInt dszBlg2, HReg dst, HReg src ) {
1647436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   ARM64Instr* i = LibVEX_Alloc(sizeof(ARM64Instr));
1648436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   i->tag                      = ARM64in_VNarrowV;
1649436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   i->ARM64in.VNarrowV.dszBlg2 = dszBlg2;
1650436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   i->ARM64in.VNarrowV.dst     = dst;
1651436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   i->ARM64in.VNarrowV.src     = src;
1652436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   vassert(dszBlg2 == 0 || dszBlg2 == 1 || dszBlg2 == 2);
1653436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   return i;
1654436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
1655436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovARM64Instr* ARM64Instr_VShiftImmV ( ARM64VecShiftOp op,
1656436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                    HReg dst, HReg src, UInt amt ) {
1657436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   ARM64Instr* i = LibVEX_Alloc(sizeof(ARM64Instr));
1658436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   i->tag                    = ARM64in_VShiftImmV;
1659436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   i->ARM64in.VShiftImmV.op  = op;
1660436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   i->ARM64in.VShiftImmV.dst = dst;
1661436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   i->ARM64in.VShiftImmV.src = src;
1662436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   i->ARM64in.VShiftImmV.amt = amt;
1663436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   UInt maxSh = 0;
1664436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   switch (op) {
1665436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case ARM64vecsh_USHR64x2: case ARM64vecsh_SSHR64x2:
1666eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov      case ARM64vecsh_SHL64x2:
1667436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         maxSh = 63; break;
1668eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov      case ARM64vecsh_USHR32x4: case ARM64vecsh_SSHR32x4:
1669436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case ARM64vecsh_SHL32x4:
1670436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         maxSh = 31; break;
1671eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov      case ARM64vecsh_USHR16x8: case ARM64vecsh_SSHR16x8:
1672eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov      case ARM64vecsh_SHL16x8:
16732ca80a6a6fc069acdb73186e8e578dbf8f46af80Dmitriy Ivanov         maxSh = 15; break;
1674eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov      case ARM64vecsh_USHR8x16: case ARM64vecsh_SSHR8x16:
1675eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov      case ARM64vecsh_SHL8x16:
1676eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov         maxSh = 7; break;
1677436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      default:
1678436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         vassert(0);
1679436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   }
1680436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   vassert(maxSh > 0);
1681436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   vassert(amt > 0 && amt <= maxSh);
1682436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   return i;
1683436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
1684436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ ARMInstr* ARMInstr_VAluS ( ARMVfpOp op, HReg dst, HReg argL, HReg argR ) {
1685436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    ARMInstr* i = LibVEX_Alloc(sizeof(ARMInstr));
1686436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    i->tag              = ARMin_VAluS;
1687436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    i->ARMin.VAluS.op   = op;
1688436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    i->ARMin.VAluS.dst  = dst;
1689436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    i->ARMin.VAluS.argL = argL;
1690436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    i->ARMin.VAluS.argR = argR;
1691436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    return i;
1692436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ }
1693436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ ARMInstr* ARMInstr_VCMovD ( ARMCondCode cond, HReg dst, HReg src ) {
1694436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    ARMInstr* i = LibVEX_Alloc(sizeof(ARMInstr));
1695436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    i->tag               = ARMin_VCMovD;
1696436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    i->ARMin.VCMovD.cond = cond;
1697436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    i->ARMin.VCMovD.dst  = dst;
1698436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    i->ARMin.VCMovD.src  = src;
1699436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    vassert(cond != ARMcc_AL);
1700436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    return i;
1701436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ }
1702436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ ARMInstr* ARMInstr_VCMovS ( ARMCondCode cond, HReg dst, HReg src ) {
1703436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    ARMInstr* i = LibVEX_Alloc(sizeof(ARMInstr));
1704436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    i->tag               = ARMin_VCMovS;
1705436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    i->ARMin.VCMovS.cond = cond;
1706436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    i->ARMin.VCMovS.dst  = dst;
1707436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    i->ARMin.VCMovS.src  = src;
1708436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    vassert(cond != ARMcc_AL);
1709436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    return i;
1710436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ }
1711436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ ARMInstr* ARMInstr_VXferD ( Bool toD, HReg dD, HReg rHi, HReg rLo ) {
1712436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    ARMInstr* i = LibVEX_Alloc(sizeof(ARMInstr));
1713436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    i->tag              = ARMin_VXferD;
1714436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    i->ARMin.VXferD.toD = toD;
1715436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    i->ARMin.VXferD.dD  = dD;
1716436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    i->ARMin.VXferD.rHi = rHi;
1717436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    i->ARMin.VXferD.rLo = rLo;
1718436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    return i;
1719436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ }
1720436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ ARMInstr* ARMInstr_VXferS ( Bool toS, HReg fD, HReg rLo ) {
1721436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    ARMInstr* i = LibVEX_Alloc(sizeof(ARMInstr));
1722436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    i->tag              = ARMin_VXferS;
1723436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    i->ARMin.VXferS.toS = toS;
1724436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    i->ARMin.VXferS.fD  = fD;
1725436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    i->ARMin.VXferS.rLo = rLo;
1726436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    return i;
1727436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ }
1728436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ ARMInstr* ARMInstr_VCvtID ( Bool iToD, Bool syned,
1729436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                             HReg dst, HReg src ) {
1730436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    ARMInstr* i = LibVEX_Alloc(sizeof(ARMInstr));
1731436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    i->tag                = ARMin_VCvtID;
1732436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    i->ARMin.VCvtID.iToD  = iToD;
1733436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    i->ARMin.VCvtID.syned = syned;
1734436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    i->ARMin.VCvtID.dst   = dst;
1735436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    i->ARMin.VCvtID.src   = src;
1736436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    return i;
1737436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ }
1738436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ ARMInstr* ARMInstr_NLdStD ( Bool isLoad, HReg dD, ARMAModeN *amode ) {
1739436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    ARMInstr* i = LibVEX_Alloc(sizeof(ARMInstr));
1740436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    i->tag                  = ARMin_NLdStD;
1741436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    i->ARMin.NLdStD.isLoad  = isLoad;
1742436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    i->ARMin.NLdStD.dD      = dD;
1743436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    i->ARMin.NLdStD.amode   = amode;
1744436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    return i;
1745436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ }
1746436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ
1747436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ ARMInstr* ARMInstr_NUnary ( ARMNeonUnOp op, HReg dQ, HReg nQ,
1748436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                             UInt size, Bool Q ) {
1749436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    ARMInstr* i = LibVEX_Alloc(sizeof(ARMInstr));
1750436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    i->tag                = ARMin_NUnary;
1751436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    i->ARMin.NUnary.op   = op;
1752436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    i->ARMin.NUnary.src  = nQ;
1753436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    i->ARMin.NUnary.dst  = dQ;
1754436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    i->ARMin.NUnary.size = size;
1755436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    i->ARMin.NUnary.Q    = Q;
1756436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    return i;
1757436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ }
1758436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ
1759436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ ARMInstr* ARMInstr_NUnaryS ( ARMNeonUnOpS op, ARMNRS* dst, ARMNRS* src,
1760436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                              UInt size, Bool Q ) {
1761436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    ARMInstr* i = LibVEX_Alloc(sizeof(ARMInstr));
1762436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    i->tag                = ARMin_NUnaryS;
1763436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    i->ARMin.NUnaryS.op   = op;
1764436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    i->ARMin.NUnaryS.src  = src;
1765436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    i->ARMin.NUnaryS.dst  = dst;
1766436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    i->ARMin.NUnaryS.size = size;
1767436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    i->ARMin.NUnaryS.Q    = Q;
1768436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    return i;
1769436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ }
1770436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ
1771436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ ARMInstr* ARMInstr_NDual ( ARMNeonDualOp op, HReg nQ, HReg mQ,
1772436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                            UInt size, Bool Q ) {
1773436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    ARMInstr* i = LibVEX_Alloc(sizeof(ARMInstr));
1774436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    i->tag                = ARMin_NDual;
1775436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    i->ARMin.NDual.op   = op;
1776436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    i->ARMin.NDual.arg1 = nQ;
1777436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    i->ARMin.NDual.arg2 = mQ;
1778436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    i->ARMin.NDual.size = size;
1779436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    i->ARMin.NDual.Q    = Q;
1780436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    return i;
1781436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ }
1782436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ
1783436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ ARMInstr* ARMInstr_NBinary ( ARMNeonBinOp op,
1784436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                              HReg dst, HReg argL, HReg argR,
1785436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                              UInt size, Bool Q ) {
1786436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    ARMInstr* i = LibVEX_Alloc(sizeof(ARMInstr));
1787436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    i->tag                = ARMin_NBinary;
1788436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    i->ARMin.NBinary.op   = op;
1789436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    i->ARMin.NBinary.argL = argL;
1790436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    i->ARMin.NBinary.argR = argR;
1791436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    i->ARMin.NBinary.dst  = dst;
1792436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    i->ARMin.NBinary.size = size;
1793436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    i->ARMin.NBinary.Q    = Q;
1794436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    return i;
1795436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ }
1796436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
1797436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovARM64Instr* ARM64Instr_VImmQ (HReg rQ, UShort imm) {
1798436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   ARM64Instr* i = LibVEX_Alloc(sizeof(ARM64Instr));
1799436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   i->tag               = ARM64in_VImmQ;
1800436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   i->ARM64in.VImmQ.rQ  = rQ;
1801436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   i->ARM64in.VImmQ.imm = imm;
1802436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   return i;
1803436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
1804436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovARM64Instr* ARM64Instr_VDfromX ( HReg rD, HReg rX ) {
1805436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   ARM64Instr* i = LibVEX_Alloc(sizeof(ARM64Instr));
1806436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   i->tag                = ARM64in_VDfromX;
1807436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   i->ARM64in.VDfromX.rD = rD;
1808436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   i->ARM64in.VDfromX.rX = rX;
1809436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   return i;
1810436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
1811436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovARM64Instr* ARM64Instr_VQfromXX ( HReg rQ, HReg rXhi, HReg rXlo ) {
1812436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   ARM64Instr* i = LibVEX_Alloc(sizeof(ARM64Instr));
1813436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   i->tag                   = ARM64in_VQfromXX;
1814436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   i->ARM64in.VQfromXX.rQ   = rQ;
1815436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   i->ARM64in.VQfromXX.rXhi = rXhi;
1816436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   i->ARM64in.VQfromXX.rXlo = rXlo;
1817436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   return i;
1818436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
1819436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovARM64Instr* ARM64Instr_VXfromQ ( HReg rX, HReg rQ, UInt laneNo ) {
1820436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   ARM64Instr* i = LibVEX_Alloc(sizeof(ARM64Instr));
1821436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   i->tag                    = ARM64in_VXfromQ;
1822436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   i->ARM64in.VXfromQ.rX     = rX;
1823436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   i->ARM64in.VXfromQ.rQ     = rQ;
1824436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   i->ARM64in.VXfromQ.laneNo = laneNo;
1825436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   vassert(laneNo <= 1);
1826436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   return i;
1827436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
1828436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovARM64Instr* ARM64Instr_VMov ( UInt szB, HReg dst, HReg src ) {
1829436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   ARM64Instr* i       = LibVEX_Alloc(sizeof(ARM64Instr));
1830436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   i->tag              = ARM64in_VMov;
1831436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   i->ARM64in.VMov.szB = szB;
1832436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   i->ARM64in.VMov.dst = dst;
1833436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   i->ARM64in.VMov.src = src;
1834436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   switch (szB) {
1835436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case 16:
1836436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov        vassert(hregClass(src) == HRcVec128);
1837436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov        vassert(hregClass(dst) == HRcVec128);
1838436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov        break;
1839436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case 8:
1840436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov        vassert(hregClass(src) == HRcFlt64);
1841436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov        vassert(hregClass(dst) == HRcFlt64);
1842436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov        break;
1843436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      default:
1844436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov        vpanic("ARM64Instr_VMov");
1845436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   }
1846436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   return i;
1847436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
1848436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
1849436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ ARMInstr* ARMInstr_NCMovQ ( ARMCondCode cond, HReg dst, HReg src ) {
1850436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    ARMInstr* i = LibVEX_Alloc(sizeof(ARMInstr));
1851436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    i->tag               = ARMin_NCMovQ;
1852436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    i->ARMin.NCMovQ.cond = cond;
1853436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    i->ARMin.NCMovQ.dst  = dst;
1854436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    i->ARMin.NCMovQ.src  = src;
1855436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    vassert(cond != ARMcc_AL);
1856436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    return i;
1857436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ }
1858436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ
1859436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ ARMInstr* ARMInstr_NShift ( ARMNeonShiftOp op,
1860436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                             HReg dst, HReg argL, HReg argR,
1861436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                             UInt size, Bool Q ) {
1862436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    ARMInstr* i = LibVEX_Alloc(sizeof(ARMInstr));
1863436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    i->tag                = ARMin_NShift;
1864436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    i->ARMin.NShift.op   = op;
1865436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    i->ARMin.NShift.argL = argL;
1866436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    i->ARMin.NShift.argR = argR;
1867436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    i->ARMin.NShift.dst  = dst;
1868436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    i->ARMin.NShift.size = size;
1869436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    i->ARMin.NShift.Q    = Q;
1870436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    return i;
1871436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ }
1872436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ
1873436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ ARMInstr* ARMInstr_NShl64 ( HReg dst, HReg src, UInt amt )
1874436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ {
1875436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    ARMInstr* i = LibVEX_Alloc(sizeof(ARMInstr));
1876436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    i->tag              = ARMin_NShl64;
1877436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    i->ARMin.NShl64.dst = dst;
1878436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    i->ARMin.NShl64.src = src;
1879436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    i->ARMin.NShl64.amt = amt;
1880436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    vassert(amt >= 1 && amt <= 63);
1881436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    return i;
1882436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ }
1883436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ
1884436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ /* Helper copy-pasted from isel.c */
1885436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ static Bool fitsIn8x4 ( UInt* u8, UInt* u4, UInt u )
1886436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ {
1887436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    UInt i;
1888436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    for (i = 0; i < 16; i++) {
1889436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       if (0 == (u & 0xFFFFFF00)) {
1890436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          *u8 = u;
1891436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          *u4 = i;
1892436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          return True;
1893436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       }
1894436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       u = ROR32(u, 30);
1895436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    }
1896436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    vassert(i == 16);
1897436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    return False;
1898436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ }
1899436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ
1900436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ ARMInstr* ARMInstr_Add32 ( HReg rD, HReg rN, UInt imm32 ) {
1901436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    UInt u8, u4;
1902436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    ARMInstr *i = LibVEX_Alloc(sizeof(ARMInstr));
1903436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    /* Try to generate single ADD if possible */
1904436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    if (fitsIn8x4(&u8, &u4, imm32)) {
1905436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       i->tag            = ARMin_Alu;
1906436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       i->ARMin.Alu.op   = ARMalu_ADD;
1907436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       i->ARMin.Alu.dst  = rD;
1908436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       i->ARMin.Alu.argL = rN;
1909436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       i->ARMin.Alu.argR = ARMRI84_I84(u8, u4);
1910436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    } else {
1911436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       i->tag               = ARMin_Add32;
1912436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       i->ARMin.Add32.rD    = rD;
1913436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       i->ARMin.Add32.rN    = rN;
1914436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       i->ARMin.Add32.imm32 = imm32;
1915436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    }
1916436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    return i;
1917436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ }
1918436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
1919436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovARM64Instr* ARM64Instr_EvCheck ( ARM64AMode* amCounter,
1920436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                 ARM64AMode* amFailAddr ) {
1921436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   ARM64Instr* i                 = LibVEX_Alloc(sizeof(ARM64Instr));
1922436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   i->tag                        = ARM64in_EvCheck;
1923436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   i->ARM64in.EvCheck.amCounter  = amCounter;
1924436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   i->ARM64in.EvCheck.amFailAddr = amFailAddr;
1925436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   return i;
1926436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
1927436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
1928436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ ARMInstr* ARMInstr_ProfInc ( void ) {
1929436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    ARMInstr* i = LibVEX_Alloc(sizeof(ARMInstr));
1930436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    i->tag      = ARMin_ProfInc;
1931436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    return i;
1932436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ }
1933436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
1934436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov/* ... */
1935436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
1936436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovvoid ppARM64Instr ( ARM64Instr* i ) {
1937436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   switch (i->tag) {
1938436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case ARM64in_Arith:
1939436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         vex_printf("%s    ", i->ARM64in.Arith.isAdd ? "add" : "sub");
1940436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         ppHRegARM64(i->ARM64in.Arith.dst);
1941436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         vex_printf(", ");
1942436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         ppHRegARM64(i->ARM64in.Arith.argL);
1943436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         vex_printf(", ");
1944436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         ppARM64RIA(i->ARM64in.Arith.argR);
1945436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         return;
1946436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case ARM64in_Cmp:
1947436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         vex_printf("cmp%s ", i->ARM64in.Cmp.is64 ? "   " : "(w)" );
1948436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         ppHRegARM64(i->ARM64in.Cmp.argL);
1949436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         vex_printf(", ");
1950436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         ppARM64RIA(i->ARM64in.Cmp.argR);
1951436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         return;
1952436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case ARM64in_Logic:
1953436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         vex_printf("%s    ", showARM64LogicOp(i->ARM64in.Logic.op));
1954436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         ppHRegARM64(i->ARM64in.Logic.dst);
1955436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         vex_printf(", ");
1956436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         ppHRegARM64(i->ARM64in.Logic.argL);
1957436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         vex_printf(", ");
1958436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         ppARM64RIL(i->ARM64in.Logic.argR);
1959436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         return;
1960436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case ARM64in_Test:
1961436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         vex_printf("tst    ");
1962436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         ppHRegARM64(i->ARM64in.Test.argL);
1963436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         vex_printf(", ");
1964436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         ppARM64RIL(i->ARM64in.Test.argR);
1965436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         return;
1966436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case ARM64in_Shift:
1967436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         vex_printf("%s    ", showARM64ShiftOp(i->ARM64in.Shift.op));
1968436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         ppHRegARM64(i->ARM64in.Shift.dst);
1969436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         vex_printf(", ");
1970436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         ppHRegARM64(i->ARM64in.Shift.argL);
1971436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         vex_printf(", ");
1972436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         ppARM64RI6(i->ARM64in.Shift.argR);
1973436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         return;
1974436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case ARM64in_Unary:
1975436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         vex_printf("%s    ", showARM64UnaryOp(i->ARM64in.Unary.op));
1976436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         ppHRegARM64(i->ARM64in.Unary.dst);
1977436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         vex_printf(", ");
1978436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         ppHRegARM64(i->ARM64in.Unary.src);
1979436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         return;
1980436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case ARM64in_MovI:
1981436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         vex_printf("mov    ");
1982436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         ppHRegARM64(i->ARM64in.MovI.dst);
1983436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         vex_printf(", ");
1984436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         ppHRegARM64(i->ARM64in.MovI.src);
1985436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         return;
1986436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case ARM64in_Imm64:
1987436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         vex_printf("imm64  ");
1988436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         ppHRegARM64(i->ARM64in.Imm64.dst);
1989436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         vex_printf(", 0x%llx", i->ARM64in.Imm64.imm64);
1990436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         return;
1991436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case ARM64in_LdSt64:
1992436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         if (i->ARM64in.LdSt64.isLoad) {
1993436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            vex_printf("ldr    ");
1994436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            ppHRegARM64(i->ARM64in.LdSt64.rD);
1995436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            vex_printf(", ");
1996436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            ppARM64AMode(i->ARM64in.LdSt64.amode);
1997436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         } else {
1998436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            vex_printf("str    ");
1999436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            ppARM64AMode(i->ARM64in.LdSt64.amode);
2000436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            vex_printf(", ");
2001436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            ppHRegARM64(i->ARM64in.LdSt64.rD);
2002436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         }
2003436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         return;
2004436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case ARM64in_LdSt32:
2005436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         if (i->ARM64in.LdSt32.isLoad) {
2006436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            vex_printf("ldruw  ");
2007436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            ppHRegARM64(i->ARM64in.LdSt32.rD);
2008436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            vex_printf(", ");
2009436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            ppARM64AMode(i->ARM64in.LdSt32.amode);
2010436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         } else {
2011436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            vex_printf("strw   ");
2012436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            ppARM64AMode(i->ARM64in.LdSt32.amode);
2013436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            vex_printf(", ");
2014436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            ppHRegARM64(i->ARM64in.LdSt32.rD);
2015436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         }
2016436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         return;
2017436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case ARM64in_LdSt16:
2018436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         if (i->ARM64in.LdSt16.isLoad) {
2019436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            vex_printf("ldruh  ");
2020436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            ppHRegARM64(i->ARM64in.LdSt16.rD);
2021436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            vex_printf(", ");
2022436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            ppARM64AMode(i->ARM64in.LdSt16.amode);
2023436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         } else {
2024436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            vex_printf("strh   ");
2025436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            ppARM64AMode(i->ARM64in.LdSt16.amode);
2026436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            vex_printf(", ");
2027436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            ppHRegARM64(i->ARM64in.LdSt16.rD);
2028436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         }
2029436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         return;
2030436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case ARM64in_LdSt8:
2031436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         if (i->ARM64in.LdSt8.isLoad) {
2032436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            vex_printf("ldrub  ");
2033436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            ppHRegARM64(i->ARM64in.LdSt8.rD);
2034436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            vex_printf(", ");
2035436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            ppARM64AMode(i->ARM64in.LdSt8.amode);
2036436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         } else {
2037436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            vex_printf("strb   ");
2038436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            ppARM64AMode(i->ARM64in.LdSt8.amode);
2039436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            vex_printf(", ");
2040436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            ppHRegARM64(i->ARM64in.LdSt8.rD);
2041436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         }
2042436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         return;
2043436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case ARM64in_XDirect:
2044436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         vex_printf("(xDirect) ");
2045436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         vex_printf("if (%%pstate.%s) { ",
2046436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                    showARM64CondCode(i->ARM64in.XDirect.cond));
2047436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         vex_printf("imm64 x9,0x%llx; ", i->ARM64in.XDirect.dstGA);
2048436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         vex_printf("str x9,");
2049436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         ppARM64AMode(i->ARM64in.XDirect.amPC);
2050436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         vex_printf("; imm64-exactly4 x9,$disp_cp_chain_me_to_%sEP; ",
2051436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                    i->ARM64in.XDirect.toFastEP ? "fast" : "slow");
2052436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         vex_printf("blr x9 }");
2053436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         return;
2054436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case ARM64in_XIndir:
2055436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         vex_printf("(xIndir) ");
2056436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         vex_printf("if (%%pstate.%s) { ",
2057436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                    showARM64CondCode(i->ARM64in.XIndir.cond));
2058436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         vex_printf("str ");
2059436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         ppHRegARM64(i->ARM64in.XIndir.dstGA);
2060436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         vex_printf(",");
2061436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         ppARM64AMode(i->ARM64in.XIndir.amPC);
2062436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         vex_printf("; imm64 x9,$disp_cp_xindir; ");
2063436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         vex_printf("br x9 }");
2064436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         return;
2065436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case ARM64in_XAssisted:
2066436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         vex_printf("(xAssisted) ");
2067436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         vex_printf("if (%%pstate.%s) { ",
2068436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                    showARM64CondCode(i->ARM64in.XAssisted.cond));
2069436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         vex_printf("str ");
2070436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         ppHRegARM64(i->ARM64in.XAssisted.dstGA);
2071436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         vex_printf(",");
2072436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         ppARM64AMode(i->ARM64in.XAssisted.amPC);
2073436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         vex_printf("; movw x21,$IRJumpKind_to_TRCVAL(%d); ",
2074436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                    (Int)i->ARM64in.XAssisted.jk);
2075436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         vex_printf("imm64 x9,$disp_cp_xassisted; ");
2076436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         vex_printf("br x9 }");
2077436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         return;
2078436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case ARM64in_CSel:
2079436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         vex_printf("csel   ");
2080436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         ppHRegARM64(i->ARM64in.CSel.dst);
2081436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         vex_printf(", ");
2082436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         ppHRegARM64(i->ARM64in.CSel.argL);
2083436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         vex_printf(", ");
2084436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         ppHRegARM64(i->ARM64in.CSel.argR);
2085436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         vex_printf(", %s", showARM64CondCode(i->ARM64in.CSel.cond));
2086436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         return;
2087436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case ARM64in_Call:
2088436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         vex_printf("call%s ",
2089436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                    i->ARM64in.Call.cond==ARM64cc_AL
2090436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                       ? "  " : showARM64CondCode(i->ARM64in.Call.cond));
2091436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         vex_printf("0x%lx [nArgRegs=%d, ",
2092436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                    i->ARM64in.Call.target, i->ARM64in.Call.nArgRegs);
2093436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         ppRetLoc(i->ARM64in.Call.rloc);
2094436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         vex_printf("]");
2095436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         return;
2096436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case ARM64in_AddToSP: {
2097436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         Int simm = i->ARM64in.AddToSP.simm;
2098436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         vex_printf("%s    xsp, xsp, #%d", simm < 0 ? "sub" : "add",
2099436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           simm < 0 ? -simm : simm);
2100436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         return;
2101436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      }
2102436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case ARM64in_FromSP:
2103436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         vex_printf("mov    ");
2104436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         ppHRegARM64(i->ARM64in.FromSP.dst);
2105436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         vex_printf(", xsp");
2106436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         return;
2107436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case ARM64in_Mul:
2108436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         vex_printf("%s  ", showARM64MulOp(i->ARM64in.Mul.op));
2109436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         ppHRegARM64(i->ARM64in.Mul.dst);
2110436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         vex_printf(", ");
2111436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         ppHRegARM64(i->ARM64in.Mul.argL);
2112436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         vex_printf(", ");
2113436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         ppHRegARM64(i->ARM64in.Mul.argR);
2114436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         return;
2115436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
2116436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case ARM64in_LdrEX: {
2117436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         const HChar* sz = " ";
2118436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         switch (i->ARM64in.LdrEX.szB) {
2119436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case 1: sz = "b"; break;
2120436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case 2: sz = "h"; break;
2121436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case 4: case 8: break;
2122436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            default: vassert(0);
2123436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         }
2124436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         vex_printf("ldxr%s  %c2, [x4]",
2125436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                    sz, i->ARM64in.LdrEX.szB == 8 ? 'x' : 'w');
2126436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         return;
2127436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      }
2128436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case ARM64in_StrEX: {
2129436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         const HChar* sz = " ";
2130436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         switch (i->ARM64in.StrEX.szB) {
2131436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case 1: sz = "b"; break;
2132436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case 2: sz = "h"; break;
2133436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case 4: case 8: break;
2134436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            default: vassert(0);
2135436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         }
2136436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         vex_printf("stxr%s  w0, %c2, [x4]",
2137436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                    sz, i->ARM64in.StrEX.szB == 8 ? 'x' : 'w');
2138436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         return;
2139436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      }
2140436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case ARM64in_MFence:
2141436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         vex_printf("(mfence) dsb sy; dmb sy; isb");
2142436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         return;
2143436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARM64in_CLREX:
2144436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          vex_printf("clrex");
2145436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          return;
2146436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case ARM64in_VLdStS:
2147436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         if (i->ARM64in.VLdStS.isLoad) {
2148436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            vex_printf("ldr    ");
2149436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            ppHRegARM64asSreg(i->ARM64in.VLdStS.sD);
2150436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            vex_printf(", %u(", i->ARM64in.VLdStS.uimm12);
2151436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            ppHRegARM64(i->ARM64in.VLdStS.rN);
2152436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            vex_printf(")");
2153436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         } else {
2154436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            vex_printf("str    ");
2155436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            vex_printf("%u(", i->ARM64in.VLdStS.uimm12);
2156436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            ppHRegARM64(i->ARM64in.VLdStS.rN);
2157436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            vex_printf("), ");
2158436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            ppHRegARM64asSreg(i->ARM64in.VLdStS.sD);
2159436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         }
2160436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         return;
2161436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case ARM64in_VLdStD:
2162436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         if (i->ARM64in.VLdStD.isLoad) {
2163436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            vex_printf("ldr    ");
2164436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            ppHRegARM64(i->ARM64in.VLdStD.dD);
2165436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            vex_printf(", %u(", i->ARM64in.VLdStD.uimm12);
2166436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            ppHRegARM64(i->ARM64in.VLdStD.rN);
2167436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            vex_printf(")");
2168436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         } else {
2169436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            vex_printf("str    ");
2170436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            vex_printf("%u(", i->ARM64in.VLdStD.uimm12);
2171436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            ppHRegARM64(i->ARM64in.VLdStD.rN);
2172436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            vex_printf("), ");
2173436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            ppHRegARM64(i->ARM64in.VLdStD.dD);
2174436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         }
2175436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         return;
2176436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case ARM64in_VLdStQ:
2177436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         if (i->ARM64in.VLdStQ.isLoad)
2178436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            vex_printf("ld1.2d {");
2179436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         else
2180436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            vex_printf("st1.2d {");
2181436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         ppHRegARM64(i->ARM64in.VLdStQ.rQ);
2182436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         vex_printf("}, [");
2183436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         ppHRegARM64(i->ARM64in.VLdStQ.rN);
2184436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         vex_printf("]");
2185436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         return;
2186436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case ARM64in_VCvtI2F: {
2187436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         HChar syn  = '?';
2188436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         UInt  fszB = 0;
2189436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         UInt  iszB = 0;
2190436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         characteriseARM64CvtOp(&syn, &fszB, &iszB, i->ARM64in.VCvtI2F.how);
2191436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         vex_printf("%ccvtf  ", syn);
2192436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         ppHRegARM64(i->ARM64in.VCvtI2F.rD);
2193436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         vex_printf("(%c-reg), ", fszB == 4 ? 'S' : 'D');
2194436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         ppHRegARM64(i->ARM64in.VCvtI2F.rS);
2195436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         vex_printf("(%c-reg)", iszB == 4 ? 'W' : 'X');
2196436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         return;
2197436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      }
2198436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case ARM64in_VCvtF2I: {
2199436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         HChar syn  = '?';
2200436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         UInt  fszB = 0;
2201436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         UInt  iszB = 0;
2202436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         HChar rmo  = '?';
2203436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         characteriseARM64CvtOp(&syn, &fszB, &iszB, i->ARM64in.VCvtF2I.how);
2204436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         UChar armRM = i->ARM64in.VCvtF2I.armRM;
2205436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         if (armRM < 4) rmo = "npmz"[armRM];
2206436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         vex_printf("fcvt%c%c ", rmo, syn);
2207436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         ppHRegARM64(i->ARM64in.VCvtF2I.rD);
2208436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         vex_printf("(%c-reg), ", iszB == 4 ? 'W' : 'X');
2209436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         ppHRegARM64(i->ARM64in.VCvtF2I.rS);
2210436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         vex_printf("(%c-reg)", fszB == 4 ? 'S' : 'D');
2211436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         return;
2212436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      }
2213436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case ARM64in_VCvtSD:
2214436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         vex_printf("fcvt%s ", i->ARM64in.VCvtSD.sToD ? "s2d" : "d2s");
2215436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         if (i->ARM64in.VCvtSD.sToD) {
2216436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            ppHRegARM64(i->ARM64in.VCvtSD.dst);
2217436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            vex_printf(", ");
2218436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            ppHRegARM64asSreg(i->ARM64in.VCvtSD.src);
2219436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         } else {
2220436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            ppHRegARM64asSreg(i->ARM64in.VCvtSD.dst);
2221436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            vex_printf(", ");
2222436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            ppHRegARM64(i->ARM64in.VCvtSD.src);
2223436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         }
2224436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         return;
2225436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case ARM64in_VUnaryD:
2226436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         vex_printf("f%s ", showARM64FpUnaryOp(i->ARM64in.VUnaryD.op));
2227436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         ppHRegARM64(i->ARM64in.VUnaryD.dst);
2228436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         vex_printf(", ");
2229436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         ppHRegARM64(i->ARM64in.VUnaryD.src);
2230436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         return;
2231436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case ARM64in_VUnaryS:
2232436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         vex_printf("f%s ", showARM64FpUnaryOp(i->ARM64in.VUnaryS.op));
2233436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         ppHRegARM64asSreg(i->ARM64in.VUnaryS.dst);
2234436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         vex_printf(", ");
2235436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         ppHRegARM64asSreg(i->ARM64in.VUnaryS.src);
2236436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         return;
2237436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case ARM64in_VBinD:
2238436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         vex_printf("f%s   ", showARM64FpBinOp(i->ARM64in.VBinD.op));
2239436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         ppHRegARM64(i->ARM64in.VBinD.dst);
2240436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         vex_printf(", ");
2241436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         ppHRegARM64(i->ARM64in.VBinD.argL);
2242436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         vex_printf(", ");
2243436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         ppHRegARM64(i->ARM64in.VBinD.argR);
2244436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         return;
2245436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case ARM64in_VBinS:
2246436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         vex_printf("f%s   ", showARM64FpBinOp(i->ARM64in.VBinS.op));
2247436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         ppHRegARM64asSreg(i->ARM64in.VBinS.dst);
2248436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         vex_printf(", ");
2249436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         ppHRegARM64asSreg(i->ARM64in.VBinS.argL);
2250436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         vex_printf(", ");
2251436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         ppHRegARM64asSreg(i->ARM64in.VBinS.argR);
2252436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         return;
2253436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case ARM64in_VCmpD:
2254436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         vex_printf("fcmp   ");
2255436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         ppHRegARM64(i->ARM64in.VCmpD.argL);
2256436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         vex_printf(", ");
2257436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         ppHRegARM64(i->ARM64in.VCmpD.argR);
2258436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         return;
2259436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case ARM64in_VCmpS:
2260436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         vex_printf("fcmp   ");
2261436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         ppHRegARM64asSreg(i->ARM64in.VCmpS.argL);
2262436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         vex_printf(", ");
2263436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         ppHRegARM64asSreg(i->ARM64in.VCmpS.argR);
2264436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         return;
2265436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case ARM64in_FPCR:
2266436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         if (i->ARM64in.FPCR.toFPCR) {
2267436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            vex_printf("msr    fpcr, ");
2268436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            ppHRegARM64(i->ARM64in.FPCR.iReg);
2269436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         } else {
2270436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            vex_printf("mrs    ");
2271436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            ppHRegARM64(i->ARM64in.FPCR.iReg);
2272436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            vex_printf(", fpcr");
2273436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         }
2274436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         return;
2275436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case ARM64in_VBinV: {
2276436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         const HChar* nm = "??";
2277436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         const HChar* ar = "??";
2278436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         showARM64VecBinOp(&nm, &ar, i->ARM64in.VBinV.op);
2279436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         vex_printf("%s   ", nm);
2280436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         ppHRegARM64(i->ARM64in.VBinV.dst);
2281436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         vex_printf(".%s, ", ar);
2282436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         ppHRegARM64(i->ARM64in.VBinV.argL);
2283436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         vex_printf(".%s, ", ar);
2284436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         ppHRegARM64(i->ARM64in.VBinV.argR);
2285436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         vex_printf(".%s", ar);
2286436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         return;
2287436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      }
2288436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case ARM64in_VUnaryV: {
2289436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         const HChar* nm = "??";
2290436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         const HChar* ar = "??";
2291436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         showARM64VecUnaryOp(&nm, &ar, i->ARM64in.VUnaryV.op);
2292436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         vex_printf("%s  ", nm);
2293436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         ppHRegARM64(i->ARM64in.VUnaryV.dst);
2294436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         vex_printf(".%s, ", ar);
2295436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         ppHRegARM64(i->ARM64in.VUnaryV.arg);
2296436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         vex_printf(".%s", ar);
2297436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         return;
2298436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      }
2299436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case ARM64in_VNarrowV: {
2300436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         UInt dszBlg2 = i->ARM64in.VNarrowV.dszBlg2;
2301436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         const HChar* darr[3] = { "8b", "4h", "2s" };
2302436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         const HChar* sarr[3] = { "8h", "4s", "2d" };
2303436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         vex_printf("xtn    ");
2304436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         ppHRegARM64(i->ARM64in.VNarrowV.dst);
2305436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         vex_printf(".%s, ", dszBlg2 < 3 ? darr[dszBlg2] : "??");
2306436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         ppHRegARM64(i->ARM64in.VNarrowV.src);
2307436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         vex_printf(".%s", dszBlg2 < 3 ? sarr[dszBlg2] : "??");
2308436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         return;
2309436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      }
2310436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case ARM64in_VShiftImmV: {
2311436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         const HChar* nm = "??";
2312436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         const HChar* ar = "??";
2313436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         showARM64VecShiftOp(&nm, &ar, i->ARM64in.VShiftImmV.op);
2314436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         vex_printf("%s ", nm);
2315436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         ppHRegARM64(i->ARM64in.VShiftImmV.dst);
2316436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         vex_printf(".%s, ", ar);
2317436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         ppHRegARM64(i->ARM64in.VShiftImmV.src);
2318436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         vex_printf(".%s, #%u", ar, i->ARM64in.VShiftImmV.amt);
2319436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         return;
2320436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      }
2321436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMin_VAluS:
2322436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          vex_printf("f%-3ss ", showARMVfpOp(i->ARMin.VAluS.op));
2323436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          ppHRegARM(i->ARMin.VAluS.dst);
2324436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          vex_printf(", ");
2325436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          ppHRegARM(i->ARMin.VAluS.argL);
2326436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          vex_printf(", ");
2327436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          ppHRegARM(i->ARMin.VAluS.argR);
2328436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          return;
2329436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMin_VCMovD:
2330436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          vex_printf("fcpyd%s ", showARMCondCode(i->ARMin.VCMovD.cond));
2331436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          ppHRegARM(i->ARMin.VCMovD.dst);
2332436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          vex_printf(", ");
2333436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          ppHRegARM(i->ARMin.VCMovD.src);
2334436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          return;
2335436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMin_VCMovS:
2336436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          vex_printf("fcpys%s ", showARMCondCode(i->ARMin.VCMovS.cond));
2337436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          ppHRegARM(i->ARMin.VCMovS.dst);
2338436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          vex_printf(", ");
2339436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          ppHRegARM(i->ARMin.VCMovS.src);
2340436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          return;
2341436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMin_VXferD:
2342436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          vex_printf("vmov  ");
2343436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          if (i->ARMin.VXferD.toD) {
2344436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             ppHRegARM(i->ARMin.VXferD.dD);
2345436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             vex_printf(", ");
2346436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             ppHRegARM(i->ARMin.VXferD.rLo);
2347436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             vex_printf(", ");
2348436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             ppHRegARM(i->ARMin.VXferD.rHi);
2349436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          } else {
2350436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             ppHRegARM(i->ARMin.VXferD.rLo);
2351436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             vex_printf(", ");
2352436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             ppHRegARM(i->ARMin.VXferD.rHi);
2353436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             vex_printf(", ");
2354436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             ppHRegARM(i->ARMin.VXferD.dD);
2355436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          }
2356436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          return;
2357436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMin_VXferS:
2358436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          vex_printf("vmov  ");
2359436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          if (i->ARMin.VXferS.toS) {
2360436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             ppHRegARM(i->ARMin.VXferS.fD);
2361436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             vex_printf(", ");
2362436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             ppHRegARM(i->ARMin.VXferS.rLo);
2363436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          } else {
2364436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             ppHRegARM(i->ARMin.VXferS.rLo);
2365436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             vex_printf(", ");
2366436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             ppHRegARM(i->ARMin.VXferS.fD);
2367436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          }
2368436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          return;
2369436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMin_VCvtID: {
2370436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          const HChar* nm = "?";
2371436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          if (i->ARMin.VCvtID.iToD) {
2372436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             nm = i->ARMin.VCvtID.syned ? "fsitod" : "fuitod";
2373436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          } else {
2374436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             nm = i->ARMin.VCvtID.syned ? "ftosid" : "ftouid";
2375436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          }
2376436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          vex_printf("%s ", nm);
2377436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          ppHRegARM(i->ARMin.VCvtID.dst);
2378436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          vex_printf(", ");
2379436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          ppHRegARM(i->ARMin.VCvtID.src);
2380436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          return;
2381436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       }
2382436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMin_NLdStD:
2383436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          if (i->ARMin.NLdStD.isLoad)
2384436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             vex_printf("vld1.32 {");
2385436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          else
2386436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             vex_printf("vst1.32 {");
2387436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          ppHRegARM(i->ARMin.NLdStD.dD);
2388436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          vex_printf("} ");
2389436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          ppARMAModeN(i->ARMin.NLdStD.amode);
2390436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          return;
2391436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMin_NUnary:
2392436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          vex_printf("%s%s%s  ",
2393436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                     showARMNeonUnOp(i->ARMin.NUnary.op),
2394436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                     showARMNeonUnOpDataType(i->ARMin.NUnary.op),
2395436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                     showARMNeonDataSize(i));
2396436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          ppHRegARM(i->ARMin.NUnary.dst);
2397436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          vex_printf(", ");
2398436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          ppHRegARM(i->ARMin.NUnary.src);
2399436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          if (i->ARMin.NUnary.op == ARMneon_EQZ)
2400436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             vex_printf(", #0");
2401436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          if (i->ARMin.NUnary.op == ARMneon_VCVTFtoFixedS ||
2402436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ              i->ARMin.NUnary.op == ARMneon_VCVTFtoFixedU ||
2403436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ              i->ARMin.NUnary.op == ARMneon_VCVTFixedStoF ||
2404436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ              i->ARMin.NUnary.op == ARMneon_VCVTFixedUtoF) {
2405436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             vex_printf(", #%d", i->ARMin.NUnary.size);
2406436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          }
2407436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          if (i->ARMin.NUnary.op == ARMneon_VQSHLNSS ||
2408436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ              i->ARMin.NUnary.op == ARMneon_VQSHLNUU ||
2409436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ              i->ARMin.NUnary.op == ARMneon_VQSHLNUS) {
2410436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             UInt size;
2411436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             size = i->ARMin.NUnary.size;
2412436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             if (size & 0x40) {
2413436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                vex_printf(", #%d", size - 64);
2414436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             } else if (size & 0x20) {
2415436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                vex_printf(", #%d", size - 32);
2416436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             } else if (size & 0x10) {
2417436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                vex_printf(", #%d", size - 16);
2418436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             } else if (size & 0x08) {
2419436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                vex_printf(", #%d", size - 8);
2420436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             }
2421436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          }
2422436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          return;
2423436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMin_NUnaryS:
2424436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          vex_printf("%s%s%s  ",
2425436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                     showARMNeonUnOpS(i->ARMin.NUnaryS.op),
2426436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                     showARMNeonUnOpSDataType(i->ARMin.NUnaryS.op),
2427436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                     showARMNeonDataSize(i));
2428436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          ppARMNRS(i->ARMin.NUnaryS.dst);
2429436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          vex_printf(", ");
2430436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          ppARMNRS(i->ARMin.NUnaryS.src);
2431436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          return;
2432436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMin_NShift:
2433436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          vex_printf("%s%s%s  ",
2434436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                     showARMNeonShiftOp(i->ARMin.NShift.op),
2435436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                     showARMNeonShiftOpDataType(i->ARMin.NShift.op),
2436436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                     showARMNeonDataSize(i));
2437436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          ppHRegARM(i->ARMin.NShift.dst);
2438436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          vex_printf(", ");
2439436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          ppHRegARM(i->ARMin.NShift.argL);
2440436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          vex_printf(", ");
2441436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          ppHRegARM(i->ARMin.NShift.argR);
2442436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          return;
2443436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMin_NShl64:
2444436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          vex_printf("vshl.i64 ");
2445436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          ppHRegARM(i->ARMin.NShl64.dst);
2446436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          vex_printf(", ");
2447436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          ppHRegARM(i->ARMin.NShl64.src);
2448436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          vex_printf(", #%u", i->ARMin.NShl64.amt);
2449436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          return;
2450436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMin_NDual:
2451436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          vex_printf("%s%s%s  ",
2452436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                     showARMNeonDualOp(i->ARMin.NDual.op),
2453436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                     showARMNeonDualOpDataType(i->ARMin.NDual.op),
2454436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                     showARMNeonDataSize(i));
2455436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          ppHRegARM(i->ARMin.NDual.arg1);
2456436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          vex_printf(", ");
2457436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          ppHRegARM(i->ARMin.NDual.arg2);
2458436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          return;
2459436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMin_NBinary:
2460436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          vex_printf("%s%s%s",
2461436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                     showARMNeonBinOp(i->ARMin.NBinary.op),
2462436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                     showARMNeonBinOpDataType(i->ARMin.NBinary.op),
2463436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                     showARMNeonDataSize(i));
2464436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          vex_printf("  ");
2465436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          ppHRegARM(i->ARMin.NBinary.dst);
2466436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          vex_printf(", ");
2467436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          ppHRegARM(i->ARMin.NBinary.argL);
2468436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          vex_printf(", ");
2469436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          ppHRegARM(i->ARMin.NBinary.argR);
2470436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          return;
2471436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case ARM64in_VImmQ:
2472436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         vex_printf("qimm   ");
2473436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         ppHRegARM64(i->ARM64in.VImmQ.rQ);
2474436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         vex_printf(", Bits16toBytes16(0x%x)", (UInt)i->ARM64in.VImmQ.imm);
2475436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         return;
2476436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case ARM64in_VDfromX:
2477436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         vex_printf("fmov   ");
2478436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         ppHRegARM64(i->ARM64in.VDfromX.rD);
2479436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         vex_printf(", ");
2480436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         ppHRegARM64(i->ARM64in.VDfromX.rX);
2481436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         return;
2482436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case ARM64in_VQfromXX:
2483436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         vex_printf("qFromXX ");
2484436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         ppHRegARM64(i->ARM64in.VQfromXX.rQ);
2485436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         vex_printf(", ");
2486436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         ppHRegARM64(i->ARM64in.VQfromXX.rXhi);
2487436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         vex_printf(", ");
2488436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         ppHRegARM64(i->ARM64in.VQfromXX.rXlo);
2489436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         return;
2490436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case ARM64in_VXfromQ:
2491436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         vex_printf("mov    ");
2492436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         ppHRegARM64(i->ARM64in.VXfromQ.rX);
2493436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         vex_printf(", ");
2494436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         ppHRegARM64(i->ARM64in.VXfromQ.rQ);
2495436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         vex_printf(".d[%u]", i->ARM64in.VXfromQ.laneNo);
2496436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         return;
2497436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case ARM64in_VMov: {
2498436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         UChar aux = '?';
2499436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         switch (i->ARM64in.VMov.szB) {
2500436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case 16: aux = 'q'; break;
2501436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case 8:  aux = 'd'; break;
2502436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case 4:  aux = 's'; break;
2503436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            default: break;
2504436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         }
2505436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         vex_printf("mov(%c) ", aux);
2506436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         ppHRegARM64(i->ARM64in.VMov.dst);
2507436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         vex_printf(", ");
2508436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         ppHRegARM64(i->ARM64in.VMov.src);
2509436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         return;
2510436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   }
2511436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ        case ARMin_NCMovQ:
2512436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          vex_printf("vmov%s ", showARMCondCode(i->ARMin.NCMovQ.cond));
2513436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          ppHRegARM(i->ARMin.NCMovQ.dst);
2514436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          vex_printf(", ");
2515436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          ppHRegARM(i->ARMin.NCMovQ.src);
2516436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          return;
2517436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMin_Add32:
2518436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          vex_printf("add32 ");
2519436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          ppHRegARM(i->ARMin.Add32.rD);
2520436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          vex_printf(", ");
2521436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          ppHRegARM(i->ARMin.Add32.rN);
2522436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          vex_printf(", ");
2523436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          vex_printf("%d", i->ARMin.Add32.imm32);
2524436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          return;
2525436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case ARM64in_EvCheck:
2526436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         vex_printf("(evCheck) ldr w9,");
2527436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         ppARM64AMode(i->ARM64in.EvCheck.amCounter);
2528436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         vex_printf("; subs w9,w9,$1; str w9,");
2529436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         ppARM64AMode(i->ARM64in.EvCheck.amCounter);
2530436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         vex_printf("; bpl nofail; ldr x9,");
2531436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         ppARM64AMode(i->ARM64in.EvCheck.amFailAddr);
2532436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         vex_printf("; br x9; nofail:");
2533436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         return;
2534436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMin_ProfInc:
2535436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          vex_printf("(profInc) movw r12,LO16($NotKnownYet); "
2536436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                     "movw r12,HI16($NotKnownYet); "
2537436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                     "ldr r11,[r12]; "
2538436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                     "adds r11,r11,$1; "
2539436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                     "str r11,[r12]; "
2540436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                     "ldr r11,[r12+4]; "
2541436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                     "adc r11,r11,$0; "
2542436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                     "str r11,[r12+4]");
2543436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          return;
2544436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      default:
2545436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         vex_printf("ppARM64Instr: unhandled case (tag %d)", (Int)i->tag);
2546436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         vpanic("ppARM64Instr(1)");
2547436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         return;
2548436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   }
2549436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
2550436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
2551436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
2552436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov/* --------- Helpers for register allocation. --------- */
2553436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
2554436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovvoid getRegUsage_ARM64Instr ( HRegUsage* u, ARM64Instr* i, Bool mode64 )
2555436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
2556436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   vassert(mode64 == True);
2557436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   initHRegUsage(u);
2558436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   switch (i->tag) {
2559436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case ARM64in_Arith:
2560436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         addHRegUse(u, HRmWrite, i->ARM64in.Arith.dst);
2561436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         addHRegUse(u, HRmRead, i->ARM64in.Arith.argL);
2562436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         addRegUsage_ARM64RIA(u, i->ARM64in.Arith.argR);
2563436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         return;
2564436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case ARM64in_Cmp:
2565436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         addHRegUse(u, HRmRead, i->ARM64in.Cmp.argL);
2566436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         addRegUsage_ARM64RIA(u, i->ARM64in.Cmp.argR);
2567436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         return;
2568436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case ARM64in_Logic:
2569436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         addHRegUse(u, HRmWrite, i->ARM64in.Logic.dst);
2570436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         addHRegUse(u, HRmRead, i->ARM64in.Logic.argL);
2571436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         addRegUsage_ARM64RIL(u, i->ARM64in.Logic.argR);
2572436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         return;
2573436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case ARM64in_Test:
2574436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         addHRegUse(u, HRmRead, i->ARM64in.Test.argL);
2575436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         addRegUsage_ARM64RIL(u, i->ARM64in.Test.argR);
2576436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         return;
2577436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case ARM64in_Shift:
2578436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         addHRegUse(u, HRmWrite, i->ARM64in.Shift.dst);
2579436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         addHRegUse(u, HRmRead, i->ARM64in.Shift.argL);
2580436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         addRegUsage_ARM64RI6(u, i->ARM64in.Shift.argR);
2581436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         return;
2582436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case ARM64in_Unary:
2583436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         addHRegUse(u, HRmWrite, i->ARM64in.Unary.dst);
2584436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         addHRegUse(u, HRmRead, i->ARM64in.Unary.src);
2585436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         return;
2586436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case ARM64in_MovI:
2587436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         addHRegUse(u, HRmWrite, i->ARM64in.MovI.dst);
2588436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         addHRegUse(u, HRmRead,  i->ARM64in.MovI.src);
2589436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         return;
2590436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case ARM64in_Imm64:
2591436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         addHRegUse(u, HRmWrite, i->ARM64in.Imm64.dst);
2592436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         return;
2593436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case ARM64in_LdSt64:
2594436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         addRegUsage_ARM64AMode(u, i->ARM64in.LdSt64.amode);
2595436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         if (i->ARM64in.LdSt64.isLoad) {
2596436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            addHRegUse(u, HRmWrite, i->ARM64in.LdSt64.rD);
2597436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         } else {
2598436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            addHRegUse(u, HRmRead, i->ARM64in.LdSt64.rD);
2599436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         }
2600436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         return;
2601436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case ARM64in_LdSt32:
2602436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         addRegUsage_ARM64AMode(u, i->ARM64in.LdSt32.amode);
2603436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         if (i->ARM64in.LdSt32.isLoad) {
2604436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            addHRegUse(u, HRmWrite, i->ARM64in.LdSt32.rD);
2605436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         } else {
2606436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            addHRegUse(u, HRmRead, i->ARM64in.LdSt32.rD);
2607436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         }
2608436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         return;
2609436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case ARM64in_LdSt16:
2610436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         addRegUsage_ARM64AMode(u, i->ARM64in.LdSt16.amode);
2611436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         if (i->ARM64in.LdSt16.isLoad) {
2612436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            addHRegUse(u, HRmWrite, i->ARM64in.LdSt16.rD);
2613436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         } else {
2614436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            addHRegUse(u, HRmRead, i->ARM64in.LdSt16.rD);
2615436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         }
2616436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         return;
2617436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case ARM64in_LdSt8:
2618436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         addRegUsage_ARM64AMode(u, i->ARM64in.LdSt8.amode);
2619436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         if (i->ARM64in.LdSt8.isLoad) {
2620436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            addHRegUse(u, HRmWrite, i->ARM64in.LdSt8.rD);
2621436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         } else {
2622436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            addHRegUse(u, HRmRead, i->ARM64in.LdSt8.rD);
2623436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         }
2624436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         return;
2625436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      /* XDirect/XIndir/XAssisted are also a bit subtle.  They
2626436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         conditionally exit the block.  Hence we only need to list (1)
2627436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         the registers that they read, and (2) the registers that they
2628436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         write in the case where the block is not exited.  (2) is
2629436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         empty, hence only (1) is relevant here. */
2630436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case ARM64in_XDirect:
2631436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         addRegUsage_ARM64AMode(u, i->ARM64in.XDirect.amPC);
2632436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         return;
2633436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case ARM64in_XIndir:
2634436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         addHRegUse(u, HRmRead, i->ARM64in.XIndir.dstGA);
2635436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         addRegUsage_ARM64AMode(u, i->ARM64in.XIndir.amPC);
2636436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         return;
2637436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case ARM64in_XAssisted:
2638436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         addHRegUse(u, HRmRead, i->ARM64in.XAssisted.dstGA);
2639436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         addRegUsage_ARM64AMode(u, i->ARM64in.XAssisted.amPC);
2640436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         return;
2641436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case ARM64in_CSel:
2642436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         addHRegUse(u, HRmWrite, i->ARM64in.CSel.dst);
2643436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         addHRegUse(u, HRmRead,  i->ARM64in.CSel.argL);
2644436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         addHRegUse(u, HRmRead,  i->ARM64in.CSel.argR);
2645436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         return;
2646436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case ARM64in_Call:
2647436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         /* logic and comments copied/modified from x86 back end */
2648436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         /* This is a bit subtle. */
2649436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         /* First off, claim it trashes all the caller-saved regs
2650436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            which fall within the register allocator's jurisdiction.
2651436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            These I believe to be x0 to x7.  Also need to be
2652436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            careful about vector regs. */
2653436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         addHRegUse(u, HRmWrite, hregARM64_X0());
2654436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         addHRegUse(u, HRmWrite, hregARM64_X1());
2655436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         addHRegUse(u, HRmWrite, hregARM64_X2());
2656436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         addHRegUse(u, HRmWrite, hregARM64_X3());
2657436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         addHRegUse(u, HRmWrite, hregARM64_X4());
2658436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         addHRegUse(u, HRmWrite, hregARM64_X5());
2659436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         addHRegUse(u, HRmWrite, hregARM64_X6());
2660436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         addHRegUse(u, HRmWrite, hregARM64_X7());
2661436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         addHRegUse(u, HRmWrite, hregARM64_Q16());
2662436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         addHRegUse(u, HRmWrite, hregARM64_Q17());
2663436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         addHRegUse(u, HRmWrite, hregARM64_Q18());
2664436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         /* Now we have to state any parameter-carrying registers
2665436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            which might be read.  This depends on nArgRegs. */
2666436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            switch (i->ARM64in.Call.nArgRegs) {
2667436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case 8: addHRegUse(u, HRmRead, hregARM64_X7()); /*fallthru*/
2668436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case 7: addHRegUse(u, HRmRead, hregARM64_X6()); /*fallthru*/
2669436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case 6: addHRegUse(u, HRmRead, hregARM64_X5()); /*fallthru*/
2670436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case 5: addHRegUse(u, HRmRead, hregARM64_X4()); /*fallthru*/
2671436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case 4: addHRegUse(u, HRmRead, hregARM64_X3()); /*fallthru*/
2672436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case 3: addHRegUse(u, HRmRead, hregARM64_X2()); /*fallthru*/
2673436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case 2: addHRegUse(u, HRmRead, hregARM64_X1()); /*fallthru*/
2674436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case 1: addHRegUse(u, HRmRead, hregARM64_X0()); break;
2675436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case 0: break;
2676436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            default: vpanic("getRegUsage_ARM64:Call:regparms");
2677436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         }
2678436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         /* Finally, there is the issue that the insn trashes a
2679436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            register because the literal target address has to be
2680436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            loaded into a register.  However, we reserve x9 for that
2681436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            purpose so there's no further complexity here.  Stating x9
2682436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            as trashed is pointless since it's not under the control
2683436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            of the allocator, but what the hell. */
2684436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         addHRegUse(u, HRmWrite, hregARM64_X9());
2685436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         return;
2686436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case ARM64in_AddToSP:
2687436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         /* Only changes SP, but regalloc doesn't control that, hence
2688436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            we don't care. */
2689436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         return;
2690436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case ARM64in_FromSP:
2691436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         addHRegUse(u, HRmWrite, i->ARM64in.FromSP.dst);
2692436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         return;
2693436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case ARM64in_Mul:
2694436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         addHRegUse(u, HRmWrite, i->ARM64in.Mul.dst);
2695436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         addHRegUse(u, HRmRead,  i->ARM64in.Mul.argL);
2696436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         addHRegUse(u, HRmRead,  i->ARM64in.Mul.argR);
2697436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         return;
2698436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case ARM64in_LdrEX:
2699436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         addHRegUse(u, HRmRead, hregARM64_X4());
2700436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         addHRegUse(u, HRmWrite, hregARM64_X2());
2701436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         return;
2702436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case ARM64in_StrEX:
2703436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         addHRegUse(u, HRmRead, hregARM64_X4());
2704436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         addHRegUse(u, HRmWrite, hregARM64_X0());
2705436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         addHRegUse(u, HRmRead, hregARM64_X2());
2706436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         return;
2707436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case ARM64in_MFence:
2708436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         return;
2709436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMin_CLREX:
2710436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          return;
2711436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case ARM64in_VLdStS:
2712436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         addHRegUse(u, HRmRead, i->ARM64in.VLdStS.rN);
2713436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         if (i->ARM64in.VLdStS.isLoad) {
2714436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            addHRegUse(u, HRmWrite, i->ARM64in.VLdStS.sD);
2715436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         } else {
2716436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            addHRegUse(u, HRmRead, i->ARM64in.VLdStS.sD);
2717436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         }
2718436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         return;
2719436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case ARM64in_VLdStD:
2720436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         addHRegUse(u, HRmRead, i->ARM64in.VLdStD.rN);
2721436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         if (i->ARM64in.VLdStD.isLoad) {
2722436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            addHRegUse(u, HRmWrite, i->ARM64in.VLdStD.dD);
2723436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         } else {
2724436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            addHRegUse(u, HRmRead, i->ARM64in.VLdStD.dD);
2725436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         }
2726436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         return;
2727436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case ARM64in_VLdStQ:
2728436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         addHRegUse(u, HRmRead, i->ARM64in.VLdStQ.rN);
2729436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         if (i->ARM64in.VLdStQ.isLoad)
2730436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            addHRegUse(u, HRmWrite, i->ARM64in.VLdStQ.rQ);
2731436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         else
2732436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            addHRegUse(u, HRmRead, i->ARM64in.VLdStQ.rQ);
2733436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         return;
2734436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case ARM64in_VCvtI2F:
2735436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         addHRegUse(u, HRmRead, i->ARM64in.VCvtI2F.rS);
2736436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         addHRegUse(u, HRmWrite, i->ARM64in.VCvtI2F.rD);
2737436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         return;
2738436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case ARM64in_VCvtF2I:
2739436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         addHRegUse(u, HRmRead, i->ARM64in.VCvtF2I.rS);
2740436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         addHRegUse(u, HRmWrite, i->ARM64in.VCvtF2I.rD);
2741436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         return;
2742436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case ARM64in_VCvtSD:
2743436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         addHRegUse(u, HRmWrite, i->ARM64in.VCvtSD.dst);
2744436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         addHRegUse(u, HRmRead,  i->ARM64in.VCvtSD.src);
2745436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         return;
2746436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case ARM64in_VUnaryD:
2747436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         addHRegUse(u, HRmWrite, i->ARM64in.VUnaryD.dst);
2748436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         addHRegUse(u, HRmRead, i->ARM64in.VUnaryD.src);
2749436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         return;
2750436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case ARM64in_VUnaryS:
2751436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         addHRegUse(u, HRmWrite, i->ARM64in.VUnaryS.dst);
2752436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         addHRegUse(u, HRmRead, i->ARM64in.VUnaryS.src);
2753436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         return;
2754436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case ARM64in_VBinD:
2755436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         addHRegUse(u, HRmWrite, i->ARM64in.VBinD.dst);
2756436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         addHRegUse(u, HRmRead, i->ARM64in.VBinD.argL);
2757436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         addHRegUse(u, HRmRead, i->ARM64in.VBinD.argR);
2758436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         return;
2759436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case ARM64in_VBinS:
2760436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         addHRegUse(u, HRmWrite, i->ARM64in.VBinS.dst);
2761436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         addHRegUse(u, HRmRead, i->ARM64in.VBinS.argL);
2762436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         addHRegUse(u, HRmRead, i->ARM64in.VBinS.argR);
2763436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         return;
2764436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case ARM64in_VCmpD:
2765436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         addHRegUse(u, HRmRead, i->ARM64in.VCmpD.argL);
2766436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         addHRegUse(u, HRmRead, i->ARM64in.VCmpD.argR);
2767436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         return;
2768436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case ARM64in_VCmpS:
2769436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         addHRegUse(u, HRmRead, i->ARM64in.VCmpS.argL);
2770436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         addHRegUse(u, HRmRead, i->ARM64in.VCmpS.argR);
2771436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         return;
2772436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case ARM64in_FPCR:
2773436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         if (i->ARM64in.FPCR.toFPCR)
2774436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            addHRegUse(u, HRmRead, i->ARM64in.FPCR.iReg);
2775436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         else
2776436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            addHRegUse(u, HRmWrite, i->ARM64in.FPCR.iReg);
2777436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         return;
2778436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case ARM64in_VBinV:
2779436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         addHRegUse(u, HRmWrite, i->ARM64in.VBinV.dst);
2780436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         addHRegUse(u, HRmRead, i->ARM64in.VBinV.argL);
2781436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         addHRegUse(u, HRmRead, i->ARM64in.VBinV.argR);
2782436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         return;
2783436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case ARM64in_VUnaryV:
2784436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         addHRegUse(u, HRmWrite, i->ARM64in.VUnaryV.dst);
2785436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         addHRegUse(u, HRmRead, i->ARM64in.VUnaryV.arg);
2786436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         return;
2787436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case ARM64in_VNarrowV:
2788436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         addHRegUse(u, HRmWrite, i->ARM64in.VNarrowV.dst);
2789436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         addHRegUse(u, HRmRead, i->ARM64in.VNarrowV.src);
2790436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         return;
2791436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case ARM64in_VShiftImmV:
2792436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         addHRegUse(u, HRmWrite, i->ARM64in.VShiftImmV.dst);
2793436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         addHRegUse(u, HRmRead, i->ARM64in.VShiftImmV.src);
2794436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         return;
2795436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMin_VAluS:
2796436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          addHRegUse(u, HRmWrite, i->ARMin.VAluS.dst);
2797436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          addHRegUse(u, HRmRead, i->ARMin.VAluS.argL);
2798436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          addHRegUse(u, HRmRead, i->ARMin.VAluS.argR);
2799436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          return;
2800436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMin_VUnaryS:
2801436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          addHRegUse(u, HRmWrite, i->ARMin.VUnaryS.dst);
2802436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          addHRegUse(u, HRmRead, i->ARMin.VUnaryS.src);
2803436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          return;
2804436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMin_VCMovD:
2805436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          addHRegUse(u, HRmWrite, i->ARMin.VCMovD.dst);
2806436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          addHRegUse(u, HRmRead,  i->ARMin.VCMovD.dst);
2807436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          addHRegUse(u, HRmRead,  i->ARMin.VCMovD.src);
2808436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          return;
2809436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMin_VCMovS:
2810436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          addHRegUse(u, HRmWrite, i->ARMin.VCMovS.dst);
2811436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          addHRegUse(u, HRmRead,  i->ARMin.VCMovS.dst);
2812436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          addHRegUse(u, HRmRead,  i->ARMin.VCMovS.src);
2813436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          return;
2814436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMin_VXferD:
2815436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          if (i->ARMin.VXferD.toD) {
2816436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             addHRegUse(u, HRmWrite, i->ARMin.VXferD.dD);
2817436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             addHRegUse(u, HRmRead,  i->ARMin.VXferD.rHi);
2818436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             addHRegUse(u, HRmRead,  i->ARMin.VXferD.rLo);
2819436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          } else {
2820436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             addHRegUse(u, HRmRead,  i->ARMin.VXferD.dD);
2821436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             addHRegUse(u, HRmWrite, i->ARMin.VXferD.rHi);
2822436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             addHRegUse(u, HRmWrite, i->ARMin.VXferD.rLo);
2823436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          }
2824436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          return;
2825436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMin_VXferS:
2826436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          if (i->ARMin.VXferS.toS) {
2827436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             addHRegUse(u, HRmWrite, i->ARMin.VXferS.fD);
2828436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             addHRegUse(u, HRmRead,  i->ARMin.VXferS.rLo);
2829436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          } else {
2830436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             addHRegUse(u, HRmRead,  i->ARMin.VXferS.fD);
2831436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             addHRegUse(u, HRmWrite, i->ARMin.VXferS.rLo);
2832436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          }
2833436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          return;
2834436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMin_VCvtID:
2835436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          addHRegUse(u, HRmWrite, i->ARMin.VCvtID.dst);
2836436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          addHRegUse(u, HRmRead,  i->ARMin.VCvtID.src);
2837436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          return;
2838436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMin_NLdStD:
2839436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          if (i->ARMin.NLdStD.isLoad)
2840436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             addHRegUse(u, HRmWrite, i->ARMin.NLdStD.dD);
2841436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          else
2842436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             addHRegUse(u, HRmRead, i->ARMin.NLdStD.dD);
2843436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          addRegUsage_ARMAModeN(u, i->ARMin.NLdStD.amode);
2844436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          return;
2845436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMin_NUnary:
2846436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          addHRegUse(u, HRmWrite, i->ARMin.NUnary.dst);
2847436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          addHRegUse(u, HRmRead, i->ARMin.NUnary.src);
2848436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          return;
2849436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMin_NUnaryS:
2850436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          addHRegUse(u, HRmWrite, i->ARMin.NUnaryS.dst->reg);
2851436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          addHRegUse(u, HRmRead, i->ARMin.NUnaryS.src->reg);
2852436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          return;
2853436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMin_NShift:
2854436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          addHRegUse(u, HRmWrite, i->ARMin.NShift.dst);
2855436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          addHRegUse(u, HRmRead, i->ARMin.NShift.argL);
2856436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          addHRegUse(u, HRmRead, i->ARMin.NShift.argR);
2857436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          return;
2858436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMin_NShl64:
2859436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          addHRegUse(u, HRmWrite, i->ARMin.NShl64.dst);
2860436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          addHRegUse(u, HRmRead, i->ARMin.NShl64.src);
2861436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          return;
2862436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMin_NDual:
2863436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          addHRegUse(u, HRmWrite, i->ARMin.NDual.arg1);
2864436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          addHRegUse(u, HRmWrite, i->ARMin.NDual.arg2);
2865436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          addHRegUse(u, HRmRead, i->ARMin.NDual.arg1);
2866436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          addHRegUse(u, HRmRead, i->ARMin.NDual.arg2);
2867436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          return;
2868436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case ARM64in_VImmQ:
2869436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         addHRegUse(u, HRmWrite, i->ARM64in.VImmQ.rQ);
2870436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         return;
2871436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case ARM64in_VDfromX:
2872436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         addHRegUse(u, HRmWrite, i->ARM64in.VDfromX.rD);
2873436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         addHRegUse(u, HRmRead,  i->ARM64in.VDfromX.rX);
2874436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         return;
2875436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case ARM64in_VQfromXX:
2876436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         addHRegUse(u, HRmWrite, i->ARM64in.VQfromXX.rQ);
2877436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         addHRegUse(u, HRmRead,  i->ARM64in.VQfromXX.rXhi);
2878436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         addHRegUse(u, HRmRead,  i->ARM64in.VQfromXX.rXlo);
2879436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         return;
2880436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case ARM64in_VXfromQ:
2881436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         addHRegUse(u, HRmWrite, i->ARM64in.VXfromQ.rX);
2882436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         addHRegUse(u, HRmRead,  i->ARM64in.VXfromQ.rQ);
2883436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         return;
2884436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case ARM64in_VMov:
2885436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         addHRegUse(u, HRmWrite, i->ARM64in.VMov.dst);
2886436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         addHRegUse(u, HRmRead,  i->ARM64in.VMov.src);
2887436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         return;
2888436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMin_NBinary:
2889436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          addHRegUse(u, HRmWrite, i->ARMin.NBinary.dst);
2890436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          /* TODO: sometimes dst is also being read! */
2891436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          // XXX fix this
2892436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          addHRegUse(u, HRmRead, i->ARMin.NBinary.argL);
2893436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          addHRegUse(u, HRmRead, i->ARMin.NBinary.argR);
2894436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          return;
2895436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMin_NCMovQ:
2896436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          addHRegUse(u, HRmWrite, i->ARMin.NCMovQ.dst);
2897436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          addHRegUse(u, HRmRead,  i->ARMin.NCMovQ.dst);
2898436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          addHRegUse(u, HRmRead,  i->ARMin.NCMovQ.src);
2899436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          return;
2900436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMin_Add32:
2901436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          addHRegUse(u, HRmWrite, i->ARMin.Add32.rD);
2902436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          addHRegUse(u, HRmRead, i->ARMin.Add32.rN);
2903436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          return;
2904436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case ARM64in_EvCheck:
2905436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         /* We expect both amodes only to mention x21, so this is in
2906436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            fact pointless, since x21 isn't allocatable, but
2907436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            anyway.. */
2908436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         addRegUsage_ARM64AMode(u, i->ARM64in.EvCheck.amCounter);
2909436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         addRegUsage_ARM64AMode(u, i->ARM64in.EvCheck.amFailAddr);
2910436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         addHRegUse(u, HRmWrite, hregARM64_X9()); /* also unavail to RA */
2911436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         return;
2912436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMin_ProfInc:
2913436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          addHRegUse(u, HRmWrite, hregARM_R12());
2914436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          addHRegUse(u, HRmWrite, hregARM_R11());
2915436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          return;
2916436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      default:
2917436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         ppARM64Instr(i);
2918436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         vpanic("getRegUsage_ARM64Instr");
2919436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   }
2920436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
2921436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
2922436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
2923436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovvoid mapRegs_ARM64Instr ( HRegRemap* m, ARM64Instr* i, Bool mode64 )
2924436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
2925436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   vassert(mode64 == True);
2926436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   switch (i->tag) {
2927436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case ARM64in_Arith:
2928436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         i->ARM64in.Arith.dst = lookupHRegRemap(m, i->ARM64in.Arith.dst);
2929436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         i->ARM64in.Arith.argL = lookupHRegRemap(m, i->ARM64in.Arith.argL);
2930436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         mapRegs_ARM64RIA(m, i->ARM64in.Arith.argR);
2931436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         return;
2932436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case ARM64in_Cmp:
2933436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         i->ARM64in.Cmp.argL = lookupHRegRemap(m, i->ARM64in.Cmp.argL);
2934436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         mapRegs_ARM64RIA(m, i->ARM64in.Cmp.argR);
2935436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         return;
2936436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case ARM64in_Logic:
2937436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         i->ARM64in.Logic.dst = lookupHRegRemap(m, i->ARM64in.Logic.dst);
2938436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         i->ARM64in.Logic.argL = lookupHRegRemap(m, i->ARM64in.Logic.argL);
2939436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         mapRegs_ARM64RIL(m, i->ARM64in.Logic.argR);
2940436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         return;
2941436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case ARM64in_Test:
2942436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         i->ARM64in.Test.argL = lookupHRegRemap(m, i->ARM64in.Test.argL);
2943436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         mapRegs_ARM64RIL(m, i->ARM64in.Logic.argR);
2944436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         return;
2945436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case ARM64in_Shift:
2946436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         i->ARM64in.Shift.dst = lookupHRegRemap(m, i->ARM64in.Shift.dst);
2947436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         i->ARM64in.Shift.argL = lookupHRegRemap(m, i->ARM64in.Shift.argL);
2948436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         mapRegs_ARM64RI6(m, i->ARM64in.Shift.argR);
2949436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         return;
2950436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case ARM64in_Unary:
2951436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         i->ARM64in.Unary.dst = lookupHRegRemap(m, i->ARM64in.Unary.dst);
2952436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         i->ARM64in.Unary.src = lookupHRegRemap(m, i->ARM64in.Unary.src);
2953436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         return;
2954436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case ARM64in_MovI:
2955436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         i->ARM64in.MovI.dst = lookupHRegRemap(m, i->ARM64in.MovI.dst);
2956436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         i->ARM64in.MovI.src = lookupHRegRemap(m, i->ARM64in.MovI.src);
2957436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         return;
2958436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case ARM64in_Imm64:
2959436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         i->ARM64in.Imm64.dst = lookupHRegRemap(m, i->ARM64in.Imm64.dst);
2960436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         return;
2961436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case ARM64in_LdSt64:
2962436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         i->ARM64in.LdSt64.rD = lookupHRegRemap(m, i->ARM64in.LdSt64.rD);
2963436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         mapRegs_ARM64AMode(m, i->ARM64in.LdSt64.amode);
2964436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         return;
2965436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case ARM64in_LdSt32:
2966436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         i->ARM64in.LdSt32.rD = lookupHRegRemap(m, i->ARM64in.LdSt32.rD);
2967436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         mapRegs_ARM64AMode(m, i->ARM64in.LdSt32.amode);
2968436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         return;
2969436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case ARM64in_LdSt16:
2970436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         i->ARM64in.LdSt16.rD = lookupHRegRemap(m, i->ARM64in.LdSt16.rD);
2971436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         mapRegs_ARM64AMode(m, i->ARM64in.LdSt16.amode);
2972436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         return;
2973436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case ARM64in_LdSt8:
2974436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         i->ARM64in.LdSt8.rD = lookupHRegRemap(m, i->ARM64in.LdSt8.rD);
2975436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         mapRegs_ARM64AMode(m, i->ARM64in.LdSt8.amode);
2976436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         return;
2977436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case ARM64in_XDirect:
2978436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         mapRegs_ARM64AMode(m, i->ARM64in.XDirect.amPC);
2979436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         return;
2980436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case ARM64in_XIndir:
2981436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         i->ARM64in.XIndir.dstGA
2982436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            = lookupHRegRemap(m, i->ARM64in.XIndir.dstGA);
2983436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         mapRegs_ARM64AMode(m, i->ARM64in.XIndir.amPC);
2984436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         return;
2985436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case ARM64in_XAssisted:
2986436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         i->ARM64in.XAssisted.dstGA
2987436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            = lookupHRegRemap(m, i->ARM64in.XAssisted.dstGA);
2988436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         mapRegs_ARM64AMode(m, i->ARM64in.XAssisted.amPC);
2989436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         return;
2990436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case ARM64in_CSel:
2991436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         i->ARM64in.CSel.dst  = lookupHRegRemap(m, i->ARM64in.CSel.dst);
2992436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         i->ARM64in.CSel.argL = lookupHRegRemap(m, i->ARM64in.CSel.argL);
2993436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         i->ARM64in.CSel.argR = lookupHRegRemap(m, i->ARM64in.CSel.argR);
2994436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         return;
2995436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case ARM64in_Call:
2996436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         return;
2997436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case ARM64in_AddToSP:
2998436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         return;
2999436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case ARM64in_FromSP:
3000436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         i->ARM64in.FromSP.dst = lookupHRegRemap(m, i->ARM64in.FromSP.dst);
3001436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         return;
3002436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case ARM64in_Mul:
3003436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         i->ARM64in.Mul.dst  = lookupHRegRemap(m, i->ARM64in.Mul.dst);
3004436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         i->ARM64in.Mul.argL = lookupHRegRemap(m, i->ARM64in.Mul.argL);
3005436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         i->ARM64in.Mul.argR = lookupHRegRemap(m, i->ARM64in.Mul.argR);
3006436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         break;
3007436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case ARM64in_LdrEX:
3008436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         return;
3009436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case ARM64in_StrEX:
3010436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         return;
3011436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case ARM64in_MFence:
3012436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         return;
3013436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMin_CLREX:
3014436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          return;
3015436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case ARM64in_VLdStS:
3016436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         i->ARM64in.VLdStS.sD = lookupHRegRemap(m, i->ARM64in.VLdStS.sD);
3017436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         i->ARM64in.VLdStS.rN = lookupHRegRemap(m, i->ARM64in.VLdStS.rN);
3018436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         return;
3019436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case ARM64in_VLdStD:
3020436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         i->ARM64in.VLdStD.dD = lookupHRegRemap(m, i->ARM64in.VLdStD.dD);
3021436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         i->ARM64in.VLdStD.rN = lookupHRegRemap(m, i->ARM64in.VLdStD.rN);
3022436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         return;
3023436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case ARM64in_VLdStQ:
3024436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         i->ARM64in.VLdStQ.rQ = lookupHRegRemap(m, i->ARM64in.VLdStQ.rQ);
3025436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         i->ARM64in.VLdStQ.rN = lookupHRegRemap(m, i->ARM64in.VLdStQ.rN);
3026436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         return;
3027436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case ARM64in_VCvtI2F:
3028436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         i->ARM64in.VCvtI2F.rS = lookupHRegRemap(m, i->ARM64in.VCvtI2F.rS);
3029436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         i->ARM64in.VCvtI2F.rD = lookupHRegRemap(m, i->ARM64in.VCvtI2F.rD);
3030436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         return;
3031436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case ARM64in_VCvtF2I:
3032436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         i->ARM64in.VCvtF2I.rS = lookupHRegRemap(m, i->ARM64in.VCvtF2I.rS);
3033436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         i->ARM64in.VCvtF2I.rD = lookupHRegRemap(m, i->ARM64in.VCvtF2I.rD);
3034436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         return;
3035436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case ARM64in_VCvtSD:
3036436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         i->ARM64in.VCvtSD.dst = lookupHRegRemap(m, i->ARM64in.VCvtSD.dst);
3037436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         i->ARM64in.VCvtSD.src = lookupHRegRemap(m, i->ARM64in.VCvtSD.src);
3038436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         return;
3039436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case ARM64in_VUnaryD:
3040436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         i->ARM64in.VUnaryD.dst = lookupHRegRemap(m, i->ARM64in.VUnaryD.dst);
3041436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         i->ARM64in.VUnaryD.src = lookupHRegRemap(m, i->ARM64in.VUnaryD.src);
3042436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         return;
3043436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case ARM64in_VUnaryS:
3044436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         i->ARM64in.VUnaryS.dst = lookupHRegRemap(m, i->ARM64in.VUnaryS.dst);
3045436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         i->ARM64in.VUnaryS.src = lookupHRegRemap(m, i->ARM64in.VUnaryS.src);
3046436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         return;
3047436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case ARM64in_VBinD:
3048436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         i->ARM64in.VBinD.dst  = lookupHRegRemap(m, i->ARM64in.VBinD.dst);
3049436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         i->ARM64in.VBinD.argL = lookupHRegRemap(m, i->ARM64in.VBinD.argL);
3050436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         i->ARM64in.VBinD.argR = lookupHRegRemap(m, i->ARM64in.VBinD.argR);
3051436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         return;
3052436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case ARM64in_VBinS:
3053436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         i->ARM64in.VBinS.dst  = lookupHRegRemap(m, i->ARM64in.VBinS.dst);
3054436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         i->ARM64in.VBinS.argL = lookupHRegRemap(m, i->ARM64in.VBinS.argL);
3055436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         i->ARM64in.VBinS.argR = lookupHRegRemap(m, i->ARM64in.VBinS.argR);
3056436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         return;
3057436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case ARM64in_VCmpD:
3058436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         i->ARM64in.VCmpD.argL = lookupHRegRemap(m, i->ARM64in.VCmpD.argL);
3059436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         i->ARM64in.VCmpD.argR = lookupHRegRemap(m, i->ARM64in.VCmpD.argR);
3060436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         return;
3061436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case ARM64in_VCmpS:
3062436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         i->ARM64in.VCmpS.argL = lookupHRegRemap(m, i->ARM64in.VCmpS.argL);
3063436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         i->ARM64in.VCmpS.argR = lookupHRegRemap(m, i->ARM64in.VCmpS.argR);
3064436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         return;
3065436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case ARM64in_FPCR:
3066436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         i->ARM64in.FPCR.iReg = lookupHRegRemap(m, i->ARM64in.FPCR.iReg);
3067436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         return;
3068436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case ARM64in_VBinV:
3069436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         i->ARM64in.VBinV.dst  = lookupHRegRemap(m, i->ARM64in.VBinV.dst);
3070436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         i->ARM64in.VBinV.argL = lookupHRegRemap(m, i->ARM64in.VBinV.argL);
3071436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         i->ARM64in.VBinV.argR = lookupHRegRemap(m, i->ARM64in.VBinV.argR);
3072436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         return;
3073436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case ARM64in_VUnaryV:
3074436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         i->ARM64in.VUnaryV.dst = lookupHRegRemap(m, i->ARM64in.VUnaryV.dst);
3075436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         i->ARM64in.VUnaryV.arg = lookupHRegRemap(m, i->ARM64in.VUnaryV.arg);
3076436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         return;
3077436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case ARM64in_VNarrowV:
3078436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         i->ARM64in.VNarrowV.dst = lookupHRegRemap(m, i->ARM64in.VNarrowV.dst);
3079436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         i->ARM64in.VNarrowV.src = lookupHRegRemap(m, i->ARM64in.VNarrowV.src);
3080436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         return;
3081436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case ARM64in_VShiftImmV:
3082436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         i->ARM64in.VShiftImmV.dst
3083436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            = lookupHRegRemap(m, i->ARM64in.VShiftImmV.dst);
3084436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         i->ARM64in.VShiftImmV.src
3085436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            = lookupHRegRemap(m, i->ARM64in.VShiftImmV.src);
3086436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         return;
3087436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMin_VAluS:
3088436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          i->ARMin.VAluS.dst  = lookupHRegRemap(m, i->ARMin.VAluS.dst);
3089436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          i->ARMin.VAluS.argL = lookupHRegRemap(m, i->ARMin.VAluS.argL);
3090436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          i->ARMin.VAluS.argR = lookupHRegRemap(m, i->ARMin.VAluS.argR);
3091436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          return;
3092436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMin_VCMovD:
3093436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          i->ARMin.VCMovD.dst = lookupHRegRemap(m, i->ARMin.VCMovD.dst);
3094436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          i->ARMin.VCMovD.src = lookupHRegRemap(m, i->ARMin.VCMovD.src);
3095436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          return;
3096436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMin_VCMovS:
3097436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          i->ARMin.VCMovS.dst = lookupHRegRemap(m, i->ARMin.VCMovS.dst);
3098436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          i->ARMin.VCMovS.src = lookupHRegRemap(m, i->ARMin.VCMovS.src);
3099436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          return;
3100436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMin_VXferD:
3101436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          i->ARMin.VXferD.dD  = lookupHRegRemap(m, i->ARMin.VXferD.dD);
3102436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          i->ARMin.VXferD.rHi = lookupHRegRemap(m, i->ARMin.VXferD.rHi);
3103436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          i->ARMin.VXferD.rLo = lookupHRegRemap(m, i->ARMin.VXferD.rLo);
3104436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          return;
3105436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMin_VXferS:
3106436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          i->ARMin.VXferS.fD  = lookupHRegRemap(m, i->ARMin.VXferS.fD);
3107436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          i->ARMin.VXferS.rLo = lookupHRegRemap(m, i->ARMin.VXferS.rLo);
3108436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          return;
3109436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMin_VCvtID:
3110436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          i->ARMin.VCvtID.dst = lookupHRegRemap(m, i->ARMin.VCvtID.dst);
3111436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          i->ARMin.VCvtID.src = lookupHRegRemap(m, i->ARMin.VCvtID.src);
3112436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          return;
3113436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMin_NLdStD:
3114436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          i->ARMin.NLdStD.dD = lookupHRegRemap(m, i->ARMin.NLdStD.dD);
3115436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          mapRegs_ARMAModeN(m, i->ARMin.NLdStD.amode);
3116436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          return;
3117436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMin_NUnary:
3118436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          i->ARMin.NUnary.src = lookupHRegRemap(m, i->ARMin.NUnary.src);
3119436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          i->ARMin.NUnary.dst = lookupHRegRemap(m, i->ARMin.NUnary.dst);
3120436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          return;
3121436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMin_NUnaryS:
3122436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          i->ARMin.NUnaryS.src->reg
3123436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             = lookupHRegRemap(m, i->ARMin.NUnaryS.src->reg);
3124436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          i->ARMin.NUnaryS.dst->reg
3125436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             = lookupHRegRemap(m, i->ARMin.NUnaryS.dst->reg);
3126436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          return;
3127436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMin_NShift:
3128436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          i->ARMin.NShift.dst = lookupHRegRemap(m, i->ARMin.NShift.dst);
3129436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          i->ARMin.NShift.argL = lookupHRegRemap(m, i->ARMin.NShift.argL);
3130436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          i->ARMin.NShift.argR = lookupHRegRemap(m, i->ARMin.NShift.argR);
3131436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          return;
3132436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMin_NShl64:
3133436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          i->ARMin.NShl64.dst = lookupHRegRemap(m, i->ARMin.NShl64.dst);
3134436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          i->ARMin.NShl64.src = lookupHRegRemap(m, i->ARMin.NShl64.src);
3135436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          return;
3136436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMin_NDual:
3137436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          i->ARMin.NDual.arg1 = lookupHRegRemap(m, i->ARMin.NDual.arg1);
3138436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          i->ARMin.NDual.arg2 = lookupHRegRemap(m, i->ARMin.NDual.arg2);
3139436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          return;
3140436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case ARM64in_VImmQ:
3141436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         i->ARM64in.VImmQ.rQ = lookupHRegRemap(m, i->ARM64in.VImmQ.rQ);
3142436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         return;
3143436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case ARM64in_VDfromX:
3144436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         i->ARM64in.VDfromX.rD
3145436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            = lookupHRegRemap(m, i->ARM64in.VDfromX.rD);
3146436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         i->ARM64in.VDfromX.rX
3147436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            = lookupHRegRemap(m, i->ARM64in.VDfromX.rX);
3148436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         return;
3149436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case ARM64in_VQfromXX:
3150436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         i->ARM64in.VQfromXX.rQ
3151436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            = lookupHRegRemap(m, i->ARM64in.VQfromXX.rQ);
3152436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         i->ARM64in.VQfromXX.rXhi
3153436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            = lookupHRegRemap(m, i->ARM64in.VQfromXX.rXhi);
3154436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         i->ARM64in.VQfromXX.rXlo
3155436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            = lookupHRegRemap(m, i->ARM64in.VQfromXX.rXlo);
3156436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         return;
3157436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case ARM64in_VXfromQ:
3158436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         i->ARM64in.VXfromQ.rX
3159436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            = lookupHRegRemap(m, i->ARM64in.VXfromQ.rX);
3160436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         i->ARM64in.VXfromQ.rQ
3161436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            = lookupHRegRemap(m, i->ARM64in.VXfromQ.rQ);
3162436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         return;
3163436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case ARM64in_VMov:
3164436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         i->ARM64in.VMov.dst = lookupHRegRemap(m, i->ARM64in.VMov.dst);
3165436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         i->ARM64in.VMov.src = lookupHRegRemap(m, i->ARM64in.VMov.src);
3166436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         return;
3167436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
3168436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMin_NBinary:
3169436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          i->ARMin.NBinary.argL = lookupHRegRemap(m, i->ARMin.NBinary.argL);
3170436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          i->ARMin.NBinary.argR = lookupHRegRemap(m, i->ARMin.NBinary.argR);
3171436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          i->ARMin.NBinary.dst  = lookupHRegRemap(m, i->ARMin.NBinary.dst);
3172436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          return;
3173436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMin_NCMovQ:
3174436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          i->ARMin.NCMovQ.dst = lookupHRegRemap(m, i->ARMin.NCMovQ.dst);
3175436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          i->ARMin.NCMovQ.src = lookupHRegRemap(m, i->ARMin.NCMovQ.src);
3176436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          return;
3177436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMin_Add32:
3178436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          i->ARMin.Add32.rD = lookupHRegRemap(m, i->ARMin.Add32.rD);
3179436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          i->ARMin.Add32.rN = lookupHRegRemap(m, i->ARMin.Add32.rN);
3180436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          return;
3181436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case ARM64in_EvCheck:
3182436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         /* We expect both amodes only to mention x21, so this is in
3183436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            fact pointless, since x21 isn't allocatable, but
3184436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            anyway.. */
3185436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         mapRegs_ARM64AMode(m, i->ARM64in.EvCheck.amCounter);
3186436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         mapRegs_ARM64AMode(m, i->ARM64in.EvCheck.amFailAddr);
3187436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         return;
3188436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMin_ProfInc:
3189436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          /* hardwires r11 and r12 -- nothing to modify. */
3190436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          return;
3191436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      default:
3192436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         ppARM64Instr(i);
3193436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         vpanic("mapRegs_ARM64Instr");
3194436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   }
3195436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
3196436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
3197436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov/* Figure out if i represents a reg-reg move, and if so assign the
3198436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   source and destination to *src and *dst.  If in doubt say No.  Used
3199436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   by the register allocator to do move coalescing.
3200436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov*/
3201436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovBool isMove_ARM64Instr ( ARM64Instr* i, HReg* src, HReg* dst )
3202436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
3203436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   switch (i->tag) {
3204436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case ARM64in_MovI:
3205436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         *src = i->ARM64in.MovI.src;
3206436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         *dst = i->ARM64in.MovI.dst;
3207436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         return True;
3208436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case ARM64in_VMov:
3209436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         *src = i->ARM64in.VMov.src;
3210436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         *dst = i->ARM64in.VMov.dst;
3211436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         return True;
3212436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      default:
3213436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         break;
3214436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   }
3215436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
3216436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   return False;
3217436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
3218436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
3219436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
3220436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov/* Generate arm spill/reload instructions under the direction of the
3221436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   register allocator.  Note it's critical these don't write the
3222436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   condition codes. */
3223436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
3224436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovvoid genSpill_ARM64 ( /*OUT*/HInstr** i1, /*OUT*/HInstr** i2,
3225436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                      HReg rreg, Int offsetB, Bool mode64 )
3226436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
3227436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   HRegClass rclass;
3228436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   vassert(offsetB >= 0);
3229436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   vassert(!hregIsVirtual(rreg));
3230436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   vassert(mode64 == True);
3231436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   *i1 = *i2 = NULL;
3232436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   rclass = hregClass(rreg);
3233436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   switch (rclass) {
3234436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case HRcInt64:
3235436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         vassert(0 == (offsetB & 7));
3236436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         offsetB >>= 3;
3237436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         vassert(offsetB < 4096);
3238436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         *i1 = ARM64Instr_LdSt64(
3239436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  False/*!isLoad*/,
3240436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  rreg,
3241436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  ARM64AMode_RI12(hregARM64_X21(), offsetB, 8)
3242436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               );
3243436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         return;
3244436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case HRcFlt64:
3245436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         vassert(0 == (offsetB & 7));
3246436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         vassert(offsetB >= 0 && offsetB < 32768);
3247436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         *i1 = ARM64Instr_VLdStD(False/*!isLoad*/,
3248436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                 rreg, hregARM64_X21(), offsetB);
3249436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         return;
3250436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case HRcVec128: {
3251436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         HReg x21  = hregARM64_X21();  // baseblock
3252436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         HReg x9   = hregARM64_X9();   // spill temporary
3253436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         vassert(0 == (offsetB & 15)); // check sane alignment
3254436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         vassert(offsetB < 4096);
3255436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         *i1 = ARM64Instr_Arith(x9, x21, ARM64RIA_I12(offsetB, 0), True);
3256436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         *i2 = ARM64Instr_VLdStQ(False/*!isLoad*/, rreg, x9);
3257436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         return;
3258436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      }
3259436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      default:
3260436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         ppHRegClass(rclass);
3261436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         vpanic("genSpill_ARM: unimplemented regclass");
3262436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   }
3263436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
3264436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
3265436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovvoid genReload_ARM64 ( /*OUT*/HInstr** i1, /*OUT*/HInstr** i2,
3266436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                       HReg rreg, Int offsetB, Bool mode64 )
3267436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
3268436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   HRegClass rclass;
3269436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   vassert(offsetB >= 0);
3270436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   vassert(!hregIsVirtual(rreg));
3271436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   vassert(mode64 == True);
3272436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   *i1 = *i2 = NULL;
3273436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   rclass = hregClass(rreg);
3274436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   switch (rclass) {
3275436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case HRcInt64:
3276436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         vassert(0 == (offsetB & 7));
3277436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         offsetB >>= 3;
3278436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         vassert(offsetB < 4096);
3279436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         *i1 = ARM64Instr_LdSt64(
3280436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  True/*isLoad*/,
3281436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  rreg,
3282436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  ARM64AMode_RI12(hregARM64_X21(), offsetB, 8)
3283436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               );
3284436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         return;
3285436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case HRcFlt64:
3286436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         vassert(0 == (offsetB & 7));
3287436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         vassert(offsetB >= 0 && offsetB < 32768);
3288436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         *i1 = ARM64Instr_VLdStD(True/*isLoad*/,
3289436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                 rreg, hregARM64_X21(), offsetB);
3290436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         return;
3291436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case HRcVec128: {
3292436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         HReg x21  = hregARM64_X21();  // baseblock
3293436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         HReg x9   = hregARM64_X9();   // spill temporary
3294436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         vassert(0 == (offsetB & 15)); // check sane alignment
3295436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         vassert(offsetB < 4096);
3296436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         *i1 = ARM64Instr_Arith(x9, x21, ARM64RIA_I12(offsetB, 0), True);
3297436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         *i2 = ARM64Instr_VLdStQ(True/*isLoad*/, rreg, x9);
3298436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         return;
3299436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      }
3300436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      default:
3301436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         ppHRegClass(rclass);
3302436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         vpanic("genReload_ARM: unimplemented regclass");
3303436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   }
3304436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
3305436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
3306436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
3307436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ /* Emit an instruction into buf and return the number of bytes used.
3308436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    Note that buf is not the insn's final place, and therefore it is
3309436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    imperative to emit position-independent code. */
3310436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
3311436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic inline UChar iregNo ( HReg r )
3312436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
3313436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   UInt n;
3314436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   vassert(hregClass(r) == HRcInt64);
3315436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   vassert(!hregIsVirtual(r));
3316436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   n = hregNumber(r);
3317436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   vassert(n <= 30);
3318436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   return toUChar(n);
3319436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
3320436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
3321436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic inline UChar dregNo ( HReg r )
3322436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
3323436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   UInt n;
33240a8046eb0993fb7e155b03cc5ef3323fca3467c0Dmitriy Ivanov   vassert(hregClass(r) == HRcFlt64 || hregClass(r) == HRcInt64);
3325436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   vassert(!hregIsVirtual(r));
3326436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   n = hregNumber(r);
3327436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   vassert(n <= 31);
3328436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   return toUChar(n);
3329436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
3330436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
3331436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic inline UChar qregNo ( HReg r )
3332436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
3333436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   UInt n;
3334436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   vassert(hregClass(r) == HRcVec128);
3335436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   vassert(!hregIsVirtual(r));
3336436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   n = hregNumber(r);
3337436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   vassert(n <= 31);
3338436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   return toUChar(n);
3339436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
3340436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
3341436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define BITS4(zzb3,zzb2,zzb1,zzb0) \
3342436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   (((zzb3) << 3) | ((zzb2) << 2) | ((zzb1) << 1) | (zzb0))
3343436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
3344436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define X00  BITS4(0,0, 0,0)
3345436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define X01  BITS4(0,0, 0,1)
3346436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define X10  BITS4(0,0, 1,0)
3347436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define X11  BITS4(0,0, 1,1)
3348436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
3349436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define X000 BITS4(0, 0,0,0)
3350436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define X001 BITS4(0, 0,0,1)
3351436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define X010 BITS4(0, 0,1,0)
3352436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define X011 BITS4(0, 0,1,1)
3353436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define X100 BITS4(0, 1,0,0)
3354436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define X101 BITS4(0, 1,0,1)
3355436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define X110 BITS4(0, 1,1,0)
3356436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define X111 BITS4(0, 1,1,1)
3357436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
3358436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define X0000 BITS4(0,0,0,0)
3359436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define X0001 BITS4(0,0,0,1)
3360436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define X0010 BITS4(0,0,1,0)
3361436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define X0011 BITS4(0,0,1,1)
3362436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
3363436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define BITS8(zzb7,zzb6,zzb5,zzb4,zzb3,zzb2,zzb1,zzb0) \
3364436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  ((BITS4(zzb7,zzb6,zzb5,zzb4) << 4) | BITS4(zzb3,zzb2,zzb1,zzb0))
3365436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
3366436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define X00000   BITS8(0,0,0, 0,0,0,0,0)
3367436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define X00001   BITS8(0,0,0, 0,0,0,0,1)
3368436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define X00111   BITS8(0,0,0, 0,0,1,1,1)
3369436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define X01000   BITS8(0,0,0, 0,1,0,0,0)
3370436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define X10000   BITS8(0,0,0, 1,0,0,0,0)
3371436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define X11000   BITS8(0,0,0, 1,1,0,0,0)
3372436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define X11110   BITS8(0,0,0, 1,1,1,1,0)
3373436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define X11111   BITS8(0,0,0, 1,1,1,1,1)
3374436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
3375436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define X000000  BITS8(0,0, 0,0,0,0,0,0)
3376436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define X000001  BITS8(0,0, 0,0,0,0,0,1)
3377436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define X000100  BITS8(0,0, 0,0,0,1,0,0)
3378436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define X000111  BITS8(0,0, 0,0,0,1,1,1)
3379436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define X001000  BITS8(0,0, 0,0,1,0,0,0)
3380436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define X001001  BITS8(0,0, 0,0,1,0,0,1)
3381436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define X001010  BITS8(0,0, 0,0,1,0,1,0)
3382eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov#define X001101  BITS8(0,0, 0,0,1,1,0,1)
3383051d3b5d6376aa10a65793c3c2267d6ab233b896Dmitriy Ivanov#define X001110  BITS8(0,0, 0,0,1,1,1,0)
3384436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define X001111  BITS8(0,0, 0,0,1,1,1,1)
3385436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define X010000  BITS8(0,0, 0,1,0,0,0,0)
3386436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define X010001  BITS8(0,0, 0,1,0,0,0,1)
3387436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define X010101  BITS8(0,0, 0,1,0,1,0,1)
3388436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define X010110  BITS8(0,0, 0,1,0,1,1,0)
3389436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define X011001  BITS8(0,0, 0,1,1,0,0,1)
3390436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define X011010  BITS8(0,0, 0,1,1,0,1,0)
3391436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define X011011  BITS8(0,0, 0,1,1,0,1,1)
3392436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define X011110  BITS8(0,0, 0,1,1,1,1,0)
3393436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define X011111  BITS8(0,0, 0,1,1,1,1,1)
33940a8046eb0993fb7e155b03cc5ef3323fca3467c0Dmitriy Ivanov#define X100000  BITS8(0,0, 1,0,0,0,0,0)
3395436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define X100001  BITS8(0,0, 1,0,0,0,0,1)
3396436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define X100011  BITS8(0,0, 1,0,0,0,1,1)
3397436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define X100100  BITS8(0,0, 1,0,0,1,0,0)
3398436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define X100101  BITS8(0,0, 1,0,0,1,0,1)
3399436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define X100110  BITS8(0,0, 1,0,0,1,1,0)
3400436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define X100111  BITS8(0,0, 1,0,0,1,1,1)
34010a8046eb0993fb7e155b03cc5ef3323fca3467c0Dmitriy Ivanov#define X101000  BITS8(0,0, 1,0,1,0,0,0)
3402436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define X110000  BITS8(0,0, 1,1,0,0,0,0)
3403436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define X110001  BITS8(0,0, 1,1,0,0,0,1)
3404436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define X110101  BITS8(0,0, 1,1,0,1,0,1)
3405436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define X110111  BITS8(0,0, 1,1,0,1,1,1)
3406436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define X111000  BITS8(0,0, 1,1,1,0,0,0)
3407436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define X111001  BITS8(0,0, 1,1,1,0,0,1)
3408436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define X111101  BITS8(0,0, 1,1,1,1,0,1)
3409436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define X111110  BITS8(0,0, 1,1,1,1,1,0)
3410436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define X111111  BITS8(0,0, 1,1,1,1,1,1)
3411436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
3412eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov#define X0001000  BITS8(0, 0,0,0,1,0,0,0)
34132ca80a6a6fc069acdb73186e8e578dbf8f46af80Dmitriy Ivanov#define X0010000  BITS8(0, 0,0,1,0,0,0,0)
3414436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define X0100000  BITS8(0, 0,1,0,0,0,0,0)
3415436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define X1000000  BITS8(0, 1,0,0,0,0,0,0)
3416436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
3417436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define X00100000  BITS8(0,0,1,0,0,0,0,0)
3418436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define X00100001  BITS8(0,0,1,0,0,0,0,1)
3419436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define X00100010  BITS8(0,0,1,0,0,0,1,0)
3420436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define X00100011  BITS8(0,0,1,0,0,0,1,1)
3421436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define X01010000  BITS8(0,1,0,1,0,0,0,0)
3422436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define X01010001  BITS8(0,1,0,1,0,0,0,1)
3423436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define X01010100  BITS8(0,1,0,1,0,1,0,0)
3424436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define X01011000  BITS8(0,1,0,1,1,0,0,0)
3425436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define X01100000  BITS8(0,1,1,0,0,0,0,0)
3426436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define X01100001  BITS8(0,1,1,0,0,0,0,1)
3427436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define X01100010  BITS8(0,1,1,0,0,0,1,0)
3428436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define X01100011  BITS8(0,1,1,0,0,0,1,1)
3429436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define X01110000  BITS8(0,1,1,1,0,0,0,0)
3430436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define X01110001  BITS8(0,1,1,1,0,0,0,1)
3431436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define X01110011  BITS8(0,1,1,1,0,0,1,1)
3432436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define X01110101  BITS8(0,1,1,1,0,1,0,1)
3433436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define X01110111  BITS8(0,1,1,1,0,1,1,1)
3434436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define X11000001  BITS8(1,1,0,0,0,0,0,1)
3435436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define X11000011  BITS8(1,1,0,0,0,0,1,1)
3436436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define X11010100  BITS8(1,1,0,1,0,1,0,0)
3437436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define X11010110  BITS8(1,1,0,1,0,1,1,0)
3438436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define X11011000  BITS8(1,1,0,1,1,0,0,0)
3439436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define X11011010  BITS8(1,1,0,1,1,0,1,0)
3440436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define X11011110  BITS8(1,1,0,1,1,1,1,0)
3441436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define X11110001  BITS8(1,1,1,1,0,0,0,1)
3442436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define X11110011  BITS8(1,1,1,1,0,0,1,1)
3443436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
34440a8046eb0993fb7e155b03cc5ef3323fca3467c0Dmitriy Ivanov#define BITS9(zzb8,zzb7,zzb6,zzb5,zzb4,zzb3,zzb2,zzb1,zzb0) \
34450a8046eb0993fb7e155b03cc5ef3323fca3467c0Dmitriy Ivanov  ((BITS8(zzb8,zzb7,zzb6,zzb5,zzb4,zzb3,zzb2,zzb1) << 1) | zzb0)
34460a8046eb0993fb7e155b03cc5ef3323fca3467c0Dmitriy Ivanov
34470a8046eb0993fb7e155b03cc5ef3323fca3467c0Dmitriy Ivanov#define X111100111 BITS9(1,1,1,1,0,0,1,1,1)
34480a8046eb0993fb7e155b03cc5ef3323fca3467c0Dmitriy Ivanov#define X111100101 BITS9(1,1,1,1,0,0,1,0,1)
34490a8046eb0993fb7e155b03cc5ef3323fca3467c0Dmitriy Ivanov
3450436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
3451436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov/* --- 4 fields --- */
3452436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
3453436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic inline UInt X_8_19_1_4 ( UInt f1, UInt f2, UInt f3, UInt f4 ) {
3454436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   vassert(8+19+1+4 == 32);
3455436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   vassert(f1 < (1<<8));
3456436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   vassert(f2 < (1<<19));
3457436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   vassert(f3 < (1<<1));
3458436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   vassert(f4 < (1<<4));
3459436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   UInt w = 0;
3460436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   w = (w <<  8) | f1;
3461436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   w = (w << 19) | f2;
3462436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   w = (w <<  1) | f3;
3463436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   w = (w <<  4) | f4;
3464436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   return w;
3465436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
3466436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
3467436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov/* --- 5 fields --- */
3468436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
3469436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic inline UInt X_3_6_2_16_5 ( UInt f1, UInt f2,
3470436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                  UInt f3, UInt f4, UInt f5 ) {
3471436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   vassert(3+6+2+16+5 == 32);
3472436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   vassert(f1 < (1<<3));
3473436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   vassert(f2 < (1<<6));
3474436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   vassert(f3 < (1<<2));
3475436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   vassert(f4 < (1<<16));
3476436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   vassert(f5 < (1<<5));
3477436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   UInt w = 0;
3478436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   w = (w <<  3) | f1;
3479436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   w = (w <<  6) | f2;
3480436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   w = (w <<  2) | f3;
3481436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   w = (w << 16) | f4;
3482436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   w = (w <<  5) | f5;
3483436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   return w;
3484436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
3485436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
3486436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov/* --- 6 fields --- */
3487436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
3488436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic inline UInt X_2_6_2_12_5_5 ( UInt f1, UInt f2, UInt f3,
3489436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                    UInt f4, UInt f5, UInt f6 ) {
3490436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   vassert(2+6+2+12+5+5 == 32);
3491436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   vassert(f1 < (1<<2));
3492436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   vassert(f2 < (1<<6));
3493436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   vassert(f3 < (1<<2));
3494436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   vassert(f4 < (1<<12));
3495436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   vassert(f5 < (1<<5));
3496436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   vassert(f6 < (1<<5));
3497436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   UInt w = 0;
3498436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   w = (w <<  2) | f1;
3499436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   w = (w <<  6) | f2;
3500436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   w = (w <<  2) | f3;
3501436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   w = (w << 12) | f4;
3502436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   w = (w <<  5) | f5;
3503436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   w = (w <<  5) | f6;
3504436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   return w;
3505436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
3506436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
3507436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic inline UInt X_3_8_5_6_5_5 ( UInt f1, UInt f2, UInt f3,
3508436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                   UInt f4, UInt f5, UInt f6 ) {
3509436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   vassert(3+8+5+6+5+5 == 32);
3510436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   vassert(f1 < (1<<3));
3511436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   vassert(f2 < (1<<8));
3512436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   vassert(f3 < (1<<5));
3513436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   vassert(f4 < (1<<6));
3514436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   vassert(f5 < (1<<5));
3515436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   vassert(f6 < (1<<5));
3516436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   UInt w = 0;
3517436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   w = (w <<  3) | f1;
3518436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   w = (w <<  8) | f2;
3519436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   w = (w <<  5) | f3;
3520436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   w = (w <<  6) | f4;
3521436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   w = (w <<  5) | f5;
3522436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   w = (w <<  5) | f6;
3523436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   return w;
3524436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
3525436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
3526436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic inline UInt X_3_5_8_6_5_5 ( UInt f1, UInt f2, UInt f3,
3527436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                   UInt f4, UInt f5, UInt f6 ) {
3528436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   vassert(3+8+5+6+5+5 == 32);
3529436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   vassert(f1 < (1<<3));
3530436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   vassert(f2 < (1<<5));
3531436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   vassert(f3 < (1<<8));
3532436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   vassert(f4 < (1<<6));
3533436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   vassert(f5 < (1<<5));
3534436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   vassert(f6 < (1<<5));
3535436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   UInt w = 0;
3536436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   w = (w <<  3) | f1;
3537436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   w = (w <<  5) | f2;
3538436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   w = (w <<  8) | f3;
3539436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   w = (w <<  6) | f4;
3540436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   w = (w <<  5) | f5;
3541436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   w = (w <<  5) | f6;
3542436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   return w;
3543436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
3544436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
3545436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic inline UInt X_3_6_7_6_5_5 ( UInt f1, UInt f2, UInt f3,
3546436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                   UInt f4, UInt f5, UInt f6 ) {
3547436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   vassert(3+6+7+6+5+5 == 32);
3548436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   vassert(f1 < (1<<3));
3549436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   vassert(f2 < (1<<6));
3550436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   vassert(f3 < (1<<7));
3551436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   vassert(f4 < (1<<6));
3552436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   vassert(f5 < (1<<5));
3553436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   vassert(f6 < (1<<5));
3554436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   UInt w = 0;
3555436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   w = (w <<  3) | f1;
3556436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   w = (w <<  6) | f2;
3557436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   w = (w <<  7) | f3;
3558436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   w = (w <<  6) | f4;
3559436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   w = (w <<  5) | f5;
3560436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   w = (w <<  5) | f6;
3561436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   return w;
3562436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
3563436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
3564436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov/* --- 7 fields --- */
3565436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
3566436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic inline UInt X_2_6_3_9_2_5_5 ( UInt f1, UInt f2, UInt f3,
3567436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     UInt f4, UInt f5, UInt f6, UInt f7 ) {
3568436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   vassert(2+6+3+9+2+5+5 == 32);
3569436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   vassert(f1 < (1<<2));
3570436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   vassert(f2 < (1<<6));
3571436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   vassert(f3 < (1<<3));
3572436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   vassert(f4 < (1<<9));
3573436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   vassert(f5 < (1<<2));
3574436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   vassert(f6 < (1<<5));
3575436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   vassert(f7 < (1<<5));
3576436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   UInt w = 0;
3577436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   w = (w << 2) | f1;
3578436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   w = (w << 6) | f2;
3579436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   w = (w << 3) | f3;
3580436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   w = (w << 9) | f4;
3581436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   w = (w << 2) | f5;
3582436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   w = (w << 5) | f6;
3583436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   w = (w << 5) | f7;
3584436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   return w;
3585436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
3586436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
3587436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic inline UInt X_3_6_1_6_6_5_5 ( UInt f1, UInt f2, UInt f3,
3588436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     UInt f4, UInt f5, UInt f6, UInt f7 ) {
3589436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   vassert(3+6+1+6+6+5+5 == 32);
3590436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   vassert(f1 < (1<<3));
3591436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   vassert(f2 < (1<<6));
3592436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   vassert(f3 < (1<<1));
3593436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   vassert(f4 < (1<<6));
3594436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   vassert(f5 < (1<<6));
3595436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   vassert(f6 < (1<<5));
3596436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   vassert(f7 < (1<<5));
3597436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   UInt w = 0;
3598436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   w = (w << 3) | f1;
3599436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   w = (w << 6) | f2;
3600436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   w = (w << 1) | f3;
3601436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   w = (w << 6) | f4;
3602436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   w = (w << 6) | f5;
3603436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   w = (w << 5) | f6;
3604436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   w = (w << 5) | f7;
3605436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   return w;
3606436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
3607436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
36080a8046eb0993fb7e155b03cc5ef3323fca3467c0Dmitriy Ivanovstatic inline UInt X_9_1_6_4_6_1_1_4( UInt f1, UInt f2, UInt f3, UInt f4,
36090a8046eb0993fb7e155b03cc5ef3323fca3467c0Dmitriy Ivanov                                        UInt f5, UInt f6, UInt f7, UInt f8) {
36100a8046eb0993fb7e155b03cc5ef3323fca3467c0Dmitriy Ivanov   vassert(9+1+6+4+6+1+1+4 == 32);
36110a8046eb0993fb7e155b03cc5ef3323fca3467c0Dmitriy Ivanov   vassert(f1 < (1<<9));
36120a8046eb0993fb7e155b03cc5ef3323fca3467c0Dmitriy Ivanov   vassert(f2 < (1<<1));
36130a8046eb0993fb7e155b03cc5ef3323fca3467c0Dmitriy Ivanov   vassert(f3 < (1<<6));
36140a8046eb0993fb7e155b03cc5ef3323fca3467c0Dmitriy Ivanov   vassert(f4 < (1<<4));
36150a8046eb0993fb7e155b03cc5ef3323fca3467c0Dmitriy Ivanov   vassert(f5 < (1<<6));
36160a8046eb0993fb7e155b03cc5ef3323fca3467c0Dmitriy Ivanov   vassert(f6 < (1<<1));
36170a8046eb0993fb7e155b03cc5ef3323fca3467c0Dmitriy Ivanov   vassert(f7 < (1<<1));
36180a8046eb0993fb7e155b03cc5ef3323fca3467c0Dmitriy Ivanov   vassert(f8 < (1<<9));
36190a8046eb0993fb7e155b03cc5ef3323fca3467c0Dmitriy Ivanov   UInt w = 0;
36200a8046eb0993fb7e155b03cc5ef3323fca3467c0Dmitriy Ivanov   w = (w << 9) | f1;
36210a8046eb0993fb7e155b03cc5ef3323fca3467c0Dmitriy Ivanov   w = (w << 1) | f2;
36220a8046eb0993fb7e155b03cc5ef3323fca3467c0Dmitriy Ivanov   w = (w << 6) | f3;
36230a8046eb0993fb7e155b03cc5ef3323fca3467c0Dmitriy Ivanov   w = (w << 4) | f4;
36240a8046eb0993fb7e155b03cc5ef3323fca3467c0Dmitriy Ivanov   w = (w << 6) | f5;
36250a8046eb0993fb7e155b03cc5ef3323fca3467c0Dmitriy Ivanov   w = (w << 1) | f6;
36260a8046eb0993fb7e155b03cc5ef3323fca3467c0Dmitriy Ivanov   w = (w << 1) | f7;
36270a8046eb0993fb7e155b03cc5ef3323fca3467c0Dmitriy Ivanov   w = (w << 4) | f8;
36280a8046eb0993fb7e155b03cc5ef3323fca3467c0Dmitriy Ivanov   return w;
36290a8046eb0993fb7e155b03cc5ef3323fca3467c0Dmitriy Ivanov}
36300a8046eb0993fb7e155b03cc5ef3323fca3467c0Dmitriy Ivanov
3631436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
3632436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ #define X0000  BITS4(0,0,0,0)
3633436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ #define X0001  BITS4(0,0,0,1)
3634436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ #define X0010  BITS4(0,0,1,0)
3635436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ #define X0011  BITS4(0,0,1,1)
3636436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ #define X0100  BITS4(0,1,0,0)
3637436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ #define X0101  BITS4(0,1,0,1)
3638436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ #define X0110  BITS4(0,1,1,0)
3639436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ #define X0111  BITS4(0,1,1,1)
3640436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ #define X1000  BITS4(1,0,0,0)
3641436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ #define X1001  BITS4(1,0,0,1)
3642436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ #define X1010  BITS4(1,0,1,0)
3643436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ #define X1011  BITS4(1,0,1,1)
3644436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ #define X1100  BITS4(1,1,0,0)
3645436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ #define X1101  BITS4(1,1,0,1)
3646436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ #define X1110  BITS4(1,1,1,0)
3647436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ #define X1111  BITS4(1,1,1,1)
3648436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov/*
3649436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define XXXXX___(zzx7,zzx6,zzx5,zzx4,zzx3) \
3650436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   ((((zzx7) & 0xF) << 28) | (((zzx6) & 0xF) << 24) |  \
3651436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    (((zzx5) & 0xF) << 20) | (((zzx4) & 0xF) << 16) |  \
3652436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    (((zzx3) & 0xF) << 12))
3653436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
3654436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define XXXXXX__(zzx7,zzx6,zzx5,zzx4,zzx3,zzx2)        \
3655436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   ((((zzx7) & 0xF) << 28) | (((zzx6) & 0xF) << 24) |  \
3656436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    (((zzx5) & 0xF) << 20) | (((zzx4) & 0xF) << 16) |  \
3657436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    (((zzx3) & 0xF) << 12) | (((zzx2) & 0xF) <<  8))
3658436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
3659436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define XXXXX__X(zzx7,zzx6,zzx5,zzx4,zzx3,zzx0)        \
3660436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   ((((zzx7) & 0xF) << 28) | (((zzx6) & 0xF) << 24) |  \
3661436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    (((zzx5) & 0xF) << 20) | (((zzx4) & 0xF) << 16) |  \
3662436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    (((zzx3) & 0xF) << 12) | (((zzx0) & 0xF) <<  0))
3663436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
3664436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define XXX___XX(zzx7,zzx6,zzx5,zzx1,zzx0) \
3665436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  ((((zzx7) & 0xF) << 28) | (((zzx6) & 0xF) << 24) | \
3666436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   (((zzx5) & 0xF) << 20) | (((zzx1) & 0xF) << 4) | \
3667436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   (((zzx0) & 0xF) << 0))
3668436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
3669436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define XXXXXXXX(zzx7,zzx6,zzx5,zzx4,zzx3,zzx2,zzx1,zzx0)  \
3670436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   ((((zzx7) & 0xF) << 28) | (((zzx6) & 0xF) << 24) |  \
3671436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    (((zzx5) & 0xF) << 20) | (((zzx4) & 0xF) << 16) |  \
3672436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    (((zzx3) & 0xF) << 12) | (((zzx2) & 0xF) <<  8) |  \
3673436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    (((zzx1) & 0xF) <<  4) | (((zzx0) & 0xF) <<  0))
3674436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
3675436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define XX______(zzx7,zzx6) \
3676436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   ((((zzx7) & 0xF) << 28) | (((zzx6) & 0xF) << 24))
3677436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov*/
3678436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ /* Generate a skeletal insn that involves an a RI84 shifter operand.
3679436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    Returns a word which is all zeroes apart from bits 25 and 11..0,
3680436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    since it is those that encode the shifter operand (at least to the
3681436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    extent that we care about it.) */
3682436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ static UInt skeletal_RI84 ( ARMRI84* ri )
3683436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ {
3684436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    UInt instr;
3685436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    if (ri->tag == ARMri84_I84) {
3686436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       vassert(0 == (ri->ARMri84.I84.imm4 & ~0x0F));
3687436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       vassert(0 == (ri->ARMri84.I84.imm8 & ~0xFF));
3688436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       instr = 1 << 25;
3689436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       instr |= (ri->ARMri84.I84.imm4 << 8);
3690436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       instr |= ri->ARMri84.I84.imm8;
3691436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    } else {
3692436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       instr = 0 << 25;
3693436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       instr |= iregNo(ri->ARMri84.R.reg);
3694436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    }
3695436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    return instr;
3696436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ }
3697436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ
3698436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ /* Ditto for RI5.  Resulting word is zeroes apart from bit 4 and bits
3699436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    11..7. */
3700436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ static UInt skeletal_RI5 ( ARMRI5* ri )
3701436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ {
3702436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    UInt instr;
3703436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    if (ri->tag == ARMri5_I5) {
3704436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       UInt imm5 = ri->ARMri5.I5.imm5;
3705436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       vassert(imm5 >= 1 && imm5 <= 31);
3706436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       instr = 0 << 4;
3707436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       instr |= imm5 << 7;
3708436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    } else {
3709436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       instr = 1 << 4;
3710436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       instr |= iregNo(ri->ARMri5.R.reg) << 8;
3711436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    }
3712436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    return instr;
3713436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ }
3714436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
3715436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
3716436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov/* Get an immediate into a register, using only that register. */
3717436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic UInt* imm64_to_iregNo ( UInt* p, Int xD, ULong imm64 )
3718436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
3719436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   if (imm64 == 0) {
3720436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      // This has to be special-cased, since the logic below
3721436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      // will leave the register unchanged in this case.
3722436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      // MOVZ xD, #0, LSL #0
3723436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      *p++ = X_3_6_2_16_5(X110, X100101, X00, 0/*imm16*/, xD);
3724436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      return p;
3725436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   }
3726436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
3727436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   // There must be at least one non-zero halfword.  Find the
3728436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   // lowest nonzero such, and use MOVZ to install it and zero
3729436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   // out the rest of the register.
3730436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   UShort h[4];
3731436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   h[3] = (UShort)((imm64 >> 48) & 0xFFFF);
3732436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   h[2] = (UShort)((imm64 >> 32) & 0xFFFF);
3733436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   h[1] = (UShort)((imm64 >> 16) & 0xFFFF);
3734436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   h[0] = (UShort)((imm64 >>  0) & 0xFFFF);
3735436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
3736436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   UInt i;
3737436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   for (i = 0; i < 4; i++) {
3738436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      if (h[i] != 0)
3739436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         break;
3740436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   }
3741436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   vassert(i < 4);
3742436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
3743436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   // MOVZ xD, h[i], LSL (16*i)
3744436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   *p++ = X_3_6_2_16_5(X110, X100101, i, h[i], xD);
3745436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
3746436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   // Work on upwards through h[i], using MOVK to stuff in any
3747436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   // remaining nonzero elements.
3748436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   i++;
3749436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   for (; i < 4; i++) {
3750436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      if (h[i] == 0)
3751436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         continue;
3752436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      // MOVK xD, h[i], LSL (16*i)
3753436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      *p++ = X_3_6_2_16_5(X111, X100101, i, h[i], xD);
3754436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   }
3755436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
3756436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   return p;
3757436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
3758436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
3759436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov/* Get an immediate into a register, using only that register, and
3760436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   generating exactly 4 instructions, regardless of the value of the
3761436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   immediate. This is used when generating sections of code that need
3762436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   to be patched later, so as to guarantee a specific size. */
3763436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic UInt* imm64_to_iregNo_EXACTLY4 ( UInt* p, Int xD, ULong imm64 )
3764436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
3765436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   UShort h[4];
3766436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   h[3] = (UShort)((imm64 >> 48) & 0xFFFF);
3767436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   h[2] = (UShort)((imm64 >> 32) & 0xFFFF);
3768436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   h[1] = (UShort)((imm64 >> 16) & 0xFFFF);
3769436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   h[0] = (UShort)((imm64 >>  0) & 0xFFFF);
3770436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   // Work on upwards through h[i], using MOVK to stuff in the
3771436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   // remaining elements.
3772436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   UInt i;
3773436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   for (i = 0; i < 4; i++) {
3774436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      if (i == 0) {
3775436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         // MOVZ xD, h[0], LSL (16*0)
3776436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         *p++ = X_3_6_2_16_5(X110, X100101, i, h[i], xD);
3777436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      } else {
3778436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         // MOVK xD, h[i], LSL (16*i)
3779436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         *p++ = X_3_6_2_16_5(X111, X100101, i, h[i], xD);
3780436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      }
3781436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   }
3782436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   return p;
3783436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
3784436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
3785436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov/* Check whether p points at a 4-insn sequence cooked up by
3786436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   imm64_to_iregNo_EXACTLY4(). */
3787436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic Bool is_imm64_to_iregNo_EXACTLY4 ( UInt* p, Int xD, ULong imm64 )
3788436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
3789436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   UShort h[4];
3790436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   h[3] = (UShort)((imm64 >> 48) & 0xFFFF);
3791436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   h[2] = (UShort)((imm64 >> 32) & 0xFFFF);
3792436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   h[1] = (UShort)((imm64 >> 16) & 0xFFFF);
3793436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   h[0] = (UShort)((imm64 >>  0) & 0xFFFF);
3794436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   // Work on upwards through h[i], using MOVK to stuff in the
3795436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   // remaining elements.
3796436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   UInt i;
3797436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   for (i = 0; i < 4; i++) {
3798436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      UInt expected;
3799436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      if (i == 0) {
3800436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         // MOVZ xD, h[0], LSL (16*0)
3801436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         expected = X_3_6_2_16_5(X110, X100101, i, h[i], xD);
3802436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      } else {
3803436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         // MOVK xD, h[i], LSL (16*i)
3804436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         expected = X_3_6_2_16_5(X111, X100101, i, h[i], xD);
3805436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      }
3806436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      if (p[i] != expected)
3807436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         return False;
3808436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   }
3809436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   return True;
3810436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
3811436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
3812436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
3813436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov/* Generate a 8 bit store or 8-to-64 unsigned widening load from/to
3814436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   rD, using the given amode for the address. */
3815436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic UInt* do_load_or_store8 ( UInt* p,
3816436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                 Bool isLoad, UInt wD, ARM64AMode* am )
3817436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
3818436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   vassert(wD <= 30);
3819436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   if (am->tag == ARM64am_RI9) {
3820436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      /* STURB Wd, [Xn|SP + simm9]:  00 111000 000 simm9 00 n d
3821436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         LDURB Wd, [Xn|SP + simm9]:  00 111000 010 simm9 00 n d
3822436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      */
3823436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      Int simm9 = am->ARM64am.RI9.simm9;
3824436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      vassert(-256 <= simm9 && simm9 <= 255);
3825436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      UInt instr = X_2_6_3_9_2_5_5(X00, X111000, isLoad ? X010 : X000,
3826436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                   simm9 & 0x1FF, X00,
3827436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                   iregNo(am->ARM64am.RI9.reg), wD);
3828436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      *p++ = instr;
3829436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      return p;
3830436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   }
3831436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   if (am->tag == ARM64am_RI12) {
3832436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      /* STRB Wd, [Xn|SP + uimm12 * 1]:  00 111 001 00 imm12 n d
3833436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         LDRB Wd, [Xn|SP + uimm12 * 1]:  00 111 001 01 imm12 n d
3834436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      */
3835436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      UInt uimm12 = am->ARM64am.RI12.uimm12;
3836436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      UInt scale  = am->ARM64am.RI12.szB;
3837436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      vassert(scale == 1); /* failure of this is serious.  Do not ignore. */
3838436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      UInt xN    = iregNo(am->ARM64am.RI12.reg);
3839436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      vassert(xN <= 30);
3840436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      UInt instr = X_2_6_2_12_5_5(X00, X111001, isLoad ? X01 : X00,
3841436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                  uimm12, xN, wD);
3842436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      *p++ = instr;
3843436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      return p;
3844436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   }
3845436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   if (am->tag == ARM64am_RR) {
3846436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      /* STRB Xd, [Xn|SP, Xm]: 00 111 000 001 m 011 0 10 n d
3847436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         LDRB Xd, [Xn|SP, Xm]: 00 111 000 011 m 011 0 10 n d
3848436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      */
3849436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      UInt xN = iregNo(am->ARM64am.RR.base);
3850436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      UInt xM = iregNo(am->ARM64am.RR.index);
3851436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      vassert(xN <= 30);
3852436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      UInt instr = X_3_8_5_6_5_5(X001, isLoad ? X11000011 : X11000001,
3853436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                 xM, X011010, xN, wD);
3854436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      *p++ = instr;
3855436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      return p;
3856436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   }
3857436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   vpanic("do_load_or_store8");
3858436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   vassert(0);
3859436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
3860436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
3861436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
3862436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov/* Generate a 16 bit store or 16-to-64 unsigned widening load from/to
3863436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   rD, using the given amode for the address. */
3864436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic UInt* do_load_or_store16 ( UInt* p,
3865436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                  Bool isLoad, UInt wD, ARM64AMode* am )
3866436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
3867436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   vassert(wD <= 30);
3868436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   if (am->tag == ARM64am_RI9) {
3869436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      /* STURH Wd, [Xn|SP + simm9]:  01 111000 000 simm9 00 n d
3870436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         LDURH Wd, [Xn|SP + simm9]:  01 111000 010 simm9 00 n d
3871436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      */
3872436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      Int simm9 = am->ARM64am.RI9.simm9;
3873436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      vassert(-256 <= simm9 && simm9 <= 255);
3874436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      UInt instr = X_2_6_3_9_2_5_5(X01, X111000, isLoad ? X010 : X000,
3875436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                   simm9 & 0x1FF, X00,
3876436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                   iregNo(am->ARM64am.RI9.reg), wD);
3877436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      *p++ = instr;
3878436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      return p;
3879436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   }
3880436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   if (am->tag == ARM64am_RI12) {
3881436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      /* STRH Wd, [Xn|SP + uimm12 * 2]:  01 111 001 00 imm12 n d
3882436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         LDRH Wd, [Xn|SP + uimm12 * 2]:  01 111 001 01 imm12 n d
3883436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      */
3884436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      UInt uimm12 = am->ARM64am.RI12.uimm12;
3885436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      UInt scale  = am->ARM64am.RI12.szB;
3886436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      vassert(scale == 2); /* failure of this is serious.  Do not ignore. */
3887436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      UInt xN    = iregNo(am->ARM64am.RI12.reg);
3888436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      vassert(xN <= 30);
3889436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      UInt instr = X_2_6_2_12_5_5(X01, X111001, isLoad ? X01 : X00,
3890436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                  uimm12, xN, wD);
3891436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      *p++ = instr;
3892436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      return p;
3893436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   }
3894436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   if (am->tag == ARM64am_RR) {
3895436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      /* STRH Xd, [Xn|SP, Xm]: 01 111 000 001 m 011 0 10 n d
3896436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         LDRH Xd, [Xn|SP, Xm]: 01 111 000 011 m 011 0 10 n d
3897436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      */
3898436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      UInt xN = iregNo(am->ARM64am.RR.base);
3899436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      UInt xM = iregNo(am->ARM64am.RR.index);
3900436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      vassert(xN <= 30);
3901436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      UInt instr = X_3_8_5_6_5_5(X011, isLoad ? X11000011 : X11000001,
3902436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                 xM, X011010, xN, wD);
3903436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      *p++ = instr;
3904436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      return p;
3905436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   }
3906436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   vpanic("do_load_or_store16");
3907436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   vassert(0);
3908436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
3909436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
3910436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
3911436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov/* Generate a 32 bit store or 32-to-64 unsigned widening load from/to
3912436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   rD, using the given amode for the address. */
3913436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic UInt* do_load_or_store32 ( UInt* p,
3914436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                  Bool isLoad, UInt wD, ARM64AMode* am )
3915436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
3916436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   vassert(wD <= 30);
3917436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   if (am->tag == ARM64am_RI9) {
3918436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      /* STUR Wd, [Xn|SP + simm9]:  10 111000 000 simm9 00 n d
3919436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         LDUR Wd, [Xn|SP + simm9]:  10 111000 010 simm9 00 n d
3920436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      */
3921436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      Int simm9 = am->ARM64am.RI9.simm9;
3922436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      vassert(-256 <= simm9 && simm9 <= 255);
3923436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      UInt instr = X_2_6_3_9_2_5_5(X10, X111000, isLoad ? X010 : X000,
3924436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                   simm9 & 0x1FF, X00,
3925436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                   iregNo(am->ARM64am.RI9.reg), wD);
3926436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      *p++ = instr;
3927436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      return p;
3928436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   }
3929436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   if (am->tag == ARM64am_RI12) {
3930436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      /* STR Wd, [Xn|SP + uimm12 * 4]:  10 111 001 00 imm12 n d
3931436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         LDR Wd, [Xn|SP + uimm12 * 4]:  10 111 001 01 imm12 n d
3932436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      */
3933436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      UInt uimm12 = am->ARM64am.RI12.uimm12;
3934436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      UInt scale  = am->ARM64am.RI12.szB;
3935436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      vassert(scale == 4); /* failure of this is serious.  Do not ignore. */
3936436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      UInt xN    = iregNo(am->ARM64am.RI12.reg);
3937436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      vassert(xN <= 30);
3938436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      UInt instr = X_2_6_2_12_5_5(X10, X111001, isLoad ? X01 : X00,
3939436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                  uimm12, xN, wD);
3940436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      *p++ = instr;
3941436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      return p;
3942436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   }
3943436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   if (am->tag == ARM64am_RR) {
3944436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      /* STR Wd, [Xn|SP, Xm]: 10 111 000 001 m 011 0 10 n d
3945436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         LDR Wd, [Xn|SP, Xm]: 10 111 000 011 m 011 0 10 n d
3946436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      */
3947436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      UInt xN = iregNo(am->ARM64am.RR.base);
3948436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      UInt xM = iregNo(am->ARM64am.RR.index);
3949436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      vassert(xN <= 30);
3950436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      UInt instr = X_3_8_5_6_5_5(X101, isLoad ? X11000011 : X11000001,
3951436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                 xM, X011010, xN, wD);
3952436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      *p++ = instr;
3953436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      return p;
3954436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   }
3955436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   vpanic("do_load_or_store32");
3956436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   vassert(0);
3957436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
3958436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
3959436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
3960436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov/* Generate a 64 bit load or store to/from xD, using the given amode
3961436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   for the address. */
3962436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic UInt* do_load_or_store64 ( UInt* p,
3963436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                  Bool isLoad, UInt xD, ARM64AMode* am )
3964436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
3965436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   /* In all these cases, Rn can't be 31 since that means SP. */
3966436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   vassert(xD <= 30);
3967436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   if (am->tag == ARM64am_RI9) {
3968436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      /* STUR Xd, [Xn|SP + simm9]:  11 111000 000 simm9 00 n d
3969436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         LDUR Xd, [Xn|SP + simm9]:  11 111000 010 simm9 00 n d
3970436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      */
3971436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      Int simm9 = am->ARM64am.RI9.simm9;
3972436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      vassert(-256 <= simm9 && simm9 <= 255);
3973436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      UInt xN = iregNo(am->ARM64am.RI9.reg);
3974436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      vassert(xN <= 30);
3975436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      UInt instr = X_2_6_3_9_2_5_5(X11, X111000, isLoad ? X010 : X000,
3976436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                   simm9 & 0x1FF, X00, xN, xD);
3977436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      *p++ = instr;
3978436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      return p;
3979436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   }
3980436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   if (am->tag == ARM64am_RI12) {
3981436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      /* STR Xd, [Xn|SP + uimm12 * 8]:  11 111 001 00 imm12 n d
3982436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         LDR Xd, [Xn|SP + uimm12 * 8]:  11 111 001 01 imm12 n d
3983436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      */
3984436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      UInt uimm12 = am->ARM64am.RI12.uimm12;
3985436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      UInt scale  = am->ARM64am.RI12.szB;
3986436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      vassert(scale == 8); /* failure of this is serious.  Do not ignore. */
3987436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      UInt xN    = iregNo(am->ARM64am.RI12.reg);
3988436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      vassert(xN <= 30);
3989436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      UInt instr = X_2_6_2_12_5_5(X11, X111001, isLoad ? X01 : X00,
3990436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                  uimm12, xN, xD);
3991436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      *p++ = instr;
3992436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      return p;
3993436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   }
3994436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   if (am->tag == ARM64am_RR) {
3995436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      /* STR Xd, [Xn|SP, Xm]: 11 111 000 001 m 011 0 10 n d
3996436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         LDR Xd, [Xn|SP, Xm]: 11 111 000 011 m 011 0 10 n d
3997436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      */
3998436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      UInt xN = iregNo(am->ARM64am.RR.base);
3999436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      UInt xM = iregNo(am->ARM64am.RR.index);
4000436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      vassert(xN <= 30);
4001436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      UInt instr = X_3_8_5_6_5_5(X111, isLoad ? X11000011 : X11000001,
4002436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                 xM, X011010, xN, xD);
4003436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      *p++ = instr;
4004436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      return p;
4005436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   }
4006436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   vpanic("do_load_or_store64");
4007436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   vassert(0);
4008436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
4009436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
4010436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
4011436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov/* Emit an instruction into buf and return the number of bytes used.
4012436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   Note that buf is not the insn's final place, and therefore it is
4013436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   imperative to emit position-independent code.  If the emitted
4014436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   instruction was a profiler inc, set *is_profInc to True, else
4015436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   leave it unchanged. */
4016436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
4017436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovInt emit_ARM64Instr ( /*MB_MOD*/Bool* is_profInc,
4018436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                      UChar* buf, Int nbuf, ARM64Instr* i,
4019436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                      Bool mode64,
4020436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                      void* disp_cp_chain_me_to_slowEP,
4021436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                      void* disp_cp_chain_me_to_fastEP,
4022436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                      void* disp_cp_xindir,
4023436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                      void* disp_cp_xassisted )
4024436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
4025436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   UInt* p = (UInt*)buf;
4026436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   vassert(nbuf >= 32);
4027436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   vassert(mode64 == True);
4028436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   vassert(0 == (((HWord)buf) & 3));
4029436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
4030436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   switch (i->tag) {
4031436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case ARM64in_Arith: {
4032436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         UInt      rD   = iregNo(i->ARM64in.Arith.dst);
4033436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         UInt      rN   = iregNo(i->ARM64in.Arith.argL);
4034436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         ARM64RIA* argR = i->ARM64in.Arith.argR;
4035436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         switch (argR->tag) {
4036436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case ARM64riA_I12:
4037436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               *p++ = X_2_6_2_12_5_5(
4038436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                         i->ARM64in.Arith.isAdd ? X10 : X11,
4039436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                         X010001,
4040436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                         argR->ARM64riA.I12.shift == 12 ? X01 : X00,
4041436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                         argR->ARM64riA.I12.imm12, rN, rD
4042436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                      );
4043436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               break;
4044436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case ARM64riA_R: {
4045436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               UInt rM = iregNo(i->ARM64in.Arith.argR->ARM64riA.R.reg);
4046436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               *p++ = X_3_8_5_6_5_5(
4047436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                         i->ARM64in.Arith.isAdd ? X100 : X110,
4048436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                         X01011000, rM, X000000, rN, rD
4049436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                      );
4050436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               break;
4051436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            }
4052436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            default:
4053436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               goto bad;
4054436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         }
4055436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         goto done;
4056436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      }
4057436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case ARM64in_Cmp: {
4058436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         UInt      rD   = 31; /* XZR, we are going to dump the result */
4059436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         UInt      rN   = iregNo(i->ARM64in.Cmp.argL);
4060436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         ARM64RIA* argR = i->ARM64in.Cmp.argR;
4061436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         Bool      is64 = i->ARM64in.Cmp.is64;
4062436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         switch (argR->tag) {
4063436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case ARM64riA_I12:
4064436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               /* 1 11 10001 sh imm12 Rn Rd = SUBS Xd, Xn, #imm */
4065436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               /* 0 11 10001 sh imm12 Rn Rd = SUBS Wd, Wn, #imm */
4066436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               *p++ = X_2_6_2_12_5_5(
4067436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                         is64 ? X11 : X01, X110001,
4068436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                         argR->ARM64riA.I12.shift == 12 ? X01 : X00,
4069436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                         argR->ARM64riA.I12.imm12, rN, rD);
4070436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               break;
4071436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case ARM64riA_R: {
4072436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               /* 1 11 01011 00 0 Rm 000000 Rn Rd = SUBS Xd, Xn, Xm */
4073436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               /* 0 11 01011 00 0 Rm 000000 Rn Rd = SUBS Wd, Wn, Wm */
4074436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               UInt rM = iregNo(i->ARM64in.Cmp.argR->ARM64riA.R.reg);
4075436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               *p++ = X_3_8_5_6_5_5(is64 ? X111 : X011,
4076436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                    X01011000, rM, X000000, rN, rD);
4077436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               break;
4078436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            }
4079436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            default:
4080436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               goto bad;
4081436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         }
4082436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         goto done;
4083436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      }
4084436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case ARM64in_Logic: {
4085436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         UInt      rD   = iregNo(i->ARM64in.Logic.dst);
4086436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         UInt      rN   = iregNo(i->ARM64in.Logic.argL);
4087436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         ARM64RIL* argR = i->ARM64in.Logic.argR;
4088436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         UInt      opc  = 0; /* invalid */
4089436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         vassert(rD < 31);
4090436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         vassert(rN < 31);
4091436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         switch (i->ARM64in.Logic.op) {
4092436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case ARM64lo_OR:  opc = X101; break;
4093436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case ARM64lo_AND: opc = X100; break;
4094436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case ARM64lo_XOR: opc = X110; break;
4095436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            default: break;
4096436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         }
4097436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         vassert(opc != 0);
4098436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         switch (argR->tag) {
4099436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case ARM64riL_I13: {
4100436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               /* 1 01 100100 N immR immS Rn Rd = ORR <Xd|Sp>, Xn, #imm */
4101436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               /* 1 00 100100 N immR immS Rn Rd = AND <Xd|Sp>, Xn, #imm */
4102436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               /* 1 10 100100 N immR immS Rn Rd = EOR <Xd|Sp>, Xn, #imm */
4103436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               *p++ = X_3_6_1_6_6_5_5(
4104436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                         opc, X100100, argR->ARM64riL.I13.bitN,
4105436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                         argR->ARM64riL.I13.immR, argR->ARM64riL.I13.immS,
4106436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                         rN, rD
4107436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                      );
4108436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               break;
4109436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            }
4110436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case ARM64riL_R: {
4111436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               /* 1 01 01010 00 0 m 000000 n d = ORR Xd, Xn, Xm */
4112436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               /* 1 00 01010 00 0 m 000000 n d = AND Xd, Xn, Xm */
4113436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               /* 1 10 01010 00 0 m 000000 n d = EOR Xd, Xn, Xm */
4114436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               UInt rM = iregNo(argR->ARM64riL.R.reg);
4115436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               vassert(rM < 31);
4116436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               *p++ = X_3_8_5_6_5_5(opc, X01010000, rM, X000000, rN, rD);
4117436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               break;
4118436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            }
4119436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            default:
4120436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               goto bad;
4121436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         }
4122436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         goto done;
4123436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      }
4124436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case ARM64in_Test: {
4125436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         UInt      rD   = 31; /* XZR, we are going to dump the result */
4126436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         UInt      rN   = iregNo(i->ARM64in.Test.argL);
4127436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         ARM64RIL* argR = i->ARM64in.Test.argR;
4128436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         switch (argR->tag) {
4129436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case ARM64riL_I13: {
4130436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               /* 1 11 100100 N immR immS Rn Rd = ANDS Xd, Xn, #imm */
4131436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               *p++ = X_3_6_1_6_6_5_5(
4132436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                         X111, X100100, argR->ARM64riL.I13.bitN,
4133436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                         argR->ARM64riL.I13.immR, argR->ARM64riL.I13.immS,
4134436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                         rN, rD
4135436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                      );
4136436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               break;
4137436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            }
4138436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            default:
4139436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               goto bad;
4140436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         }
4141436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         goto done;
4142436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      }
4143436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case ARM64in_Shift: {
4144436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         UInt      rD   = iregNo(i->ARM64in.Shift.dst);
4145436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         UInt      rN   = iregNo(i->ARM64in.Shift.argL);
4146436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         ARM64RI6* argR = i->ARM64in.Shift.argR;
4147436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         vassert(rD < 31);
4148436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         vassert(rN < 31);
4149436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         switch (argR->tag) {
4150436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case ARM64ri6_I6: {
4151436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               /* 110 1001101 (63-sh) (64-sh) nn dd   LSL Xd, Xn, sh */
4152436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               /* 110 1001101 sh      63      nn dd   LSR Xd, Xn, sh */
4153436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               /* 100 1001101 sh      63      nn dd   ASR Xd, Xn, sh */
4154436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               UInt sh = argR->ARM64ri6.I6.imm6;
4155436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               vassert(sh > 0 && sh < 64);
4156436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               switch (i->ARM64in.Shift.op) {
4157436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  case ARM64sh_SHL:
4158436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     *p++ = X_3_6_1_6_6_5_5(X110, X100110,
4159436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            1, 64-sh, 63-sh, rN, rD);
4160436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     break;
4161436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  case ARM64sh_SHR:
4162436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     *p++ = X_3_6_1_6_6_5_5(X110, X100110, 1, sh, 63, rN, rD);
4163436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     break;
4164436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  case ARM64sh_SAR:
4165436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     *p++ = X_3_6_1_6_6_5_5(X100, X100110, 1, sh, 63, rN, rD);
4166436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     break;
4167436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  default:
4168436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     vassert(0);
4169436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               }
4170436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               break;
4171436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            }
4172436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case ARM64ri6_R: {
4173436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               /* 100 1101 0110 mm 001000 nn dd   LSL Xd, Xn, Xm */
4174436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               /* 100 1101 0110 mm 001001 nn dd   LSR Xd, Xn, Xm */
4175436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               /* 100 1101 0110 mm 001010 nn dd   ASR Xd, Xn, Xm */
4176436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               UInt rM = iregNo(argR->ARM64ri6.R.reg);
4177436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               vassert(rM < 31);
4178436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               UInt subOpc = 0;
4179436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               switch (i->ARM64in.Shift.op) {
4180436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  case ARM64sh_SHL: subOpc = X001000; break;
4181436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  case ARM64sh_SHR: subOpc = X001001; break;
4182436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  case ARM64sh_SAR: subOpc = X001010; break;
4183436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  default: vassert(0);
4184436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               }
4185436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               *p++ = X_3_8_5_6_5_5(X100, X11010110, rM, subOpc, rN, rD);
4186436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               break;
4187436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            }
4188436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            default:
4189436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               vassert(0);
4190436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         }
4191436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         goto done;
4192436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      }
4193436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case ARM64in_Unary: {
4194436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         UInt rDst = iregNo(i->ARM64in.Unary.dst);
4195436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         UInt rSrc = iregNo(i->ARM64in.Unary.src);
4196436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         switch (i->ARM64in.Unary.op) {
4197436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case ARM64un_CLZ:
4198436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               /* 1 10 1101 0110 00000 00010 0 nn dd   CLZ Xd, Xn */
4199436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               /* 1 10 1101 0110 00000 00010 1 nn dd   CLS Xd, Xn (unimp) */
4200436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               *p++ = X_3_8_5_6_5_5(X110,
4201436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                    X11010110, X00000, X000100, rSrc, rDst);
4202436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               goto done;
4203436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case ARM64un_NEG:
4204436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               /* 1 10 01011 000 m 000000 11111 d  NEG Xd,Xm */
4205436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               /* 0 10 01011 000 m 000000 11111 d  NEG Wd,Wm (unimp) */
4206436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               *p++ = X_3_8_5_6_5_5(X110,
4207436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                    X01011000, rSrc, X000000, X11111, rDst);
4208436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               goto done;
4209436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case ARM64un_NOT: {
4210436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               /* 1 01 01010 00 1 m 000000 11111 d   MVN Xd,Xm */
4211436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               *p++ = X_3_8_5_6_5_5(X101,
4212436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                    X01010001, rSrc, X000000, X11111, rDst);
4213436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               goto done;
4214436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            }
4215436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            default:
4216436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               break;
4217436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         }
4218436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         goto bad;
4219436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      }
4220436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case ARM64in_MovI: {
4221436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         /* We generate the "preferred form", ORR Xd, XZR, Xm
4222436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            101 01010 00 0 m 000000 11111 d
4223436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         */
4224436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         UInt instr = 0xAA0003E0;
4225436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         UInt d     = iregNo(i->ARM64in.MovI.dst);
4226436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         UInt m     = iregNo(i->ARM64in.MovI.src);
4227436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         *p++ = instr | ((m & 31) << 16) | ((d & 31) << 0);
4228436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         goto done;
4229436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      }
4230436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case ARM64in_Imm64: {
4231436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         p = imm64_to_iregNo( p, iregNo(i->ARM64in.Imm64.dst),
4232436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                              i->ARM64in.Imm64.imm64 );
4233436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         goto done;
4234436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      }
4235436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case ARM64in_LdSt64: {
4236436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         p = do_load_or_store64( p, i->ARM64in.LdSt64.isLoad,
4237436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                 iregNo(i->ARM64in.LdSt64.rD),
4238436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                 i->ARM64in.LdSt64.amode );
4239436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         goto done;
4240436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      }
4241436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case ARM64in_LdSt32: {
4242436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         p = do_load_or_store32( p, i->ARM64in.LdSt32.isLoad,
4243436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                 iregNo(i->ARM64in.LdSt32.rD),
4244436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                 i->ARM64in.LdSt32.amode );
4245436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         goto done;
4246436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      }
4247436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case ARM64in_LdSt16: {
4248436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         p = do_load_or_store16( p, i->ARM64in.LdSt16.isLoad,
4249436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                 iregNo(i->ARM64in.LdSt16.rD),
4250436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                 i->ARM64in.LdSt16.amode );
4251436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         goto done;
4252436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      }
4253436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case ARM64in_LdSt8: {
4254436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         p = do_load_or_store8( p, i->ARM64in.LdSt8.isLoad,
4255436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                iregNo(i->ARM64in.LdSt8.rD),
4256436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                i->ARM64in.LdSt8.amode );
4257436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         goto done;
4258436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      }
4259436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMin_LdSt32:
4260436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMin_LdSt8U: {
4261436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          UInt        bL, bB;
4262436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          HReg        rD;
4263436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          ARMAMode1*  am;
4264436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          ARMCondCode cc;
4265436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          if (i->tag == ARMin_LdSt32) {
4266436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             bB = 0;
4267436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             bL = i->ARMin.LdSt32.isLoad ? 1 : 0;
4268436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             am = i->ARMin.LdSt32.amode;
4269436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             rD = i->ARMin.LdSt32.rD;
4270436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             cc = i->ARMin.LdSt32.cc;
4271436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          } else {
4272436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             bB = 1;
4273436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             bL = i->ARMin.LdSt8U.isLoad ? 1 : 0;
4274436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             am = i->ARMin.LdSt8U.amode;
4275436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             rD = i->ARMin.LdSt8U.rD;
4276436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             cc = i->ARMin.LdSt8U.cc;
4277436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          }
4278436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          vassert(cc != ARMcc_NV);
4279436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          if (am->tag == ARMam1_RI) {
4280436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             Int  simm12;
4281436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             UInt instr, bP;
4282436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             if (am->ARMam1.RI.simm13 < 0) {
4283436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                bP = 0;
4284436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                simm12 = -am->ARMam1.RI.simm13;
4285436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             } else {
4286436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                bP = 1;
4287436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                simm12 = am->ARMam1.RI.simm13;
4288436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             }
4289436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             vassert(simm12 >= 0 && simm12 <= 4095);
4290436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             instr = XXXXX___(cc,X0101,BITS4(bP,bB,0,bL),
4291436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                              iregNo(am->ARMam1.RI.reg),
4292436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                              iregNo(rD));
4293436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             instr |= simm12;
4294436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             *p++ = instr;
4295436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             goto done;
4296436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          } else {
4297436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             // RR case
4298436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             goto bad;
4299436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          }
4300436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       }
4301436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMin_LdSt16: {
4302436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          HReg        rD = i->ARMin.LdSt16.rD;
4303436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          UInt        bS = i->ARMin.LdSt16.signedLoad ? 1 : 0;
4304436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          UInt        bL = i->ARMin.LdSt16.isLoad ? 1 : 0;
4305436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          ARMAMode2*  am = i->ARMin.LdSt16.amode;
4306436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          ARMCondCode cc = i->ARMin.LdSt16.cc;
4307436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          vassert(cc != ARMcc_NV);
4308436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          if (am->tag == ARMam2_RI) {
4309436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             HReg rN = am->ARMam2.RI.reg;
4310436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             Int  simm8;
4311436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             UInt bP, imm8hi, imm8lo, instr;
4312436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             if (am->ARMam2.RI.simm9 < 0) {
4313436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                bP = 0;
4314436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                simm8 = -am->ARMam2.RI.simm9;
4315436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             } else {
4316436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                bP = 1;
4317436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                simm8 = am->ARMam2.RI.simm9;
4318436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             }
4319436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             vassert(simm8 >= 0 && simm8 <= 255);
4320436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             imm8hi = (simm8 >> 4) & 0xF;
4321436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             imm8lo = simm8 & 0xF;
4322436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             vassert(!(bL == 0 && bS == 1)); // "! signed store"
4323436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             /**/ if (bL == 0 && bS == 0) {
4324436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                // strh
4325436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                instr = XXXXXXXX(cc,X0001, BITS4(bP,1,0,0), iregNo(rN),
4326436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                                 iregNo(rD), imm8hi, X1011, imm8lo);
4327436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                *p++ = instr;
4328436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                goto done;
4329436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             }
4330436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             else if (bL == 1 && bS == 0) {
4331436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                // ldrh
4332436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                instr = XXXXXXXX(cc,X0001, BITS4(bP,1,0,1), iregNo(rN),
4333436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                                 iregNo(rD), imm8hi, X1011, imm8lo);
4334436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                *p++ = instr;
4335436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                goto done;
4336436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             }
4337436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             else if (bL == 1 && bS == 1) {
4338436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                // ldrsh
4339436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                instr = XXXXXXXX(cc,X0001, BITS4(bP,1,0,1), iregNo(rN),
4340436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                                 iregNo(rD), imm8hi, X1111, imm8lo);
4341436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                *p++ = instr;
4342436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                goto done;
4343436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             }
4344436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             else vassert(0); // ill-constructed insn
4345436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          } else {
4346436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             // RR case
4347436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             goto bad;
4348436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          }
4349436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       }
4350436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMin_Ld8S: {
4351436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          HReg        rD = i->ARMin.Ld8S.rD;
4352436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          ARMAMode2*  am = i->ARMin.Ld8S.amode;
4353436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          ARMCondCode cc = i->ARMin.Ld8S.cc;
4354436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          vassert(cc != ARMcc_NV);
4355436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          if (am->tag == ARMam2_RI) {
4356436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             HReg rN = am->ARMam2.RI.reg;
4357436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             Int  simm8;
4358436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             UInt bP, imm8hi, imm8lo, instr;
4359436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             if (am->ARMam2.RI.simm9 < 0) {
4360436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                bP = 0;
4361436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                simm8 = -am->ARMam2.RI.simm9;
4362436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             } else {
4363436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                bP = 1;
4364436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                simm8 = am->ARMam2.RI.simm9;
4365436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             }
4366436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             vassert(simm8 >= 0 && simm8 <= 255);
4367436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             imm8hi = (simm8 >> 4) & 0xF;
4368436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             imm8lo = simm8 & 0xF;
4369436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             // ldrsb
4370436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             instr = XXXXXXXX(cc,X0001, BITS4(bP,1,0,1), iregNo(rN),
4371436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                              iregNo(rD), imm8hi, X1101, imm8lo);
4372436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             *p++ = instr;
4373436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             goto done;
4374436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          } else {
4375436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             // RR case
4376436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             goto bad;
4377436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          }
4378436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       }
4379436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
4380436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case ARM64in_XDirect: {
4381436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         /* NB: what goes on here has to be very closely coordinated
4382436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            with chainXDirect_ARM64 and unchainXDirect_ARM64 below. */
4383436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         /* We're generating chain-me requests here, so we need to be
4384436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            sure this is actually allowed -- no-redir translations
4385436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            can't use chain-me's.  Hence: */
4386436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         vassert(disp_cp_chain_me_to_slowEP != NULL);
4387436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         vassert(disp_cp_chain_me_to_fastEP != NULL);
4388436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
4389436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         /* Use ptmp for backpatching conditional jumps. */
4390436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         UInt* ptmp = NULL;
4391436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
4392436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         /* First off, if this is conditional, create a conditional
4393436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            jump over the rest of it.  Or at least, leave a space for
4394436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            it that we will shortly fill in. */
4395436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         if (i->ARM64in.XDirect.cond != ARM64cc_AL) {
4396436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            vassert(i->ARM64in.XDirect.cond != ARM64cc_NV);
4397436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            ptmp = p;
4398436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            *p++ = 0;
4399436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         }
4400436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
4401436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         /* Update the guest PC. */
4402436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         /* imm64 x9, dstGA */
4403436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         /* str   x9, amPC */
4404436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         p = imm64_to_iregNo(p, /*x*/9, i->ARM64in.XDirect.dstGA);
4405436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         p = do_load_or_store64(p, False/*!isLoad*/,
4406436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                /*x*/9, i->ARM64in.XDirect.amPC);
4407436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
4408436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         /* --- FIRST PATCHABLE BYTE follows --- */
4409436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         /* VG_(disp_cp_chain_me_to_{slowEP,fastEP}) (where we're
4410436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            calling to) backs up the return address, so as to find the
4411436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            address of the first patchable byte.  So: don't change the
4412436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            number of instructions (5) below. */
4413436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         /* movw x9, VG_(disp_cp_chain_me_to_{slowEP,fastEP})[15:0] */
4414436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         /* movk x9, VG_(disp_cp_chain_me_to_{slowEP,fastEP})[31:15], lsl 16 */
4415436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         /* movk x9, VG_(disp_cp_chain_me_to_{slowEP,fastEP})[47:32], lsl 32 */
4416436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         /* movk x9, VG_(disp_cp_chain_me_to_{slowEP,fastEP})[63:48], lsl 48 */
4417436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         /* blr  x9 */
4418436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         void* disp_cp_chain_me
4419436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  = i->ARM64in.XDirect.toFastEP ? disp_cp_chain_me_to_fastEP
4420436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                : disp_cp_chain_me_to_slowEP;
4421436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         p = imm64_to_iregNo_EXACTLY4(p, /*x*/9,
4422436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      Ptr_to_ULong(disp_cp_chain_me));
4423436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         *p++ = 0xD63F0120;
4424436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         /* --- END of PATCHABLE BYTES --- */
4425436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
4426436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         /* Fix up the conditional jump, if there was one. */
4427436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         if (i->ARM64in.XDirect.cond != ARM64cc_AL) {
4428436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            Int delta = (UChar*)p - (UChar*)ptmp; /* must be signed */
4429436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            vassert(delta > 0 && delta < 40);
4430436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            vassert((delta & 3) == 0);
4431436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            UInt notCond = 1 ^ (UInt)i->ARM64in.XDirect.cond;
4432436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            vassert(notCond <= 13); /* Neither AL nor NV */
4433436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            vassert(ptmp != NULL);
4434436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            delta = delta >> 2;
4435436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            *ptmp = X_8_19_1_4(X01010100, delta & ((1<<19)-1), 0, notCond);
4436436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         }
4437436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         goto done;
4438436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      }
4439436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
4440436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case ARM64in_XIndir: {
4441436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         // XIndir is more or less the same as XAssisted, except
4442436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         // we don't have a trc value to hand back, so there's no
4443436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         // write to r21
4444436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         /* Use ptmp for backpatching conditional jumps. */
4445436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         //UInt* ptmp = NULL;
4446436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
4447436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         /* First off, if this is conditional, create a conditional
4448436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            jump over the rest of it.  Or at least, leave a space for
4449436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            it that we will shortly fill in. */
4450436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         if (i->ARM64in.XIndir.cond != ARM64cc_AL) {
4451436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            vassert(0); //ATC
4452436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             vassert(i->ARMin.XIndir.cond != ARMcc_NV);
4453436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             ptmp = p;
4454436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             *p++ = 0;
4455436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         }
4456436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
4457436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         /* Update the guest PC. */
4458436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         /* str r-dstGA, amPC */
4459436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         p = do_load_or_store64(p, False/*!isLoad*/,
4460436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                iregNo(i->ARM64in.XIndir.dstGA),
4461436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                i->ARM64in.XIndir.amPC);
4462436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
4463436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         /* imm64 x9, VG_(disp_cp_xindir) */
4464436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         /* br    x9 */
4465436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         p = imm64_to_iregNo(p, /*x*/9, Ptr_to_ULong(disp_cp_xindir));
4466436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         *p++ = 0xD61F0120; /* br x9 */
4467436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
4468436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         /* Fix up the conditional jump, if there was one. */
4469436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         if (i->ARM64in.XIndir.cond != ARM64cc_AL) {
4470436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            vassert(0); //ATC
4471436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             Int delta = (UChar*)p - (UChar*)ptmp; /* must be signed */
4472436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             vassert(delta > 0 && delta < 40);
4473436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             vassert((delta & 3) == 0);
4474436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             UInt notCond = 1 ^ (UInt)i->ARMin.XIndir.cond;
4475436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             vassert(notCond <= 13); /* Neither AL nor NV */
4476436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             delta = (delta >> 2) - 2;
4477436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             *ptmp = XX______(notCond, X1010) | (delta & 0xFFFFFF);
4478436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         }
4479436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         goto done;
4480436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      }
4481436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
4482436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case ARM64in_XAssisted: {
4483436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         /* Use ptmp for backpatching conditional jumps. */
4484436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         UInt* ptmp = NULL;
4485436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
4486436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         /* First off, if this is conditional, create a conditional
4487436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            jump over the rest of it.  Or at least, leave a space for
4488436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            it that we will shortly fill in.  I think this can only
4489436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            ever happen when VEX is driven by the switchbacker. */
4490436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         if (i->ARM64in.XAssisted.cond != ARM64cc_AL) {
4491436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            vassert(i->ARM64in.XDirect.cond != ARM64cc_NV);
4492436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            ptmp = p;
4493436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            *p++ = 0;
4494436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         }
4495436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
4496436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         /* Update the guest PC. */
4497436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         /* str r-dstGA, amPC */
4498436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         p = do_load_or_store64(p, False/*!isLoad*/,
4499436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                iregNo(i->ARM64in.XAssisted.dstGA),
4500436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                i->ARM64in.XAssisted.amPC);
4501436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
4502436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         /* movw r21,  $magic_number */
4503436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         UInt trcval = 0;
4504436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         switch (i->ARM64in.XAssisted.jk) {
4505436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case Ijk_ClientReq:   trcval = VEX_TRC_JMP_CLIENTREQ;   break;
4506436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case Ijk_Sys_syscall: trcval = VEX_TRC_JMP_SYS_SYSCALL; break;
4507436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            //case Ijk_Sys_int128:  trcval = VEX_TRC_JMP_SYS_INT128;  break;
4508436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            //case Ijk_Yield:       trcval = VEX_TRC_JMP_YIELD;       break;
4509436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            //case Ijk_EmWarn:      trcval = VEX_TRC_JMP_EMWARN;      break;
4510436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            //case Ijk_MapFail:     trcval = VEX_TRC_JMP_MAPFAIL;     break;
4511436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case Ijk_NoDecode:    trcval = VEX_TRC_JMP_NODECODE;    break;
4512eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov            case Ijk_InvalICache: trcval = VEX_TRC_JMP_INVALICACHE; break;
4513eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov            case Ijk_FlushDCache: trcval = VEX_TRC_JMP_FLUSHDCACHE; break;
45142ca80a6a6fc069acdb73186e8e578dbf8f46af80Dmitriy Ivanov            case Ijk_NoRedir:     trcval = VEX_TRC_JMP_NOREDIR;     break;
4515436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            //case Ijk_SigTRAP:     trcval = VEX_TRC_JMP_SIGTRAP;     break;
4516436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            //case Ijk_SigSEGV:     trcval = VEX_TRC_JMP_SIGSEGV;     break;
4517436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case Ijk_Boring:      trcval = VEX_TRC_JMP_BORING;      break;
4518436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            /* We don't expect to see the following being assisted. */
4519436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            //case Ijk_Ret:
4520436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            //case Ijk_Call:
4521436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            /* fallthrough */
4522436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            default:
4523436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               ppIRJumpKind(i->ARM64in.XAssisted.jk);
4524436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               vpanic("emit_ARM64Instr.ARM64in_XAssisted: "
4525436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                      "unexpected jump kind");
4526436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         }
4527436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         vassert(trcval != 0);
4528436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         p = imm64_to_iregNo(p, /*x*/21, (ULong)trcval);
4529436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
4530436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         /* imm64 x9, VG_(disp_cp_xassisted) */
4531436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         /* br    x9 */
4532436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         p = imm64_to_iregNo(p, /*x*/9, Ptr_to_ULong(disp_cp_xassisted));
4533436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         *p++ = 0xD61F0120; /* br x9 */
4534436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
4535436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         /* Fix up the conditional jump, if there was one. */
4536436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         if (i->ARM64in.XAssisted.cond != ARM64cc_AL) {
4537436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            Int delta = (UChar*)p - (UChar*)ptmp; /* must be signed */
4538436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            vassert(delta > 0 && delta < 40);
4539436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            vassert((delta & 3) == 0);
4540436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            UInt notCond = 1 ^ (UInt)i->ARM64in.XDirect.cond;
4541436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            vassert(notCond <= 13); /* Neither AL nor NV */
4542436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            vassert(ptmp != NULL);
4543436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            delta = delta >> 2;
4544436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            *ptmp = X_8_19_1_4(X01010100, delta & ((1<<19)-1), 0, notCond);
4545436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         }
4546436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         goto done;
4547436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      }
4548436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
4549436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case ARM64in_CSel: {
4550436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         /* 100 1101 0100 mm cond 00 nn dd = CSEL Xd, Xn, Xm, cond */
4551436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         UInt dd   = iregNo(i->ARM64in.CSel.dst);
4552436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         UInt nn   = iregNo(i->ARM64in.CSel.argL);
4553436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         UInt mm   = iregNo(i->ARM64in.CSel.argR);
4554436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         UInt cond = (UInt)i->ARM64in.CSel.cond;
4555436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         vassert(dd < 31 && nn < 31 && mm < 31 && cond < 16);
4556436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         *p++ = X_3_8_5_6_5_5(X100, X11010100, mm, cond << 2, nn, dd);
4557436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         goto done;
4558436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      }
4559436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
4560436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case ARM64in_Call: {
4561436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         /* We'll use x9 as a scratch register to put the target
4562436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            address in. */
4563436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         if (i->ARM64in.Call.cond != ARM64cc_AL
4564436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov             && i->ARM64in.Call.rloc.pri != RLPri_None) {
4565436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            /* The call might not happen (it isn't unconditional) and
4566436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               it returns a result.  In this case we will need to
4567436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               generate a control flow diamond to put 0x555..555 in
4568436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               the return register(s) in the case where the call
4569436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               doesn't happen.  If this ever becomes necessary, maybe
4570436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               copy code from the 32-bit ARM equivalent.  Until that
4571436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               day, just give up. */
4572436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            goto bad;
4573436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         }
4574436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
4575436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         UInt* ptmp = NULL;
4576436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         if (i->ARM64in.Call.cond != ARM64cc_AL) {
4577436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            /* Create a hole to put a conditional branch in.  We'll
4578436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               patch it once we know the branch length. */
4579436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            ptmp = p;
4580436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            *p++ = 0;
4581436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         }
4582436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
4583436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         // x9 = &target
4584436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         p = imm64_to_iregNo( (UInt*)p,
4585436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                              /*x*/9, (ULong)i->ARM64in.Call.target );
4586436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         // blr x9
4587436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         *p++ = 0xD63F0120;
4588436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
4589436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         // Patch the hole if necessary
4590436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         if (i->ARM64in.Call.cond != ARM64cc_AL) {
4591436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            ULong dist = (ULong)(p - ptmp);
4592436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            /* imm64_to_iregNo produces between 1 and 4 insns, and
4593436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               then there's the BLR itself.  Hence: */
4594436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            vassert(dist >= 2 && dist <= 5);
4595436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            vassert(ptmp != NULL);
4596436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            // 01010100 simm19 0 cond = B.cond (here + simm19 << 2)
4597436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            *ptmp = X_8_19_1_4(X01010100, dist, 0,
4598436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                               1 ^ (UInt)i->ARM64in.Call.cond);
4599436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         } else {
4600436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            vassert(ptmp == NULL);
4601436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         }
4602436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
4603436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         goto done;
4604436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      }
4605436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
4606436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case ARM64in_AddToSP: {
4607436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         /* 10,0 10001 00 imm12 11111 11111  ADD xsp, xsp, #imm12
4608436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            11,0 10001 00 imm12 11111 11111  SUB xsp, xsp, #imm12
4609436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         */
4610436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         Int simm12 = i->ARM64in.AddToSP.simm;
4611436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         vassert(-4096 < simm12 && simm12 < 4096);
4612436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         vassert(0 == (simm12 & 0xF));
4613436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         if (simm12 >= 0) {
4614436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            *p++ = X_2_6_2_12_5_5(X10, X010001, X00, simm12, X11111, X11111);
4615436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         } else {
4616436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            *p++ = X_2_6_2_12_5_5(X11, X010001, X00, -simm12, X11111, X11111);
4617436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         }
4618436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         goto done;
4619436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      }
4620436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
4621436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case ARM64in_FromSP: {
4622436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         /* 10,0 10001 00 0..(12)..0 11111 dd  MOV Xd, xsp */
4623436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         UInt dd = iregNo(i->ARM64in.FromSP.dst);
4624436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         vassert(dd < 31);
4625436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         *p++ = X_2_6_2_12_5_5(X10, X010001, X00, 0, X11111, dd);
4626436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         goto done;
4627436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      }
4628436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
4629436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case ARM64in_Mul: {
4630436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         /* 100 11011 110 mm 011111 nn dd   UMULH Xd, Xn,Xm
4631436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            100 11011 010 mm 011111 nn dd   SMULH Xd, Xn,Xm
4632436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            100 11011 000 mm 011111 nn dd   MUL   Xd, Xn,Xm
4633436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         */
4634436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         UInt dd = iregNo(i->ARM64in.Mul.dst);
4635436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         UInt nn = iregNo(i->ARM64in.Mul.argL);
4636436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         UInt mm = iregNo(i->ARM64in.Mul.argR);
4637436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         vassert(dd < 31 && nn < 31 && mm < 31);
4638436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         switch (i->ARM64in.Mul.op) {
4639436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case ARM64mul_ZX:
4640436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               *p++ = X_3_8_5_6_5_5(X100, X11011110, mm, X011111, nn, dd);
4641436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               goto done;
4642eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov            case ARM64mul_SX:
4643eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov               *p++ = X_3_8_5_6_5_5(X100, X11011010, mm, X011111, nn, dd);
4644eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov               goto done;
4645436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case ARM64mul_PLAIN:
4646436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               *p++ = X_3_8_5_6_5_5(X100, X11011000, mm, X011111, nn, dd);
4647436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               goto done;
4648436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            default:
4649436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               vassert(0);
4650436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         }
4651436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         goto bad;
4652436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      }
4653436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case ARM64in_LdrEX: {
4654436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         /* 085F7C82   ldxrb w2, [x4]
4655436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            485F7C82   ldxrh w2, [x4]
4656436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            885F7C82   ldxr  w2, [x4]
4657436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            C85F7C82   ldxr  x2, [x4]
4658436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         */
4659436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         switch (i->ARM64in.LdrEX.szB) {
4660436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case 1: *p++ = 0x085F7C82; goto done;
4661436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case 2: *p++ = 0x485F7C82; goto done;
4662436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case 4: *p++ = 0x885F7C82; goto done;
4663436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case 8: *p++ = 0xC85F7C82; goto done;
4664436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            default: break;
4665436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         }
4666436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         goto bad;
4667436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      }
4668436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case ARM64in_StrEX: {
4669436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         /* 08007C82   stxrb w0, w2, [x4]
4670436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            48007C82   stxrh w0, w2, [x4]
4671436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            88007C82   stxr  w0, w2, [x4]
4672436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            C8007C82   stxr  w0, x2, [x4]
4673436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         */
4674436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         switch (i->ARM64in.StrEX.szB) {
4675436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case 1: *p++ = 0x08007C82; goto done;
4676436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case 2: *p++ = 0x48007C82; goto done;
4677436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case 4: *p++ = 0x88007C82; goto done;
4678436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case 8: *p++ = 0xC8007C82; goto done;
4679436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            default: break;
4680436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         }
4681436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         goto bad;
4682436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      }
4683436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case ARM64in_MFence: {
4684436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         *p++ = 0xD5033F9F; /* DSB sy */
4685436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         *p++ = 0xD5033FBF; /* DMB sy */
4686436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         *p++ = 0xD5033FDF; /* ISB */
4687436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         goto done;
4688436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      }
4689436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      //case ARM64in_CLREX: {
4690436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      //   //ATC, but believed to be correct
4691436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      //   goto bad;
4692436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      //   *p++ = 0xD5033F5F; /* clrex */
4693436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      //   goto done;
4694436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      //}
4695436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case ARM64in_VLdStS: {
4696436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         /* 10 111101 01 imm12 n t   LDR St, [Xn|SP, #imm12 * 4]
4697436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            10 111101 00 imm12 n t   STR St, [Xn|SP, #imm12 * 4]
4698436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         */
4699436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         UInt sD     = dregNo(i->ARM64in.VLdStS.sD);
4700436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         UInt rN     = iregNo(i->ARM64in.VLdStS.rN);
4701436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         UInt uimm12 = i->ARM64in.VLdStS.uimm12;
4702436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         Bool isLD   = i->ARM64in.VLdStS.isLoad;
4703436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         vassert(uimm12 < 16384 && 0 == (uimm12 & 3));
4704436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         uimm12 >>= 2;
4705436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         vassert(uimm12 < (1<<12));
4706436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         vassert(sD < 32);
4707436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         vassert(rN < 31);
4708436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         *p++ = X_2_6_2_12_5_5(X10, X111101, isLD ? X01 : X00,
4709436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                               uimm12, rN, sD);
4710436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         goto done;
4711436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      }
4712436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case ARM64in_VLdStD: {
4713436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         /* 11 111101 01 imm12 n t   LDR Dt, [Xn|SP, #imm12 * 8]
4714436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            11 111101 00 imm12 n t   STR Dt, [Xn|SP, #imm12 * 8]
4715436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         */
4716436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         UInt dD     = dregNo(i->ARM64in.VLdStD.dD);
4717436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         UInt rN     = iregNo(i->ARM64in.VLdStD.rN);
4718436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         UInt uimm12 = i->ARM64in.VLdStD.uimm12;
4719436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         Bool isLD   = i->ARM64in.VLdStD.isLoad;
4720436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         vassert(uimm12 < 32768 && 0 == (uimm12 & 7));
4721436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         uimm12 >>= 3;
4722436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         vassert(uimm12 < (1<<12));
4723436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         vassert(dD < 32);
4724436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         vassert(rN < 31);
4725436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         *p++ = X_2_6_2_12_5_5(X11, X111101, isLD ? X01 : X00,
4726436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                               uimm12, rN, dD);
4727436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         goto done;
4728436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      }
4729436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case ARM64in_VLdStQ: {
4730436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         /* 0100 1100 0000 0000 0111 11 rN rQ   st1 {vQ.2d}, [<rN|SP>]
4731436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            0100 1100 0100 0000 0111 11 rN rQ   ld1 {vQ.2d}, [<rN|SP>]
4732436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         */
4733436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         UInt rQ = qregNo(i->ARM64in.VLdStQ.rQ);
4734436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         UInt rN = iregNo(i->ARM64in.VLdStQ.rN);
4735436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         vassert(rQ < 32);
4736436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         vassert(rN < 31);
4737436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         if (i->ARM64in.VLdStQ.isLoad) {
4738436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            *p++ = 0x4C407C00 | (rN << 5) | rQ;
4739436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         } else {
4740436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            *p++ = 0x4C007C00 | (rN << 5) | rQ;
4741436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         }
4742436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         goto done;
4743436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      }
4744436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case ARM64in_VCvtI2F: {
4745436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         /* 31  28    23 21 20 18  15     9 4
4746436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            000 11110 00 1  00 010 000000 n d  SCVTF Sd, Wn
4747436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            000 11110 01 1  00 010 000000 n d  SCVTF Dd, Wn
4748436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            100 11110 00 1  00 010 000000 n d  SCVTF Sd, Xn
4749436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            100 11110 01 1  00 010 000000 n d  SCVTF Dd, Xn
4750436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            000 11110 00 1  00 011 000000 n d  UCVTF Sd, Wn
4751436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            000 11110 01 1  00 011 000000 n d  UCVTF Dd, Wn
4752436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            100 11110 00 1  00 011 000000 n d  UCVTF Sd, Xn
4753436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            100 11110 01 1  00 011 000000 n d  UCVTF Dd, Xn
4754436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         */
4755436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         UInt       rN = iregNo(i->ARM64in.VCvtI2F.rS);
4756436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         UInt       rD = dregNo(i->ARM64in.VCvtI2F.rD);
4757436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         ARM64CvtOp how = i->ARM64in.VCvtI2F.how;
4758436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         /* Just handle cases as they show up. */
4759436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         switch (how) {
4760436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case ARM64cvt_F32_I32S: /* SCVTF Sd, Wn */
4761436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               *p++ = X_3_5_8_6_5_5(X000, X11110, X00100010, X000000, rN, rD);
4762436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               break;
4763436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case ARM64cvt_F64_I32S: /* SCVTF Dd, Wn */
4764436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               *p++ = X_3_5_8_6_5_5(X000, X11110, X01100010, X000000, rN, rD);
4765436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               break;
4766436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case ARM64cvt_F32_I64S: /* SCVTF Sd, Xn */
4767436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               *p++ = X_3_5_8_6_5_5(X100, X11110, X00100010, X000000, rN, rD);
4768436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               break;
4769436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case ARM64cvt_F64_I64S: /* SCVTF Dd, Xn */
4770436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               *p++ = X_3_5_8_6_5_5(X100, X11110, X01100010, X000000, rN, rD);
4771436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               break;
47722ca80a6a6fc069acdb73186e8e578dbf8f46af80Dmitriy Ivanov            case ARM64cvt_F32_I32U: /* UCVTF Sd, Wn */
47732ca80a6a6fc069acdb73186e8e578dbf8f46af80Dmitriy Ivanov               *p++ = X_3_5_8_6_5_5(X000, X11110, X00100011, X000000, rN, rD);
47742ca80a6a6fc069acdb73186e8e578dbf8f46af80Dmitriy Ivanov               break;
4775436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case ARM64cvt_F64_I32U: /* UCVTF Dd, Wn */
4776436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               *p++ = X_3_5_8_6_5_5(X000, X11110, X01100011, X000000, rN, rD);
4777436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               break;
4778436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case ARM64cvt_F32_I64U: /* UCVTF Sd, Xn */
4779436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               *p++ = X_3_5_8_6_5_5(X100, X11110, X00100011, X000000, rN, rD);
4780436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               break;
4781436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case ARM64cvt_F64_I64U: /* UCVTF Dd, Xn  */
4782436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               *p++ = X_3_5_8_6_5_5(X100, X11110, X01100011, X000000, rN, rD);
4783436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               break;
4784436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            default:
4785436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               goto bad; //ATC
4786436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         }
4787436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         goto done;
4788436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      }
4789436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case ARM64in_VCvtF2I: {
4790436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         /*    30       23   20 18  15     9 4
4791436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            sf 00,11110,0x 1 00 000,000000 n d  FCVTNS Rd, Fn (round to
4792436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            sf 00,11110,0x 1 00 001,000000 n d  FCVTNU Rd, Fn  nearest)
4793436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            ---------------- 01 --------------  FCVTP-------- (round to +inf)
4794436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            ---------------- 10 --------------  FCVTM-------- (round to -inf)
4795436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            ---------------- 11 --------------  FCVTZ-------- (round to zero)
4796436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
4797436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            Rd is Xd when sf==1, Wd when sf==0
4798436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            Fn is Dn when x==1, Sn when x==0
4799436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            20:19 carry the rounding mode, using the same encoding as FPCR
4800436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         */
4801436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         UInt       rD    = iregNo(i->ARM64in.VCvtF2I.rD);
4802436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         UInt       rN    = dregNo(i->ARM64in.VCvtF2I.rS);
4803436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         ARM64CvtOp how   = i->ARM64in.VCvtF2I.how;
4804436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         UChar      armRM = i->ARM64in.VCvtF2I.armRM;
4805436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         /* Just handle cases as they show up. */
4806436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         switch (how) {
4807436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case ARM64cvt_F64_I32S: /* FCVTxS Wd, Dn */
4808436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               *p++ = X_3_5_8_6_5_5(X000, X11110, X01100000 | (armRM << 3),
4809436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                    X000000, rN, rD);
4810436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               break;
4811436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case ARM64cvt_F64_I32U: /* FCVTxU Wd, Dn */
4812436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               *p++ = X_3_5_8_6_5_5(X000, X11110, X01100001 | (armRM << 3),
4813436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                    X000000, rN, rD);
4814436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               break;
4815436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case ARM64cvt_F64_I64S: /* FCVTxS Xd, Dn */
4816436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               *p++ = X_3_5_8_6_5_5(X100, X11110, X01100000 | (armRM << 3),
4817436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                    X000000, rN, rD);
4818436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               break;
4819436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case ARM64cvt_F64_I64U: /* FCVTxU Xd, Dn */
4820436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               *p++ = X_3_5_8_6_5_5(X100, X11110, X01100001 | (armRM << 3),
4821436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                    X000000, rN, rD);
4822436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               break;
4823436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case ARM64cvt_F32_I32S: /* FCVTxS Wd, Sn */
4824436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               *p++ = X_3_5_8_6_5_5(X000, X11110, X00100000 | (armRM << 3),
4825436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                    X000000, rN, rD);
4826436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               break;
48272ca80a6a6fc069acdb73186e8e578dbf8f46af80Dmitriy Ivanov            case ARM64cvt_F32_I32U: /* FCVTxU Wd, Sn */
48282ca80a6a6fc069acdb73186e8e578dbf8f46af80Dmitriy Ivanov               *p++ = X_3_5_8_6_5_5(X000, X11110, X00100001 | (armRM << 3),
48292ca80a6a6fc069acdb73186e8e578dbf8f46af80Dmitriy Ivanov                                    X000000, rN, rD);
48302ca80a6a6fc069acdb73186e8e578dbf8f46af80Dmitriy Ivanov               break;
48312ca80a6a6fc069acdb73186e8e578dbf8f46af80Dmitriy Ivanov            case ARM64cvt_F32_I64S: /* FCVTxS Xd, Sn */
48322ca80a6a6fc069acdb73186e8e578dbf8f46af80Dmitriy Ivanov               *p++ = X_3_5_8_6_5_5(X100, X11110, X00100000 | (armRM << 3),
48332ca80a6a6fc069acdb73186e8e578dbf8f46af80Dmitriy Ivanov                                    X000000, rN, rD);
48342ca80a6a6fc069acdb73186e8e578dbf8f46af80Dmitriy Ivanov               break;
4835436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case ARM64cvt_F32_I64U: /* FCVTxU Xd, Sn */
4836436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               *p++ = X_3_5_8_6_5_5(X100, X11110, X00100001 | (armRM << 3),
4837436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                    X000000, rN, rD);
4838436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               break;
4839436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            default:
4840436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               goto bad; //ATC
4841436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         }
4842436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         goto done;
4843436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      }
4844436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case ARM64in_VCvtSD: {
4845436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         /* 31        23 21     16  14    9 4
4846436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            000,11110, 00 10001 0,1 10000 n d   FCVT Dd, Sn (S->D)
4847436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            ---------- 01 ----- 0,0 ---------   FCVT Sd, Dn (D->S)
4848436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            Rounding, when dst is smaller than src, is per the FPCR.
4849436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         */
4850436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         UInt dd = dregNo(i->ARM64in.VCvtSD.dst);
4851436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         UInt nn = dregNo(i->ARM64in.VCvtSD.src);
4852436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         if (i->ARM64in.VCvtSD.sToD) {
4853436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            *p++ = X_3_5_8_6_5_5(X000, X11110, X00100010, X110000, nn, dd);
4854436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         } else {
4855436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            *p++ = X_3_5_8_6_5_5(X000, X11110, X01100010, X010000, nn, dd);
4856436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         }
4857436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         goto done;
4858436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      }
4859436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case ARM64in_VUnaryD: {
4860436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         /* 31        23 21     16 14    9 4
4861436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            000,11110 01 1,0000 0,0 10000 n d  FMOV Dd, Dn (not handled)
4862436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            ------------------- 0,1 ---------  FABS ------
4863436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            ------------------- 1,0 ---------  FNEG ------
4864436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            ------------------- 1,1 ---------  FQSRT -----
4865436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         */
4866436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         UInt dD  = dregNo(i->ARM64in.VUnaryD.dst);
4867436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         UInt dN  = dregNo(i->ARM64in.VUnaryD.src);
4868436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         UInt b16 = 2; /* impossible */
4869436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         UInt b15 = 2; /* impossible */
4870436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         switch (i->ARM64in.VUnaryD.op) {
4871436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case ARM64fpu_NEG:  b16 = 1; b15 = 0; break;
4872436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case ARM64fpu_SQRT: b16 = 1; b15 = 1; break;
4873436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case ARM64fpu_ABS:  b16 = 0; b15 = 1; break;
4874436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            default: break;
4875436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         }
4876436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         if (b16 < 2 && b15 < 2) {
4877436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            *p++ = X_3_8_5_6_5_5(X000, X11110011, (X0000 << 1) | b16,
4878436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                 (b15 << 5) | X10000, dN, dD);
4879436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            goto done;
4880436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         }
4881436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         /*
4882436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            000, 11110 01 1,001 11,1 10000 n d  FRINTI Dd, Dm (round per FPCR)
4883436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         */
4884436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         if (i->ARM64in.VUnaryD.op == ARM64fpu_RINT) {
4885436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov           *p++ = X_3_8_5_6_5_5(X000, X11110011, X00111, X110000, dN, dD);
4886436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov           goto done;
4887436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         }
4888436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         goto bad;
4889436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      }
4890436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case ARM64in_VUnaryS: {
4891436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         /* 31        23 21     16 14    9 4
4892436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            000,11110 00 1,0000 0,0 10000 n d  FMOV Sd, Sn (not handled)
4893436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            ------------------- 0,1 ---------  FABS ------
4894436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            ------------------- 1,0 ---------  FNEG ------
4895436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            ------------------- 1,1 ---------  FQSRT -----
4896436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         */
4897436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         UInt sD  = dregNo(i->ARM64in.VUnaryS.dst);
4898436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         UInt sN  = dregNo(i->ARM64in.VUnaryS.src);
4899436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         UInt b16 = 2; /* impossible */
4900436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         UInt b15 = 2; /* impossible */
4901436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         switch (i->ARM64in.VUnaryS.op) {
4902436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case ARM64fpu_NEG:  b16 = 1; b15 = 0; break;
4903436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case ARM64fpu_SQRT: b16 = 1; b15 = 1; break;
4904436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case ARM64fpu_ABS:  b16 = 0; b15 = 1; break;
4905436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            default: break;
4906436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         }
4907436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         if (b16 < 2 && b15 < 2) {
4908436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            *p++ = X_3_8_5_6_5_5(X000, X11110001, (X0000 << 1) | b16,
4909436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                 (b15 << 5) | X10000, sN, sD);
4910436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            goto done;
4911436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         }
4912436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         /*
4913436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            000, 11110 00 1,001 11,1 10000 n d  FRINTI Sd, Sm (round per FPCR)
4914436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         */
4915436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         if (i->ARM64in.VUnaryS.op == ARM64fpu_RINT) {
4916436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov           *p++ = X_3_8_5_6_5_5(X000, X11110001, X00111, X110000, sN, sD);
4917436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov           goto done;
4918436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         }
4919436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         goto bad;
4920436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      }
4921436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case ARM64in_VBinD: {
4922436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         /* 31        23  20 15   11 9 4
4923436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            ---------------- 0000 ------   FMUL  --------
4924436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            000 11110 011 m  0001 10 n d   FDIV  Dd,Dn,Dm
4925436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            ---------------- 0010 ------   FADD  --------
4926436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            ---------------- 0011 ------   FSUB  --------
4927436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         */
4928436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         UInt dD = dregNo(i->ARM64in.VBinD.dst);
4929436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         UInt dN = dregNo(i->ARM64in.VBinD.argL);
4930436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         UInt dM = dregNo(i->ARM64in.VBinD.argR);
4931436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         UInt b1512 = 16; /* impossible */
4932436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         switch (i->ARM64in.VBinD.op) {
4933436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case ARM64fpb_DIV: b1512 = X0001; break;
4934436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case ARM64fpb_MUL: b1512 = X0000; break;
4935436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case ARM64fpb_SUB: b1512 = X0011; break;
4936436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case ARM64fpb_ADD: b1512 = X0010; break;
4937436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            default: goto bad;
4938436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         }
4939436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         vassert(b1512 < 16);
4940436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         *p++
4941436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            = X_3_8_5_6_5_5(X000, X11110011, dM, (b1512 << 2) | X10, dN, dD);
4942436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         goto done;
4943436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      }
4944436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case ARM64in_VBinS: {
4945436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         /* 31        23  20 15   11 9 4
4946436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            ---------------- 0000 ------   FMUL  --------
4947436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            000 11110 001 m  0001 10 n d   FDIV  Dd,Dn,Dm
4948436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            ---------------- 0010 ------   FADD  --------
4949436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            ---------------- 0011 ------   FSUB  --------
4950436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         */
4951436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         UInt sD = dregNo(i->ARM64in.VBinS.dst);
4952436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         UInt sN = dregNo(i->ARM64in.VBinS.argL);
4953436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         UInt sM = dregNo(i->ARM64in.VBinS.argR);
4954436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         UInt b1512 = 16; /* impossible */
4955436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         switch (i->ARM64in.VBinS.op) {
4956436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case ARM64fpb_DIV: b1512 = X0001; break;
4957436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case ARM64fpb_MUL: b1512 = X0000; break;
4958436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case ARM64fpb_SUB: b1512 = X0011; break;
4959436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case ARM64fpb_ADD: b1512 = X0010; break;
4960436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            default: goto bad;
4961436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         }
4962436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         vassert(b1512 < 16);
4963436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         *p++
4964436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            = X_3_8_5_6_5_5(X000, X11110001, sM, (b1512 << 2) | X10, sN, sD);
4965436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         goto done;
4966436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      }
4967436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case ARM64in_VCmpD: {
4968436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         /* 000 11110 01 1 m 00 1000 n 00 000  FCMP Dn, Dm */
4969436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         UInt dN = dregNo(i->ARM64in.VCmpD.argL);
4970436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         UInt dM = dregNo(i->ARM64in.VCmpD.argR);
4971436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         *p++ = X_3_8_5_6_5_5(X000, X11110011, dM, X001000, dN, X00000);
4972436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         goto done;
4973436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      }
4974436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case ARM64in_VCmpS: {
4975436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         /* 000 11110 00 1 m 00 1000 n 00 000  FCMP Sn, Sm */
4976436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         UInt sN = dregNo(i->ARM64in.VCmpS.argL);
4977436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         UInt sM = dregNo(i->ARM64in.VCmpS.argR);
4978436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         *p++ = X_3_8_5_6_5_5(X000, X11110001, sM, X001000, sN, X00000);
4979436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         goto done;
4980436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      }
4981436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case ARM64in_FPCR: {
4982436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         Bool toFPCR = i->ARM64in.FPCR.toFPCR;
4983436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         UInt iReg   = iregNo(i->ARM64in.FPCR.iReg);
4984436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         if (toFPCR) {
4985436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            /* 0xD51B44 000 Rt  MSR fpcr, rT */
4986436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            *p++ = 0xD51B4400 | (iReg & 0x1F);
4987436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            goto done;
4988436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         }
4989436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         goto bad; // FPCR -> iReg case currently ATC
4990436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      }
4991436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case ARM64in_VBinV: {
4992436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         /* 31        23   20 15     9 4
4993eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov            010 01110 11 1 m  100001 n d   ADD Vd.2d,  Vn.2d,  Vm.2d
4994eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov            010 01110 10 1 m  100001 n d   ADD Vd.4s,  Vn.4s,  Vm.4s
4995eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov            010 01110 01 1 m  100001 n d   ADD Vd.8h,  Vn.8h,  Vm.8h
4996eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov            010 01110 00 1 m  100001 n d   ADD Vd.16b, Vn.16b, Vm.16b
4997436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
4998eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov            011 01110 11 1 m  100001 n d   SUB Vd.2d,  Vn.2d,  Vm.2d
4999eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov            011 01110 10 1 m  100001 n d   SUB Vd.4s,  Vn.4s,  Vm.4s
5000eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov            011 01110 01 1 m  100001 n d   SUB Vd.8h,  Vn.8h,  Vm.8h
5001eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov            011 01110 00 1 m  100001 n d   SUB Vd.16b, Vn.16b, Vm.16b
5002436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
5003eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov            010 01110 10 1 m  100111 n d   MUL Vd.4s,  Vn.4s,  Vm.4s
5004eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov            010 01110 01 1 m  100111 n d   MUL Vd.8h,  Vn.8h,  Vm.8h
5005eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov            010 01110 00 1 m  100111 n d   MUL Vd.16b, Vn.16b, Vm.16b
5006436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
5007436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            010 01110 01 1 m  110101 n d   FADD Vd.2d, Vn.2d, Vm.2d
5008436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            010 01110 00 1 m  110101 n d   FADD Vd.4s, Vn.4s, Vm.4s
5009436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            010 01110 11 1 m  110101 n d   FSUB Vd.2d, Vn.2d, Vm.2d
5010436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            010 01110 10 1 m  110101 n d   FSUB Vd.4s, Vn.4s, Vm.4s
5011436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
5012436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            011 01110 01 1 m  110111 n d   FMUL Vd.2d, Vn.2d, Vm.2d
5013436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            011 01110 00 1 m  110111 n d   FMUL Vd.4s, Vn.4s, Vm.4s
5014436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            011 01110 01 1 m  111111 n d   FDIV Vd.2d, Vn.2d, Vm.2d
5015436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            011 01110 00 1 m  111111 n d   FDIV Vd.4s, Vn.4s, Vm.4s
5016436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
5017436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            011 01110 10 1 m  011001 n d   UMAX Vd.4s,  Vn.4s,  Vm.4s
5018436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            011 01110 01 1 m  011001 n d   UMAX Vd.8h,  Vn.8h,  Vm.8h
5019436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            011 01110 00 1 m  011001 n d   UMAX Vd.16b, Vn.16b, Vm.16b
5020436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
5021436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            011 01110 10 1 m  011011 n d   UMIN Vd.4s,  Vn.4s,  Vm.4s
5022436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            011 01110 01 1 m  011011 n d   UMIN Vd.8h,  Vn.8h,  Vm.8h
5023436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            011 01110 00 1 m  011011 n d   UMIN Vd.16b, Vn.16b, Vm.16b
5024436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
5025436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            010 01110 10 1 m  011001 n d   SMAX Vd.4s,  Vn.4s,  Vm.4s
5026436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            010 01110 01 1 m  011001 n d   SMAX Vd.8h,  Vn.8h,  Vm.8h
5027436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            010 01110 00 1 m  011001 n d   SMAX Vd.16b, Vn.16b, Vm.16b
5028436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
5029436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            010 01110 10 1 m  011011 n d   SMIN Vd.4s,  Vn.4s,  Vm.4s
5030436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            010 01110 01 1 m  011011 n d   SMIN Vd.8h,  Vn.8h,  Vm.8h
5031436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            010 01110 00 1 m  011011 n d   SMIN Vd.16b, Vn.16b, Vm.16b
5032436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
5033436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            010 01110 00 1 m  000111 n d   AND Vd, Vn, Vm
5034436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            010 01110 10 1 m  000111 n d   ORR Vd, Vn, Vm
5035436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            011 01110 00 1 m  000111 n d   EOR Vd, Vn, Vm
5036436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
50372ca80a6a6fc069acdb73186e8e578dbf8f46af80Dmitriy Ivanov            011 01110 11 1 m  100011 n d   CMEQ Vd.2d,  Vn.2d,  Vm.2d
50382ca80a6a6fc069acdb73186e8e578dbf8f46af80Dmitriy Ivanov            011 01110 10 1 m  100011 n d   CMEQ Vd.4s,  Vn.4s,  Vm.4s
50392ca80a6a6fc069acdb73186e8e578dbf8f46af80Dmitriy Ivanov            011 01110 01 1 m  100011 n d   CMEQ Vd.8h,  Vn.8h,  Vm.8h
50402ca80a6a6fc069acdb73186e8e578dbf8f46af80Dmitriy Ivanov            011 01110 00 1 m  100011 n d   CMEQ Vd.16b, Vn.16b, Vm.16b
50412ca80a6a6fc069acdb73186e8e578dbf8f46af80Dmitriy Ivanov
5042eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov            011 01110 11 1 m  001101 n d   CMHI Vd.2d,  Vn.2d,  Vm.2d
5043eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov            011 01110 10 1 m  001101 n d   CMHI Vd.4s,  Vn.4s,  Vm.4s
5044eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov            011 01110 01 1 m  001101 n d   CMHI Vd.8h,  Vn.8h,  Vm.8h
5045eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov            011 01110 00 1 m  001101 n d   CMHI Vd.16b, Vn.16b, Vm.16b
5046eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov
5047eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov            010 01110 11 1 m  001101 n d   CMGT Vd.2d,  Vn.2d,  Vm.2d
5048eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov            010 01110 10 1 m  001101 n d   CMGT Vd.4s,  Vn.4s,  Vm.4s
5049eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov            010 01110 01 1 m  001101 n d   CMGT Vd.8h,  Vn.8h,  Vm.8h
5050eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov            010 01110 00 1 m  001101 n d   CMGT Vd.16b, Vn.16b, Vm.16b
5051eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov
5052eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov            010 01110 01 1 m  111001 n d   FCMEQ Vd.2d, Vn.2d, Vm.2d
5053eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov            010 01110 00 1 m  111001 n d   FCMEQ Vd.4s, Vn.4s, Vm.4s
5054eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov
5055eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov            011 01110 01 1 m  111001 n d   FCMGE Vd.2d, Vn.2d, Vm.2d
5056eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov            011 01110 00 1 m  111001 n d   FCMGE Vd.4s, Vn.4s, Vm.4s
5057eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov
5058eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov            011 01110 11 1 m  111001 n d   FCMGT Vd.2d, Vn.2d, Vm.2d
5059eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov            011 01110 10 1 m  111001 n d   FCMGT Vd.4s, Vn.4s, Vm.4s
5060eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov
5061eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov            010 01110 00 0 m  000000 n d   TBL Vd.16b, {Vn.16b}, Vm.16b
5062eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov
5063436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         */
5064436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         UInt vD = qregNo(i->ARM64in.VBinV.dst);
50650a8046eb0993fb7e155b03cc5ef3323fca3467c0Dmitriy Ivanov         ARM64VecBinOp op = i->ARM64in.VBinV.op;
50660a8046eb0993fb7e155b03cc5ef3323fca3467c0Dmitriy Ivanov         Bool isV128 = (op != ARM64vecb_UMULL8x8
50670a8046eb0993fb7e155b03cc5ef3323fca3467c0Dmitriy Ivanov                        && op != ARM64vecb_UMULL16x4
50680a8046eb0993fb7e155b03cc5ef3323fca3467c0Dmitriy Ivanov                        && op != ARM64vecb_UMULL32x2);
50690a8046eb0993fb7e155b03cc5ef3323fca3467c0Dmitriy Ivanov         UInt vN = isV128 ? qregNo(i->ARM64in.VBinV.argL)
50700a8046eb0993fb7e155b03cc5ef3323fca3467c0Dmitriy Ivanov                          : dregNo(i->ARM64in.VBinV.argL);
50710a8046eb0993fb7e155b03cc5ef3323fca3467c0Dmitriy Ivanov         UInt vM = isV128 ? qregNo(i->ARM64in.VBinV.argR)
50720a8046eb0993fb7e155b03cc5ef3323fca3467c0Dmitriy Ivanov                          : dregNo(i->ARM64in.VBinV.argR);
5073436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         switch (i->ARM64in.VBinV.op) {
5074436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case ARM64vecb_ADD64x2:
5075436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               *p++ = X_3_8_5_6_5_5(X010, X01110111, vM, X100001, vN, vD);
5076436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               break;
5077436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case ARM64vecb_ADD32x4:
5078436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               *p++ = X_3_8_5_6_5_5(X010, X01110101, vM, X100001, vN, vD);
5079436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               break;
5080436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case ARM64vecb_ADD16x8:
5081436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               *p++ = X_3_8_5_6_5_5(X010, X01110011, vM, X100001, vN, vD);
5082436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               break;
5083eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov            case ARM64vecb_ADD8x16:
5084eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov               *p++ = X_3_8_5_6_5_5(X010, X01110001, vM, X100001, vN, vD);
5085eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov               break;
5086436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case ARM64vecb_SUB64x2:
5087436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               *p++ = X_3_8_5_6_5_5(X011, X01110111, vM, X100001, vN, vD);
5088436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               break;
5089436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case ARM64vecb_SUB32x4:
5090436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               *p++ = X_3_8_5_6_5_5(X011, X01110101, vM, X100001, vN, vD);
5091436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               break;
5092436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case ARM64vecb_SUB16x8:
5093436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               *p++ = X_3_8_5_6_5_5(X011, X01110011, vM, X100001, vN, vD);
5094436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               break;
5095eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov            case ARM64vecb_SUB8x16:
5096eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov               *p++ = X_3_8_5_6_5_5(X011, X01110001, vM, X100001, vN, vD);
5097eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov               break;
5098436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case ARM64vecb_MUL32x4:
5099436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               *p++ = X_3_8_5_6_5_5(X010, X01110101, vM, X100111, vN, vD);
5100436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               break;
5101436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case ARM64vecb_MUL16x8:
5102436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               *p++ = X_3_8_5_6_5_5(X010, X01110011, vM, X100111, vN, vD);
5103436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               break;
5104eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov            case ARM64vecb_MUL8x16:
5105eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov               *p++ = X_3_8_5_6_5_5(X010, X01110001, vM, X100111, vN, vD);
5106eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov               break;
5107436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case ARM64vecb_FADD64x2:
5108436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               *p++ = X_3_8_5_6_5_5(X010, X01110011, vM, X110101, vN, vD);
5109436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               break;
5110436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case ARM64vecb_FADD32x4:
5111436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               *p++ = X_3_8_5_6_5_5(X010, X01110001, vM, X110101, vN, vD);
5112436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               break;
5113436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case ARM64vecb_FSUB64x2:
5114436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               *p++ = X_3_8_5_6_5_5(X010, X01110111, vM, X110101, vN, vD);
5115436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               break;
5116436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case ARM64vecb_FSUB32x4:
5117436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               *p++ = X_3_8_5_6_5_5(X010, X01110101, vM, X110101, vN, vD);
5118436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               break;
5119436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case ARM64vecb_FMUL64x2:
5120436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               *p++ = X_3_8_5_6_5_5(X011, X01110011, vM, X110111, vN, vD);
5121436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               break;
5122436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case ARM64vecb_FMUL32x4:
5123436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               *p++ = X_3_8_5_6_5_5(X011, X01110001, vM, X110111, vN, vD);
5124436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               break;
5125436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case ARM64vecb_FDIV64x2:
5126436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               *p++ = X_3_8_5_6_5_5(X011, X01110011, vM, X111111, vN, vD);
5127436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               break;
5128436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case ARM64vecb_FDIV32x4:
5129436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               *p++ = X_3_8_5_6_5_5(X011, X01110001, vM, X111111, vN, vD);
5130436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               break;
5131436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
5132436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case ARM64vecb_UMAX32x4:
5133436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               *p++ = X_3_8_5_6_5_5(X011, X01110101, vM, X011001, vN, vD);
5134436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               break;
5135436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case ARM64vecb_UMAX16x8:
5136436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               *p++ = X_3_8_5_6_5_5(X011, X01110011, vM, X011001, vN, vD);
5137436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               break;
5138436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case ARM64vecb_UMAX8x16:
5139436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               *p++ = X_3_8_5_6_5_5(X011, X01110001, vM, X011001, vN, vD);
5140436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               break;
5141436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
5142436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case ARM64vecb_UMIN32x4:
5143436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               *p++ = X_3_8_5_6_5_5(X011, X01110101, vM, X011011, vN, vD);
5144436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               break;
5145436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case ARM64vecb_UMIN16x8:
5146436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               *p++ = X_3_8_5_6_5_5(X011, X01110011, vM, X011011, vN, vD);
5147436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               break;
5148436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case ARM64vecb_UMIN8x16:
5149436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               *p++ = X_3_8_5_6_5_5(X011, X01110001, vM, X011011, vN, vD);
5150436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               break;
5151436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
51520a8046eb0993fb7e155b03cc5ef3323fca3467c0Dmitriy Ivanov            case ARM64vecb_UMULL32x2:
51530a8046eb0993fb7e155b03cc5ef3323fca3467c0Dmitriy Ivanov               *p++ = X_3_8_5_6_5_5(X001, X01110101, vM, X110000, vN, vD);
51540a8046eb0993fb7e155b03cc5ef3323fca3467c0Dmitriy Ivanov               break;
51550a8046eb0993fb7e155b03cc5ef3323fca3467c0Dmitriy Ivanov            case ARM64vecb_UMULL16x4:
51560a8046eb0993fb7e155b03cc5ef3323fca3467c0Dmitriy Ivanov               *p++ = X_3_8_5_6_5_5(X001, X01110011, vM, X110000, vN, vD);
51570a8046eb0993fb7e155b03cc5ef3323fca3467c0Dmitriy Ivanov               break;
51580a8046eb0993fb7e155b03cc5ef3323fca3467c0Dmitriy Ivanov            case ARM64vecb_UMULL8x8:
51590a8046eb0993fb7e155b03cc5ef3323fca3467c0Dmitriy Ivanov               *p++ = X_3_8_5_6_5_5(X001, X01110001, vM, X110000, vN, vD);
51600a8046eb0993fb7e155b03cc5ef3323fca3467c0Dmitriy Ivanov               break;
51610a8046eb0993fb7e155b03cc5ef3323fca3467c0Dmitriy Ivanov
5162436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case ARM64vecb_SMAX32x4:
5163436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               *p++ = X_3_8_5_6_5_5(X010, X01110101, vM, X011001, vN, vD);
5164436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               break;
5165436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case ARM64vecb_SMAX16x8:
5166436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               *p++ = X_3_8_5_6_5_5(X010, X01110011, vM, X011001, vN, vD);
5167436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               break;
5168436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case ARM64vecb_SMAX8x16:
5169436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               *p++ = X_3_8_5_6_5_5(X010, X01110001, vM, X011001, vN, vD);
5170436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               break;
5171436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
5172436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case ARM64vecb_SMIN32x4:
5173436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               *p++ = X_3_8_5_6_5_5(X010, X01110101, vM, X011011, vN, vD);
5174436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               break;
5175436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case ARM64vecb_SMIN16x8:
5176436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               *p++ = X_3_8_5_6_5_5(X010, X01110011, vM, X011011, vN, vD);
5177436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               break;
5178436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case ARM64vecb_SMIN8x16:
5179436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               *p++ = X_3_8_5_6_5_5(X010, X01110001, vM, X011011, vN, vD);
5180436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               break;
5181436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
5182436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case ARM64vecb_AND:
5183436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               *p++ = X_3_8_5_6_5_5(X010, X01110001, vM, X000111, vN, vD);
5184436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               break;
5185436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case ARM64vecb_ORR:
5186436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               *p++ = X_3_8_5_6_5_5(X010, X01110101, vM, X000111, vN, vD);
5187436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               break;
5188436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case ARM64vecb_XOR:
5189436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               *p++ = X_3_8_5_6_5_5(X011, X01110001, vM, X000111, vN, vD);
5190436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               break;
5191436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
5192436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case ARM64vecb_CMEQ64x2:
5193436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               *p++ = X_3_8_5_6_5_5(X011, X01110111, vM, X100011, vN, vD);
5194436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               break;
51952ca80a6a6fc069acdb73186e8e578dbf8f46af80Dmitriy Ivanov            case ARM64vecb_CMEQ32x4:
51962ca80a6a6fc069acdb73186e8e578dbf8f46af80Dmitriy Ivanov               *p++ = X_3_8_5_6_5_5(X011, X01110101, vM, X100011, vN, vD);
51972ca80a6a6fc069acdb73186e8e578dbf8f46af80Dmitriy Ivanov               break;
51982ca80a6a6fc069acdb73186e8e578dbf8f46af80Dmitriy Ivanov            case ARM64vecb_CMEQ16x8:
51992ca80a6a6fc069acdb73186e8e578dbf8f46af80Dmitriy Ivanov               *p++ = X_3_8_5_6_5_5(X011, X01110011, vM, X100011, vN, vD);
52002ca80a6a6fc069acdb73186e8e578dbf8f46af80Dmitriy Ivanov               break;
52012ca80a6a6fc069acdb73186e8e578dbf8f46af80Dmitriy Ivanov            case ARM64vecb_CMEQ8x16:
52022ca80a6a6fc069acdb73186e8e578dbf8f46af80Dmitriy Ivanov               *p++ = X_3_8_5_6_5_5(X011, X01110001, vM, X100011, vN, vD);
52032ca80a6a6fc069acdb73186e8e578dbf8f46af80Dmitriy Ivanov               break;
5204436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
5205eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov            case ARM64vecb_CMHI64x2:
5206eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov               *p++ = X_3_8_5_6_5_5(X011, X01110111, vM,  X001101, vN, vD);
5207eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov               break;
5208eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov            case ARM64vecb_CMHI32x4:
5209eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov               *p++ = X_3_8_5_6_5_5(X011, X01110101, vM,  X001101, vN, vD);
5210eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov               break;
5211eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov            case ARM64vecb_CMHI16x8:
5212eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov               *p++ = X_3_8_5_6_5_5(X011, X01110011, vM,  X001101, vN, vD);
5213eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov               break;
5214eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov            case ARM64vecb_CMHI8x16:
5215eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov               *p++ = X_3_8_5_6_5_5(X011, X01110001, vM,  X001101, vN, vD);
5216eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov               break;
5217eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov
5218eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov            case ARM64vecb_CMGT64x2:
5219eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov               *p++ = X_3_8_5_6_5_5(X010, X01110111, vM,  X001101, vN, vD);
5220eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov               break;
5221eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov            case ARM64vecb_CMGT32x4:
5222eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov               *p++ = X_3_8_5_6_5_5(X010, X01110101, vM,  X001101, vN, vD);
5223eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov               break;
5224eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov            case ARM64vecb_CMGT16x8:
5225eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov               *p++ = X_3_8_5_6_5_5(X010, X01110011, vM,  X001101, vN, vD);
5226eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov               break;
5227eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov            case ARM64vecb_CMGT8x16:
5228eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov               *p++ = X_3_8_5_6_5_5(X010, X01110001, vM,  X001101, vN, vD);
5229eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov               break;
5230eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov
5231eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov            case ARM64vecb_FCMEQ64x2:
5232eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov               *p++ = X_3_8_5_6_5_5(X010, X01110011, vM, X111001, vN, vD);
5233eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov               break;
5234eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov            case ARM64vecb_FCMEQ32x4:
5235eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov               *p++ = X_3_8_5_6_5_5(X010, X01110001, vM, X111001, vN, vD);
5236eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov               break;
5237eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov
5238eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov            case ARM64vecb_FCMGE64x2:
5239eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov               *p++ = X_3_8_5_6_5_5(X011, X01110011, vM, X111001, vN, vD);
5240eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov               break;
5241eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov            case ARM64vecb_FCMGE32x4:
5242eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov               *p++ = X_3_8_5_6_5_5(X011, X01110001, vM, X111001, vN, vD);
5243eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov               break;
5244eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov
5245eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov            case ARM64vecb_FCMGT64x2:
5246eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov               *p++ = X_3_8_5_6_5_5(X011, X01110111, vM, X111001, vN, vD);
5247eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov               break;
5248eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov            case ARM64vecb_FCMGT32x4:
5249eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov               *p++ = X_3_8_5_6_5_5(X011, X01110101, vM, X111001, vN, vD);
5250eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov               break;
5251eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov
5252eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov            case ARM64vecb_TBL1:
5253eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov               *p++ = X_3_8_5_6_5_5(X010, X01110000, vM,  X000000, vN, vD);
5254eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov               break;
5255eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov
5256436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            default:
5257436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               goto bad;
5258436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         }
5259436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         goto done;
5260436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      }
5261436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case ARM64in_VUnaryV: {
5262436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         /* 31        23   20    15     9 4
5263436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            010 01110 11 1 00000 111110 n d  FABS Vd.2d,  Vn.2d
5264436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            010 01110 10 1 00000 111110 n d  FABS Vd.4s,  Vn.4s
5265436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            011 01110 11 1 00000 111110 n d  FNEG Vd.2d,  Vn.2d
5266436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            011 01110 10 1 00000 111110 n d  FNEG Vd.4s,  Vn.4s
52676d9b01c06e645ea0b0a3544e968961aaa7bc6a66Dmitriy Ivanov            010 01110 00 1 00000 010110 n d  CNT  Vd.16b, Vn.16b
5268436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            011 01110 00 1 00000 010110 n d  NOT  Vd.16b, Vn.16b
5269051d3b5d6376aa10a65793c3c2267d6ab233b896Dmitriy Ivanov
5270051d3b5d6376aa10a65793c3c2267d6ab233b896Dmitriy Ivanov            011 01110 00 1 10000 001110 n d  UADDLV  Hd, Vn.16b
5271051d3b5d6376aa10a65793c3c2267d6ab233b896Dmitriy Ivanov            011 01110 01 1 10000 001110 n d  UADDLV  Sd, Vn.8h
5272051d3b5d6376aa10a65793c3c2267d6ab233b896Dmitriy Ivanov            011 01110 10 1 10000 001110 n d  UADDLV  Dd, Vn.4s
5273051d3b5d6376aa10a65793c3c2267d6ab233b896Dmitriy Ivanov
5274051d3b5d6376aa10a65793c3c2267d6ab233b896Dmitriy Ivanov            010 01110 00 1 10000 001110 n d  SADDLV  Hd, Vn.16b
5275051d3b5d6376aa10a65793c3c2267d6ab233b896Dmitriy Ivanov            010 01110 01 1 10000 001110 n d  SADDLV  Sd, Vn.8h
5276051d3b5d6376aa10a65793c3c2267d6ab233b896Dmitriy Ivanov            010 01110 10 1 10000 001110 n d  SADDLV  Dd, Vn.4s
5277436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         */
52780a8046eb0993fb7e155b03cc5ef3323fca3467c0Dmitriy Ivanov         ARM64VecUnaryOp op = i->ARM64in.VUnaryV.op;
5279436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         UInt vD = qregNo(i->ARM64in.VUnaryV.dst);
52800a8046eb0993fb7e155b03cc5ef3323fca3467c0Dmitriy Ivanov         Bool isV128 = !(op >= ARM64vecu_VMOVL8U && op <= ARM64vecu_VMOVL32S);
52810a8046eb0993fb7e155b03cc5ef3323fca3467c0Dmitriy Ivanov         UInt vN = isV128 ? qregNo(i->ARM64in.VUnaryV.arg)
52820a8046eb0993fb7e155b03cc5ef3323fca3467c0Dmitriy Ivanov                          : dregNo(i->ARM64in.VUnaryV.arg);
5283436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         switch (i->ARM64in.VUnaryV.op) {
5284436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case ARM64vecu_FABS64x2:
5285436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               *p++ = X_3_8_5_6_5_5(X010, X01110111, X00000, X111110, vN, vD);
5286436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               break;
5287eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov            case ARM64vecu_FABS32x4:
5288eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov               *p++ = X_3_8_5_6_5_5(X010, X01110101, X00000, X111110, vN, vD);
5289eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov               break;
5290436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case ARM64vecu_FNEG64x2:
5291436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               *p++ = X_3_8_5_6_5_5(X011, X01110111, X00000, X111110, vN, vD);
5292436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               break;
5293eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov            case ARM64vecu_FNEG32x4:
5294eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov               *p++ = X_3_8_5_6_5_5(X011, X01110101, X00000, X111110, vN, vD);
5295eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov               break;
52960a8046eb0993fb7e155b03cc5ef3323fca3467c0Dmitriy Ivanov            case ARM64vecu_VMOVL8U:
52970a8046eb0993fb7e155b03cc5ef3323fca3467c0Dmitriy Ivanov               *p++ = X_9_1_6_4_6_1_1_4(X111100111, vD >> 4, X001000, vD & 0xFU, X101000, vN >> 4, 1, vN & 0xFU);
52980a8046eb0993fb7e155b03cc5ef3323fca3467c0Dmitriy Ivanov               break;
52990a8046eb0993fb7e155b03cc5ef3323fca3467c0Dmitriy Ivanov            case ARM64vecu_VMOVL16U:
53000a8046eb0993fb7e155b03cc5ef3323fca3467c0Dmitriy Ivanov               *p++ = X_9_1_6_4_6_1_1_4(X111100111, vD >> 4, X010000, vD & 0xFU, X101000, vN >> 4, 1, vN & 0xFU);
53010a8046eb0993fb7e155b03cc5ef3323fca3467c0Dmitriy Ivanov               break;
53020a8046eb0993fb7e155b03cc5ef3323fca3467c0Dmitriy Ivanov            case ARM64vecu_VMOVL32U:
53030a8046eb0993fb7e155b03cc5ef3323fca3467c0Dmitriy Ivanov               *p++ = X_9_1_6_4_6_1_1_4(X111100111, vD >> 4, X100000, vD & 0xFU, X101000, vN >> 4, 1, vN & 0xFU);
53040a8046eb0993fb7e155b03cc5ef3323fca3467c0Dmitriy Ivanov               break;
53050a8046eb0993fb7e155b03cc5ef3323fca3467c0Dmitriy Ivanov            case ARM64vecu_VMOVL8S:
53060a8046eb0993fb7e155b03cc5ef3323fca3467c0Dmitriy Ivanov               *p++ = X_9_1_6_4_6_1_1_4(X111100101, vD >> 4, X001000, vD & 0xFU, X101000, vN >> 4, 1, vN & 0xFU);
53070a8046eb0993fb7e155b03cc5ef3323fca3467c0Dmitriy Ivanov               break;
53080a8046eb0993fb7e155b03cc5ef3323fca3467c0Dmitriy Ivanov            case ARM64vecu_VMOVL16S:
53090a8046eb0993fb7e155b03cc5ef3323fca3467c0Dmitriy Ivanov               *p++ = X_9_1_6_4_6_1_1_4(X111100101, vD >> 4, X010000, vD & 0xFU, X101000, vN >> 4, 1, vN & 0xFU);
53100a8046eb0993fb7e155b03cc5ef3323fca3467c0Dmitriy Ivanov               break;
53110a8046eb0993fb7e155b03cc5ef3323fca3467c0Dmitriy Ivanov            case ARM64vecu_VMOVL32S:
53120a8046eb0993fb7e155b03cc5ef3323fca3467c0Dmitriy Ivanov               *p++ = X_9_1_6_4_6_1_1_4(X111100101, vD >> 4, X100000, vD & 0xFU, X101000, vN >> 4, 1, vN & 0xFU);
53130a8046eb0993fb7e155b03cc5ef3323fca3467c0Dmitriy Ivanov               break;
5314436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case ARM64vecu_NOT:
5315436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               *p++ = X_3_8_5_6_5_5(X011, X01110001, X00000, X010110, vN, vD);
5316436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               break;
53176d9b01c06e645ea0b0a3544e968961aaa7bc6a66Dmitriy Ivanov            case ARM64vecu_CNT:
53186d9b01c06e645ea0b0a3544e968961aaa7bc6a66Dmitriy Ivanov               *p++ = X_3_8_5_6_5_5(X010, X01110001, X00000, X010110, vN, vD);
53196d9b01c06e645ea0b0a3544e968961aaa7bc6a66Dmitriy Ivanov               break;
5320051d3b5d6376aa10a65793c3c2267d6ab233b896Dmitriy Ivanov            case ARM64vecu_UADDLV8x16:
5321051d3b5d6376aa10a65793c3c2267d6ab233b896Dmitriy Ivanov               *p++ = X_3_8_5_6_5_5(X011, X01110001, X10000, X001110, vN, vD);
5322051d3b5d6376aa10a65793c3c2267d6ab233b896Dmitriy Ivanov               break;
5323051d3b5d6376aa10a65793c3c2267d6ab233b896Dmitriy Ivanov            case ARM64vecu_UADDLV16x8:
5324051d3b5d6376aa10a65793c3c2267d6ab233b896Dmitriy Ivanov               *p++ = X_3_8_5_6_5_5(X011, X01110011, X10000, X001110, vN, vD);
5325051d3b5d6376aa10a65793c3c2267d6ab233b896Dmitriy Ivanov               break;
5326051d3b5d6376aa10a65793c3c2267d6ab233b896Dmitriy Ivanov            case ARM64vecu_UADDLV32x4:
5327051d3b5d6376aa10a65793c3c2267d6ab233b896Dmitriy Ivanov               *p++ = X_3_8_5_6_5_5(X011, X01110101, X10000, X001110, vN, vD);
5328051d3b5d6376aa10a65793c3c2267d6ab233b896Dmitriy Ivanov               break;
5329051d3b5d6376aa10a65793c3c2267d6ab233b896Dmitriy Ivanov            case ARM64vecu_SADDLV8x16:
5330051d3b5d6376aa10a65793c3c2267d6ab233b896Dmitriy Ivanov               *p++ = X_3_8_5_6_5_5(X010, X01110001, X10000, X001110, vN, vD);
5331051d3b5d6376aa10a65793c3c2267d6ab233b896Dmitriy Ivanov               break;
5332051d3b5d6376aa10a65793c3c2267d6ab233b896Dmitriy Ivanov            case ARM64vecu_SADDLV16x8:
5333051d3b5d6376aa10a65793c3c2267d6ab233b896Dmitriy Ivanov               *p++ = X_3_8_5_6_5_5(X010, X01110011, X10000, X001110, vN, vD);
5334051d3b5d6376aa10a65793c3c2267d6ab233b896Dmitriy Ivanov               break;
5335051d3b5d6376aa10a65793c3c2267d6ab233b896Dmitriy Ivanov            case ARM64vecu_SADDLV32x4:
5336051d3b5d6376aa10a65793c3c2267d6ab233b896Dmitriy Ivanov               *p++ = X_3_8_5_6_5_5(X010, X01110101, X10000, X001110, vN, vD);
5337051d3b5d6376aa10a65793c3c2267d6ab233b896Dmitriy Ivanov               break;
5338436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            default:
5339436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               goto bad;
5340436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         }
5341436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         goto done;
5342436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      }
5343436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case ARM64in_VNarrowV: {
5344436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         /* 31        23 21      15     9 4
5345436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            000 01110 00 1,00001 001010 n d  XTN Vd.8b, Vn.8h
5346436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            000 01110 01 1,00001 001010 n d  XTN Vd.4h, Vn.4s
5347436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            000 01110 10 1,00001 001010 n d  XTN Vd.2s, Vn.2d
5348436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         */
5349436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         UInt vD = qregNo(i->ARM64in.VNarrowV.dst);
5350436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         UInt vN = qregNo(i->ARM64in.VNarrowV.src);
5351436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         UInt dszBlg2 = i->ARM64in.VNarrowV.dszBlg2;
5352436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         vassert(dszBlg2 >= 0 && dszBlg2 <= 2);
5353436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         *p++ = X_3_8_5_6_5_5(X000, X01110001 | (dszBlg2 << 1),
5354436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                              X00001, X001010, vN, vD);
5355436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         goto done;
5356436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      }
5357436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case ARM64in_VShiftImmV: {
5358436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         /*
5359436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            0q1 011110 immh immb 000001 n d  USHR Vd.T, Vn.T, #sh
5360436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            0q0 011110 immh immb 000001 n d  SSHR Vd.T, Vn.T, #sh
5361436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            where immh:immb
5362436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               = case T of
5363436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                    2d  | sh in 1..63 -> let xxxxxx = 64-sh in 1xxx:xxx
5364436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                    4s  | sh in 1..31 -> let  xxxxx = 32-sh in 01xx:xxx
5365436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                    8h  | sh in 1..15 -> let   xxxx = 16-sh in 001x:xxx
5366436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                    16b | sh in 1..7  -> let    xxx =  8-sh in 0001:xxx
5367436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
5368436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            0q0 011110 immh immb 010101 n d  SHL Vd.T, Vn.T, #sh
5369436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            where immh:immb
5370436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               = case T of
5371436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                    2d  | sh in 1..63 -> let xxxxxx = sh in 1xxx:xxx
5372436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                    4s  | sh in 1..31 -> let  xxxxx = sh in 01xx:xxx
5373436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                    8h  | sh in 1..15 -> let   xxxx = sh in 001x:xxx
5374436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                    16b | sh in 1..7  -> let    xxx = sh in 0001:xxx
5375436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         */
5376436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         UInt vD = qregNo(i->ARM64in.VShiftImmV.dst);
5377436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         UInt vN = qregNo(i->ARM64in.VShiftImmV.src);
5378436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         UInt sh = i->ARM64in.VShiftImmV.amt;
5379436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         ARM64VecShiftOp op = i->ARM64in.VShiftImmV.op;
5380436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         Bool syned = False;
5381436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         switch (op) {
5382eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov            /* 64x2 cases */
5383436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case ARM64vecsh_SSHR64x2: syned = True;
5384436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case ARM64vecsh_USHR64x2: /* fallthrough */
5385436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               if (sh >= 1 && sh <= 63) {
5386436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  UInt xxxxxx = 64-sh;
5387436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  *p++ = X_3_6_7_6_5_5(syned ? X010 : X011, X011110,
5388436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       X1000000 | xxxxxx, X000001, vN, vD);
5389436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  goto done;
5390436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               }
5391436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               break;
5392eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov            case ARM64vecsh_SHL64x2:
5393eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov               if (sh >= 1 && sh <= 63) {
5394eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov                  UInt xxxxxx = sh;
5395eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov                  *p++ = X_3_6_7_6_5_5(X010, X011110,
5396eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov                                       X1000000 | xxxxxx, X010101, vN, vD);
5397eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov                  goto done;
5398eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov               }
5399eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov               break;
5400eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov            /* 32x4 cases */
5401eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov            case ARM64vecsh_SSHR32x4: syned = True;
5402eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov            case ARM64vecsh_USHR32x4: /* fallthrough */
5403eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov               if (sh >= 1 && sh <= 31) {
5404eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov                  UInt xxxxx = 32-sh;
5405eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov                  *p++ = X_3_6_7_6_5_5(syned ? X010 : X011, X011110,
5406eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov                                       X0100000 | xxxxx, X000001, vN, vD);
5407eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov                  goto done;
5408eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov               }
5409eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov               break;
5410436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case ARM64vecsh_SHL32x4:
5411436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               if (sh >= 1 && sh <= 31) {
5412436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  UInt xxxxx = sh;
5413436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  *p++ = X_3_6_7_6_5_5(X010, X011110,
5414436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       X0100000 | xxxxx, X010101, vN, vD);
5415436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  goto done;
5416436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               }
5417436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               break;
5418eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov            /* 16x8 cases */
5419eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov            case ARM64vecsh_SSHR16x8: syned = True;
54202ca80a6a6fc069acdb73186e8e578dbf8f46af80Dmitriy Ivanov            case ARM64vecsh_USHR16x8: /* fallthrough */
54212ca80a6a6fc069acdb73186e8e578dbf8f46af80Dmitriy Ivanov               if (sh >= 1 && sh <= 15) {
54222ca80a6a6fc069acdb73186e8e578dbf8f46af80Dmitriy Ivanov                  UInt xxxx = 16-sh;
54232ca80a6a6fc069acdb73186e8e578dbf8f46af80Dmitriy Ivanov                  *p++ = X_3_6_7_6_5_5(syned ? X010 : X011, X011110,
54242ca80a6a6fc069acdb73186e8e578dbf8f46af80Dmitriy Ivanov                                       X0010000 | xxxx, X000001, vN, vD);
54252ca80a6a6fc069acdb73186e8e578dbf8f46af80Dmitriy Ivanov                  goto done;
54262ca80a6a6fc069acdb73186e8e578dbf8f46af80Dmitriy Ivanov               }
54272ca80a6a6fc069acdb73186e8e578dbf8f46af80Dmitriy Ivanov               break;
5428eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov            case ARM64vecsh_SHL16x8:
5429eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov               if (sh >= 1 && sh <= 15) {
5430eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov                  UInt xxxx = sh;
5431eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov                  *p++ = X_3_6_7_6_5_5(X010, X011110,
5432eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov                                       X0010000 | xxxx, X010101, vN, vD);
5433eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov                  goto done;
5434eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov               }
5435eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov               break;
5436eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov
5437eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov
5438eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov            /* 8x16 cases */
5439eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov            case ARM64vecsh_SSHR8x16: syned = True;
5440eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov            case ARM64vecsh_USHR8x16: /* fallthrough */
5441eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov               if (sh >= 1 && sh <= 7) {
5442eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov                  UInt xxx = 8-sh;
5443eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov                  *p++ = X_3_6_7_6_5_5(syned ? X010 : X011, X011110,
5444eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov                                       X0001000 | xxx, X000001, vN, vD);
5445eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov                  goto done;
5446eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov               }
5447eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov               break;
5448eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov            case ARM64vecsh_SHL8x16:
5449eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov               if (sh >= 1 && sh <= 7) {
5450eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov                  UInt xxx = sh;
5451eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov                  *p++ = X_3_6_7_6_5_5(X010, X011110,
5452eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov                                       X0001000 | xxx, X010101, vN, vD);
5453eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov                  goto done;
5454eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov               }
5455eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov               break;
5456eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov
5457436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            default:
5458436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               break;
5459436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         }
5460436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         goto bad;
5461436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      }
5462436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMin_VAluS: {
5463436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          UInt dN = fregNo(i->ARMin.VAluS.argL);
5464436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          UInt dD = fregNo(i->ARMin.VAluS.dst);
5465436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          UInt dM = fregNo(i->ARMin.VAluS.argR);
5466436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          UInt bN = dN & 1;
5467436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          UInt bD = dD & 1;
5468436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          UInt bM = dM & 1;
5469436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          UInt pqrs = X1111; /* undefined */
5470436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          switch (i->ARMin.VAluS.op) {
5471436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             case ARMvfp_ADD: pqrs = X0110; break;
5472436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             case ARMvfp_SUB: pqrs = X0111; break;
5473436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             case ARMvfp_MUL: pqrs = X0100; break;
5474436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             case ARMvfp_DIV: pqrs = X1000; break;
5475436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             default: goto bad;
5476436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          }
5477436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          vassert(pqrs != X1111);
5478436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          UInt bP  = (pqrs >> 3) & 1;
5479436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          UInt bQ  = (pqrs >> 2) & 1;
5480436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          UInt bR  = (pqrs >> 1) & 1;
5481436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          UInt bS  = (pqrs >> 0) & 1;
5482436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          UInt insn = XXXXXXXX(0xE, X1110, BITS4(bP,bD,bQ,bR),
5483436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                               (dN >> 1), (dD >> 1),
5484436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                               X1010, BITS4(bN,bS,bM,0), (dM >> 1));
5485436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          *p++ = insn;
5486436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          goto done;
5487436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       }
5488436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMin_VUnaryS: {
5489436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          UInt fD   = fregNo(i->ARMin.VUnaryS.dst);
5490436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          UInt fM   = fregNo(i->ARMin.VUnaryS.src);
5491436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          UInt insn = 0;
5492436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          switch (i->ARMin.VUnaryS.op) {
5493436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             case ARMvfpu_COPY:
5494436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                insn = XXXXXXXX(0xE, X1110, BITS4(1,(fD & 1),1,1), X0000,
5495436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                                (fD >> 1), X1010, BITS4(0,1,(fM & 1),0),
5496436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                                (fM >> 1));
5497436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                break;
5498436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             case ARMvfpu_ABS:
5499436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                insn = XXXXXXXX(0xE, X1110, BITS4(1,(fD & 1),1,1), X0000,
5500436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                                (fD >> 1), X1010, BITS4(1,1,(fM & 1),0),
5501436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                                (fM >> 1));
5502436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                break;
5503436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             case ARMvfpu_NEG:
5504436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                insn = XXXXXXXX(0xE, X1110, BITS4(1,(fD & 1),1,1), X0001,
5505436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                                (fD >> 1), X1010, BITS4(0,1,(fM & 1),0),
5506436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                                (fM >> 1));
5507436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                break;
5508436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             case ARMvfpu_SQRT:
5509436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                insn = XXXXXXXX(0xE, X1110, BITS4(1,(fD & 1),1,1), X0001,
5510436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                                (fD >> 1), X1010, BITS4(1,1,(fM & 1),0),
5511436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                                (fM >> 1));
5512436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                break;
5513436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             default:
5514436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                goto bad;
5515436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          }
5516436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          *p++ = insn;
5517436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          goto done;
5518436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       }
5519436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMin_VCMovD: {
5520436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          UInt cc = (UInt)i->ARMin.VCMovD.cond;
5521436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          UInt dD = dregNo(i->ARMin.VCMovD.dst);
5522436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          UInt dM = dregNo(i->ARMin.VCMovD.src);
5523436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          vassert(cc < 16 && cc != ARMcc_AL);
5524436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          UInt insn = XXXXXXXX(cc, X1110,X1011,X0000,dD,X1011,X0100,dM);
5525436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          *p++ = insn;
5526436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          goto done;
5527436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       }
5528436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMin_VCMovS: {
5529436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          UInt cc = (UInt)i->ARMin.VCMovS.cond;
5530436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          UInt fD = fregNo(i->ARMin.VCMovS.dst);
5531436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          UInt fM = fregNo(i->ARMin.VCMovS.src);
5532436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          vassert(cc < 16 && cc != ARMcc_AL);
5533436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          UInt insn = XXXXXXXX(cc, X1110, BITS4(1,(fD & 1),1,1),
5534436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                               X0000,(fD >> 1),X1010,
5535436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                               BITS4(0,1,(fM & 1),0), (fM >> 1));
5536436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          *p++ = insn;
5537436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          goto done;
5538436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       }
5539436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMin_VXferD: {
5540436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          UInt dD  = dregNo(i->ARMin.VXferD.dD);
5541436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          UInt rHi = iregNo(i->ARMin.VXferD.rHi);
5542436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          UInt rLo = iregNo(i->ARMin.VXferD.rLo);
5543436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          /* vmov dD, rLo, rHi is
5544436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             E C 4 rHi rLo B (0,0,dD[4],1) dD[3:0]
5545436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             vmov rLo, rHi, dD is
5546436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             E C 5 rHi rLo B (0,0,dD[4],1) dD[3:0]
5547436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          */
5548436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          UInt insn
5549436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             = XXXXXXXX(0xE, 0xC, i->ARMin.VXferD.toD ? 4 : 5,
5550436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                        rHi, rLo, 0xB,
5551436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                        BITS4(0,0, ((dD >> 4) & 1), 1), (dD & 0xF));
5552436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          *p++ = insn;
5553436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          goto done;
5554436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       }
5555436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMin_VXferS: {
5556436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          UInt fD  = fregNo(i->ARMin.VXferS.fD);
5557436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          UInt rLo = iregNo(i->ARMin.VXferS.rLo);
5558436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          /* vmov fD, rLo is
5559436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             E E 0 fD[4:1] rLo A (fD[0],0,0,1) 0
5560436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             vmov rLo, fD is
5561436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             E E 1 fD[4:1] rLo A (fD[0],0,0,1) 0
5562436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          */
5563436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          UInt insn
5564436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             = XXXXXXXX(0xE, 0xE, i->ARMin.VXferS.toS ? 0 : 1,
5565436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                        (fD >> 1) & 0xF, rLo, 0xA,
5566436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                        BITS4((fD & 1),0,0,1), 0);
5567436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          *p++ = insn;
5568436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          goto done;
5569436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       }
5570436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMin_VCvtID: {
5571436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          Bool iToD = i->ARMin.VCvtID.iToD;
5572436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          Bool syned = i->ARMin.VCvtID.syned;
5573436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          if (iToD && syned) {
5574436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             // FSITOD: I32S-in-freg to F64-in-dreg
5575436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             UInt regF = fregNo(i->ARMin.VCvtID.src);
5576436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             UInt regD = dregNo(i->ARMin.VCvtID.dst);
5577436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             UInt insn = XXXXXXXX(0xE, X1110, X1011, X1000, regD,
5578436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                                  X1011, BITS4(1,1,(regF & 1),0),
5579436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                                  (regF >> 1) & 0xF);
5580436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             *p++ = insn;
5581436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             goto done;
5582436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          }
5583436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          if (iToD && (!syned)) {
5584436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             // FUITOD: I32U-in-freg to F64-in-dreg
5585436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             UInt regF = fregNo(i->ARMin.VCvtID.src);
5586436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             UInt regD = dregNo(i->ARMin.VCvtID.dst);
5587436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             UInt insn = XXXXXXXX(0xE, X1110, X1011, X1000, regD,
5588436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                                  X1011, BITS4(0,1,(regF & 1),0),
5589436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                                  (regF >> 1) & 0xF);
5590436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             *p++ = insn;
5591436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             goto done;
5592436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          }
5593436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          if ((!iToD) && syned) {
5594436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             // FTOSID: F64-in-dreg to I32S-in-freg
5595436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             UInt regD = dregNo(i->ARMin.VCvtID.src);
5596436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             UInt regF = fregNo(i->ARMin.VCvtID.dst);
5597436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             UInt insn = XXXXXXXX(0xE, X1110, BITS4(1,(regF & 1),1,1),
5598436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                                  X1101, (regF >> 1) & 0xF,
5599436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                                  X1011, X0100, regD);
5600436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             *p++ = insn;
5601436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             goto done;
5602436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          }
5603436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          if ((!iToD) && (!syned)) {
5604436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             // FTOUID: F64-in-dreg to I32U-in-freg
5605436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             UInt regD = dregNo(i->ARMin.VCvtID.src);
5606436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             UInt regF = fregNo(i->ARMin.VCvtID.dst);
5607436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             UInt insn = XXXXXXXX(0xE, X1110, BITS4(1,(regF & 1),1,1),
5608436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                                  X1100, (regF >> 1) & 0xF,
5609436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                                  X1011, X0100, regD);
5610436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             *p++ = insn;
5611436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             goto done;
5612436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          }
5613436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          /*UNREACHED*/
5614436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          vassert(0);
5615436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       }
5616436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMin_NLdStD: {
5617436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          UInt regD = dregNo(i->ARMin.NLdStD.dD);
5618436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          UInt regN, regM;
5619436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          UInt D = regD >> 4;
5620436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          UInt bL = i->ARMin.NLdStD.isLoad ? 1 : 0;
5621436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          UInt insn;
5622436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          vassert(hregClass(i->ARMin.NLdStD.dD) == HRcFlt64);
5623436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          regD &= 0xF;
5624436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          if (i->ARMin.NLdStD.amode->tag == ARMamN_RR) {
5625436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             regN = iregNo(i->ARMin.NLdStD.amode->ARMamN.RR.rN);
5626436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             regM = iregNo(i->ARMin.NLdStD.amode->ARMamN.RR.rM);
5627436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          } else {
5628436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             regN = iregNo(i->ARMin.NLdStD.amode->ARMamN.R.rN);
5629436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             regM = 15;
5630436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          }
5631436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          insn = XXXXXXXX(0xF, X0100, BITS4(0, D, bL, 0),
5632436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                               regN, regD, X0111, X1000, regM);
5633436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          *p++ = insn;
5634436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          goto done;
5635436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       }
5636436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMin_NUnaryS: {
5637436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          UInt Q = i->ARMin.NUnaryS.Q ? 1 : 0;
5638436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          UInt regD, D;
5639436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          UInt regM, M;
5640436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          UInt size = i->ARMin.NUnaryS.size;
5641436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          UInt insn;
5642436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          UInt opc, opc1, opc2;
5643436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          switch (i->ARMin.NUnaryS.op) {
5644436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ 	    case ARMneon_VDUP:
5645436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                if (i->ARMin.NUnaryS.size >= 16)
5646436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                   goto bad;
5647436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                if (i->ARMin.NUnaryS.dst->tag != ARMNRS_Reg)
5648436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                   goto bad;
5649436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                if (i->ARMin.NUnaryS.src->tag != ARMNRS_Scalar)
5650436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                   goto bad;
5651436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                regD = (hregClass(i->ARMin.NUnaryS.dst->reg) == HRcVec128)
5652436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                         ? (qregNo(i->ARMin.NUnaryS.dst->reg) << 1)
5653436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                         : dregNo(i->ARMin.NUnaryS.dst->reg);
5654436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                regM = (hregClass(i->ARMin.NUnaryS.src->reg) == HRcVec128)
5655436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                         ? (qregNo(i->ARMin.NUnaryS.src->reg) << 1)
5656436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                         : dregNo(i->ARMin.NUnaryS.src->reg);
5657436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                D = regD >> 4;
5658436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                M = regM >> 4;
5659436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                regD &= 0xf;
5660436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                regM &= 0xf;
5661436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                insn = XXXXXXXX(0xF, X0011, BITS4(1,D,1,1),
5662436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                                (i->ARMin.NUnaryS.size & 0xf), regD,
5663436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                                X1100, BITS4(0,Q,M,0), regM);
5664436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                *p++ = insn;
5665436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                goto done;
5666436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             case ARMneon_SETELEM:
5667436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                regD = Q ? (qregNo(i->ARMin.NUnaryS.dst->reg) << 1) :
5668436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                                 dregNo(i->ARMin.NUnaryS.dst->reg);
5669436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                regM = iregNo(i->ARMin.NUnaryS.src->reg);
5670436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                M = regM >> 4;
5671436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                D = regD >> 4;
5672436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                regM &= 0xF;
5673436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                regD &= 0xF;
5674436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                if (i->ARMin.NUnaryS.dst->tag != ARMNRS_Scalar)
5675436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                   goto bad;
5676436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                switch (size) {
5677436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                   case 0:
5678436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                      if (i->ARMin.NUnaryS.dst->index > 7)
5679436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                         goto bad;
5680436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                      opc = X1000 | i->ARMin.NUnaryS.dst->index;
5681436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                      break;
5682436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                   case 1:
5683436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                      if (i->ARMin.NUnaryS.dst->index > 3)
5684436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                         goto bad;
5685436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                      opc = X0001 | (i->ARMin.NUnaryS.dst->index << 1);
5686436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                      break;
5687436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                   case 2:
5688436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                      if (i->ARMin.NUnaryS.dst->index > 1)
5689436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                         goto bad;
5690436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                      opc = X0000 | (i->ARMin.NUnaryS.dst->index << 2);
5691436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                      break;
5692436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                   default:
5693436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                      goto bad;
5694436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                }
5695436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                opc1 = (opc >> 2) & 3;
5696436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                opc2 = opc & 3;
5697436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                insn = XXXXXXXX(0xE, X1110, BITS4(0,(opc1 >> 1),(opc1 & 1),0),
5698436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                                regD, regM, X1011,
5699436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                                BITS4(D,(opc2 >> 1),(opc2 & 1),1), X0000);
5700436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                *p++ = insn;
5701436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                goto done;
5702436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             case ARMneon_GETELEMU:
5703436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                regM = Q ? (qregNo(i->ARMin.NUnaryS.src->reg) << 1) :
5704436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                                 dregNo(i->ARMin.NUnaryS.src->reg);
5705436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                regD = iregNo(i->ARMin.NUnaryS.dst->reg);
5706436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                M = regM >> 4;
5707436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                D = regD >> 4;
5708436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                regM &= 0xF;
5709436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                regD &= 0xF;
5710436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                if (i->ARMin.NUnaryS.src->tag != ARMNRS_Scalar)
5711436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                   goto bad;
5712436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                switch (size) {
5713436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                   case 0:
5714436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                      if (Q && i->ARMin.NUnaryS.src->index > 7) {
5715436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                         regM++;
5716436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                         i->ARMin.NUnaryS.src->index -= 8;
5717436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                      }
5718436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                      if (i->ARMin.NUnaryS.src->index > 7)
5719436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                         goto bad;
5720436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                      opc = X1000 | i->ARMin.NUnaryS.src->index;
5721436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                      break;
5722436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                   case 1:
5723436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                      if (Q && i->ARMin.NUnaryS.src->index > 3) {
5724436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                         regM++;
5725436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                         i->ARMin.NUnaryS.src->index -= 4;
5726436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                      }
5727436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                      if (i->ARMin.NUnaryS.src->index > 3)
5728436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                         goto bad;
5729436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                      opc = X0001 | (i->ARMin.NUnaryS.src->index << 1);
5730436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                      break;
5731436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                   case 2:
5732436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                      goto bad;
5733436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                   default:
5734436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                      goto bad;
5735436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                }
5736436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                opc1 = (opc >> 2) & 3;
5737436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                opc2 = opc & 3;
5738436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                insn = XXXXXXXX(0xE, X1110, BITS4(1,(opc1 >> 1),(opc1 & 1),1),
5739436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                                regM, regD, X1011,
5740436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                                BITS4(M,(opc2 >> 1),(opc2 & 1),1), X0000);
5741436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                *p++ = insn;
5742436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                goto done;
5743436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             case ARMneon_GETELEMS:
5744436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                regM = Q ? (qregNo(i->ARMin.NUnaryS.src->reg) << 1) :
5745436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                                 dregNo(i->ARMin.NUnaryS.src->reg);
5746436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                regD = iregNo(i->ARMin.NUnaryS.dst->reg);
5747436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                M = regM >> 4;
5748436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                D = regD >> 4;
5749436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                regM &= 0xF;
5750436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                regD &= 0xF;
5751436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                if (i->ARMin.NUnaryS.src->tag != ARMNRS_Scalar)
5752436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                   goto bad;
5753436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                switch (size) {
5754436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                   case 0:
5755436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                      if (Q && i->ARMin.NUnaryS.src->index > 7) {
5756436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                         regM++;
5757436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                         i->ARMin.NUnaryS.src->index -= 8;
5758436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                      }
5759436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                      if (i->ARMin.NUnaryS.src->index > 7)
5760436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                         goto bad;
5761436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                      opc = X1000 | i->ARMin.NUnaryS.src->index;
5762436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                      break;
5763436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                   case 1:
5764436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                      if (Q && i->ARMin.NUnaryS.src->index > 3) {
5765436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                         regM++;
5766436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                         i->ARMin.NUnaryS.src->index -= 4;
5767436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                      }
5768436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                      if (i->ARMin.NUnaryS.src->index > 3)
5769436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                         goto bad;
5770436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                      opc = X0001 | (i->ARMin.NUnaryS.src->index << 1);
5771436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                      break;
5772436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                   case 2:
5773436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                      if (Q && i->ARMin.NUnaryS.src->index > 1) {
5774436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                         regM++;
5775436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                         i->ARMin.NUnaryS.src->index -= 2;
5776436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                      }
5777436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                      if (i->ARMin.NUnaryS.src->index > 1)
5778436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                         goto bad;
5779436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                      opc = X0000 | (i->ARMin.NUnaryS.src->index << 2);
5780436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                      break;
5781436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                   default:
5782436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                      goto bad;
5783436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                }
5784436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                opc1 = (opc >> 2) & 3;
5785436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                opc2 = opc & 3;
5786436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                insn = XXXXXXXX(0xE, X1110, BITS4(0,(opc1 >> 1),(opc1 & 1),1),
5787436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                                regM, regD, X1011,
5788436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                                BITS4(M,(opc2 >> 1),(opc2 & 1),1), X0000);
5789436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                *p++ = insn;
5790436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                goto done;
5791436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             default:
5792436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                goto bad;
5793436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          }
5794436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       }
5795436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMin_NUnary: {
5796436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          UInt Q = i->ARMin.NUnary.Q ? 1 : 0;
5797436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          UInt regD = (hregClass(i->ARMin.NUnary.dst) == HRcVec128)
5798436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                        ? (qregNo(i->ARMin.NUnary.dst) << 1)
5799436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                        : dregNo(i->ARMin.NUnary.dst);
5800436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          UInt regM, M;
5801436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          UInt D = regD >> 4;
5802436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          UInt sz1 = i->ARMin.NUnary.size >> 1;
5803436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          UInt sz2 = i->ARMin.NUnary.size & 1;
5804436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          UInt sz = i->ARMin.NUnary.size;
5805436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          UInt insn;
5806436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          UInt F = 0; /* TODO: floating point EQZ ??? */
5807436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          if (i->ARMin.NUnary.op != ARMneon_DUP) {
5808436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             regM = (hregClass(i->ARMin.NUnary.src) == HRcVec128)
5809436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                      ? (qregNo(i->ARMin.NUnary.src) << 1)
5810436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                      : dregNo(i->ARMin.NUnary.src);
5811436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             M = regM >> 4;
5812436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          } else {
5813436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             regM = iregNo(i->ARMin.NUnary.src);
5814436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             M = regM >> 4;
5815436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          }
5816436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          regD &= 0xF;
5817436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          regM &= 0xF;
5818436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          switch (i->ARMin.NUnary.op) {
5819436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             case ARMneon_COPY: /* VMOV reg, reg */
5820436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                insn = XXXXXXXX(0xF, X0010, BITS4(0,D,1,0), regM, regD, X0001,
5821436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                                BITS4(M,Q,M,1), regM);
5822436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                break;
5823436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             case ARMneon_COPYN: /* VMOVN regD, regQ */
5824436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                insn = XXXXXXXX(0xF, X0011, BITS4(1,D,1,1), BITS4(sz1,sz2,1,0),
5825436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                                regD, X0010, BITS4(0,0,M,0), regM);
5826436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                break;
5827436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             case ARMneon_COPYQNSS: /* VQMOVN regD, regQ */
5828436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                insn = XXXXXXXX(0xF, X0011, BITS4(1,D,1,1), BITS4(sz1,sz2,1,0),
5829436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                                regD, X0010, BITS4(1,0,M,0), regM);
5830436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                break;
5831436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             case ARMneon_COPYQNUS: /* VQMOVUN regD, regQ */
5832436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                insn = XXXXXXXX(0xF, X0011, BITS4(1,D,1,1), BITS4(sz1,sz2,1,0),
5833436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                                regD, X0010, BITS4(0,1,M,0), regM);
5834436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                break;
5835436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             case ARMneon_COPYQNUU: /* VQMOVN regD, regQ */
5836436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                insn = XXXXXXXX(0xF, X0011, BITS4(1,D,1,1), BITS4(sz1,sz2,1,0),
5837436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                                regD, X0010, BITS4(1,1,M,0), regM);
5838436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                break;
5839436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             case ARMneon_COPYLS: /* VMOVL regQ, regD */
5840436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                if (sz >= 3)
5841436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                   goto bad;
5842436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                insn = XXXXXXXX(0xF, X0010,
5843436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                                BITS4(1,D,(sz == 2) ? 1 : 0,(sz == 1) ? 1 : 0),
5844436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                                BITS4((sz == 0) ? 1 : 0,0,0,0),
5845436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                                regD, X1010, BITS4(0,0,M,1), regM);
5846436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                break;
5847436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             case ARMneon_COPYLU: /* VMOVL regQ, regD */
5848436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                if (sz >= 3)
5849436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                   goto bad;
5850436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                insn = XXXXXXXX(0xF, X0011,
5851436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                                BITS4(1,D,(sz == 2) ? 1 : 0,(sz == 1) ? 1 : 0),
5852436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                                BITS4((sz == 0) ? 1 : 0,0,0,0),
5853436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                                regD, X1010, BITS4(0,0,M,1), regM);
5854436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                break;
5855436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             case ARMneon_NOT: /* VMVN reg, reg*/
5856436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                insn = XXXXXXXX(0xF, X0011, BITS4(1,D,1,1), X0000, regD, X0101,
5857436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                                BITS4(1,Q,M,0), regM);
5858436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                break;
5859436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             case ARMneon_EQZ:
5860436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                insn = XXXXXXXX(0xF, X0011, BITS4(1,D,1,1), BITS4(sz1,sz2,0,1),
5861436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                                regD, BITS4(0,F,0,1), BITS4(0,Q,M,0), regM);
5862436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                break;
5863436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             case ARMneon_CNT:
5864436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                insn = XXXXXXXX(0xF, X0011, BITS4(1,D,1,1), X0000, regD, X0101,
5865436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                                BITS4(0,Q,M,0), regM);
5866436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                break;
5867436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             case ARMneon_CLZ:
5868436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                insn = XXXXXXXX(0xF, X0011, BITS4(1,D,1,1), BITS4(sz1,sz2,0,0),
5869436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                                regD, X0100, BITS4(1,Q,M,0), regM);
5870436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                break;
5871436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             case ARMneon_CLS:
5872436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                insn = XXXXXXXX(0xF, X0011, BITS4(1,D,1,1), BITS4(sz1,sz2,0,0),
5873436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                                regD, X0100, BITS4(0,Q,M,0), regM);
5874436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                break;
5875436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             case ARMneon_ABS:
5876436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                insn = XXXXXXXX(0xF, X0011, BITS4(1,D,1,1), BITS4(sz1,sz2,0,1),
5877436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                                regD, X0011, BITS4(0,Q,M,0), regM);
5878436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                break;
5879436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             case ARMneon_DUP:
5880436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                sz1 = i->ARMin.NUnary.size == 0 ? 1 : 0;
5881436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                sz2 = i->ARMin.NUnary.size == 1 ? 1 : 0;
5882436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                vassert(sz1 + sz2 < 2);
5883436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                insn = XXXXXXXX(0xE, X1110, BITS4(1, sz1, Q, 0), regD, regM,
5884436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                                X1011, BITS4(D,0,sz2,1), X0000);
5885436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                break;
5886436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             case ARMneon_REV16:
5887436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                insn = XXXXXXXX(0xF, X0011, BITS4(1,D,1,1), BITS4(sz1,sz2,0,0),
5888436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                                regD, BITS4(0,0,0,1), BITS4(0,Q,M,0), regM);
5889436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                break;
5890436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             case ARMneon_REV32:
5891436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                insn = XXXXXXXX(0xF, X0011, BITS4(1,D,1,1), BITS4(sz1,sz2,0,0),
5892436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                                regD, BITS4(0,0,0,0), BITS4(1,Q,M,0), regM);
5893436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                break;
5894436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             case ARMneon_REV64:
5895436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                insn = XXXXXXXX(0xF, X0011, BITS4(1,D,1,1), BITS4(sz1,sz2,0,0),
5896436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                                regD, BITS4(0,0,0,0), BITS4(0,Q,M,0), regM);
5897436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                break;
5898436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             case ARMneon_PADDLU:
5899436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                insn = XXXXXXXX(0xF, X0011, BITS4(1,D,1,1), BITS4(sz1,sz2,0,0),
5900436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                                regD, X0010, BITS4(1,Q,M,0), regM);
5901436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                break;
5902436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             case ARMneon_PADDLS:
5903436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                insn = XXXXXXXX(0xF, X0011, BITS4(1,D,1,1), BITS4(sz1,sz2,0,0),
5904436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                                regD, X0010, BITS4(0,Q,M,0), regM);
5905436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                break;
5906436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             case ARMneon_VQSHLNUU:
5907436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                insn = XXXXXXXX(0xF, X0011,
5908436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                                (1 << 3) | (D << 2) | ((sz >> 4) & 3),
5909436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                                sz & 0xf, regD, X0111,
5910436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                                BITS4(sz >> 6,Q,M,1), regM);
5911436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                break;
5912436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             case ARMneon_VQSHLNSS:
5913436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                insn = XXXXXXXX(0xF, X0010,
5914436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                                (1 << 3) | (D << 2) | ((sz >> 4) & 3),
5915436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                                sz & 0xf, regD, X0111,
5916436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                                BITS4(sz >> 6,Q,M,1), regM);
5917436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                break;
5918436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             case ARMneon_VQSHLNUS:
5919436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                insn = XXXXXXXX(0xF, X0011,
5920436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                                (1 << 3) | (D << 2) | ((sz >> 4) & 3),
5921436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                                sz & 0xf, regD, X0110,
5922436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                                BITS4(sz >> 6,Q,M,1), regM);
5923436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                break;
5924436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             case ARMneon_VCVTFtoS:
5925436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                insn = XXXXXXXX(0xF, X0011, BITS4(1,D,1,1), X1011, regD, X0111,
5926436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                                BITS4(0,Q,M,0), regM);
5927436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                break;
5928436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             case ARMneon_VCVTFtoU:
5929436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                insn = XXXXXXXX(0xF, X0011, BITS4(1,D,1,1), X1011, regD, X0111,
5930436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                                BITS4(1,Q,M,0), regM);
5931436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                break;
5932436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             case ARMneon_VCVTStoF:
5933436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                insn = XXXXXXXX(0xF, X0011, BITS4(1,D,1,1), X1011, regD, X0110,
5934436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                                BITS4(0,Q,M,0), regM);
5935436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                break;
5936436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             case ARMneon_VCVTUtoF:
5937436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                insn = XXXXXXXX(0xF, X0011, BITS4(1,D,1,1), X1011, regD, X0110,
5938436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                                BITS4(1,Q,M,0), regM);
5939436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                break;
5940436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             case ARMneon_VCVTFtoFixedU:
5941436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                sz1 = (sz >> 5) & 1;
5942436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                sz2 = (sz >> 4) & 1;
5943436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                sz &= 0xf;
5944436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                insn = XXXXXXXX(0xF, X0011,
5945436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                                BITS4(1,D,sz1,sz2), sz, regD, X1111,
5946436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                                BITS4(0,Q,M,1), regM);
5947436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                break;
5948436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             case ARMneon_VCVTFtoFixedS:
5949436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                sz1 = (sz >> 5) & 1;
5950436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                sz2 = (sz >> 4) & 1;
5951436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                sz &= 0xf;
5952436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                insn = XXXXXXXX(0xF, X0010,
5953436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                                BITS4(1,D,sz1,sz2), sz, regD, X1111,
5954436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                                BITS4(0,Q,M,1), regM);
5955436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                break;
5956436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             case ARMneon_VCVTFixedUtoF:
5957436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                sz1 = (sz >> 5) & 1;
5958436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                sz2 = (sz >> 4) & 1;
5959436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                sz &= 0xf;
5960436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                insn = XXXXXXXX(0xF, X0011,
5961436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                                BITS4(1,D,sz1,sz2), sz, regD, X1110,
5962436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                                BITS4(0,Q,M,1), regM);
5963436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                break;
5964436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             case ARMneon_VCVTFixedStoF:
5965436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                sz1 = (sz >> 5) & 1;
5966436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                sz2 = (sz >> 4) & 1;
5967436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                sz &= 0xf;
5968436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                insn = XXXXXXXX(0xF, X0010,
5969436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                                BITS4(1,D,sz1,sz2), sz, regD, X1110,
5970436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                                BITS4(0,Q,M,1), regM);
5971436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                break;
5972436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             case ARMneon_VCVTF32toF16:
5973436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                insn = XXXXXXXX(0xF, X0011, BITS4(1,D,1,1), X0110, regD, X0110,
5974436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                                BITS4(0,0,M,0), regM);
5975436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                break;
5976436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             case ARMneon_VCVTF16toF32:
5977436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                insn = XXXXXXXX(0xF, X0011, BITS4(1,D,1,1), X0110, regD, X0111,
5978436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                                BITS4(0,0,M,0), regM);
5979436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                break;
5980436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             case ARMneon_VRECIP:
5981436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                insn = XXXXXXXX(0xF, X0011, BITS4(1,D,1,1), X1011, regD, X0100,
5982436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                                BITS4(0,Q,M,0), regM);
5983436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                break;
5984436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             case ARMneon_VRECIPF:
5985436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                insn = XXXXXXXX(0xF, X0011, BITS4(1,D,1,1), X1011, regD, X0101,
5986436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                                BITS4(0,Q,M,0), regM);
5987436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                break;
5988436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             case ARMneon_VABSFP:
5989436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                insn = XXXXXXXX(0xF, X0011, BITS4(1,D,1,1), X1001, regD, X0111,
5990436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                                BITS4(0,Q,M,0), regM);
5991436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                break;
5992436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             case ARMneon_VRSQRTEFP:
5993436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                insn = XXXXXXXX(0xF, X0011, BITS4(1,D,1,1), X1011, regD, X0101,
5994436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                                BITS4(1,Q,M,0), regM);
5995436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                break;
5996436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             case ARMneon_VRSQRTE:
5997436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                insn = XXXXXXXX(0xF, X0011, BITS4(1,D,1,1), X1011, regD, X0100,
5998436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                                BITS4(1,Q,M,0), regM);
5999436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                break;
6000436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             case ARMneon_VNEGF:
6001436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                insn = XXXXXXXX(0xF, X0011, BITS4(1,D,1,1), X1001, regD, X0111,
6002436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                                BITS4(1,Q,M,0), regM);
6003436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                break;
6004436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ
6005436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             default:
6006436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                goto bad;
6007436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          }
6008436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          *p++ = insn;
6009436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          goto done;
6010436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       }
6011436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMin_NDual: {
6012436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          UInt Q = i->ARMin.NDual.Q ? 1 : 0;
6013436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          UInt regD = (hregClass(i->ARMin.NDual.arg1) == HRcVec128)
6014436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                        ? (qregNo(i->ARMin.NDual.arg1) << 1)
6015436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                        : dregNo(i->ARMin.NDual.arg1);
6016436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          UInt regM = (hregClass(i->ARMin.NDual.arg2) == HRcVec128)
6017436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                        ? (qregNo(i->ARMin.NDual.arg2) << 1)
6018436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                        : dregNo(i->ARMin.NDual.arg2);
6019436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          UInt D = regD >> 4;
6020436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          UInt M = regM >> 4;
6021436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          UInt sz1 = i->ARMin.NDual.size >> 1;
6022436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          UInt sz2 = i->ARMin.NDual.size & 1;
6023436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          UInt insn;
6024436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          regD &= 0xF;
6025436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          regM &= 0xF;
6026436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          switch (i->ARMin.NDual.op) {
6027436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             case ARMneon_TRN: /* VTRN reg, reg */
6028436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                insn = XXXXXXXX(0xF, X0011, BITS4(1,D,1,1), BITS4(sz1,sz2,1,0),
6029436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                                regD, X0000, BITS4(1,Q,M,0), regM);
6030436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                break;
6031436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             case ARMneon_ZIP: /* VZIP reg, reg */
6032436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                insn = XXXXXXXX(0xF, X0011, BITS4(1,D,1,1), BITS4(sz1,sz2,1,0),
6033436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                                regD, X0001, BITS4(1,Q,M,0), regM);
6034436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                break;
6035436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             case ARMneon_UZP: /* VUZP reg, reg */
6036436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                insn = XXXXXXXX(0xF, X0011, BITS4(1,D,1,1), BITS4(sz1,sz2,1,0),
6037436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                                regD, X0001, BITS4(0,Q,M,0), regM);
6038436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                break;
6039436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             default:
6040436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                goto bad;
6041436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          }
6042436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          *p++ = insn;
6043436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          goto done;
6044436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       }
6045436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMin_NBinary: {
6046436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          UInt Q = i->ARMin.NBinary.Q ? 1 : 0;
6047436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          UInt regD = (hregClass(i->ARMin.NBinary.dst) == HRcVec128)
6048436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                        ? (qregNo(i->ARMin.NBinary.dst) << 1)
6049436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                        : dregNo(i->ARMin.NBinary.dst);
6050436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          UInt regN = (hregClass(i->ARMin.NBinary.argL) == HRcVec128)
6051436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                        ? (qregNo(i->ARMin.NBinary.argL) << 1)
6052436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                        : dregNo(i->ARMin.NBinary.argL);
6053436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          UInt regM = (hregClass(i->ARMin.NBinary.argR) == HRcVec128)
6054436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                        ? (qregNo(i->ARMin.NBinary.argR) << 1)
6055436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                        : dregNo(i->ARMin.NBinary.argR);
6056436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          UInt sz1 = i->ARMin.NBinary.size >> 1;
6057436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          UInt sz2 = i->ARMin.NBinary.size & 1;
6058436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          UInt D = regD >> 4;
6059436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          UInt N = regN >> 4;
6060436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          UInt M = regM >> 4;
6061436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          UInt insn;
6062436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          regD &= 0xF;
6063436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          regM &= 0xF;
6064436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          regN &= 0xF;
6065436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          switch (i->ARMin.NBinary.op) {
6066436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             case ARMneon_VAND: /* VAND reg, reg, reg */
6067436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                insn = XXXXXXXX(0xF, X0010, BITS4(0,D,0,0), regN, regD, X0001,
6068436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                                BITS4(N,Q,M,1), regM);
6069436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                break;
6070436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             case ARMneon_VORR: /* VORR reg, reg, reg*/
6071436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                insn = XXXXXXXX(0xF, X0010, BITS4(0,D,1,0), regN, regD, X0001,
6072436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                                BITS4(N,Q,M,1), regM);
6073436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                break;
6074436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             case ARMneon_VXOR: /* VEOR reg, reg, reg */
6075436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                insn = XXXXXXXX(0xF, X0011, BITS4(0,D,0,0), regN, regD, X0001,
6076436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                                BITS4(N,Q,M,1), regM);
6077436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                break;
6078436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             case ARMneon_VADD: /* VADD reg, reg, reg */
6079436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                insn = XXXXXXXX(0xF, X0010, BITS4(0,D,sz1,sz2), regN, regD,
6080436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                                X1000, BITS4(N,Q,M,0), regM);
6081436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                break;
6082436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             case ARMneon_VSUB: /* VSUB reg, reg, reg */
6083436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                insn = XXXXXXXX(0xF, X0011, BITS4(0,D,sz1,sz2), regN, regD,
6084436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                                X1000, BITS4(N,Q,M,0), regM);
6085436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                break;
6086436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             case ARMneon_VMINU: /* VMIN.Uxx reg, reg, reg */
6087436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                insn = XXXXXXXX(0xF, X0011, BITS4(0,D,sz1,sz2), regN, regD,
6088436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                                X0110, BITS4(N,Q,M,1), regM);
6089436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                break;
6090436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             case ARMneon_VMINS: /* VMIN.Sxx reg, reg, reg */
6091436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                insn = XXXXXXXX(0xF, X0010, BITS4(0,D,sz1,sz2), regN, regD,
6092436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                                X0110, BITS4(N,Q,M,1), regM);
6093436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                break;
6094436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             case ARMneon_VMAXU: /* VMAX.Uxx reg, reg, reg */
6095436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                insn = XXXXXXXX(0xF, X0011, BITS4(0,D,sz1,sz2), regN, regD,
6096436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                                X0110, BITS4(N,Q,M,0), regM);
6097436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                break;
6098436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             case ARMneon_VMAXS: /* VMAX.Sxx reg, reg, reg */
6099436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                insn = XXXXXXXX(0xF, X0010, BITS4(0,D,sz1,sz2), regN, regD,
6100436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                                X0110, BITS4(N,Q,M,0), regM);
6101436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                break;
6102436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             case ARMneon_VRHADDS: /* VRHADD.Sxx reg, reg, reg */
6103436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                insn = XXXXXXXX(0xF, X0010, BITS4(0,D,sz1,sz2), regN, regD,
6104436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                                X0001, BITS4(N,Q,M,0), regM);
6105436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                break;
6106436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             case ARMneon_VRHADDU: /* VRHADD.Uxx reg, reg, reg */
6107436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                insn = XXXXXXXX(0xF, X0011, BITS4(0,D,sz1,sz2), regN, regD,
6108436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                                X0001, BITS4(N,Q,M,0), regM);
6109436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                break;
6110436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             case ARMneon_VQADDU: /* VQADD unsigned reg, reg, reg */
6111436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                insn = XXXXXXXX(0xF, X0011, BITS4(0,D,sz1,sz2), regN, regD,
6112436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                                X0000, BITS4(N,Q,M,1), regM);
6113436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                break;
6114436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             case ARMneon_VQADDS: /* VQADD signed reg, reg, reg */
6115436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                insn = XXXXXXXX(0xF, X0010, BITS4(0,D,sz1,sz2), regN, regD,
6116436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                                X0000, BITS4(N,Q,M,1), regM);
6117436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                break;
6118436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             case ARMneon_VQSUBU: /* VQSUB unsigned reg, reg, reg */
6119436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                insn = XXXXXXXX(0xF, X0011, BITS4(0,D,sz1,sz2), regN, regD,
6120436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                                X0010, BITS4(N,Q,M,1), regM);
6121436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                break;
6122436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             case ARMneon_VQSUBS: /* VQSUB signed reg, reg, reg */
6123436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                insn = XXXXXXXX(0xF, X0010, BITS4(0,D,sz1,sz2), regN, regD,
6124436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                                X0010, BITS4(N,Q,M,1), regM);
6125436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                break;
6126436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             case ARMneon_VCGTU: /* VCGT unsigned reg, reg, reg */
6127436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                insn = XXXXXXXX(0xF, X0011, BITS4(0,D,sz1,sz2), regN, regD,
6128436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                                X0011, BITS4(N,Q,M,0), regM);
6129436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                break;
6130436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             case ARMneon_VCGTS: /* VCGT signed reg, reg, reg */
6131436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                insn = XXXXXXXX(0xF, X0010, BITS4(0,D,sz1,sz2), regN, regD,
6132436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                                X0011, BITS4(N,Q,M,0), regM);
6133436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                break;
6134436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             case ARMneon_VCGEU: /* VCGE unsigned reg, reg, reg */
6135436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                insn = XXXXXXXX(0xF, X0011, BITS4(0,D,sz1,sz2), regN, regD,
6136436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                                X0011, BITS4(N,Q,M,1), regM);
6137436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                break;
6138436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             case ARMneon_VCGES: /* VCGE signed reg, reg, reg */
6139436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                insn = XXXXXXXX(0xF, X0010, BITS4(0,D,sz1,sz2), regN, regD,
6140436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                                X0011, BITS4(N,Q,M,1), regM);
6141436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                break;
6142436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             case ARMneon_VCEQ: /* VCEQ reg, reg, reg */
6143436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                insn = XXXXXXXX(0xF, X0011, BITS4(0,D,sz1,sz2), regN, regD,
6144436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                                X1000, BITS4(N,Q,M,1), regM);
6145436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                break;
6146436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             case ARMneon_VEXT: /* VEXT.8 reg, reg, #imm4*/
6147436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                if (i->ARMin.NBinary.size >= 16)
6148436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                   goto bad;
6149436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                insn = XXXXXXXX(0xF, X0010, BITS4(1,D,1,1), regN, regD,
6150436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                                i->ARMin.NBinary.size & 0xf, BITS4(N,Q,M,0),
6151436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                                regM);
6152436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                break;
6153436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             case ARMneon_VMUL:
6154436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                insn = XXXXXXXX(0xF, X0010, BITS4(0,D,sz1,sz2), regN, regD,
6155436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                                X1001, BITS4(N,Q,M,1), regM);
6156436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                break;
6157436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             case ARMneon_VMULLU:
6158436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                insn = XXXXXXXX(0xF, X0011, BITS4(1,D,sz1,sz2), regN, regD,
6159436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                                X1100, BITS4(N,0,M,0), regM);
6160436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                break;
6161436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             case ARMneon_VMULLS:
6162436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                insn = XXXXXXXX(0xF, X0010, BITS4(1,D,sz1,sz2), regN, regD,
6163436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                                X1100, BITS4(N,0,M,0), regM);
6164436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                break;
6165436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             case ARMneon_VMULP:
6166436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                insn = XXXXXXXX(0xF, X0011, BITS4(0,D,sz1,sz2), regN, regD,
6167436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                                X1001, BITS4(N,Q,M,1), regM);
6168436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                break;
6169436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             case ARMneon_VMULFP:
6170436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                insn = XXXXXXXX(0xF, X0011, BITS4(0,D,0,0), regN, regD,
6171436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                                X1101, BITS4(N,Q,M,1), regM);
6172436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                break;
6173436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             case ARMneon_VMULLP:
6174436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                insn = XXXXXXXX(0xF, X0010, BITS4(1,D,sz1,sz2), regN, regD,
6175436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                                X1110, BITS4(N,0,M,0), regM);
6176436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                break;
6177436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             case ARMneon_VQDMULH:
6178436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                insn = XXXXXXXX(0xF, X0010, BITS4(0,D,sz1,sz2), regN, regD,
6179436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                                X1011, BITS4(N,Q,M,0), regM);
6180436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                break;
6181436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             case ARMneon_VQRDMULH:
6182436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                insn = XXXXXXXX(0xF, X0011, BITS4(0,D,sz1,sz2), regN, regD,
6183436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                                X1011, BITS4(N,Q,M,0), regM);
6184436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                break;
6185436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             case ARMneon_VQDMULL:
6186436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                insn = XXXXXXXX(0xF, X0010, BITS4(1,D,sz1,sz2), regN, regD,
6187436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                                X1101, BITS4(N,0,M,0), regM);
6188436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                break;
6189436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             case ARMneon_VTBL:
6190436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                insn = XXXXXXXX(0xF, X0011, BITS4(1,D,1,1), regN, regD,
6191436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                                X1000, BITS4(N,0,M,0), regM);
6192436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                break;
6193436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             case ARMneon_VPADD:
6194436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                insn = XXXXXXXX(0xF, X0010, BITS4(0,D,sz1,sz2), regN, regD,
6195436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                                X1011, BITS4(N,Q,M,1), regM);
6196436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                break;
6197436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             case ARMneon_VPADDFP:
6198436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                insn = XXXXXXXX(0xF, X0011, BITS4(0,D,0,0), regN, regD,
6199436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                                X1101, BITS4(N,Q,M,0), regM);
6200436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                break;
6201436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             case ARMneon_VPMINU:
6202436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                insn = XXXXXXXX(0xF, X0011, BITS4(0,D,sz1,sz2), regN, regD,
6203436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                                X1010, BITS4(N,Q,M,1), regM);
6204436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                break;
6205436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             case ARMneon_VPMINS:
6206436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                insn = XXXXXXXX(0xF, X0010, BITS4(0,D,sz1,sz2), regN, regD,
6207436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                                X1010, BITS4(N,Q,M,1), regM);
6208436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                break;
6209436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             case ARMneon_VPMAXU:
6210436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                insn = XXXXXXXX(0xF, X0011, BITS4(0,D,sz1,sz2), regN, regD,
6211436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                                X1010, BITS4(N,Q,M,0), regM);
6212436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                break;
6213436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             case ARMneon_VPMAXS:
6214436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                insn = XXXXXXXX(0xF, X0010, BITS4(0,D,sz1,sz2), regN, regD,
6215436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                                X1010, BITS4(N,Q,M,0), regM);
6216436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                break;
6217436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             case ARMneon_VADDFP: /* VADD reg, reg, reg */
6218436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                insn = XXXXXXXX(0xF, X0010, BITS4(0,D,0,0), regN, regD,
6219436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                                X1101, BITS4(N,Q,M,0), regM);
6220436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                break;
6221436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             case ARMneon_VSUBFP: /* VADD reg, reg, reg */
6222436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                insn = XXXXXXXX(0xF, X0010, BITS4(0,D,1,0), regN, regD,
6223436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                                X1101, BITS4(N,Q,M,0), regM);
6224436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                break;
6225436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             case ARMneon_VABDFP: /* VABD reg, reg, reg */
6226436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                insn = XXXXXXXX(0xF, X0011, BITS4(0,D,1,0), regN, regD,
6227436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                                X1101, BITS4(N,Q,M,0), regM);
6228436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                break;
6229436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             case ARMneon_VMINF:
6230436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                insn = XXXXXXXX(0xF, X0010, BITS4(0,D,1,0), regN, regD,
6231436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                                X1111, BITS4(N,Q,M,0), regM);
6232436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                break;
6233436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             case ARMneon_VMAXF:
6234436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                insn = XXXXXXXX(0xF, X0010, BITS4(0,D,0,0), regN, regD,
6235436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                                X1111, BITS4(N,Q,M,0), regM);
6236436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                break;
6237436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             case ARMneon_VPMINF:
6238436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                insn = XXXXXXXX(0xF, X0011, BITS4(0,D,1,0), regN, regD,
6239436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                                X1111, BITS4(N,Q,M,0), regM);
6240436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                break;
6241436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             case ARMneon_VPMAXF:
6242436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                insn = XXXXXXXX(0xF, X0011, BITS4(0,D,0,0), regN, regD,
6243436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                                X1111, BITS4(N,Q,M,0), regM);
6244436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                break;
6245436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             case ARMneon_VRECPS:
6246436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                insn = XXXXXXXX(0xF, X0010, BITS4(0,D,0,0), regN, regD, X1111,
6247436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                                BITS4(N,Q,M,1), regM);
6248436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                break;
6249436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             case ARMneon_VCGTF:
6250436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                insn = XXXXXXXX(0xF, X0011, BITS4(0,D,1,0), regN, regD, X1110,
6251436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                                BITS4(N,Q,M,0), regM);
6252436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                break;
6253436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             case ARMneon_VCGEF:
6254436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                insn = XXXXXXXX(0xF, X0011, BITS4(0,D,0,0), regN, regD, X1110,
6255436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                                BITS4(N,Q,M,0), regM);
6256436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                break;
6257436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             case ARMneon_VCEQF:
6258436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                insn = XXXXXXXX(0xF, X0010, BITS4(0,D,0,0), regN, regD, X1110,
6259436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                                BITS4(N,Q,M,0), regM);
6260436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                break;
6261436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             case ARMneon_VRSQRTS:
6262436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                insn = XXXXXXXX(0xF, X0010, BITS4(0,D,1,0), regN, regD, X1111,
6263436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                                BITS4(N,Q,M,1), regM);
6264436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                break;
6265436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             default:
6266436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                goto bad;
6267436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          }
6268436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          *p++ = insn;
6269436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          goto done;
6270436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       }
6271436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMin_NShift: {
6272436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          UInt Q = i->ARMin.NShift.Q ? 1 : 0;
6273436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          UInt regD = (hregClass(i->ARMin.NShift.dst) == HRcVec128)
6274436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                        ? (qregNo(i->ARMin.NShift.dst) << 1)
6275436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                        : dregNo(i->ARMin.NShift.dst);
6276436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          UInt regM = (hregClass(i->ARMin.NShift.argL) == HRcVec128)
6277436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                        ? (qregNo(i->ARMin.NShift.argL) << 1)
6278436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                        : dregNo(i->ARMin.NShift.argL);
6279436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          UInt regN = (hregClass(i->ARMin.NShift.argR) == HRcVec128)
6280436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                        ? (qregNo(i->ARMin.NShift.argR) << 1)
6281436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                        : dregNo(i->ARMin.NShift.argR);
6282436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          UInt sz1 = i->ARMin.NShift.size >> 1;
6283436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          UInt sz2 = i->ARMin.NShift.size & 1;
6284436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          UInt D = regD >> 4;
6285436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          UInt N = regN >> 4;
6286436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          UInt M = regM >> 4;
6287436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          UInt insn;
6288436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          regD &= 0xF;
6289436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          regM &= 0xF;
6290436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          regN &= 0xF;
6291436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          switch (i->ARMin.NShift.op) {
6292436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             case ARMneon_VSHL:
6293436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                insn = XXXXXXXX(0xF, X0011, BITS4(0,D,sz1,sz2), regN, regD,
6294436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                                X0100, BITS4(N,Q,M,0), regM);
6295436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                break;
6296436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             case ARMneon_VSAL:
6297436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                insn = XXXXXXXX(0xF, X0010, BITS4(0,D,sz1,sz2), regN, regD,
6298436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                                X0100, BITS4(N,Q,M,0), regM);
6299436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                break;
6300436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             case ARMneon_VQSHL:
6301436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                insn = XXXXXXXX(0xF, X0011, BITS4(0,D,sz1,sz2), regN, regD,
6302436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                                X0100, BITS4(N,Q,M,1), regM);
6303436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                break;
6304436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             case ARMneon_VQSAL:
6305436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                insn = XXXXXXXX(0xF, X0010, BITS4(0,D,sz1,sz2), regN, regD,
6306436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                                X0100, BITS4(N,Q,M,1), regM);
6307436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                break;
6308436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             default:
6309436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                goto bad;
6310436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          }
6311436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          *p++ = insn;
6312436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          goto done;
6313436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       }
6314436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMin_NShl64: {
6315436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          HReg regDreg = i->ARMin.NShl64.dst;
6316436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          HReg regMreg = i->ARMin.NShl64.src;
6317436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          UInt amt     = i->ARMin.NShl64.amt;
6318436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          vassert(amt >= 1 && amt <= 63);
6319436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          vassert(hregClass(regDreg) == HRcFlt64);
6320436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          vassert(hregClass(regMreg) == HRcFlt64);
6321436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          UInt regD = dregNo(regDreg);
6322436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          UInt regM = dregNo(regMreg);
6323436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          UInt D    = (regD >> 4) & 1;
6324436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          UInt Vd   = regD & 0xF;
6325436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          UInt L    = 1;
6326436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          UInt Q    = 0; /* always 64-bit */
6327436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          UInt M    = (regM >> 4) & 1;
6328436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          UInt Vm   = regM & 0xF;
6329436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          UInt insn = XXXXXXXX(X1111,X0010, BITS4(1,D,(amt>>5)&1,(amt>>4)&1),
6330436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                               amt & 0xF, Vd, X0101, BITS4(L,Q,M,1), Vm);
6331436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          *p++ = insn;
6332436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          goto done;
6333436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       }
6334436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case ARM64in_VImmQ: {
6335436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         UInt   rQ  = qregNo(i->ARM64in.VImmQ.rQ);
6336436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         UShort imm = i->ARM64in.VImmQ.imm;
6337436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         if (imm == 0x0000) {
6338436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            /* movi rQ.4s, #0x0 == 0x4F 0x00 0x04 000 rQ */
6339436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            vassert(rQ < 32);
6340436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            *p++ = 0x4F000400 | rQ;
6341436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            goto done;
6342436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         }
6343436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         if (imm == 0x0001) {
6344436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            /* movi rD, #0xFF == 0x2F 0x00 0xE4 001 rD */
6345436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            vassert(rQ < 32);
6346436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            *p++ = 0x2F00E420 | rQ;
6347436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            goto done;
6348436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         }
6349436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         if (imm == 0x0003) {
6350436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            /* movi rD, #0xFFFF == 0x2F 0x00 0xE4 011 rD */
6351436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            vassert(rQ < 32);
6352436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            *p++ = 0x2F00E460 | rQ;
6353436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            goto done;
6354436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         }
6355436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         if (imm == 0x000F) {
6356436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            /* movi rD, #0xFFFFFFFF == 0x2F 0x00 0xE5 111 rD */
6357436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            vassert(rQ < 32);
6358436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            *p++ = 0x2F00E5E0 | rQ;
6359436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            goto done;
6360436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         }
6361436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         if (imm == 0x00FF) {
6362436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            /* movi rD, #0xFFFFFFFFFFFFFFFF == 0x2F 0x07 0xE7 111 rD */
6363436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            vassert(rQ < 32);
6364436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            *p++ = 0x2F07E7E0 | rQ;
6365436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            goto done;
6366436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         }
6367436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         goto bad; /* no other handled cases right now */
6368436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      }
6369436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
6370436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case ARM64in_VDfromX: {
6371436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         /* INS Vd.D[0], rX
6372436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            0100 1110 0000 1000 0001 11 nn dd   INS Vd.D[0], Xn
6373436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            This isn't wonderful, in the sense that the upper half of
6374436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            the vector register stays unchanged and thus the insn is
6375436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            data dependent on its output register. */
6376436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         UInt dd = dregNo(i->ARM64in.VDfromX.rD);
6377436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         UInt xx = iregNo(i->ARM64in.VDfromX.rX);
6378436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         vassert(xx < 31);
6379436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         *p++ = 0x4E081C00 | X_2_6_2_12_5_5(0,0,0,0,xx,dd);
6380436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         goto done;
6381436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      }
6382436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
6383436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case ARM64in_VQfromXX: {
6384436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         /* What we really generate is a two insn sequence:
6385436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               INS Vd.D[0], Xlo; INS Vd.D[1], Xhi
6386436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            0100 1110 0000 1000 0001 11 nn dd   INS Vd.D[0], Xn
6387436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            0100 1110 0001 1000 0001 11 nn dd   INS Vd.D[1], Xn
6388436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         */
6389436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         UInt qq  = qregNo(i->ARM64in.VQfromXX.rQ);
6390436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         UInt xhi = iregNo(i->ARM64in.VQfromXX.rXhi);
6391436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         UInt xlo = iregNo(i->ARM64in.VQfromXX.rXlo);
6392436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         vassert(xhi < 31 && xlo < 31);
6393436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         *p++ = 0x4E081C00 | X_2_6_2_12_5_5(0,0,0,0,xlo,qq);
6394436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         *p++ = 0x4E181C00 | X_2_6_2_12_5_5(0,0,0,0,xhi,qq);
6395436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         goto done;
6396436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      }
6397436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
6398436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case ARM64in_VXfromQ: {
6399436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         /* 010 0111 0000 01000 001111 nn dd  UMOV Xd, Vn.D[0]
6400436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            010 0111 0000 11000 001111 nn dd  UMOV Xd, Vn.D[1]
6401436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         */
6402436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         UInt dd     = iregNo(i->ARM64in.VXfromQ.rX);
6403436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         UInt nn     = qregNo(i->ARM64in.VXfromQ.rQ);
6404436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         UInt laneNo = i->ARM64in.VXfromQ.laneNo;
6405436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         vassert(dd < 31);
6406436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         vassert(laneNo < 2);
6407436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         *p++ = X_3_8_5_6_5_5(X010, X01110000,
6408436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                              laneNo == 1 ? X11000 : X01000, X001111, nn, dd);
6409436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         goto done;
6410436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      }
6411436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
6412436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case ARM64in_VMov: {
6413436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         /* 000 11110 00 10000 00 10000 n d   FMOV Sd, Sn
6414436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            000 11110 01 10000 00 10000 n d   FMOV Dd, Dn
6415436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            010 01110 10 1 n    0 00111 n d   MOV Vd.16b, Vn.16b
6416436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         */
6417436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov        HReg rD = i->ARM64in.VMov.dst;
6418436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov        HReg rN = i->ARM64in.VMov.src;
6419436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov        switch (i->ARM64in.VMov.szB) {
6420436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov           case 8: {
6421436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov              UInt dd = dregNo(rD);
6422436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov              UInt nn = dregNo(rN);
6423436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov              *p++ = X_3_8_5_6_5_5(X000, X11110011, X00000, X010000, nn, dd);
6424436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov              goto done;
6425436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov           }
6426436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov           default:
6427436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov              break;
6428436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov        }
6429436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov        goto bad;
6430436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      }
6431436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMin_NeonImm: {
6432436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          UInt Q = (hregClass(i->ARMin.NeonImm.dst) == HRcVec128) ? 1 : 0;
6433436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          UInt regD = Q ? (qregNo(i->ARMin.NeonImm.dst) << 1) :
6434436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                           dregNo(i->ARMin.NeonImm.dst);
6435436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          UInt D = regD >> 4;
6436436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          UInt imm = i->ARMin.NeonImm.imm->imm8;
6437436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          UInt tp = i->ARMin.NeonImm.imm->type;
6438436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          UInt j = imm >> 7;
6439436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          UInt imm3 = (imm >> 4) & 0x7;
6440436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          UInt imm4 = imm & 0xF;
6441436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          UInt cmode, op;
6442436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          UInt insn;
6443436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          regD &= 0xF;
6444436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          if (tp == 9)
6445436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             op = 1;
6446436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          else
6447436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             op = 0;
6448436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          switch (tp) {
6449436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             case 0:
6450436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             case 1:
6451436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             case 2:
6452436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             case 3:
6453436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             case 4:
6454436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             case 5:
6455436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                cmode = tp << 1;
6456436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                break;
6457436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             case 9:
6458436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             case 6:
6459436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                cmode = 14;
6460436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                break;
6461436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             case 7:
6462436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                cmode = 12;
6463436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                break;
6464436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             case 8:
6465436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                cmode = 13;
6466436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                break;
6467436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             case 10:
6468436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                cmode = 15;
6469436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                break;
6470436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             default:
6471436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                vpanic("ARMin_NeonImm");
6472436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ
6473436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          }
6474436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          insn = XXXXXXXX(0xF, BITS4(0,0,1,j), BITS4(1,D,0,0), imm3, regD,
6475436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                          cmode, BITS4(0,Q,op,1), imm4);
6476436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          *p++ = insn;
6477436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          goto done;
6478436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       }
6479436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMin_NCMovQ: {
6480436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          UInt cc = (UInt)i->ARMin.NCMovQ.cond;
6481436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          UInt qM = qregNo(i->ARMin.NCMovQ.src) << 1;
6482436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          UInt qD = qregNo(i->ARMin.NCMovQ.dst) << 1;
6483436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          UInt vM = qM & 0xF;
6484436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          UInt vD = qD & 0xF;
6485436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          UInt M  = (qM >> 4) & 1;
6486436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          UInt D  = (qD >> 4) & 1;
6487436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          vassert(cc < 16 && cc != ARMcc_AL && cc != ARMcc_NV);
6488436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          /* b!cc here+8: !cc A00 0000 */
6489436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          UInt insn = XXXXXXXX(cc ^ 1, 0xA, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0);
6490436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          *p++ = insn;
6491436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          /* vmov qD, qM */
6492436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          insn = XXXXXXXX(0xF, 0x2, BITS4(0,D,1,0),
6493436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                          vM, vD, BITS4(0,0,0,1), BITS4(M,1,M,1), vM);
6494436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          *p++ = insn;
6495436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          goto done;
6496436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       }
6497436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMin_Add32: {
6498436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          UInt regD = iregNo(i->ARMin.Add32.rD);
6499436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          UInt regN = iregNo(i->ARMin.Add32.rN);
6500436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          UInt imm32 = i->ARMin.Add32.imm32;
6501436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          vassert(regD != regN);
6502436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          /* MOV regD, imm32 */
6503436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          p = imm32_to_iregNo((UInt *)p, regD, imm32);
6504436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          /* ADD regD, regN, regD */
6505436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          UInt insn = XXXXXXXX(0xE, 0, X1000, regN, regD, 0, 0, regD);
6506436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          *p++ = insn;
6507436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          goto done;
6508436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       }
6509436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
6510436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case ARM64in_EvCheck: {
6511436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         /* The sequence is fixed (canned) except for the two amodes
6512436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            supplied by the insn.  These don't change the length, though.
6513436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            We generate:
6514436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               ldr  w9, [x21 + #8]   8 == offsetof(host_EvC_COUNTER)
6515436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               subs w9, w9, #1
6516436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               str  w9, [x21 + #8]   8 == offsetof(host_EvC_COUNTER)
6517436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               bpl  nofail
6518436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               ldr  x9, [x21 + #0]   0 == offsetof(host_EvC_FAILADDR)
6519436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               br   x9
6520436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov              nofail:
6521436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         */
6522436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         UInt* p0 = p;
6523436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         p = do_load_or_store32(p, True/*isLoad*/, /*w*/9,
6524436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                i->ARM64in.EvCheck.amCounter);
6525436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         *p++ = 0x71000529; /* subs w9, w9, #1 */
6526436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         p = do_load_or_store32(p, False/*!isLoad*/, /*w*/9,
6527436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                i->ARM64in.EvCheck.amCounter);
6528436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         *p++ = 0x54000065; /* bpl nofail */
6529436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         p = do_load_or_store64(p, True/*isLoad*/, /*x*/9,
6530436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                i->ARM64in.EvCheck.amFailAddr);
6531436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         *p++ = 0xD61F0120; /* br x9 */
6532436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         /* nofail: */
6533436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
6534436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         /* Crosscheck */
6535436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         vassert(evCheckSzB_ARM64() == (UChar*)p - (UChar*)p0);
6536436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         goto done;
6537436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      }
6538436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
6539436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       case ARMin_ProfInc: {
6540436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          /* We generate:
6541436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ               (ctrP is unknown now, so use 0x65556555 in the
6542436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ               expectation that a later call to LibVEX_patchProfCtr
6543436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ               will be used to fill in the immediate fields once the
6544436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ               right value is known.)
6545436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             movw r12, lo16(0x65556555)
6546436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             movt r12, lo16(0x65556555)
6547436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             ldr  r11, [r12]
6548436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             adds r11, r11, #1
6549436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             str  r11, [r12]
6550436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             ldr  r11, [r12+4]
6551436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             adc  r11, r11, #0
6552436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ             str  r11, [r12+4]
6553436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          */
6554436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          p = imm32_to_iregNo_EXACTLY2(p, /*r*/12, 0x65556555);
6555436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          *p++ = 0xE59CB000;
6556436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          *p++ = 0xE29BB001;
6557436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          *p++ = 0xE58CB000;
6558436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          *p++ = 0xE59CB004;
6559436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          *p++ = 0xE2ABB000;
6560436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          *p++ = 0xE58CB004;
6561436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          /* Tell the caller .. */
6562436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          vassert(!(*is_profInc));
6563436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          *is_profInc = True;
6564436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ          goto done;
6565436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ       }
6566436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
6567436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      /* ... */
6568436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      default:
6569436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         goto bad;
6570436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    }
6571436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
6572436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  bad:
6573436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   ppARM64Instr(i);
6574436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   vpanic("emit_ARM64Instr");
6575436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   /*NOTREACHED*/
6576436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
6577436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  done:
6578436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   vassert(((UChar*)p) - &buf[0] <= 36);
6579436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   return ((UChar*)p) - &buf[0];
6580436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
6581436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
6582436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
6583436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov/* How big is an event check?  See case for ARM64in_EvCheck in
6584436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   emit_ARM64Instr just above.  That crosschecks what this returns, so
6585436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   we can tell if we're inconsistent. */
6586436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovInt evCheckSzB_ARM64 ( void )
6587436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
6588436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   return 24;
6589436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
6590436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
6591436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
6592436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov/* NB: what goes on here has to be very closely coordinated with the
6593436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   emitInstr case for XDirect, above. */
6594436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovVexInvalRange chainXDirect_ARM64 ( void* place_to_chain,
6595436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                   void* disp_cp_chain_me_EXPECTED,
6596436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                   void* place_to_jump_to )
6597436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
6598436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   /* What we're expecting to see is:
6599436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov        movw x9, disp_cp_chain_me_to_EXPECTED[15:0]
6600436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov        movk x9, disp_cp_chain_me_to_EXPECTED[31:15], lsl 16
6601436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov        movk x9, disp_cp_chain_me_to_EXPECTED[47:32], lsl 32
6602436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov        movk x9, disp_cp_chain_me_to_EXPECTED[63:48], lsl 48
6603436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov        blr  x9
6604436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      viz
6605436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov        <16 bytes generated by imm64_to_iregNo_EXACTLY4>
6606436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov        D6 3F 01 20
6607436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   */
6608436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   UInt* p = (UInt*)place_to_chain;
6609436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   vassert(0 == (3 & (HWord)p));
6610436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   vassert(is_imm64_to_iregNo_EXACTLY4(
6611436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov              p, /*x*/9, Ptr_to_ULong(disp_cp_chain_me_EXPECTED)));
6612436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   vassert(p[4] == 0xD63F0120);
6613436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
6614436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   /* And what we want to change it to is:
6615436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov        movw x9, place_to_jump_to[15:0]
6616436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov        movk x9, place_to_jump_to[31:15], lsl 16
6617436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov        movk x9, place_to_jump_to[47:32], lsl 32
6618436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov        movk x9, place_to_jump_to[63:48], lsl 48
6619436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov        br   x9
6620436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      viz
6621436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov        <16 bytes generated by imm64_to_iregNo_EXACTLY4>
6622436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov        D6 1F 01 20
6623436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
6624436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      The replacement has the same length as the original.
6625436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   */
6626436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   (void)imm64_to_iregNo_EXACTLY4(
6627436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            p, /*x*/9, Ptr_to_ULong(place_to_jump_to));
6628436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   p[4] = 0xD61F0120;
6629436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
6630436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   VexInvalRange vir = {(HWord)p, 20};
6631436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   return vir;
6632436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
6633436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
6634436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
6635436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov/* NB: what goes on here has to be very closely coordinated with the
6636436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   emitInstr case for XDirect, above. */
6637436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovVexInvalRange unchainXDirect_ARM64 ( void* place_to_unchain,
6638436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     void* place_to_jump_to_EXPECTED,
6639436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     void* disp_cp_chain_me )
6640436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
6641436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   /* What we're expecting to see is:
6642436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov        movw x9, place_to_jump_to_EXPECTED[15:0]
6643436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov        movk x9, place_to_jump_to_EXPECTED[31:15], lsl 16
6644436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov        movk x9, place_to_jump_to_EXPECTED[47:32], lsl 32
6645436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov        movk x9, place_to_jump_to_EXPECTED[63:48], lsl 48
6646436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov        br   x9
6647436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      viz
6648436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov        <16 bytes generated by imm64_to_iregNo_EXACTLY4>
6649436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov        D6 1F 01 20
6650436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   */
6651436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   UInt* p = (UInt*)place_to_unchain;
6652436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   vassert(0 == (3 & (HWord)p));
6653436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   vassert(is_imm64_to_iregNo_EXACTLY4(
6654436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov              p, /*x*/9, Ptr_to_ULong(place_to_jump_to_EXPECTED)));
6655436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   vassert(p[4] == 0xD61F0120);
6656436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
6657436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   /* And what we want to change it to is:
6658436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov        movw x9, disp_cp_chain_me_to[15:0]
6659436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov        movk x9, disp_cp_chain_me_to[31:15], lsl 16
6660436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov        movk x9, disp_cp_chain_me_to[47:32], lsl 32
6661436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov        movk x9, disp_cp_chain_me_to[63:48], lsl 48
6662436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov        blr  x9
6663436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      viz
6664436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov        <16 bytes generated by imm64_to_iregNo_EXACTLY4>
6665436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov        D6 3F 01 20
6666436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   */
6667436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   (void)imm64_to_iregNo_EXACTLY4(
6668436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            p, /*x*/9, Ptr_to_ULong(disp_cp_chain_me));
6669436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   p[4] = 0xD63F0120;
6670436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
6671436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   VexInvalRange vir = {(HWord)p, 20};
6672436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   return vir;
6673436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
6674436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
6675436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
6676436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ /* Patch the counter address into a profile inc point, as previously
6677436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    created by the ARMin_ProfInc case for emit_ARMInstr. */
6678436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ VexInvalRange patchProfInc_ARM ( void*  place_to_patch,
6679436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                                  ULong* location_of_counter )
6680436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ {
6681436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    vassert(sizeof(ULong*) == 4);
6682436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    UInt* p = (UInt*)place_to_patch;
6683436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    vassert(0 == (3 & (HWord)p));
6684436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    vassert(is_imm32_to_iregNo_EXACTLY2(p, /*r*/12, 0x65556555));
6685436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    vassert(p[2] == 0xE59CB000);
6686436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    vassert(p[3] == 0xE29BB001);
6687436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    vassert(p[4] == 0xE58CB000);
6688436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    vassert(p[5] == 0xE59CB004);
6689436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    vassert(p[6] == 0xE2ABB000);
6690436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    vassert(p[7] == 0xE58CB004);
6691436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    imm32_to_iregNo_EXACTLY2(p, /*r*/12,
6692436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ                             (UInt)Ptr_to_ULong(location_of_counter));
6693436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    VexInvalRange vir = {(HWord)p, 8};
6694436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ    return vir;
6695436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ }
6696436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ
6697436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ
6698436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ #undef BITS4
6699436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ #undef X0000
6700436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ #undef X0001
6701436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ #undef X0010
6702436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ #undef X0011
6703436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ #undef X0100
6704436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ #undef X0101
6705436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ #undef X0110
6706436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ #undef X0111
6707436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ #undef X1000
6708436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ #undef X1001
6709436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ #undef X1010
6710436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ #undef X1011
6711436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ #undef X1100
6712436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ #undef X1101
6713436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ #undef X1110
6714436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ #undef X1111
6715436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ #undef XXXXX___
6716436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ #undef XXXXXX__
6717436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ #undef XXX___XX
6718436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ #undef XXXXX__X
6719436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ #undef XXXXXXXX
6720436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ #undef XX______
6721436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
6722436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov/*---------------------------------------------------------------*/
6723436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov/*--- end                                   host_arm64_defs.c ---*/
6724436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov/*---------------------------------------------------------------*/
6725