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