host_arm_defs.h revision 6aa87a6864b2f3c9d766784dd13a2d321a8b08bd
10155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko 20155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko/*---------------------------------------------------------------*/ 30155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko/*--- begin host_arm_defs.h ---*/ 40155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko/*---------------------------------------------------------------*/ 59ed0cab99f18acb3570a35e9408f24355f6b8324Alex Vakulenko 60155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko/* 70155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko This file is part of Valgrind, a dynamic binary instrumentation 80155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko framework. 90155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko 100155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko Copyright (C) 2004-2010 OpenWorks LLP 110155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko info@open-works.net 120155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko 130155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko This program is free software; you can redistribute it and/or 140155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko modify it under the terms of the GNU General Public License as 150155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko published by the Free Software Foundation; either version 2 of the 160155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko License, or (at your option) any later version. 179ed0cab99f18acb3570a35e9408f24355f6b8324Alex Vakulenko 189ed0cab99f18acb3570a35e9408f24355f6b8324Alex Vakulenko This program is distributed in the hope that it will be useful, but 199ed0cab99f18acb3570a35e9408f24355f6b8324Alex Vakulenko WITHOUT ANY WARRANTY; without even the implied warranty of 209ed0cab99f18acb3570a35e9408f24355f6b8324Alex Vakulenko MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 219ed0cab99f18acb3570a35e9408f24355f6b8324Alex Vakulenko General Public License for more details. 220155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko 230155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko You should have received a copy of the GNU General Public License 240155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko along with this program; if not, write to the Free Software 250155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 260155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko 02110-1301, USA. 272fd46ba1458275cd16b0949675bff70cc8abcdadChristopher Wiley 280155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko The GNU General Public License is contained in the file COPYING. 290155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko*/ 300155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko 310155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko#ifndef __VEX_HOST_ARM_DEFS_H 320155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko#define __VEX_HOST_ARM_DEFS_H 330155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko 340155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenkoextern UInt arm_hwcaps; 350155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko 360155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko 370155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko/* --------- Registers. --------- */ 380155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko 390155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko/* The usual HReg abstraction. 400155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko There are 16 general purpose regs. 410155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko*/ 420155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko 430155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenkoextern void ppHRegARM ( HReg ); 440155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko 450155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenkoextern HReg hregARM_R0 ( void ); 460155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenkoextern HReg hregARM_R1 ( void ); 470155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenkoextern HReg hregARM_R2 ( void ); 480155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenkoextern HReg hregARM_R3 ( void ); 490155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenkoextern HReg hregARM_R4 ( void ); 509ed0cab99f18acb3570a35e9408f24355f6b8324Alex Vakulenkoextern HReg hregARM_R5 ( void ); 510155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenkoextern HReg hregARM_R6 ( void ); 520155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenkoextern HReg hregARM_R7 ( void ); 530155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenkoextern HReg hregARM_R8 ( void ); 54f76c68298c31a148c7c4bb353f87152f5ca529bcAlex Vakulenkoextern HReg hregARM_R9 ( void ); 55f76c68298c31a148c7c4bb353f87152f5ca529bcAlex Vakulenkoextern HReg hregARM_R10 ( void ); 56f76c68298c31a148c7c4bb353f87152f5ca529bcAlex Vakulenkoextern HReg hregARM_R11 ( void ); 57f76c68298c31a148c7c4bb353f87152f5ca529bcAlex Vakulenkoextern HReg hregARM_R12 ( void ); 58f76c68298c31a148c7c4bb353f87152f5ca529bcAlex Vakulenkoextern HReg hregARM_R13 ( void ); 593703d3770e024331033dcfe7bf68c9e60eaa9cecAlex Vakulenkoextern HReg hregARM_R14 ( void ); 603703d3770e024331033dcfe7bf68c9e60eaa9cecAlex Vakulenkoextern HReg hregARM_R15 ( void ); 61bccdc4c4dc25412608064edbfec302e733a28937Bertrand SIMONNETextern HReg hregARM_D8 ( void ); 623703d3770e024331033dcfe7bf68c9e60eaa9cecAlex Vakulenkoextern HReg hregARM_D9 ( void ); 633703d3770e024331033dcfe7bf68c9e60eaa9cecAlex Vakulenkoextern HReg hregARM_D10 ( void ); 643703d3770e024331033dcfe7bf68c9e60eaa9cecAlex Vakulenkoextern HReg hregARM_D11 ( void ); 65f76c68298c31a148c7c4bb353f87152f5ca529bcAlex Vakulenkoextern HReg hregARM_D12 ( void ); 660155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenkoextern HReg hregARM_S26 ( void ); 670155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenkoextern HReg hregARM_S27 ( void ); 689ed0cab99f18acb3570a35e9408f24355f6b8324Alex Vakulenkoextern HReg hregARM_S28 ( void ); 690155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenkoextern HReg hregARM_S29 ( void ); 700155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenkoextern HReg hregARM_S30 ( void ); 719ed0cab99f18acb3570a35e9408f24355f6b8324Alex Vakulenkoextern HReg hregARM_Q8 ( void ); 720155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenkoextern HReg hregARM_Q9 ( void ); 730155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenkoextern HReg hregARM_Q10 ( void ); 740155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenkoextern HReg hregARM_Q11 ( void ); 750155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenkoextern HReg hregARM_Q12 ( void ); 760155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenkoextern HReg hregARM_Q13 ( void ); 770155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenkoextern HReg hregARM_Q14 ( void ); 78f76c68298c31a148c7c4bb353f87152f5ca529bcAlex Vakulenkoextern HReg hregARM_Q15 ( void ); 790155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko 800155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko/* Number of registers used arg passing in function calls */ 810155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko#define ARM_N_ARGREGS 4 /* r0, r1, r2, r3 */ 820155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko 830155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko 840155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko/* --------- Condition codes. --------- */ 850155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko 860155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenkotypedef 870155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko enum { 880155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko ARMcc_EQ = 0, /* equal : Z=1 */ 890155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko ARMcc_NE = 1, /* not equal : Z=0 */ 900155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko 910155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko ARMcc_HS = 2, /* >=u (higher or same) : C=1 */ 920155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko ARMcc_LO = 3, /* <u (lower) : C=0 */ 930155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko 940155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko ARMcc_MI = 4, /* minus (negative) : N=1 */ 950155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko ARMcc_PL = 5, /* plus (zero or +ve) : N=0 */ 960155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko 970155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko ARMcc_VS = 6, /* overflow : V=1 */ 980155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko ARMcc_VC = 7, /* no overflow : V=0 */ 990155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko 1001b79239785bf964fd5f1a607a6ed9c9bbb57a4b1Alex Vakulenko ARMcc_HI = 8, /* >u (higher) : C=1 && Z=0 */ 1010155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko ARMcc_LS = 9, /* <=u (lower or same) : C=0 || Z=1 */ 1020155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko 1038cb41343cddbab496e7ca90bca4dc95f07af64bdAlex Vakulenko ARMcc_GE = 10, /* >=s (signed greater or equal) : N=V */ 1040155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko ARMcc_LT = 11, /* <s (signed less than) : N!=V */ 1050155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko 1060155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko ARMcc_GT = 12, /* >s (signed greater) : Z=0 && N=V */ 1070155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko ARMcc_LE = 13, /* <=s (signed less or equal) : Z=1 || N!=V */ 1080155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko 1090155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko ARMcc_AL = 14, /* always (unconditional) */ 1100155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko ARMcc_NV = 15 /* never (basically undefined meaning), deprecated */ 1110155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko } 1120155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko ARMCondCode; 1130155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko 1140155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenkoextern HChar* showARMCondCode ( ARMCondCode ); 115f76c68298c31a148c7c4bb353f87152f5ca529bcAlex Vakulenko 116f76c68298c31a148c7c4bb353f87152f5ca529bcAlex Vakulenko 1170155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko 1180155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko/* --------- Memory address expressions (amodes). --------- */ 1190155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko 1200155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko/* --- Addressing Mode 1 --- */ 1210155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenkotypedef 1220155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko enum { 1230155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko ARMam1_RI=1, /* reg +/- imm12 */ 1240155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko ARMam1_RRS /* reg1 + (reg2 << 0, 1 2 or 3) */ 1250155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko } 1260155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko ARMAMode1Tag; 1270155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko 1280155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenkotypedef 1290155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko struct { 130f76c68298c31a148c7c4bb353f87152f5ca529bcAlex Vakulenko ARMAMode1Tag tag; 131f76c68298c31a148c7c4bb353f87152f5ca529bcAlex Vakulenko union { 132f76c68298c31a148c7c4bb353f87152f5ca529bcAlex Vakulenko struct { 133f76c68298c31a148c7c4bb353f87152f5ca529bcAlex Vakulenko HReg reg; 134f76c68298c31a148c7c4bb353f87152f5ca529bcAlex Vakulenko Int simm13; /* -4095 .. +4095 */ 135f76c68298c31a148c7c4bb353f87152f5ca529bcAlex Vakulenko } RI; 1360155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko struct { 1370155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko HReg base; 1380155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko HReg index; 1390155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko UInt shift; /* 0, 1 2 or 3 */ 1400155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko } RRS; 1410155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko } ARMam1; 1420155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko } 1430155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko ARMAMode1; 1440155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko 1450155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenkoextern ARMAMode1* ARMAMode1_RI ( HReg reg, Int simm13 ); 1460155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenkoextern ARMAMode1* ARMAMode1_RRS ( HReg base, HReg index, UInt shift ); 1470155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko 1480155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenkoextern void ppARMAMode1 ( ARMAMode1* ); 1490155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko 1500155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko 1510155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko/* --- Addressing Mode 2 --- */ 1520155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenkotypedef 1530155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko enum { 1540155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko ARMam2_RI=3, /* reg +/- imm8 */ 1550155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko ARMam2_RR /* reg1 + reg2 */ 1560155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko } 1570155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko ARMAMode2Tag; 1580155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko 1590155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenkotypedef 1600155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko struct { 1610155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko ARMAMode2Tag tag; 1620155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko union { 1630155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko struct { 1640155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko HReg reg; 1650155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko Int simm9; /* -255 .. 255 */ 1660155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko } RI; 1670155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko struct { 1680155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko HReg base; 1690155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko HReg index; 1700155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko } RR; 1710155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko } ARMam2; 1720155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko } 1730155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko ARMAMode2; 1740155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko 1750155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenkoextern ARMAMode2* ARMAMode2_RI ( HReg reg, Int simm9 ); 1760155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenkoextern ARMAMode2* ARMAMode2_RR ( HReg base, HReg index ); 1770155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko 1780155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenkoextern void ppARMAMode2 ( ARMAMode2* ); 1790155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko 1800155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko 1810155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko/* --- Addressing Mode suitable for VFP --- */ 1820155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko/* The simm11 is encoded as 8 bits + 1 sign bit, 1830155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko so can only be 0 % 4. */ 1840155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenkotypedef 1850155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko struct { 1860155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko HReg reg; 1870155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko Int simm11; /* -1020, -1016 .. 1016, 1020 */ 1880155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko } 1890155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko ARMAModeV; 1900155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko 1910155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenkoextern ARMAModeV* mkARMAModeV ( HReg reg, Int simm11 ); 1920155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko 1930155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenkoextern void ppARMAModeV ( ARMAModeV* ); 1940155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko 1950155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko/* --- Addressing Mode suitable for Neon --- */ 1960155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenkotypedef 1970155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko enum { 1980155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko ARMamN_R=5, 1990155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko ARMamN_RR 2000155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko /* ... */ 2010155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko } 2020155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko ARMAModeNTag; 2030155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko 2040155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenkotypedef 2050155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko struct { 2060155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko ARMAModeNTag tag; 2070155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko union { 2080155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko struct { 2090155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko HReg rN; 2100155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko HReg rM; 2110155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko } RR; 2121b79239785bf964fd5f1a607a6ed9c9bbb57a4b1Alex Vakulenko struct { 2131b79239785bf964fd5f1a607a6ed9c9bbb57a4b1Alex Vakulenko HReg rN; 214f1f06b43f3c4699f8d0870e7949a73ecf8fda318Alex Vakulenko } R; 215f1f06b43f3c4699f8d0870e7949a73ecf8fda318Alex Vakulenko /* ... */ 216f1f06b43f3c4699f8d0870e7949a73ecf8fda318Alex Vakulenko } ARMamN; 2170155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko } 218f1f06b43f3c4699f8d0870e7949a73ecf8fda318Alex Vakulenko ARMAModeN; 219f1f06b43f3c4699f8d0870e7949a73ecf8fda318Alex Vakulenko 220f1f06b43f3c4699f8d0870e7949a73ecf8fda318Alex Vakulenkoextern ARMAModeN* mkARMAModeN_RR ( HReg, HReg ); 2210155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenkoextern ARMAModeN* mkARMAModeN_R ( HReg ); 2220155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenkoextern void ppARMAModeN ( ARMAModeN* ); 2230155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko 2240155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko/* --------- Reg or imm-8x4 operands --------- */ 2251b79239785bf964fd5f1a607a6ed9c9bbb57a4b1Alex Vakulenko/* a.k.a (a very restricted form of) Shifter Operand, 2261b79239785bf964fd5f1a607a6ed9c9bbb57a4b1Alex Vakulenko in the ARM parlance. */ 2270155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko 2281b79239785bf964fd5f1a607a6ed9c9bbb57a4b1Alex Vakulenkotypedef 2290155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko enum { 2301b79239785bf964fd5f1a607a6ed9c9bbb57a4b1Alex Vakulenko ARMri84_I84=7, /* imm8 `ror` (2 * imm4) */ 2311b79239785bf964fd5f1a607a6ed9c9bbb57a4b1Alex Vakulenko ARMri84_R /* reg */ 2320155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko } 2331b79239785bf964fd5f1a607a6ed9c9bbb57a4b1Alex Vakulenko ARMRI84Tag; 2340155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko 235f1f06b43f3c4699f8d0870e7949a73ecf8fda318Alex Vakulenkotypedef 2360155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko struct { 2370155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko ARMRI84Tag tag; 2380155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko union { 2390155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko struct { 2400155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko UShort imm8; 2410155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko UShort imm4; 2420155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko } I84; 2430155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko struct { 2440155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko HReg reg; 2450155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko } R; 2460155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko } ARMri84; 24738bb5d630348b1443c8341b939b3f2586273516dAlex Vakulenko } 24838bb5d630348b1443c8341b939b3f2586273516dAlex Vakulenko ARMRI84; 2490155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko 2500155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenkoextern ARMRI84* ARMRI84_I84 ( UShort imm8, UShort imm4 ); 2510155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenkoextern ARMRI84* ARMRI84_R ( HReg ); 2520155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko 2530155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenkoextern void ppARMRI84 ( ARMRI84* ); 2540155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko 2550155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko 2560155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko/* --------- Reg or imm5 operands --------- */ 25738bb5d630348b1443c8341b939b3f2586273516dAlex Vakulenkotypedef 2580155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko enum { 2590155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko ARMri5_I5=9, /* imm5, 1 .. 31 only (no zero!) */ 2600155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko ARMri5_R /* reg */ 2610155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko } 2621b79239785bf964fd5f1a607a6ed9c9bbb57a4b1Alex Vakulenko ARMRI5Tag; 2630155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko 2640155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenkotypedef 26538bb5d630348b1443c8341b939b3f2586273516dAlex Vakulenko struct { 26638bb5d630348b1443c8341b939b3f2586273516dAlex Vakulenko ARMRI5Tag tag; 2670155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko union { 2680155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko struct { 2690155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko UInt imm5; 2700155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko } I5; 2710155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko struct { 2720155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko HReg reg; 2730155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko } R; 2740155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko } ARMri5; 27538bb5d630348b1443c8341b939b3f2586273516dAlex Vakulenko } 2761b79239785bf964fd5f1a607a6ed9c9bbb57a4b1Alex Vakulenko ARMRI5; 2770155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko 2780155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenkoextern ARMRI5* ARMRI5_I5 ( UInt imm5 ); 2798cb41343cddbab496e7ca90bca4dc95f07af64bdAlex Vakulenkoextern ARMRI5* ARMRI5_R ( HReg ); 2808cb41343cddbab496e7ca90bca4dc95f07af64bdAlex Vakulenko 2818cb41343cddbab496e7ca90bca4dc95f07af64bdAlex Vakulenkoextern void ppARMRI5 ( ARMRI5* ); 2828cb41343cddbab496e7ca90bca4dc95f07af64bdAlex Vakulenko 2838cb41343cddbab496e7ca90bca4dc95f07af64bdAlex Vakulenko/* -------- Neon Immediate operand -------- */ 2840155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko 2850155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko/* imm8 = abcdefgh, B = NOT(b); 2860155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko 2870155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenkotype | value (64bit binary) 2880155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko-----+------------------------------------------------------------------------- 2890155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko 0 | 00000000 00000000 00000000 abcdefgh 00000000 00000000 00000000 abcdefgh 2900155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko 1 | 00000000 00000000 abcdefgh 00000000 00000000 00000000 abcdefgh 00000000 2910155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko 2 | 00000000 abcdefgh 00000000 00000000 00000000 abcdefgh 00000000 00000000 2920155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko 3 | abcdefgh 00000000 00000000 00000000 abcdefgh 00000000 00000000 00000000 2930155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko 4 | 00000000 abcdefgh 00000000 abcdefgh 00000000 abcdefgh 00000000 abcdefgh 2940155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko 5 | abcdefgh 00000000 abcdefgh 00000000 abcdefgh 00000000 abcdefgh 00000000 2950155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko 6 | abcdefgh abcdefgh abcdefgh abcdefgh abcdefgh abcdefgh abcdefgh abcdefgh 2960155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko 7 | 00000000 00000000 abcdefgh 11111111 00000000 00000000 abcdefgh 11111111 2970155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko 8 | 00000000 abcdefgh 11111111 11111111 00000000 abcdefgh 11111111 11111111 2980155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko 9 | aaaaaaaa bbbbbbbb cccccccc dddddddd eeeeeeee ffffffff gggggggg hhhhhhhh 2990155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko 10 | aBbbbbbc defgh000 00000000 00000000 aBbbbbbc defgh000 00000000 00000000 3000155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko-----+------------------------------------------------------------------------- 3010155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko 3020155b392067cba98fc6a60fe64fb38b23b01e4c4Alex VakulenkoType 10 is: 3030155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko (-1)^S * 2^exp * mantissa 3040155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenkowhere S = a, exp = UInt(B:c:d) - 3, mantissa = (16 + UInt(e:f:g:h)) / 16 3050155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko*/ 3060155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko 3070155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenkotypedef 308f76c68298c31a148c7c4bb353f87152f5ca529bcAlex Vakulenko struct { 309f76c68298c31a148c7c4bb353f87152f5ca529bcAlex Vakulenko UInt type; 310f76c68298c31a148c7c4bb353f87152f5ca529bcAlex Vakulenko UInt imm8; 311f76c68298c31a148c7c4bb353f87152f5ca529bcAlex Vakulenko } 312f76c68298c31a148c7c4bb353f87152f5ca529bcAlex Vakulenko ARMNImm; 313f76c68298c31a148c7c4bb353f87152f5ca529bcAlex Vakulenko 314f76c68298c31a148c7c4bb353f87152f5ca529bcAlex Vakulenkoextern ARMNImm* ARMNImm_TI ( UInt type, UInt imm8 ); 315f76c68298c31a148c7c4bb353f87152f5ca529bcAlex Vakulenkoextern ULong ARMNImm_to_Imm64 ( ARMNImm* ); 316f76c68298c31a148c7c4bb353f87152f5ca529bcAlex Vakulenkoextern ARMNImm* Imm64_to_ARMNImm ( ULong ); 317f76c68298c31a148c7c4bb353f87152f5ca529bcAlex Vakulenko 318f76c68298c31a148c7c4bb353f87152f5ca529bcAlex Vakulenkoextern void ppARMNImm ( ARMNImm* ); 319f76c68298c31a148c7c4bb353f87152f5ca529bcAlex Vakulenko 320f76c68298c31a148c7c4bb353f87152f5ca529bcAlex Vakulenko/* ------ Neon Register or Scalar Operand ------ */ 321f76c68298c31a148c7c4bb353f87152f5ca529bcAlex Vakulenko 322f76c68298c31a148c7c4bb353f87152f5ca529bcAlex Vakulenkotypedef 323f76c68298c31a148c7c4bb353f87152f5ca529bcAlex Vakulenko enum { 324f76c68298c31a148c7c4bb353f87152f5ca529bcAlex Vakulenko ARMNRS_Reg=11, 325f76c68298c31a148c7c4bb353f87152f5ca529bcAlex Vakulenko ARMNRS_Scalar 326f76c68298c31a148c7c4bb353f87152f5ca529bcAlex Vakulenko } 327f76c68298c31a148c7c4bb353f87152f5ca529bcAlex Vakulenko ARMNRS_tag; 328f76c68298c31a148c7c4bb353f87152f5ca529bcAlex Vakulenko 329f76c68298c31a148c7c4bb353f87152f5ca529bcAlex Vakulenkotypedef 330f76c68298c31a148c7c4bb353f87152f5ca529bcAlex Vakulenko struct { 331f76c68298c31a148c7c4bb353f87152f5ca529bcAlex Vakulenko ARMNRS_tag tag; 332f76c68298c31a148c7c4bb353f87152f5ca529bcAlex Vakulenko HReg reg; 333f76c68298c31a148c7c4bb353f87152f5ca529bcAlex Vakulenko UInt index; 334f76c68298c31a148c7c4bb353f87152f5ca529bcAlex Vakulenko } 335f76c68298c31a148c7c4bb353f87152f5ca529bcAlex Vakulenko ARMNRS; 336f76c68298c31a148c7c4bb353f87152f5ca529bcAlex Vakulenko 3370155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenkoextern ARMNRS* mkARMNRS(ARMNRS_tag, HReg reg, UInt index); 3380155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenkoextern void ppARMNRS ( ARMNRS* ); 3390155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko 340f76c68298c31a148c7c4bb353f87152f5ca529bcAlex Vakulenko/* --------- Instructions. --------- */ 3410155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko 3420155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko/* --------- */ 3430155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenkotypedef 344f76c68298c31a148c7c4bb353f87152f5ca529bcAlex Vakulenko enum { 3450155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko ARMalu_ADD=20, /* plain 32-bit add */ 3460155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko ARMalu_ADDS, /* 32-bit add, and set the flags */ 3470155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko ARMalu_ADC, /* 32-bit add with carry */ 348f76c68298c31a148c7c4bb353f87152f5ca529bcAlex Vakulenko ARMalu_SUB, /* plain 32-bit subtract */ 349f76c68298c31a148c7c4bb353f87152f5ca529bcAlex Vakulenko ARMalu_SUBS, /* 32-bit subtract, and set the flags */ 3500155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko ARMalu_SBC, /* 32-bit subtract with carry */ 351f76c68298c31a148c7c4bb353f87152f5ca529bcAlex Vakulenko ARMalu_AND, 352f76c68298c31a148c7c4bb353f87152f5ca529bcAlex Vakulenko ARMalu_BIC, 353f76c68298c31a148c7c4bb353f87152f5ca529bcAlex Vakulenko ARMalu_OR, 354f76c68298c31a148c7c4bb353f87152f5ca529bcAlex Vakulenko ARMalu_XOR 3550155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko } 3560155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko ARMAluOp; 3570155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko 3589ed0cab99f18acb3570a35e9408f24355f6b8324Alex Vakulenkoextern HChar* showARMAluOp ( ARMAluOp op ); 359f76c68298c31a148c7c4bb353f87152f5ca529bcAlex Vakulenko 360f76c68298c31a148c7c4bb353f87152f5ca529bcAlex Vakulenko 361f76c68298c31a148c7c4bb353f87152f5ca529bcAlex Vakulenkotypedef 362f76c68298c31a148c7c4bb353f87152f5ca529bcAlex Vakulenko enum { 3630155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko ARMsh_SHL=40, 364f76c68298c31a148c7c4bb353f87152f5ca529bcAlex Vakulenko ARMsh_SHR, 365f76c68298c31a148c7c4bb353f87152f5ca529bcAlex Vakulenko ARMsh_SAR 366be6a3bbf3c42fa6ead0450c503067ce06f11a572Alex Vakulenko } 367be6a3bbf3c42fa6ead0450c503067ce06f11a572Alex Vakulenko ARMShiftOp; 368be6a3bbf3c42fa6ead0450c503067ce06f11a572Alex Vakulenko 369be6a3bbf3c42fa6ead0450c503067ce06f11a572Alex Vakulenkoextern HChar* showARMShiftOp ( ARMShiftOp op ); 370be6a3bbf3c42fa6ead0450c503067ce06f11a572Alex Vakulenko 371be6a3bbf3c42fa6ead0450c503067ce06f11a572Alex Vakulenko 372f76c68298c31a148c7c4bb353f87152f5ca529bcAlex Vakulenkotypedef 373f76c68298c31a148c7c4bb353f87152f5ca529bcAlex Vakulenko enum { 3740155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko ARMun_NEG=50, 3750155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko ARMun_NOT, 3760155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko ARMun_CLZ 3770155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko } 3780155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko ARMUnaryOp; 3790155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko 380f76c68298c31a148c7c4bb353f87152f5ca529bcAlex Vakulenkoextern HChar* showARMUnaryOp ( ARMUnaryOp op ); 3810155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko 3820155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko 3830155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenkotypedef 3840155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko enum { 3850155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko ARMmul_PLAIN=60, 3860155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko ARMmul_ZX, 387000726053bddc605a6c78b5dece37bcb2c67f291Alex Deymo ARMmul_SX 388000726053bddc605a6c78b5dece37bcb2c67f291Alex Deymo } 3890155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko ARMMulOp; 3900155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko 3910155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenkoextern HChar* showARMMulOp ( ARMMulOp op ); 3920155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko 3930155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko 3940155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenkotypedef 3950155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko enum { 3960155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko ARMvfp_ADD=70, 3970155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko ARMvfp_SUB, 3980155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko ARMvfp_MUL, 3990155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko ARMvfp_DIV 4000155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko } 4010155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko ARMVfpOp; 4020155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko 4032fd46ba1458275cd16b0949675bff70cc8abcdadChristopher Wileyextern HChar* showARMVfpOp ( ARMVfpOp op ); 4040155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko 4050155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko 4060155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenkotypedef 4070155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko enum { 4080155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko ARMvfpu_COPY=80, 4090155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko ARMvfpu_NEG, 4100155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko ARMvfpu_ABS, 4110155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko ARMvfpu_SQRT 4120155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko } 4130155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko ARMVfpUnaryOp; 4140155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko 4150155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenkoextern HChar* showARMVfpUnaryOp ( ARMVfpUnaryOp op ); 4160155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko 4170155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenkotypedef 4180155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko enum { 4190155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko ARMneon_VAND=90, 4200155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko ARMneon_VORR, 4210155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko ARMneon_VXOR, 4220155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko ARMneon_VADD, 4230155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko ARMneon_VADDFP, 4240155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko ARMneon_VRHADDS, 4250155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko ARMneon_VRHADDU, 4260155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko ARMneon_VPADDFP, 4270155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko ARMneon_VABDFP, 4280155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko ARMneon_VSUB, 4290155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko ARMneon_VSUBFP, 4300155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko ARMneon_VMAXU, 4310155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko ARMneon_VMAXS, 4320155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko ARMneon_VMAXF, 4330155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko ARMneon_VMINU, 4340155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko ARMneon_VMINS, 4350155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko ARMneon_VMINF, 4360155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko ARMneon_VQADDU, 4370155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko ARMneon_VQADDS, 4380155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko ARMneon_VQSUBU, 4390155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko ARMneon_VQSUBS, 4400155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko ARMneon_VCGTU, 4410155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko ARMneon_VCGTS, 4420155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko ARMneon_VCGEU, 4430155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko ARMneon_VCGES, 4440155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko ARMneon_VCGTF, 4450155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko ARMneon_VCGEF, 4460155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko ARMneon_VCEQ, 4470155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko ARMneon_VCEQF, 4480155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko ARMneon_VEXT, 4490155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko ARMneon_VMUL, 450d66669e81c154a8be514829b9c99d1c1ffbf04a3Alex Vakulenko ARMneon_VMULFP, 451d66669e81c154a8be514829b9c99d1c1ffbf04a3Alex Vakulenko ARMneon_VMULLU, 452d66669e81c154a8be514829b9c99d1c1ffbf04a3Alex Vakulenko ARMneon_VMULLS, 453d66669e81c154a8be514829b9c99d1c1ffbf04a3Alex Vakulenko ARMneon_VMULP, 454d66669e81c154a8be514829b9c99d1c1ffbf04a3Alex Vakulenko ARMneon_VMULLP, 4550155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko ARMneon_VQDMULH, 4560155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko ARMneon_VQRDMULH, 457f76c68298c31a148c7c4bb353f87152f5ca529bcAlex Vakulenko ARMneon_VPADD, 4580155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko ARMneon_VPMINU, 4590155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko ARMneon_VPMINS, 4600155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko ARMneon_VPMINF, 4610155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko ARMneon_VPMAXU, 4620155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko ARMneon_VPMAXS, 4630155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko ARMneon_VPMAXF, 4640155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko ARMneon_VTBL, 465f76c68298c31a148c7c4bb353f87152f5ca529bcAlex Vakulenko ARMneon_VQDMULL, 4660155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko ARMneon_VRECPS, 4670155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko ARMneon_VRSQRTS, 4680155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko /* ... */ 4690155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko } 4700155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko ARMNeonBinOp; 4710155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko 4720155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenkotypedef 4730155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko enum { 4740155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko ARMneon_VSHL=150, 4750155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko ARMneon_VSAL, /* Yah, not SAR but SAL */ 4760155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko ARMneon_VQSHL, 4770155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko ARMneon_VQSAL 4782fd46ba1458275cd16b0949675bff70cc8abcdadChristopher Wiley } 4790155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko ARMNeonShiftOp; 4800155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko 4810155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenkotypedef 4822fd46ba1458275cd16b0949675bff70cc8abcdadChristopher Wiley enum { 4832fd46ba1458275cd16b0949675bff70cc8abcdadChristopher Wiley ARMneon_COPY=160, 4842fd46ba1458275cd16b0949675bff70cc8abcdadChristopher Wiley ARMneon_COPYLU, 4850155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko ARMneon_COPYLS, 4860155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko ARMneon_COPYN, 4870155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko ARMneon_COPYQNSS, 4880155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko ARMneon_COPYQNUS, 4890155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko ARMneon_COPYQNUU, 4900155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko ARMneon_NOT, 4910155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko ARMneon_EQZ, 4920155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko ARMneon_DUP, 4930155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko ARMneon_PADDLS, 4940155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko ARMneon_PADDLU, 4950155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko ARMneon_CNT, 4960155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko ARMneon_CLZ, 4970155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko ARMneon_CLS, 4980155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko ARMneon_VCVTxFPxINT, 4990155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko ARMneon_VQSHLNSS, 5000155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko ARMneon_VQSHLNUU, 5010155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko ARMneon_VQSHLNUS, 5020155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko ARMneon_VCVTFtoU, 5030155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko ARMneon_VCVTFtoS, 5040155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko ARMneon_VCVTUtoF, 5050155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko ARMneon_VCVTStoF, 5060155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko ARMneon_VCVTFtoFixedU, 5070155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko ARMneon_VCVTFtoFixedS, 5080155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko ARMneon_VCVTFixedUtoF, 5090155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko ARMneon_VCVTFixedStoF, 5100155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko ARMneon_VCVTF16toF32, 5110155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko ARMneon_VCVTF32toF16, 5120155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko ARMneon_REV16, 5130155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko ARMneon_REV32, 5140155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko ARMneon_REV64, 5150155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko ARMneon_ABS, 5160155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko ARMneon_VNEGF, 5170155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko ARMneon_VRECIP, 5180155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko ARMneon_VRECIPF, 5190155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko ARMneon_VABSFP, 5200155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko ARMneon_VRSQRTEFP, 5210155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko ARMneon_VRSQRTE 5220155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko /* ... */ 5230155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko } 5240155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko ARMNeonUnOp; 5250155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko 5260155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenkotypedef 5270155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko enum { 5280155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko ARMneon_SETELEM=200, 5290155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko ARMneon_GETELEMU, 5300155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko ARMneon_GETELEMS, 5311b79239785bf964fd5f1a607a6ed9c9bbb57a4b1Alex Vakulenko ARMneon_VDUP, 5320155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko } 5330155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko ARMNeonUnOpS; 5340155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko 5350155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenkotypedef 5361b79239785bf964fd5f1a607a6ed9c9bbb57a4b1Alex Vakulenko enum { 5370155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko ARMneon_TRN=210, 5380155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko ARMneon_ZIP, 5398cb41343cddbab496e7ca90bca4dc95f07af64bdAlex Vakulenko ARMneon_UZP 5408cb41343cddbab496e7ca90bca4dc95f07af64bdAlex Vakulenko /* ... */ 5418cb41343cddbab496e7ca90bca4dc95f07af64bdAlex Vakulenko } 5429988ee08f2bb57095b1c2adecce764b1bd612a93Alex Vakulenko ARMNeonDualOp; 5438cb41343cddbab496e7ca90bca4dc95f07af64bdAlex Vakulenko 5448cb41343cddbab496e7ca90bca4dc95f07af64bdAlex Vakulenkoextern HChar* showARMNeonBinOp ( ARMNeonBinOp op ); 5459ed0cab99f18acb3570a35e9408f24355f6b8324Alex Vakulenkoextern HChar* showARMNeonUnOp ( ARMNeonUnOp op ); 546extern HChar* showARMNeonUnOpS ( ARMNeonUnOpS op ); 547extern HChar* showARMNeonShiftOp ( ARMNeonShiftOp op ); 548extern HChar* showARMNeonDualOp ( ARMNeonDualOp op ); 549extern HChar* showARMNeonBinOpDataType ( ARMNeonBinOp op ); 550extern HChar* showARMNeonUnOpDataType ( ARMNeonUnOp op ); 551extern HChar* showARMNeonUnOpSDataType ( ARMNeonUnOpS op ); 552extern HChar* showARMNeonShiftOpDataType ( ARMNeonShiftOp op ); 553extern HChar* showARMNeonDualOpDataType ( ARMNeonDualOp op ); 554 555typedef 556 enum { 557 /* baseline */ 558 ARMin_Alu=220, 559 ARMin_Shift, 560 ARMin_Unary, 561 ARMin_CmpOrTst, 562 ARMin_Mov, 563 ARMin_Imm32, 564 ARMin_LdSt32, 565 ARMin_LdSt16, 566 ARMin_LdSt8U, 567 ARMin_Ld8S, 568 ARMin_Goto, 569 ARMin_CMov, 570 ARMin_Call, 571 ARMin_Mul, 572 ARMin_LdrEX, 573 ARMin_StrEX, 574 /* vfp */ 575 ARMin_VLdStD, 576 ARMin_VLdStS, 577 ARMin_VAluD, 578 ARMin_VAluS, 579 ARMin_VUnaryD, 580 ARMin_VUnaryS, 581 ARMin_VCmpD, 582 ARMin_VCMovD, 583 ARMin_VCMovS, 584 ARMin_VCvtSD, 585 ARMin_VXferD, 586 ARMin_VXferS, 587 ARMin_VCvtID, 588 ARMin_FPSCR, 589 ARMin_MFence, 590 /* Neon */ 591 ARMin_NLdStQ, 592 ARMin_NLdStD, 593 ARMin_NUnary, 594 ARMin_NUnaryS, 595 ARMin_NDual, 596 ARMin_NBinary, 597 ARMin_NBinaryS, 598 ARMin_NShift, 599 ARMin_NeonImm, 600 ARMin_NCMovQ, 601 /* This is not a NEON instruction. Actually there is no corresponding 602 instruction in ARM instruction set at all. We need this one to 603 generate spill/reload of 128-bit registers since current register 604 allocator demands them to consist of no more than two instructions. 605 We will split this instruction into 2 or 3 ARM instructions on the 606 emiting phase. 607 608 NOTE: source and destination registers should be different! */ 609 ARMin_Add32 610 } 611 ARMInstrTag; 612 613/* Destinations are on the LEFT (first operand) */ 614 615typedef 616 struct { 617 ARMInstrTag tag; 618 union { 619 /* ADD/SUB/AND/OR/XOR, vanilla ALU op */ 620 struct { 621 ARMAluOp op; 622 HReg dst; 623 HReg argL; 624 ARMRI84* argR; 625 } Alu; 626 /* SHL/SHR/SAR, 2nd arg is reg or imm */ 627 struct { 628 ARMShiftOp op; 629 HReg dst; 630 HReg argL; 631 ARMRI5* argR; 632 } Shift; 633 /* NOT/NEG/CLZ */ 634 struct { 635 ARMUnaryOp op; 636 HReg dst; 637 HReg src; 638 } Unary; 639 /* CMP/TST; subtract/and, discard result, set NZCV */ 640 struct { 641 Bool isCmp; 642 HReg argL; 643 ARMRI84* argR; 644 } CmpOrTst; 645 /* MOV dst, src -- reg-reg (or reg-imm8x4) move */ 646 struct { 647 HReg dst; 648 ARMRI84* src; 649 } Mov; 650 /* Pseudo-insn; make a 32-bit immediate */ 651 struct { 652 HReg dst; 653 UInt imm32; 654 } Imm32; 655 /* 32-bit load or store */ 656 struct { 657 Bool isLoad; 658 HReg rD; 659 ARMAMode1* amode; 660 } LdSt32; 661 /* 16-bit load or store */ 662 struct { 663 Bool isLoad; 664 Bool signedLoad; 665 HReg rD; 666 ARMAMode2* amode; 667 } LdSt16; 668 /* 8-bit (unsigned) load or store */ 669 struct { 670 Bool isLoad; 671 HReg rD; 672 ARMAMode1* amode; 673 } LdSt8U; 674 /* 8-bit signed load */ 675 struct { 676 HReg rD; 677 ARMAMode2* amode; 678 } Ld8S; 679 /* Pseudo-insn. Go to guest address gnext, on given 680 condition, which could be ARMcc_AL. */ 681 struct { 682 IRJumpKind jk; 683 ARMCondCode cond; 684 HReg gnext; 685 } Goto; 686 /* Mov src to dst on the given condition, which may not 687 be ARMcc_AL. */ 688 struct { 689 ARMCondCode cond; 690 HReg dst; 691 ARMRI84* src; 692 } CMov; 693 /* Pseudo-insn. Call target (an absolute address), on given 694 condition (which could be ARMcc_AL). */ 695 struct { 696 ARMCondCode cond; 697 HWord target; 698 Int nArgRegs; /* # regs carrying args: 0 .. 4 */ 699 } Call; 700 /* (PLAIN) 32 * 32 -> 32: r0 = r2 * r3 701 (ZX) 32 *u 32 -> 64: r1:r0 = r2 *u r3 702 (SX) 32 *s 32 -> 64: r1:r0 = r2 *s r3 703 Why hardwired registers? Because the ARM ARM specifies 704 (eg for straight MUL) the result (Rd) and the left arg (Rm) 705 may not be the same register. That's not a constraint we 706 can enforce in the register allocator (without mucho extra 707 complexity). Hence hardwire it. At least using caller-saves 708 registers, which are less likely to be in use. */ 709 struct { 710 ARMMulOp op; 711 } Mul; 712 /* LDREX{,H,B} r0, [r1] 713 Again, hardwired registers since this is not performance 714 critical, and there are possibly constraints on the 715 registers that we can't express in the register allocator.*/ 716 struct { 717 Int szB; /* currently only 4 is allowed */ 718 } LdrEX; 719 /* STREX{,H,B} r0, r1, [r2] 720 r0 = SC( [r2] = r1 ) 721 Ditto comment re fixed registers. */ 722 struct { 723 Int szB; /* currently only 4 is allowed */ 724 } StrEX; 725 /* VFP INSTRUCTIONS */ 726 /* 64-bit Fp load/store */ 727 struct { 728 Bool isLoad; 729 HReg dD; 730 ARMAModeV* amode; 731 } VLdStD; 732 /* 32-bit Fp load/store */ 733 struct { 734 Bool isLoad; 735 HReg fD; 736 ARMAModeV* amode; 737 } VLdStS; 738 /* 64-bit FP binary arithmetic */ 739 struct { 740 ARMVfpOp op; 741 HReg dst; 742 HReg argL; 743 HReg argR; 744 } VAluD; 745 /* 32-bit FP binary arithmetic */ 746 struct { 747 ARMVfpOp op; 748 HReg dst; 749 HReg argL; 750 HReg argR; 751 } VAluS; 752 /* 64-bit FP unary, also reg-reg move */ 753 struct { 754 ARMVfpUnaryOp op; 755 HReg dst; 756 HReg src; 757 } VUnaryD; 758 /* 32-bit FP unary, also reg-reg move */ 759 struct { 760 ARMVfpUnaryOp op; 761 HReg dst; 762 HReg src; 763 } VUnaryS; 764 /* 64-bit FP compare and move results to CPSR (FCMPD;FMSTAT) */ 765 struct { 766 HReg argL; 767 HReg argR; 768 } VCmpD; 769 /* 64-bit FP mov src to dst on the given condition, which may 770 not be ARMcc_AL. */ 771 struct { 772 ARMCondCode cond; 773 HReg dst; 774 HReg src; 775 } VCMovD; 776 /* 32-bit FP mov src to dst on the given condition, which may 777 not be ARMcc_AL. */ 778 struct { 779 ARMCondCode cond; 780 HReg dst; 781 HReg src; 782 } VCMovS; 783 /* Convert between 32-bit and 64-bit FP values (both ways). 784 (FCVTSD, FCVTDS) */ 785 struct { 786 Bool sToD; /* True: F32->F64. False: F64->F32 */ 787 HReg dst; 788 HReg src; 789 } VCvtSD; 790 /* Transfer a VFP D reg to/from two integer registers (VMOV) */ 791 struct { 792 Bool toD; 793 HReg dD; 794 HReg rHi; 795 HReg rLo; 796 } VXferD; 797 /* Transfer a VFP S reg to/from an integer register (VMOV) */ 798 struct { 799 Bool toS; 800 HReg fD; 801 HReg rLo; 802 } VXferS; 803 /* Convert between 32-bit ints and 64-bit FP values (both ways 804 and both signednesses). (FSITOD, FUITOD, FTOSID, FTOUID) */ 805 struct { 806 Bool iToD; /* True: I32->F64. False: F64->I32 */ 807 Bool syned; /* True: I32 is signed. False: I32 is unsigned */ 808 HReg dst; 809 HReg src; 810 } VCvtID; 811 /* Move a 32-bit value to/from the FPSCR (FMXR, FMRX) */ 812 struct { 813 Bool toFPSCR; 814 HReg iReg; 815 } FPSCR; 816 /* Mem fence. An insn which fences all loads and stores as 817 much as possible before continuing. On ARM we emit the 818 sequence 819 mcr 15,0,r0,c7,c10,4 (DSB) 820 mcr 15,0,r0,c7,c10,5 (DMB) 821 mcr 15,0,r0,c7,c5,4 (ISB) 822 which is probably total overkill, but better safe than 823 sorry. 824 */ 825 struct { 826 } MFence; 827 /* Neon data processing instruction: 3 registers of the same 828 length */ 829 struct { 830 ARMNeonBinOp op; 831 HReg dst; 832 HReg argL; 833 HReg argR; 834 UInt size; 835 Bool Q; 836 } NBinary; 837 struct { 838 ARMNeonBinOp op; 839 ARMNRS* dst; 840 ARMNRS* argL; 841 ARMNRS* argR; 842 UInt size; 843 Bool Q; 844 } NBinaryS; 845 struct { 846 ARMNeonShiftOp op; 847 HReg dst; 848 HReg argL; 849 HReg argR; 850 UInt size; 851 Bool Q; 852 } NShift; 853 struct { 854 Bool isLoad; 855 HReg dQ; 856 ARMAModeN *amode; 857 } NLdStQ; 858 struct { 859 Bool isLoad; 860 HReg dD; 861 ARMAModeN *amode; 862 } NLdStD; 863 struct { 864 ARMNeonUnOpS op; 865 ARMNRS* dst; 866 ARMNRS* src; 867 UInt size; 868 Bool Q; 869 } NUnaryS; 870 struct { 871 ARMNeonUnOp op; 872 HReg dst; 873 HReg src; 874 UInt size; 875 Bool Q; 876 } NUnary; 877 /* Takes two arguments and modifies them both. */ 878 struct { 879 ARMNeonDualOp op; 880 HReg arg1; 881 HReg arg2; 882 UInt size; 883 Bool Q; 884 } NDual; 885 struct { 886 HReg dst; 887 ARMNImm* imm; 888 } NeonImm; 889 /* 128-bit Neon move src to dst on the given condition, which 890 may not be ARMcc_AL. */ 891 struct { 892 ARMCondCode cond; 893 HReg dst; 894 HReg src; 895 } NCMovQ; 896 struct { 897 /* Note: rD != rN */ 898 HReg rD; 899 HReg rN; 900 UInt imm32; 901 } Add32; 902 } ARMin; 903 } 904 ARMInstr; 905 906 907extern ARMInstr* ARMInstr_Alu ( ARMAluOp, HReg, HReg, ARMRI84* ); 908extern ARMInstr* ARMInstr_Shift ( ARMShiftOp, HReg, HReg, ARMRI5* ); 909extern ARMInstr* ARMInstr_Unary ( ARMUnaryOp, HReg, HReg ); 910extern ARMInstr* ARMInstr_CmpOrTst ( Bool isCmp, HReg, ARMRI84* ); 911extern ARMInstr* ARMInstr_Mov ( HReg, ARMRI84* ); 912extern ARMInstr* ARMInstr_Imm32 ( HReg, UInt ); 913extern ARMInstr* ARMInstr_LdSt32 ( Bool isLoad, HReg, ARMAMode1* ); 914extern ARMInstr* ARMInstr_LdSt16 ( Bool isLoad, Bool signedLoad, 915 HReg, ARMAMode2* ); 916extern ARMInstr* ARMInstr_LdSt8U ( Bool isLoad, HReg, ARMAMode1* ); 917extern ARMInstr* ARMInstr_Ld8S ( HReg, ARMAMode2* ); 918extern ARMInstr* ARMInstr_Goto ( IRJumpKind, ARMCondCode, HReg gnext ); 919extern ARMInstr* ARMInstr_CMov ( ARMCondCode, HReg dst, ARMRI84* src ); 920extern ARMInstr* ARMInstr_Call ( ARMCondCode, HWord, Int nArgRegs ); 921extern ARMInstr* ARMInstr_Mul ( ARMMulOp op ); 922extern ARMInstr* ARMInstr_LdrEX ( Int szB ); 923extern ARMInstr* ARMInstr_StrEX ( Int szB ); 924extern ARMInstr* ARMInstr_VLdStD ( Bool isLoad, HReg, ARMAModeV* ); 925extern ARMInstr* ARMInstr_VLdStS ( Bool isLoad, HReg, ARMAModeV* ); 926extern ARMInstr* ARMInstr_VAluD ( ARMVfpOp op, HReg, HReg, HReg ); 927extern ARMInstr* ARMInstr_VAluS ( ARMVfpOp op, HReg, HReg, HReg ); 928extern ARMInstr* ARMInstr_VUnaryD ( ARMVfpUnaryOp, HReg dst, HReg src ); 929extern ARMInstr* ARMInstr_VUnaryS ( ARMVfpUnaryOp, HReg dst, HReg src ); 930extern ARMInstr* ARMInstr_VCmpD ( HReg argL, HReg argR ); 931extern ARMInstr* ARMInstr_VCMovD ( ARMCondCode, HReg dst, HReg src ); 932extern ARMInstr* ARMInstr_VCMovS ( ARMCondCode, HReg dst, HReg src ); 933extern ARMInstr* ARMInstr_VCvtSD ( Bool sToD, HReg dst, HReg src ); 934extern ARMInstr* ARMInstr_VXferD ( Bool toD, HReg dD, HReg rHi, HReg rLo ); 935extern ARMInstr* ARMInstr_VXferS ( Bool toS, HReg fD, HReg rLo ); 936extern ARMInstr* ARMInstr_VCvtID ( Bool iToD, Bool syned, 937 HReg dst, HReg src ); 938extern ARMInstr* ARMInstr_FPSCR ( Bool toFPSCR, HReg iReg ); 939extern ARMInstr* ARMInstr_MFence ( void ); 940extern ARMInstr* ARMInstr_NLdStQ ( Bool isLoad, HReg, ARMAModeN* ); 941extern ARMInstr* ARMInstr_NLdStD ( Bool isLoad, HReg, ARMAModeN* ); 942extern ARMInstr* ARMInstr_NUnary ( ARMNeonUnOp, HReg, HReg, UInt, Bool ); 943extern ARMInstr* ARMInstr_NUnaryS ( ARMNeonUnOp, ARMNRS*, ARMNRS*, 944 UInt, Bool ); 945extern ARMInstr* ARMInstr_NDual ( ARMNeonDualOp, HReg, HReg, UInt, Bool ); 946extern ARMInstr* ARMInstr_NBinary ( ARMNeonBinOp, HReg, HReg, HReg, 947 UInt, Bool ); 948extern ARMInstr* ARMInstr_NShift ( ARMNeonShiftOp, HReg, HReg, HReg, 949 UInt, Bool ); 950extern ARMInstr* ARMInstr_NeonImm ( HReg, ARMNImm* ); 951extern ARMInstr* ARMInstr_NCMovQ ( ARMCondCode, HReg, HReg ); 952extern ARMInstr* ARMInstr_Add32 ( HReg rD, HReg rN, UInt imm32 ); 953 954extern void ppARMInstr ( ARMInstr* ); 955 956 957/* Some functions that insulate the register allocator from details 958 of the underlying instruction set. */ 959extern void getRegUsage_ARMInstr ( HRegUsage*, ARMInstr*, Bool ); 960extern void mapRegs_ARMInstr ( HRegRemap*, ARMInstr*, Bool ); 961extern Bool isMove_ARMInstr ( ARMInstr*, HReg*, HReg* ); 962extern Int emit_ARMInstr ( UChar* buf, Int nbuf, ARMInstr*, 963 Bool, void* dispatch ); 964 965extern void genSpill_ARM ( /*OUT*/HInstr** i1, /*OUT*/HInstr** i2, 966 HReg rreg, Int offset, Bool ); 967extern void genReload_ARM ( /*OUT*/HInstr** i1, /*OUT*/HInstr** i2, 968 HReg rreg, Int offset, Bool ); 969 970extern void getAllocableRegs_ARM ( Int*, HReg** ); 971extern HInstrArray* iselSB_ARM ( IRSB*, VexArch, 972 VexArchInfo*, VexAbiInfo* ); 973 974#endif /* ndef __VEX_HOST_ARM_DEFS_H */ 975 976/*---------------------------------------------------------------*/ 977/*--- end host_arm_defs.h ---*/ 978/*---------------------------------------------------------------*/ 979