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