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