10578287155cb60143bcf70fdf5e1c2beb0b92c07cerion/*---------------------------------------------------------------*/
2752f90673ebbb6b2f55fc5e46606dea371313713sewardj/*--- begin                                   host_arm_defs.h ---*/
30578287155cb60143bcf70fdf5e1c2beb0b92c07cerion/*---------------------------------------------------------------*/
40578287155cb60143bcf70fdf5e1c2beb0b92c07cerion
50578287155cb60143bcf70fdf5e1c2beb0b92c07cerion/*
6752f90673ebbb6b2f55fc5e46606dea371313713sewardj   This file is part of Valgrind, a dynamic binary instrumentation
7752f90673ebbb6b2f55fc5e46606dea371313713sewardj   framework.
80578287155cb60143bcf70fdf5e1c2beb0b92c07cerion
9ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes   Copyright (C) 2004-2017 OpenWorks LLP
10752f90673ebbb6b2f55fc5e46606dea371313713sewardj      info@open-works.net
110578287155cb60143bcf70fdf5e1c2beb0b92c07cerion
12752f90673ebbb6b2f55fc5e46606dea371313713sewardj   This program is free software; you can redistribute it and/or
13752f90673ebbb6b2f55fc5e46606dea371313713sewardj   modify it under the terms of the GNU General Public License as
14752f90673ebbb6b2f55fc5e46606dea371313713sewardj   published by the Free Software Foundation; either version 2 of the
15752f90673ebbb6b2f55fc5e46606dea371313713sewardj   License, or (at your option) any later version.
160578287155cb60143bcf70fdf5e1c2beb0b92c07cerion
17752f90673ebbb6b2f55fc5e46606dea371313713sewardj   This program is distributed in the hope that it will be useful, but
18752f90673ebbb6b2f55fc5e46606dea371313713sewardj   WITHOUT ANY WARRANTY; without even the implied warranty of
19752f90673ebbb6b2f55fc5e46606dea371313713sewardj   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
20752f90673ebbb6b2f55fc5e46606dea371313713sewardj   General Public License for more details.
21752f90673ebbb6b2f55fc5e46606dea371313713sewardj
22752f90673ebbb6b2f55fc5e46606dea371313713sewardj   You should have received a copy of the GNU General Public License
23752f90673ebbb6b2f55fc5e46606dea371313713sewardj   along with this program; if not, write to the Free Software
24752f90673ebbb6b2f55fc5e46606dea371313713sewardj   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
257bd6ffe203f3aa9e7b25f7eae40a9b9cf48710cfsewardj   02110-1301, USA.
267bd6ffe203f3aa9e7b25f7eae40a9b9cf48710cfsewardj
27752f90673ebbb6b2f55fc5e46606dea371313713sewardj   The GNU General Public License is contained in the file COPYING.
280578287155cb60143bcf70fdf5e1c2beb0b92c07cerion*/
290578287155cb60143bcf70fdf5e1c2beb0b92c07cerion
30cef7d3e3df4796e35b4521158d9dc058f034aa87sewardj#ifndef __VEX_HOST_ARM_DEFS_H
31cef7d3e3df4796e35b4521158d9dc058f034aa87sewardj#define __VEX_HOST_ARM_DEFS_H
320578287155cb60143bcf70fdf5e1c2beb0b92c07cerion
3358a637b6675d4d68e13d18b75cea7eee2a2a91feflorian#include "libvex_basictypes.h"
3458a637b6675d4d68e13d18b75cea7eee2a2a91feflorian#include "libvex.h"                      // VexArch
3558a637b6675d4d68e13d18b75cea7eee2a2a91feflorian#include "host_generic_regs.h"           // HReg
3658a637b6675d4d68e13d18b75cea7eee2a2a91feflorian
376c60b32ab93e77a2709549dbc6eaa649eb915204sewardjextern UInt arm_hwcaps;
386c60b32ab93e77a2709549dbc6eaa649eb915204sewardj
390578287155cb60143bcf70fdf5e1c2beb0b92c07cerion
400578287155cb60143bcf70fdf5e1c2beb0b92c07cerion/* --------- Registers. --------- */
410578287155cb60143bcf70fdf5e1c2beb0b92c07cerion
42a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardj#define ST_IN static inline
43a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardjST_IN HReg hregARM_R4  ( void ) { return mkHReg(False, HRcInt32,  4,  0);  }
44a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardjST_IN HReg hregARM_R5  ( void ) { return mkHReg(False, HRcInt32,  5,  1);  }
45a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardjST_IN HReg hregARM_R6  ( void ) { return mkHReg(False, HRcInt32,  6,  2);  }
46a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardjST_IN HReg hregARM_R7  ( void ) { return mkHReg(False, HRcInt32,  7,  3);  }
47a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardjST_IN HReg hregARM_R10 ( void ) { return mkHReg(False, HRcInt32,  10, 4);  }
48a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardjST_IN HReg hregARM_R11 ( void ) { return mkHReg(False, HRcInt32,  11, 5);  }
49a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardj
50a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardjST_IN HReg hregARM_R0  ( void ) { return mkHReg(False, HRcInt32,  0,  6);  }
51a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardjST_IN HReg hregARM_R1  ( void ) { return mkHReg(False, HRcInt32,  1,  7);  }
52a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardjST_IN HReg hregARM_R2  ( void ) { return mkHReg(False, HRcInt32,  2,  8);  }
53a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardjST_IN HReg hregARM_R3  ( void ) { return mkHReg(False, HRcInt32,  3,  9);  }
54a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardjST_IN HReg hregARM_R9  ( void ) { return mkHReg(False, HRcInt32,  9,  10); }
55a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardj
56a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardjST_IN HReg hregARM_D8  ( void ) { return mkHReg(False, HRcFlt64,  8,  11); }
57a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardjST_IN HReg hregARM_D9  ( void ) { return mkHReg(False, HRcFlt64,  9,  12); }
58a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardjST_IN HReg hregARM_D10 ( void ) { return mkHReg(False, HRcFlt64,  10, 13); }
59a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardjST_IN HReg hregARM_D11 ( void ) { return mkHReg(False, HRcFlt64,  11, 14); }
60a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardjST_IN HReg hregARM_D12 ( void ) { return mkHReg(False, HRcFlt64,  12, 15); }
61a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardj
62a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardjST_IN HReg hregARM_S26 ( void ) { return mkHReg(False, HRcFlt32,  26, 16); }
63a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardjST_IN HReg hregARM_S27 ( void ) { return mkHReg(False, HRcFlt32,  27, 17); }
64a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardjST_IN HReg hregARM_S28 ( void ) { return mkHReg(False, HRcFlt32,  28, 18); }
65a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardjST_IN HReg hregARM_S29 ( void ) { return mkHReg(False, HRcFlt32,  29, 19); }
66a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardjST_IN HReg hregARM_S30 ( void ) { return mkHReg(False, HRcFlt32,  30, 20); }
67a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardj
68a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardjST_IN HReg hregARM_Q8  ( void ) { return mkHReg(False, HRcVec128, 8,  21); }
69a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardjST_IN HReg hregARM_Q9  ( void ) { return mkHReg(False, HRcVec128, 9,  22); }
70a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardjST_IN HReg hregARM_Q10 ( void ) { return mkHReg(False, HRcVec128, 10, 23); }
71a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardjST_IN HReg hregARM_Q11 ( void ) { return mkHReg(False, HRcVec128, 11, 24); }
72a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardjST_IN HReg hregARM_Q12 ( void ) { return mkHReg(False, HRcVec128, 12, 25); }
73a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardj
74a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardjST_IN HReg hregARM_R8  ( void ) { return mkHReg(False, HRcInt32,  8,  26); }
75a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardjST_IN HReg hregARM_R12 ( void ) { return mkHReg(False, HRcInt32,  12, 27); }
76a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardjST_IN HReg hregARM_R13 ( void ) { return mkHReg(False, HRcInt32,  13, 28); }
77a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardjST_IN HReg hregARM_R14 ( void ) { return mkHReg(False, HRcInt32,  14, 29); }
78a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardjST_IN HReg hregARM_R15 ( void ) { return mkHReg(False, HRcInt32,  15, 30); }
79a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardjST_IN HReg hregARM_Q13 ( void ) { return mkHReg(False, HRcVec128, 13, 31); }
80a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardjST_IN HReg hregARM_Q14 ( void ) { return mkHReg(False, HRcVec128, 14, 32); }
81a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardjST_IN HReg hregARM_Q15 ( void ) { return mkHReg(False, HRcVec128, 15, 33); }
82a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardj#undef ST_IN
830578287155cb60143bcf70fdf5e1c2beb0b92c07cerion
840578287155cb60143bcf70fdf5e1c2beb0b92c07cerionextern void ppHRegARM ( HReg );
850578287155cb60143bcf70fdf5e1c2beb0b92c07cerion
866c299f3acab617581ea504e45fbb6cab24c2b29fsewardj/* Number of registers used arg passing in function calls */
876c299f3acab617581ea504e45fbb6cab24c2b29fsewardj#define ARM_N_ARGREGS 4   /* r0, r1, r2, r3 */
880578287155cb60143bcf70fdf5e1c2beb0b92c07cerion
890578287155cb60143bcf70fdf5e1c2beb0b92c07cerion
906c299f3acab617581ea504e45fbb6cab24c2b29fsewardj/* --------- Condition codes. --------- */
910578287155cb60143bcf70fdf5e1c2beb0b92c07cerion
920578287155cb60143bcf70fdf5e1c2beb0b92c07ceriontypedef
930578287155cb60143bcf70fdf5e1c2beb0b92c07cerion   enum {
946c299f3acab617581ea504e45fbb6cab24c2b29fsewardj      ARMcc_EQ  = 0,  /* equal                          : Z=1 */
956c299f3acab617581ea504e45fbb6cab24c2b29fsewardj      ARMcc_NE  = 1,  /* not equal                      : Z=0 */
960578287155cb60143bcf70fdf5e1c2beb0b92c07cerion
976c299f3acab617581ea504e45fbb6cab24c2b29fsewardj      ARMcc_HS  = 2,  /* >=u (higher or same)           : C=1 */
986c299f3acab617581ea504e45fbb6cab24c2b29fsewardj      ARMcc_LO  = 3,  /* <u  (lower)                    : C=0 */
990578287155cb60143bcf70fdf5e1c2beb0b92c07cerion
1006c299f3acab617581ea504e45fbb6cab24c2b29fsewardj      ARMcc_MI  = 4,  /* minus (negative)               : N=1 */
1016c299f3acab617581ea504e45fbb6cab24c2b29fsewardj      ARMcc_PL  = 5,  /* plus (zero or +ve)             : N=0 */
1020578287155cb60143bcf70fdf5e1c2beb0b92c07cerion
1036c299f3acab617581ea504e45fbb6cab24c2b29fsewardj      ARMcc_VS  = 6,  /* overflow                       : V=1 */
1046c299f3acab617581ea504e45fbb6cab24c2b29fsewardj      ARMcc_VC  = 7,  /* no overflow                    : V=0 */
1050578287155cb60143bcf70fdf5e1c2beb0b92c07cerion
1066c299f3acab617581ea504e45fbb6cab24c2b29fsewardj      ARMcc_HI  = 8,  /* >u   (higher)                  : C=1 && Z=0 */
1076c299f3acab617581ea504e45fbb6cab24c2b29fsewardj      ARMcc_LS  = 9,  /* <=u  (lower or same)           : C=0 || Z=1 */
1080578287155cb60143bcf70fdf5e1c2beb0b92c07cerion
1096c299f3acab617581ea504e45fbb6cab24c2b29fsewardj      ARMcc_GE  = 10, /* >=s (signed greater or equal)  : N=V */
1106c299f3acab617581ea504e45fbb6cab24c2b29fsewardj      ARMcc_LT  = 11, /* <s  (signed less than)         : N!=V */
1110578287155cb60143bcf70fdf5e1c2beb0b92c07cerion
1126c299f3acab617581ea504e45fbb6cab24c2b29fsewardj      ARMcc_GT  = 12, /* >s  (signed greater)           : Z=0 && N=V */
1136c299f3acab617581ea504e45fbb6cab24c2b29fsewardj      ARMcc_LE  = 13, /* <=s (signed less or equal)     : Z=1 || N!=V */
1140578287155cb60143bcf70fdf5e1c2beb0b92c07cerion
1156c299f3acab617581ea504e45fbb6cab24c2b29fsewardj      ARMcc_AL  = 14, /* always (unconditional) */
1166c299f3acab617581ea504e45fbb6cab24c2b29fsewardj      ARMcc_NV  = 15  /* never (basically undefined meaning), deprecated */
1170578287155cb60143bcf70fdf5e1c2beb0b92c07cerion   }
1180578287155cb60143bcf70fdf5e1c2beb0b92c07cerion   ARMCondCode;
1190578287155cb60143bcf70fdf5e1c2beb0b92c07cerion
12055085f8680acc89d727e321f3b34cae1a8c4093aflorianextern const HChar* showARMCondCode ( ARMCondCode );
1210578287155cb60143bcf70fdf5e1c2beb0b92c07cerion
1220578287155cb60143bcf70fdf5e1c2beb0b92c07cerion
1230578287155cb60143bcf70fdf5e1c2beb0b92c07cerion
1240578287155cb60143bcf70fdf5e1c2beb0b92c07cerion/* --------- Memory address expressions (amodes). --------- */
1250578287155cb60143bcf70fdf5e1c2beb0b92c07cerion
1260578287155cb60143bcf70fdf5e1c2beb0b92c07cerion/* --- Addressing Mode 1 --- */
1270578287155cb60143bcf70fdf5e1c2beb0b92c07ceriontypedef
1280578287155cb60143bcf70fdf5e1c2beb0b92c07cerion   enum {
1296c299f3acab617581ea504e45fbb6cab24c2b29fsewardj      ARMam1_RI=1,   /* reg +/- imm12 */
1306c299f3acab617581ea504e45fbb6cab24c2b29fsewardj      ARMam1_RRS     /* reg1 + (reg2 << 0, 1 2 or 3) */
1310578287155cb60143bcf70fdf5e1c2beb0b92c07cerion   }
1320578287155cb60143bcf70fdf5e1c2beb0b92c07cerion   ARMAMode1Tag;
1330578287155cb60143bcf70fdf5e1c2beb0b92c07cerion
1340578287155cb60143bcf70fdf5e1c2beb0b92c07ceriontypedef
1350578287155cb60143bcf70fdf5e1c2beb0b92c07cerion   struct {
1366c299f3acab617581ea504e45fbb6cab24c2b29fsewardj      ARMAMode1Tag tag;
1376c299f3acab617581ea504e45fbb6cab24c2b29fsewardj      union {
1386c299f3acab617581ea504e45fbb6cab24c2b29fsewardj         struct {
1396c299f3acab617581ea504e45fbb6cab24c2b29fsewardj            HReg reg;
1406c299f3acab617581ea504e45fbb6cab24c2b29fsewardj            Int  simm13; /* -4095 .. +4095 */
1416c299f3acab617581ea504e45fbb6cab24c2b29fsewardj         } RI;
1426c299f3acab617581ea504e45fbb6cab24c2b29fsewardj         struct {
1436c299f3acab617581ea504e45fbb6cab24c2b29fsewardj            HReg base;
1446c299f3acab617581ea504e45fbb6cab24c2b29fsewardj            HReg index;
1456c299f3acab617581ea504e45fbb6cab24c2b29fsewardj            UInt shift; /* 0, 1 2 or 3 */
1466c299f3acab617581ea504e45fbb6cab24c2b29fsewardj         } RRS;
1476c299f3acab617581ea504e45fbb6cab24c2b29fsewardj      } ARMam1;
1480578287155cb60143bcf70fdf5e1c2beb0b92c07cerion   }
1490578287155cb60143bcf70fdf5e1c2beb0b92c07cerion   ARMAMode1;
1500578287155cb60143bcf70fdf5e1c2beb0b92c07cerion
1516c299f3acab617581ea504e45fbb6cab24c2b29fsewardjextern ARMAMode1* ARMAMode1_RI  ( HReg reg, Int simm13 );
1526c299f3acab617581ea504e45fbb6cab24c2b29fsewardjextern ARMAMode1* ARMAMode1_RRS ( HReg base, HReg index, UInt shift );
1530578287155cb60143bcf70fdf5e1c2beb0b92c07cerion
1540578287155cb60143bcf70fdf5e1c2beb0b92c07cerionextern void ppARMAMode1 ( ARMAMode1* );
1550578287155cb60143bcf70fdf5e1c2beb0b92c07cerion
1560578287155cb60143bcf70fdf5e1c2beb0b92c07cerion
1570578287155cb60143bcf70fdf5e1c2beb0b92c07cerion/* --- Addressing Mode 2 --- */
1580578287155cb60143bcf70fdf5e1c2beb0b92c07ceriontypedef
1590578287155cb60143bcf70fdf5e1c2beb0b92c07cerion   enum {
1606c299f3acab617581ea504e45fbb6cab24c2b29fsewardj      ARMam2_RI=3,   /* reg +/- imm8 */
1616c299f3acab617581ea504e45fbb6cab24c2b29fsewardj      ARMam2_RR      /* reg1 + reg2 */
1620578287155cb60143bcf70fdf5e1c2beb0b92c07cerion   }
1630578287155cb60143bcf70fdf5e1c2beb0b92c07cerion   ARMAMode2Tag;
1640578287155cb60143bcf70fdf5e1c2beb0b92c07cerion
1650578287155cb60143bcf70fdf5e1c2beb0b92c07ceriontypedef
1660578287155cb60143bcf70fdf5e1c2beb0b92c07cerion   struct {
1670578287155cb60143bcf70fdf5e1c2beb0b92c07cerion      ARMAMode2Tag tag;
1680578287155cb60143bcf70fdf5e1c2beb0b92c07cerion      union {
1690578287155cb60143bcf70fdf5e1c2beb0b92c07cerion         struct {
1706c299f3acab617581ea504e45fbb6cab24c2b29fsewardj            HReg reg;
1716c299f3acab617581ea504e45fbb6cab24c2b29fsewardj            Int  simm9; /* -255 .. 255 */
1720578287155cb60143bcf70fdf5e1c2beb0b92c07cerion         } RI;
1730578287155cb60143bcf70fdf5e1c2beb0b92c07cerion         struct {
1746c299f3acab617581ea504e45fbb6cab24c2b29fsewardj            HReg base;
1756c299f3acab617581ea504e45fbb6cab24c2b29fsewardj            HReg index;
1766c299f3acab617581ea504e45fbb6cab24c2b29fsewardj         } RR;
17782edbb3e13d1758cabcbfd36fab8f955cf980153cerion      } ARMam2;
1780578287155cb60143bcf70fdf5e1c2beb0b92c07cerion   }
1790578287155cb60143bcf70fdf5e1c2beb0b92c07cerion   ARMAMode2;
1800578287155cb60143bcf70fdf5e1c2beb0b92c07cerion
1816c299f3acab617581ea504e45fbb6cab24c2b29fsewardjextern ARMAMode2* ARMAMode2_RI ( HReg reg, Int simm9 );
1826c299f3acab617581ea504e45fbb6cab24c2b29fsewardjextern ARMAMode2* ARMAMode2_RR ( HReg base, HReg index );
1830578287155cb60143bcf70fdf5e1c2beb0b92c07cerion
1840578287155cb60143bcf70fdf5e1c2beb0b92c07cerionextern void ppARMAMode2 ( ARMAMode2* );
1850578287155cb60143bcf70fdf5e1c2beb0b92c07cerion
1860578287155cb60143bcf70fdf5e1c2beb0b92c07cerion
1876c299f3acab617581ea504e45fbb6cab24c2b29fsewardj/* --- Addressing Mode suitable for VFP --- */
1886c299f3acab617581ea504e45fbb6cab24c2b29fsewardj/* The simm11 is encoded as 8 bits + 1 sign bit,
1896c299f3acab617581ea504e45fbb6cab24c2b29fsewardj   so can only be 0 % 4. */
1906c299f3acab617581ea504e45fbb6cab24c2b29fsewardjtypedef
1916c299f3acab617581ea504e45fbb6cab24c2b29fsewardj   struct {
1926c299f3acab617581ea504e45fbb6cab24c2b29fsewardj      HReg reg;
1936c299f3acab617581ea504e45fbb6cab24c2b29fsewardj      Int  simm11; /* -1020, -1016 .. 1016, 1020 */
1946c299f3acab617581ea504e45fbb6cab24c2b29fsewardj   }
1956c299f3acab617581ea504e45fbb6cab24c2b29fsewardj   ARMAModeV;
1966c299f3acab617581ea504e45fbb6cab24c2b29fsewardj
1976c299f3acab617581ea504e45fbb6cab24c2b29fsewardjextern ARMAModeV* mkARMAModeV ( HReg reg, Int simm11 );
1986c299f3acab617581ea504e45fbb6cab24c2b29fsewardj
1996c299f3acab617581ea504e45fbb6cab24c2b29fsewardjextern void ppARMAModeV ( ARMAModeV* );
2006c299f3acab617581ea504e45fbb6cab24c2b29fsewardj
2016c60b32ab93e77a2709549dbc6eaa649eb915204sewardj/* --- Addressing Mode suitable for Neon --- */
2026c60b32ab93e77a2709549dbc6eaa649eb915204sewardjtypedef
2036c60b32ab93e77a2709549dbc6eaa649eb915204sewardj   enum {
204b48eddb441c460f9bf10210416925b16fdaf85c4sewardj      ARMamN_R=5,
2056c60b32ab93e77a2709549dbc6eaa649eb915204sewardj      ARMamN_RR
2066c60b32ab93e77a2709549dbc6eaa649eb915204sewardj      /* ... */
2076c60b32ab93e77a2709549dbc6eaa649eb915204sewardj   }
2086c60b32ab93e77a2709549dbc6eaa649eb915204sewardj   ARMAModeNTag;
2096c60b32ab93e77a2709549dbc6eaa649eb915204sewardj
2106c60b32ab93e77a2709549dbc6eaa649eb915204sewardjtypedef
2116c60b32ab93e77a2709549dbc6eaa649eb915204sewardj   struct {
2126c60b32ab93e77a2709549dbc6eaa649eb915204sewardj      ARMAModeNTag tag;
2136c60b32ab93e77a2709549dbc6eaa649eb915204sewardj      union {
2146c60b32ab93e77a2709549dbc6eaa649eb915204sewardj         struct {
2156c60b32ab93e77a2709549dbc6eaa649eb915204sewardj            HReg rN;
2166c60b32ab93e77a2709549dbc6eaa649eb915204sewardj            HReg rM;
2176c60b32ab93e77a2709549dbc6eaa649eb915204sewardj         } RR;
2186c60b32ab93e77a2709549dbc6eaa649eb915204sewardj         struct {
2196c60b32ab93e77a2709549dbc6eaa649eb915204sewardj            HReg rN;
2206c60b32ab93e77a2709549dbc6eaa649eb915204sewardj         } R;
2216c60b32ab93e77a2709549dbc6eaa649eb915204sewardj         /* ... */
2226c60b32ab93e77a2709549dbc6eaa649eb915204sewardj      } ARMamN;
2236c60b32ab93e77a2709549dbc6eaa649eb915204sewardj   }
2246c60b32ab93e77a2709549dbc6eaa649eb915204sewardj   ARMAModeN;
2256c60b32ab93e77a2709549dbc6eaa649eb915204sewardj
2266c60b32ab93e77a2709549dbc6eaa649eb915204sewardjextern ARMAModeN* mkARMAModeN_RR ( HReg, HReg );
2276c60b32ab93e77a2709549dbc6eaa649eb915204sewardjextern ARMAModeN* mkARMAModeN_R ( HReg );
2286c60b32ab93e77a2709549dbc6eaa649eb915204sewardjextern void ppARMAModeN ( ARMAModeN* );
2296c299f3acab617581ea504e45fbb6cab24c2b29fsewardj
2306c299f3acab617581ea504e45fbb6cab24c2b29fsewardj/* --------- Reg or imm-8x4 operands --------- */
2316c299f3acab617581ea504e45fbb6cab24c2b29fsewardj/* a.k.a (a very restricted form of) Shifter Operand,
2326c299f3acab617581ea504e45fbb6cab24c2b29fsewardj   in the ARM parlance. */
2336c299f3acab617581ea504e45fbb6cab24c2b29fsewardj
2340578287155cb60143bcf70fdf5e1c2beb0b92c07ceriontypedef
2350578287155cb60143bcf70fdf5e1c2beb0b92c07cerion   enum {
236b48eddb441c460f9bf10210416925b16fdaf85c4sewardj      ARMri84_I84=7,   /* imm8 `ror` (2 * imm4) */
2376c299f3acab617581ea504e45fbb6cab24c2b29fsewardj      ARMri84_R        /* reg */
2380578287155cb60143bcf70fdf5e1c2beb0b92c07cerion   }
2396c299f3acab617581ea504e45fbb6cab24c2b29fsewardj   ARMRI84Tag;
2400578287155cb60143bcf70fdf5e1c2beb0b92c07cerion
2410578287155cb60143bcf70fdf5e1c2beb0b92c07ceriontypedef
2420578287155cb60143bcf70fdf5e1c2beb0b92c07cerion   struct {
2436c299f3acab617581ea504e45fbb6cab24c2b29fsewardj      ARMRI84Tag tag;
2440578287155cb60143bcf70fdf5e1c2beb0b92c07cerion      union {
2450578287155cb60143bcf70fdf5e1c2beb0b92c07cerion         struct {
2466c299f3acab617581ea504e45fbb6cab24c2b29fsewardj            UShort imm8;
2476c299f3acab617581ea504e45fbb6cab24c2b29fsewardj            UShort imm4;
2486c299f3acab617581ea504e45fbb6cab24c2b29fsewardj         } I84;
2490578287155cb60143bcf70fdf5e1c2beb0b92c07cerion         struct {
2506c299f3acab617581ea504e45fbb6cab24c2b29fsewardj            HReg reg;
2516c299f3acab617581ea504e45fbb6cab24c2b29fsewardj         } R;
2526c299f3acab617581ea504e45fbb6cab24c2b29fsewardj      } ARMri84;
2530578287155cb60143bcf70fdf5e1c2beb0b92c07cerion   }
2546c299f3acab617581ea504e45fbb6cab24c2b29fsewardj   ARMRI84;
2550578287155cb60143bcf70fdf5e1c2beb0b92c07cerion
2566c299f3acab617581ea504e45fbb6cab24c2b29fsewardjextern ARMRI84* ARMRI84_I84 ( UShort imm8, UShort imm4 );
2576c299f3acab617581ea504e45fbb6cab24c2b29fsewardjextern ARMRI84* ARMRI84_R   ( HReg );
2580578287155cb60143bcf70fdf5e1c2beb0b92c07cerion
2596c299f3acab617581ea504e45fbb6cab24c2b29fsewardjextern void ppARMRI84 ( ARMRI84* );
2606c299f3acab617581ea504e45fbb6cab24c2b29fsewardj
2616c299f3acab617581ea504e45fbb6cab24c2b29fsewardj
2626c299f3acab617581ea504e45fbb6cab24c2b29fsewardj/* --------- Reg or imm5 operands --------- */
2636c299f3acab617581ea504e45fbb6cab24c2b29fsewardjtypedef
2646c299f3acab617581ea504e45fbb6cab24c2b29fsewardj   enum {
265b48eddb441c460f9bf10210416925b16fdaf85c4sewardj      ARMri5_I5=9,   /* imm5, 1 .. 31 only (no zero!) */
2666c299f3acab617581ea504e45fbb6cab24c2b29fsewardj      ARMri5_R       /* reg */
2676c299f3acab617581ea504e45fbb6cab24c2b29fsewardj   }
2686c299f3acab617581ea504e45fbb6cab24c2b29fsewardj   ARMRI5Tag;
2690578287155cb60143bcf70fdf5e1c2beb0b92c07cerion
2706c299f3acab617581ea504e45fbb6cab24c2b29fsewardjtypedef
2716c299f3acab617581ea504e45fbb6cab24c2b29fsewardj   struct {
2726c299f3acab617581ea504e45fbb6cab24c2b29fsewardj      ARMRI5Tag tag;
2736c299f3acab617581ea504e45fbb6cab24c2b29fsewardj      union {
2746c299f3acab617581ea504e45fbb6cab24c2b29fsewardj         struct {
2756c299f3acab617581ea504e45fbb6cab24c2b29fsewardj            UInt imm5;
2766c299f3acab617581ea504e45fbb6cab24c2b29fsewardj         } I5;
2776c299f3acab617581ea504e45fbb6cab24c2b29fsewardj         struct {
2786c299f3acab617581ea504e45fbb6cab24c2b29fsewardj            HReg reg;
2796c299f3acab617581ea504e45fbb6cab24c2b29fsewardj         } R;
2806c299f3acab617581ea504e45fbb6cab24c2b29fsewardj      } ARMri5;
2816c299f3acab617581ea504e45fbb6cab24c2b29fsewardj   }
2826c299f3acab617581ea504e45fbb6cab24c2b29fsewardj   ARMRI5;
2830578287155cb60143bcf70fdf5e1c2beb0b92c07cerion
2846c299f3acab617581ea504e45fbb6cab24c2b29fsewardjextern ARMRI5* ARMRI5_I5 ( UInt imm5 );
2856c299f3acab617581ea504e45fbb6cab24c2b29fsewardjextern ARMRI5* ARMRI5_R  ( HReg );
2860578287155cb60143bcf70fdf5e1c2beb0b92c07cerion
2876c299f3acab617581ea504e45fbb6cab24c2b29fsewardjextern void ppARMRI5 ( ARMRI5* );
2880578287155cb60143bcf70fdf5e1c2beb0b92c07cerion
2896c60b32ab93e77a2709549dbc6eaa649eb915204sewardj/* -------- Neon Immediate operand -------- */
2906c60b32ab93e77a2709549dbc6eaa649eb915204sewardj
2916c60b32ab93e77a2709549dbc6eaa649eb915204sewardj/* imm8 = abcdefgh, B = NOT(b);
2926c60b32ab93e77a2709549dbc6eaa649eb915204sewardj
2936c60b32ab93e77a2709549dbc6eaa649eb915204sewardjtype | value (64bit binary)
2946c60b32ab93e77a2709549dbc6eaa649eb915204sewardj-----+-------------------------------------------------------------------------
2956c60b32ab93e77a2709549dbc6eaa649eb915204sewardj   0 | 00000000 00000000 00000000 abcdefgh 00000000 00000000 00000000 abcdefgh
2966c60b32ab93e77a2709549dbc6eaa649eb915204sewardj   1 | 00000000 00000000 abcdefgh 00000000 00000000 00000000 abcdefgh 00000000
2976c60b32ab93e77a2709549dbc6eaa649eb915204sewardj   2 | 00000000 abcdefgh 00000000 00000000 00000000 abcdefgh 00000000 00000000
2986c60b32ab93e77a2709549dbc6eaa649eb915204sewardj   3 | abcdefgh 00000000 00000000 00000000 abcdefgh 00000000 00000000 00000000
2996c60b32ab93e77a2709549dbc6eaa649eb915204sewardj   4 | 00000000 abcdefgh 00000000 abcdefgh 00000000 abcdefgh 00000000 abcdefgh
3006c60b32ab93e77a2709549dbc6eaa649eb915204sewardj   5 | abcdefgh 00000000 abcdefgh 00000000 abcdefgh 00000000 abcdefgh 00000000
3016c60b32ab93e77a2709549dbc6eaa649eb915204sewardj   6 | abcdefgh abcdefgh abcdefgh abcdefgh abcdefgh abcdefgh abcdefgh abcdefgh
3026c60b32ab93e77a2709549dbc6eaa649eb915204sewardj   7 | 00000000 00000000 abcdefgh 11111111 00000000 00000000 abcdefgh 11111111
3036c60b32ab93e77a2709549dbc6eaa649eb915204sewardj   8 | 00000000 abcdefgh 11111111 11111111 00000000 abcdefgh 11111111 11111111
3046c60b32ab93e77a2709549dbc6eaa649eb915204sewardj   9 | aaaaaaaa bbbbbbbb cccccccc dddddddd eeeeeeee ffffffff gggggggg hhhhhhhh
3056c60b32ab93e77a2709549dbc6eaa649eb915204sewardj  10 | aBbbbbbc defgh000 00000000 00000000 aBbbbbbc defgh000 00000000 00000000
3066c60b32ab93e77a2709549dbc6eaa649eb915204sewardj-----+-------------------------------------------------------------------------
3076c60b32ab93e77a2709549dbc6eaa649eb915204sewardj
3086c60b32ab93e77a2709549dbc6eaa649eb915204sewardjType 10 is:
3096c60b32ab93e77a2709549dbc6eaa649eb915204sewardj   (-1)^S * 2^exp * mantissa
3106c60b32ab93e77a2709549dbc6eaa649eb915204sewardjwhere S = a, exp = UInt(B:c:d) - 3, mantissa = (16 + UInt(e:f:g:h)) / 16
3116c60b32ab93e77a2709549dbc6eaa649eb915204sewardj*/
3126c60b32ab93e77a2709549dbc6eaa649eb915204sewardj
3136c60b32ab93e77a2709549dbc6eaa649eb915204sewardjtypedef
3146c60b32ab93e77a2709549dbc6eaa649eb915204sewardj   struct {
3156c60b32ab93e77a2709549dbc6eaa649eb915204sewardj      UInt type;
3166c60b32ab93e77a2709549dbc6eaa649eb915204sewardj      UInt imm8;
3176c60b32ab93e77a2709549dbc6eaa649eb915204sewardj   }
3186c60b32ab93e77a2709549dbc6eaa649eb915204sewardj   ARMNImm;
3196c60b32ab93e77a2709549dbc6eaa649eb915204sewardj
3206c60b32ab93e77a2709549dbc6eaa649eb915204sewardjextern ARMNImm* ARMNImm_TI ( UInt type, UInt imm8 );
3216c60b32ab93e77a2709549dbc6eaa649eb915204sewardjextern ULong ARMNImm_to_Imm64 ( ARMNImm* );
3226c60b32ab93e77a2709549dbc6eaa649eb915204sewardjextern ARMNImm* Imm64_to_ARMNImm ( ULong );
3236c60b32ab93e77a2709549dbc6eaa649eb915204sewardj
3246c60b32ab93e77a2709549dbc6eaa649eb915204sewardjextern void ppARMNImm ( ARMNImm* );
3256c60b32ab93e77a2709549dbc6eaa649eb915204sewardj
3266c60b32ab93e77a2709549dbc6eaa649eb915204sewardj/* ------ Neon Register or Scalar Operand ------ */
3276c60b32ab93e77a2709549dbc6eaa649eb915204sewardj
3286c60b32ab93e77a2709549dbc6eaa649eb915204sewardjtypedef
3296c60b32ab93e77a2709549dbc6eaa649eb915204sewardj   enum {
330b48eddb441c460f9bf10210416925b16fdaf85c4sewardj      ARMNRS_Reg=11,
3316c60b32ab93e77a2709549dbc6eaa649eb915204sewardj      ARMNRS_Scalar
3326c60b32ab93e77a2709549dbc6eaa649eb915204sewardj   }
3336c60b32ab93e77a2709549dbc6eaa649eb915204sewardj   ARMNRS_tag;
3346c60b32ab93e77a2709549dbc6eaa649eb915204sewardj
3356c60b32ab93e77a2709549dbc6eaa649eb915204sewardjtypedef
3366c60b32ab93e77a2709549dbc6eaa649eb915204sewardj   struct {
3376c60b32ab93e77a2709549dbc6eaa649eb915204sewardj      ARMNRS_tag tag;
3386c60b32ab93e77a2709549dbc6eaa649eb915204sewardj      HReg reg;
3396c60b32ab93e77a2709549dbc6eaa649eb915204sewardj      UInt index;
3406c60b32ab93e77a2709549dbc6eaa649eb915204sewardj   }
3416c60b32ab93e77a2709549dbc6eaa649eb915204sewardj   ARMNRS;
3426c60b32ab93e77a2709549dbc6eaa649eb915204sewardj
3436c60b32ab93e77a2709549dbc6eaa649eb915204sewardjextern ARMNRS* mkARMNRS(ARMNRS_tag, HReg reg, UInt index);
3446c60b32ab93e77a2709549dbc6eaa649eb915204sewardjextern void ppARMNRS ( ARMNRS* );
3450578287155cb60143bcf70fdf5e1c2beb0b92c07cerion
3466c299f3acab617581ea504e45fbb6cab24c2b29fsewardj/* --------- Instructions. --------- */
3470578287155cb60143bcf70fdf5e1c2beb0b92c07cerion
3486c299f3acab617581ea504e45fbb6cab24c2b29fsewardj/* --------- */
3490578287155cb60143bcf70fdf5e1c2beb0b92c07ceriontypedef
3500578287155cb60143bcf70fdf5e1c2beb0b92c07cerion   enum {
351b48eddb441c460f9bf10210416925b16fdaf85c4sewardj      ARMalu_ADD=20,   /* plain 32-bit add */
3526c299f3acab617581ea504e45fbb6cab24c2b29fsewardj      ARMalu_ADDS,     /* 32-bit add, and set the flags */
3536c299f3acab617581ea504e45fbb6cab24c2b29fsewardj      ARMalu_ADC,      /* 32-bit add with carry */
3546c299f3acab617581ea504e45fbb6cab24c2b29fsewardj      ARMalu_SUB,      /* plain 32-bit subtract */
3556c299f3acab617581ea504e45fbb6cab24c2b29fsewardj      ARMalu_SUBS,     /* 32-bit subtract, and set the flags */
3566c299f3acab617581ea504e45fbb6cab24c2b29fsewardj      ARMalu_SBC,      /* 32-bit subtract with carry */
3576c299f3acab617581ea504e45fbb6cab24c2b29fsewardj      ARMalu_AND,
3586c299f3acab617581ea504e45fbb6cab24c2b29fsewardj      ARMalu_BIC,
3596c299f3acab617581ea504e45fbb6cab24c2b29fsewardj      ARMalu_OR,
3606c299f3acab617581ea504e45fbb6cab24c2b29fsewardj      ARMalu_XOR
3610578287155cb60143bcf70fdf5e1c2beb0b92c07cerion   }
3626c299f3acab617581ea504e45fbb6cab24c2b29fsewardj   ARMAluOp;
3636c299f3acab617581ea504e45fbb6cab24c2b29fsewardj
36455085f8680acc89d727e321f3b34cae1a8c4093aflorianextern const HChar* showARMAluOp ( ARMAluOp op );
3656c299f3acab617581ea504e45fbb6cab24c2b29fsewardj
3660578287155cb60143bcf70fdf5e1c2beb0b92c07cerion
3670578287155cb60143bcf70fdf5e1c2beb0b92c07ceriontypedef
3686c299f3acab617581ea504e45fbb6cab24c2b29fsewardj   enum {
369b48eddb441c460f9bf10210416925b16fdaf85c4sewardj      ARMsh_SHL=40,
3706c299f3acab617581ea504e45fbb6cab24c2b29fsewardj      ARMsh_SHR,
3716c299f3acab617581ea504e45fbb6cab24c2b29fsewardj      ARMsh_SAR
3726c299f3acab617581ea504e45fbb6cab24c2b29fsewardj   }
3736c299f3acab617581ea504e45fbb6cab24c2b29fsewardj   ARMShiftOp;
3740578287155cb60143bcf70fdf5e1c2beb0b92c07cerion
37555085f8680acc89d727e321f3b34cae1a8c4093aflorianextern const HChar* showARMShiftOp ( ARMShiftOp op );
37682edbb3e13d1758cabcbfd36fab8f955cf980153cerion
3770578287155cb60143bcf70fdf5e1c2beb0b92c07cerion
3786c299f3acab617581ea504e45fbb6cab24c2b29fsewardjtypedef
3796c299f3acab617581ea504e45fbb6cab24c2b29fsewardj   enum {
380b48eddb441c460f9bf10210416925b16fdaf85c4sewardj      ARMun_NEG=50,
3816c299f3acab617581ea504e45fbb6cab24c2b29fsewardj      ARMun_NOT,
3826c299f3acab617581ea504e45fbb6cab24c2b29fsewardj      ARMun_CLZ
3836c299f3acab617581ea504e45fbb6cab24c2b29fsewardj   }
3846c299f3acab617581ea504e45fbb6cab24c2b29fsewardj   ARMUnaryOp;
3850578287155cb60143bcf70fdf5e1c2beb0b92c07cerion
38655085f8680acc89d727e321f3b34cae1a8c4093aflorianextern const HChar* showARMUnaryOp ( ARMUnaryOp op );
3870578287155cb60143bcf70fdf5e1c2beb0b92c07cerion
3880578287155cb60143bcf70fdf5e1c2beb0b92c07cerion
3890578287155cb60143bcf70fdf5e1c2beb0b92c07ceriontypedef
3900578287155cb60143bcf70fdf5e1c2beb0b92c07cerion   enum {
391b48eddb441c460f9bf10210416925b16fdaf85c4sewardj      ARMmul_PLAIN=60,
3926c299f3acab617581ea504e45fbb6cab24c2b29fsewardj      ARMmul_ZX,
3936c299f3acab617581ea504e45fbb6cab24c2b29fsewardj      ARMmul_SX
3940578287155cb60143bcf70fdf5e1c2beb0b92c07cerion   }
3956c299f3acab617581ea504e45fbb6cab24c2b29fsewardj   ARMMulOp;
3960578287155cb60143bcf70fdf5e1c2beb0b92c07cerion
39755085f8680acc89d727e321f3b34cae1a8c4093aflorianextern const HChar* showARMMulOp ( ARMMulOp op );
3986c299f3acab617581ea504e45fbb6cab24c2b29fsewardj
3996c299f3acab617581ea504e45fbb6cab24c2b29fsewardj
4006c299f3acab617581ea504e45fbb6cab24c2b29fsewardjtypedef
4016c299f3acab617581ea504e45fbb6cab24c2b29fsewardj   enum {
402b48eddb441c460f9bf10210416925b16fdaf85c4sewardj      ARMvfp_ADD=70,
4036c299f3acab617581ea504e45fbb6cab24c2b29fsewardj      ARMvfp_SUB,
4046c299f3acab617581ea504e45fbb6cab24c2b29fsewardj      ARMvfp_MUL,
4056c299f3acab617581ea504e45fbb6cab24c2b29fsewardj      ARMvfp_DIV
4066c299f3acab617581ea504e45fbb6cab24c2b29fsewardj   }
4076c299f3acab617581ea504e45fbb6cab24c2b29fsewardj   ARMVfpOp;
4080578287155cb60143bcf70fdf5e1c2beb0b92c07cerion
40955085f8680acc89d727e321f3b34cae1a8c4093aflorianextern const HChar* showARMVfpOp ( ARMVfpOp op );
4106c299f3acab617581ea504e45fbb6cab24c2b29fsewardj
4116c299f3acab617581ea504e45fbb6cab24c2b29fsewardj
4126c299f3acab617581ea504e45fbb6cab24c2b29fsewardjtypedef
4136c299f3acab617581ea504e45fbb6cab24c2b29fsewardj   enum {
414b48eddb441c460f9bf10210416925b16fdaf85c4sewardj      ARMvfpu_COPY=80,
4156c299f3acab617581ea504e45fbb6cab24c2b29fsewardj      ARMvfpu_NEG,
4166c299f3acab617581ea504e45fbb6cab24c2b29fsewardj      ARMvfpu_ABS,
4176c299f3acab617581ea504e45fbb6cab24c2b29fsewardj      ARMvfpu_SQRT
4186c299f3acab617581ea504e45fbb6cab24c2b29fsewardj   }
4196c299f3acab617581ea504e45fbb6cab24c2b29fsewardj   ARMVfpUnaryOp;
4206c299f3acab617581ea504e45fbb6cab24c2b29fsewardj
42155085f8680acc89d727e321f3b34cae1a8c4093aflorianextern const HChar* showARMVfpUnaryOp ( ARMVfpUnaryOp op );
4220578287155cb60143bcf70fdf5e1c2beb0b92c07cerion
4236c60b32ab93e77a2709549dbc6eaa649eb915204sewardjtypedef
4246c60b32ab93e77a2709549dbc6eaa649eb915204sewardj   enum {
425b48eddb441c460f9bf10210416925b16fdaf85c4sewardj      ARMneon_VAND=90,
4266c60b32ab93e77a2709549dbc6eaa649eb915204sewardj      ARMneon_VORR,
4276c60b32ab93e77a2709549dbc6eaa649eb915204sewardj      ARMneon_VXOR,
4286c60b32ab93e77a2709549dbc6eaa649eb915204sewardj      ARMneon_VADD,
4296c60b32ab93e77a2709549dbc6eaa649eb915204sewardj      ARMneon_VADDFP,
4306c60b32ab93e77a2709549dbc6eaa649eb915204sewardj      ARMneon_VRHADDS,
4316c60b32ab93e77a2709549dbc6eaa649eb915204sewardj      ARMneon_VRHADDU,
4326c60b32ab93e77a2709549dbc6eaa649eb915204sewardj      ARMneon_VPADDFP,
4336c60b32ab93e77a2709549dbc6eaa649eb915204sewardj      ARMneon_VABDFP,
4346c60b32ab93e77a2709549dbc6eaa649eb915204sewardj      ARMneon_VSUB,
4356c60b32ab93e77a2709549dbc6eaa649eb915204sewardj      ARMneon_VSUBFP,
4366c60b32ab93e77a2709549dbc6eaa649eb915204sewardj      ARMneon_VMAXU,
4376c60b32ab93e77a2709549dbc6eaa649eb915204sewardj      ARMneon_VMAXS,
4386c60b32ab93e77a2709549dbc6eaa649eb915204sewardj      ARMneon_VMAXF,
4396c60b32ab93e77a2709549dbc6eaa649eb915204sewardj      ARMneon_VMINU,
4406c60b32ab93e77a2709549dbc6eaa649eb915204sewardj      ARMneon_VMINS,
4416c60b32ab93e77a2709549dbc6eaa649eb915204sewardj      ARMneon_VMINF,
4426c60b32ab93e77a2709549dbc6eaa649eb915204sewardj      ARMneon_VQADDU,
4436c60b32ab93e77a2709549dbc6eaa649eb915204sewardj      ARMneon_VQADDS,
4446c60b32ab93e77a2709549dbc6eaa649eb915204sewardj      ARMneon_VQSUBU,
4456c60b32ab93e77a2709549dbc6eaa649eb915204sewardj      ARMneon_VQSUBS,
4466c60b32ab93e77a2709549dbc6eaa649eb915204sewardj      ARMneon_VCGTU,
4476c60b32ab93e77a2709549dbc6eaa649eb915204sewardj      ARMneon_VCGTS,
4486c60b32ab93e77a2709549dbc6eaa649eb915204sewardj      ARMneon_VCGEU,
4496c60b32ab93e77a2709549dbc6eaa649eb915204sewardj      ARMneon_VCGES,
4506c60b32ab93e77a2709549dbc6eaa649eb915204sewardj      ARMneon_VCGTF,
4516c60b32ab93e77a2709549dbc6eaa649eb915204sewardj      ARMneon_VCGEF,
4526c60b32ab93e77a2709549dbc6eaa649eb915204sewardj      ARMneon_VCEQ,
4536c60b32ab93e77a2709549dbc6eaa649eb915204sewardj      ARMneon_VCEQF,
4546c60b32ab93e77a2709549dbc6eaa649eb915204sewardj      ARMneon_VEXT,
4556c60b32ab93e77a2709549dbc6eaa649eb915204sewardj      ARMneon_VMUL,
4566c60b32ab93e77a2709549dbc6eaa649eb915204sewardj      ARMneon_VMULFP,
4576c60b32ab93e77a2709549dbc6eaa649eb915204sewardj      ARMneon_VMULLU,
4586c60b32ab93e77a2709549dbc6eaa649eb915204sewardj      ARMneon_VMULLS,
4596c60b32ab93e77a2709549dbc6eaa649eb915204sewardj      ARMneon_VMULP,
4606c60b32ab93e77a2709549dbc6eaa649eb915204sewardj      ARMneon_VMULLP,
4616c60b32ab93e77a2709549dbc6eaa649eb915204sewardj      ARMneon_VQDMULH,
4626c60b32ab93e77a2709549dbc6eaa649eb915204sewardj      ARMneon_VQRDMULH,
4636c60b32ab93e77a2709549dbc6eaa649eb915204sewardj      ARMneon_VPADD,
4646c60b32ab93e77a2709549dbc6eaa649eb915204sewardj      ARMneon_VPMINU,
4656c60b32ab93e77a2709549dbc6eaa649eb915204sewardj      ARMneon_VPMINS,
4666c60b32ab93e77a2709549dbc6eaa649eb915204sewardj      ARMneon_VPMINF,
4676c60b32ab93e77a2709549dbc6eaa649eb915204sewardj      ARMneon_VPMAXU,
4686c60b32ab93e77a2709549dbc6eaa649eb915204sewardj      ARMneon_VPMAXS,
4696c60b32ab93e77a2709549dbc6eaa649eb915204sewardj      ARMneon_VPMAXF,
4706c60b32ab93e77a2709549dbc6eaa649eb915204sewardj      ARMneon_VTBL,
4716c60b32ab93e77a2709549dbc6eaa649eb915204sewardj      ARMneon_VQDMULL,
4726c60b32ab93e77a2709549dbc6eaa649eb915204sewardj      ARMneon_VRECPS,
4736c60b32ab93e77a2709549dbc6eaa649eb915204sewardj      ARMneon_VRSQRTS,
474e84eeb4f96db568593145aecade598565c71693bsewardj      ARMneon_INVALID
4756c60b32ab93e77a2709549dbc6eaa649eb915204sewardj      /* ... */
4766c60b32ab93e77a2709549dbc6eaa649eb915204sewardj   }
4776c60b32ab93e77a2709549dbc6eaa649eb915204sewardj   ARMNeonBinOp;
4786c60b32ab93e77a2709549dbc6eaa649eb915204sewardj
4796c60b32ab93e77a2709549dbc6eaa649eb915204sewardjtypedef
4806c60b32ab93e77a2709549dbc6eaa649eb915204sewardj   enum {
481b48eddb441c460f9bf10210416925b16fdaf85c4sewardj      ARMneon_VSHL=150,
4826c60b32ab93e77a2709549dbc6eaa649eb915204sewardj      ARMneon_VSAL, /* Yah, not SAR but SAL */
4836c60b32ab93e77a2709549dbc6eaa649eb915204sewardj      ARMneon_VQSHL,
4846c60b32ab93e77a2709549dbc6eaa649eb915204sewardj      ARMneon_VQSAL
4856c60b32ab93e77a2709549dbc6eaa649eb915204sewardj   }
4866c60b32ab93e77a2709549dbc6eaa649eb915204sewardj   ARMNeonShiftOp;
4876c60b32ab93e77a2709549dbc6eaa649eb915204sewardj
4886c60b32ab93e77a2709549dbc6eaa649eb915204sewardjtypedef
4896c60b32ab93e77a2709549dbc6eaa649eb915204sewardj   enum {
490b48eddb441c460f9bf10210416925b16fdaf85c4sewardj      ARMneon_COPY=160,
4916c60b32ab93e77a2709549dbc6eaa649eb915204sewardj      ARMneon_COPYLU,
4926c60b32ab93e77a2709549dbc6eaa649eb915204sewardj      ARMneon_COPYLS,
4936c60b32ab93e77a2709549dbc6eaa649eb915204sewardj      ARMneon_COPYN,
4946c60b32ab93e77a2709549dbc6eaa649eb915204sewardj      ARMneon_COPYQNSS,
4956c60b32ab93e77a2709549dbc6eaa649eb915204sewardj      ARMneon_COPYQNUS,
4966c60b32ab93e77a2709549dbc6eaa649eb915204sewardj      ARMneon_COPYQNUU,
4976c60b32ab93e77a2709549dbc6eaa649eb915204sewardj      ARMneon_NOT,
4986c60b32ab93e77a2709549dbc6eaa649eb915204sewardj      ARMneon_EQZ,
4996c60b32ab93e77a2709549dbc6eaa649eb915204sewardj      ARMneon_DUP,
5006c60b32ab93e77a2709549dbc6eaa649eb915204sewardj      ARMneon_PADDLS,
5016c60b32ab93e77a2709549dbc6eaa649eb915204sewardj      ARMneon_PADDLU,
5026c60b32ab93e77a2709549dbc6eaa649eb915204sewardj      ARMneon_CNT,
5036c60b32ab93e77a2709549dbc6eaa649eb915204sewardj      ARMneon_CLZ,
5046c60b32ab93e77a2709549dbc6eaa649eb915204sewardj      ARMneon_CLS,
5056c60b32ab93e77a2709549dbc6eaa649eb915204sewardj      ARMneon_VCVTxFPxINT,
5066c60b32ab93e77a2709549dbc6eaa649eb915204sewardj      ARMneon_VQSHLNSS,
5076c60b32ab93e77a2709549dbc6eaa649eb915204sewardj      ARMneon_VQSHLNUU,
5086c60b32ab93e77a2709549dbc6eaa649eb915204sewardj      ARMneon_VQSHLNUS,
5096c60b32ab93e77a2709549dbc6eaa649eb915204sewardj      ARMneon_VCVTFtoU,
5106c60b32ab93e77a2709549dbc6eaa649eb915204sewardj      ARMneon_VCVTFtoS,
5116c60b32ab93e77a2709549dbc6eaa649eb915204sewardj      ARMneon_VCVTUtoF,
5126c60b32ab93e77a2709549dbc6eaa649eb915204sewardj      ARMneon_VCVTStoF,
5136c60b32ab93e77a2709549dbc6eaa649eb915204sewardj      ARMneon_VCVTFtoFixedU,
5146c60b32ab93e77a2709549dbc6eaa649eb915204sewardj      ARMneon_VCVTFtoFixedS,
5156c60b32ab93e77a2709549dbc6eaa649eb915204sewardj      ARMneon_VCVTFixedUtoF,
5166c60b32ab93e77a2709549dbc6eaa649eb915204sewardj      ARMneon_VCVTFixedStoF,
5176c60b32ab93e77a2709549dbc6eaa649eb915204sewardj      ARMneon_VCVTF16toF32,
5186c60b32ab93e77a2709549dbc6eaa649eb915204sewardj      ARMneon_VCVTF32toF16,
5196c60b32ab93e77a2709549dbc6eaa649eb915204sewardj      ARMneon_REV16,
5206c60b32ab93e77a2709549dbc6eaa649eb915204sewardj      ARMneon_REV32,
5216c60b32ab93e77a2709549dbc6eaa649eb915204sewardj      ARMneon_REV64,
5226c60b32ab93e77a2709549dbc6eaa649eb915204sewardj      ARMneon_ABS,
5236c60b32ab93e77a2709549dbc6eaa649eb915204sewardj      ARMneon_VNEGF,
5246aa87a6864b2f3c9d766784dd13a2d321a8b08bdsewardj      ARMneon_VRECIP,
5256aa87a6864b2f3c9d766784dd13a2d321a8b08bdsewardj      ARMneon_VRECIPF,
5266aa87a6864b2f3c9d766784dd13a2d321a8b08bdsewardj      ARMneon_VABSFP,
5276aa87a6864b2f3c9d766784dd13a2d321a8b08bdsewardj      ARMneon_VRSQRTEFP,
5286aa87a6864b2f3c9d766784dd13a2d321a8b08bdsewardj      ARMneon_VRSQRTE
5296c60b32ab93e77a2709549dbc6eaa649eb915204sewardj      /* ... */
5306c60b32ab93e77a2709549dbc6eaa649eb915204sewardj   }
5316c60b32ab93e77a2709549dbc6eaa649eb915204sewardj   ARMNeonUnOp;
5326c60b32ab93e77a2709549dbc6eaa649eb915204sewardj
5336c60b32ab93e77a2709549dbc6eaa649eb915204sewardjtypedef
5346c60b32ab93e77a2709549dbc6eaa649eb915204sewardj   enum {
535b48eddb441c460f9bf10210416925b16fdaf85c4sewardj      ARMneon_SETELEM=200,
5366c60b32ab93e77a2709549dbc6eaa649eb915204sewardj      ARMneon_GETELEMU,
5376aa87a6864b2f3c9d766784dd13a2d321a8b08bdsewardj      ARMneon_GETELEMS,
5386aa87a6864b2f3c9d766784dd13a2d321a8b08bdsewardj      ARMneon_VDUP,
5396c60b32ab93e77a2709549dbc6eaa649eb915204sewardj   }
5406c60b32ab93e77a2709549dbc6eaa649eb915204sewardj   ARMNeonUnOpS;
5416c60b32ab93e77a2709549dbc6eaa649eb915204sewardj
5426c60b32ab93e77a2709549dbc6eaa649eb915204sewardjtypedef
5436c60b32ab93e77a2709549dbc6eaa649eb915204sewardj   enum {
544b48eddb441c460f9bf10210416925b16fdaf85c4sewardj      ARMneon_TRN=210,
5456c60b32ab93e77a2709549dbc6eaa649eb915204sewardj      ARMneon_ZIP,
5466c60b32ab93e77a2709549dbc6eaa649eb915204sewardj      ARMneon_UZP
5476c60b32ab93e77a2709549dbc6eaa649eb915204sewardj      /* ... */
5486c60b32ab93e77a2709549dbc6eaa649eb915204sewardj   }
5496c60b32ab93e77a2709549dbc6eaa649eb915204sewardj   ARMNeonDualOp;
5506c60b32ab93e77a2709549dbc6eaa649eb915204sewardj
55155085f8680acc89d727e321f3b34cae1a8c4093aflorianextern const HChar* showARMNeonBinOp ( ARMNeonBinOp op );
55255085f8680acc89d727e321f3b34cae1a8c4093aflorianextern const HChar* showARMNeonUnOp ( ARMNeonUnOp op );
55355085f8680acc89d727e321f3b34cae1a8c4093aflorianextern const HChar* showARMNeonUnOpS ( ARMNeonUnOpS op );
55455085f8680acc89d727e321f3b34cae1a8c4093aflorianextern const HChar* showARMNeonShiftOp ( ARMNeonShiftOp op );
55555085f8680acc89d727e321f3b34cae1a8c4093aflorianextern const HChar* showARMNeonDualOp ( ARMNeonDualOp op );
55655085f8680acc89d727e321f3b34cae1a8c4093aflorianextern const HChar* showARMNeonBinOpDataType ( ARMNeonBinOp op );
55755085f8680acc89d727e321f3b34cae1a8c4093aflorianextern const HChar* showARMNeonUnOpDataType ( ARMNeonUnOp op );
55855085f8680acc89d727e321f3b34cae1a8c4093aflorianextern const HChar* showARMNeonUnOpSDataType ( ARMNeonUnOpS op );
55955085f8680acc89d727e321f3b34cae1a8c4093aflorianextern const HChar* showARMNeonShiftOpDataType ( ARMNeonShiftOp op );
56055085f8680acc89d727e321f3b34cae1a8c4093aflorianextern const HChar* showARMNeonDualOpDataType ( ARMNeonDualOp op );
5610578287155cb60143bcf70fdf5e1c2beb0b92c07cerion
5620578287155cb60143bcf70fdf5e1c2beb0b92c07ceriontypedef
5630578287155cb60143bcf70fdf5e1c2beb0b92c07cerion   enum {
5646c299f3acab617581ea504e45fbb6cab24c2b29fsewardj      /* baseline */
565b48eddb441c460f9bf10210416925b16fdaf85c4sewardj      ARMin_Alu=220,
5666c299f3acab617581ea504e45fbb6cab24c2b29fsewardj      ARMin_Shift,
5676c299f3acab617581ea504e45fbb6cab24c2b29fsewardj      ARMin_Unary,
5686c299f3acab617581ea504e45fbb6cab24c2b29fsewardj      ARMin_CmpOrTst,
5696c299f3acab617581ea504e45fbb6cab24c2b29fsewardj      ARMin_Mov,
5706c299f3acab617581ea504e45fbb6cab24c2b29fsewardj      ARMin_Imm32,
5716c299f3acab617581ea504e45fbb6cab24c2b29fsewardj      ARMin_LdSt32,
5726c299f3acab617581ea504e45fbb6cab24c2b29fsewardj      ARMin_LdSt16,
5736c299f3acab617581ea504e45fbb6cab24c2b29fsewardj      ARMin_LdSt8U,
5746c299f3acab617581ea504e45fbb6cab24c2b29fsewardj      ARMin_Ld8S,
575c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj      ARMin_XDirect,     /* direct transfer to GA */
576c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj      ARMin_XIndir,      /* indirect transfer to GA */
577c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj      ARMin_XAssisted,   /* assisted transfer to GA */
5786c299f3acab617581ea504e45fbb6cab24c2b29fsewardj      ARMin_CMov,
5796c299f3acab617581ea504e45fbb6cab24c2b29fsewardj      ARMin_Call,
5806c299f3acab617581ea504e45fbb6cab24c2b29fsewardj      ARMin_Mul,
5816c299f3acab617581ea504e45fbb6cab24c2b29fsewardj      ARMin_LdrEX,
5826c299f3acab617581ea504e45fbb6cab24c2b29fsewardj      ARMin_StrEX,
5836c299f3acab617581ea504e45fbb6cab24c2b29fsewardj      /* vfp */
5846c299f3acab617581ea504e45fbb6cab24c2b29fsewardj      ARMin_VLdStD,
5856c299f3acab617581ea504e45fbb6cab24c2b29fsewardj      ARMin_VLdStS,
5866c299f3acab617581ea504e45fbb6cab24c2b29fsewardj      ARMin_VAluD,
5876c299f3acab617581ea504e45fbb6cab24c2b29fsewardj      ARMin_VAluS,
5886c299f3acab617581ea504e45fbb6cab24c2b29fsewardj      ARMin_VUnaryD,
5896c299f3acab617581ea504e45fbb6cab24c2b29fsewardj      ARMin_VUnaryS,
5906c299f3acab617581ea504e45fbb6cab24c2b29fsewardj      ARMin_VCmpD,
5916c299f3acab617581ea504e45fbb6cab24c2b29fsewardj      ARMin_VCMovD,
5926c299f3acab617581ea504e45fbb6cab24c2b29fsewardj      ARMin_VCMovS,
5936c299f3acab617581ea504e45fbb6cab24c2b29fsewardj      ARMin_VCvtSD,
594a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes      ARMin_VXferQ,
5956c299f3acab617581ea504e45fbb6cab24c2b29fsewardj      ARMin_VXferD,
5966c299f3acab617581ea504e45fbb6cab24c2b29fsewardj      ARMin_VXferS,
5976c299f3acab617581ea504e45fbb6cab24c2b29fsewardj      ARMin_VCvtID,
598ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes      ARMin_VRIntR,
599ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes      ARMin_VMinMaxNum,
600412098cf3166995b33b34e20b96eae9845e74a50sewardj      ARMin_FPSCR,
6016c60b32ab93e77a2709549dbc6eaa649eb915204sewardj      ARMin_MFence,
6026d615ba78d168bb4319120fff5ce83d3f7433022sewardj      ARMin_CLREX,
6036c60b32ab93e77a2709549dbc6eaa649eb915204sewardj      /* Neon */
6046c60b32ab93e77a2709549dbc6eaa649eb915204sewardj      ARMin_NLdStQ,
6056c60b32ab93e77a2709549dbc6eaa649eb915204sewardj      ARMin_NLdStD,
6066c60b32ab93e77a2709549dbc6eaa649eb915204sewardj      ARMin_NUnary,
6076c60b32ab93e77a2709549dbc6eaa649eb915204sewardj      ARMin_NUnaryS,
6086c60b32ab93e77a2709549dbc6eaa649eb915204sewardj      ARMin_NDual,
6096c60b32ab93e77a2709549dbc6eaa649eb915204sewardj      ARMin_NBinary,
6106c60b32ab93e77a2709549dbc6eaa649eb915204sewardj      ARMin_NBinaryS,
6116c60b32ab93e77a2709549dbc6eaa649eb915204sewardj      ARMin_NShift,
612f78a81c0427ba930ee9ab73f41d1570e013af3acsewardj      ARMin_NShl64, // special case 64-bit shift of Dreg by immediate
6136c60b32ab93e77a2709549dbc6eaa649eb915204sewardj      ARMin_NeonImm,
6146c60b32ab93e77a2709549dbc6eaa649eb915204sewardj      ARMin_NCMovQ,
6156c60b32ab93e77a2709549dbc6eaa649eb915204sewardj      /* This is not a NEON instruction. Actually there is no corresponding
6166c60b32ab93e77a2709549dbc6eaa649eb915204sewardj         instruction in ARM instruction set at all. We need this one to
6176c60b32ab93e77a2709549dbc6eaa649eb915204sewardj         generate spill/reload of 128-bit registers since current register
6186c60b32ab93e77a2709549dbc6eaa649eb915204sewardj         allocator demands them to consist of no more than two instructions.
6196c60b32ab93e77a2709549dbc6eaa649eb915204sewardj         We will split this instruction into 2 or 3 ARM instructions on the
6206c60b32ab93e77a2709549dbc6eaa649eb915204sewardj         emiting phase.
6216c60b32ab93e77a2709549dbc6eaa649eb915204sewardj         NOTE: source and destination registers should be different! */
622c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj      ARMin_Add32,
623c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj      ARMin_EvCheck,     /* Event check */
624c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj      ARMin_ProfInc      /* 64-bit profile counter increment */
6250578287155cb60143bcf70fdf5e1c2beb0b92c07cerion   }
6260578287155cb60143bcf70fdf5e1c2beb0b92c07cerion   ARMInstrTag;
6270578287155cb60143bcf70fdf5e1c2beb0b92c07cerion
6286c299f3acab617581ea504e45fbb6cab24c2b29fsewardj/* Destinations are on the LEFT (first operand) */
6290578287155cb60143bcf70fdf5e1c2beb0b92c07cerion
6300578287155cb60143bcf70fdf5e1c2beb0b92c07ceriontypedef
6310578287155cb60143bcf70fdf5e1c2beb0b92c07cerion   struct {
6320578287155cb60143bcf70fdf5e1c2beb0b92c07cerion      ARMInstrTag tag;
6330578287155cb60143bcf70fdf5e1c2beb0b92c07cerion      union {
6346c299f3acab617581ea504e45fbb6cab24c2b29fsewardj         /* ADD/SUB/AND/OR/XOR, vanilla ALU op */
6356c299f3acab617581ea504e45fbb6cab24c2b29fsewardj         struct {
6366c299f3acab617581ea504e45fbb6cab24c2b29fsewardj            ARMAluOp op;
6376c299f3acab617581ea504e45fbb6cab24c2b29fsewardj            HReg     dst;
6386c299f3acab617581ea504e45fbb6cab24c2b29fsewardj            HReg     argL;
6396c299f3acab617581ea504e45fbb6cab24c2b29fsewardj            ARMRI84* argR;
6406c299f3acab617581ea504e45fbb6cab24c2b29fsewardj         } Alu;
6416c299f3acab617581ea504e45fbb6cab24c2b29fsewardj         /* SHL/SHR/SAR, 2nd arg is reg or imm */
6426c299f3acab617581ea504e45fbb6cab24c2b29fsewardj         struct {
6436c299f3acab617581ea504e45fbb6cab24c2b29fsewardj            ARMShiftOp op;
6446c299f3acab617581ea504e45fbb6cab24c2b29fsewardj            HReg       dst;
6456c299f3acab617581ea504e45fbb6cab24c2b29fsewardj            HReg       argL;
6466c299f3acab617581ea504e45fbb6cab24c2b29fsewardj            ARMRI5*    argR;
6476c299f3acab617581ea504e45fbb6cab24c2b29fsewardj         } Shift;
6486c299f3acab617581ea504e45fbb6cab24c2b29fsewardj         /* NOT/NEG/CLZ */
6496c299f3acab617581ea504e45fbb6cab24c2b29fsewardj         struct {
6506c299f3acab617581ea504e45fbb6cab24c2b29fsewardj            ARMUnaryOp op;
6516c299f3acab617581ea504e45fbb6cab24c2b29fsewardj            HReg       dst;
6526c299f3acab617581ea504e45fbb6cab24c2b29fsewardj            HReg       src;
6536c299f3acab617581ea504e45fbb6cab24c2b29fsewardj         } Unary;
6546c299f3acab617581ea504e45fbb6cab24c2b29fsewardj         /* CMP/TST; subtract/and, discard result, set NZCV */
6556c299f3acab617581ea504e45fbb6cab24c2b29fsewardj         struct {
6566c299f3acab617581ea504e45fbb6cab24c2b29fsewardj            Bool     isCmp;
6576c299f3acab617581ea504e45fbb6cab24c2b29fsewardj            HReg     argL;
6586c299f3acab617581ea504e45fbb6cab24c2b29fsewardj            ARMRI84* argR;
6596c299f3acab617581ea504e45fbb6cab24c2b29fsewardj         } CmpOrTst;
6606c299f3acab617581ea504e45fbb6cab24c2b29fsewardj         /* MOV dst, src -- reg-reg (or reg-imm8x4) move */
6616c299f3acab617581ea504e45fbb6cab24c2b29fsewardj         struct {
6626c299f3acab617581ea504e45fbb6cab24c2b29fsewardj            HReg     dst;
6636c299f3acab617581ea504e45fbb6cab24c2b29fsewardj            ARMRI84* src;
6646c299f3acab617581ea504e45fbb6cab24c2b29fsewardj         } Mov;
6656c299f3acab617581ea504e45fbb6cab24c2b29fsewardj         /* Pseudo-insn; make a 32-bit immediate */
6666c299f3acab617581ea504e45fbb6cab24c2b29fsewardj         struct {
6676c299f3acab617581ea504e45fbb6cab24c2b29fsewardj            HReg dst;
6686c299f3acab617581ea504e45fbb6cab24c2b29fsewardj            UInt imm32;
6696c299f3acab617581ea504e45fbb6cab24c2b29fsewardj         } Imm32;
670cfe046e178666280b87da998b1b52ecda03ecd89sewardj         /* 32-bit load or store, may be conditional */
6716c299f3acab617581ea504e45fbb6cab24c2b29fsewardj         struct {
672cfe046e178666280b87da998b1b52ecda03ecd89sewardj            ARMCondCode cc; /* ARMcc_NV is not allowed */
673cfe046e178666280b87da998b1b52ecda03ecd89sewardj            Bool        isLoad;
674cfe046e178666280b87da998b1b52ecda03ecd89sewardj            HReg        rD;
675cfe046e178666280b87da998b1b52ecda03ecd89sewardj            ARMAMode1*  amode;
6766c299f3acab617581ea504e45fbb6cab24c2b29fsewardj         } LdSt32;
677cfe046e178666280b87da998b1b52ecda03ecd89sewardj         /* 16-bit load or store, may be conditional */
6786c299f3acab617581ea504e45fbb6cab24c2b29fsewardj         struct {
679cfe046e178666280b87da998b1b52ecda03ecd89sewardj            ARMCondCode cc; /* ARMcc_NV is not allowed */
680cfe046e178666280b87da998b1b52ecda03ecd89sewardj            Bool        isLoad;
681cfe046e178666280b87da998b1b52ecda03ecd89sewardj            Bool        signedLoad;
682cfe046e178666280b87da998b1b52ecda03ecd89sewardj            HReg        rD;
683cfe046e178666280b87da998b1b52ecda03ecd89sewardj            ARMAMode2*  amode;
6846c299f3acab617581ea504e45fbb6cab24c2b29fsewardj         } LdSt16;
685cfe046e178666280b87da998b1b52ecda03ecd89sewardj         /* 8-bit (unsigned) load or store, may be conditional */
6866c299f3acab617581ea504e45fbb6cab24c2b29fsewardj         struct {
687cfe046e178666280b87da998b1b52ecda03ecd89sewardj            ARMCondCode cc; /* ARMcc_NV is not allowed */
688cfe046e178666280b87da998b1b52ecda03ecd89sewardj            Bool        isLoad;
689cfe046e178666280b87da998b1b52ecda03ecd89sewardj            HReg        rD;
690cfe046e178666280b87da998b1b52ecda03ecd89sewardj            ARMAMode1*  amode;
6916c299f3acab617581ea504e45fbb6cab24c2b29fsewardj         } LdSt8U;
692cfe046e178666280b87da998b1b52ecda03ecd89sewardj         /* 8-bit signed load, may be conditional */
6936c299f3acab617581ea504e45fbb6cab24c2b29fsewardj         struct {
694cfe046e178666280b87da998b1b52ecda03ecd89sewardj            ARMCondCode cc; /* ARMcc_NV is not allowed */
695cfe046e178666280b87da998b1b52ecda03ecd89sewardj            HReg        rD;
696cfe046e178666280b87da998b1b52ecda03ecd89sewardj            ARMAMode2*  amode;
6976c299f3acab617581ea504e45fbb6cab24c2b29fsewardj         } Ld8S;
698c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj         /* Update the guest R15T value, then exit requesting to chain
699c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj            to it.  May be conditional.  Urr, use of Addr32 implicitly
700c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj            assumes that wordsize(guest) == wordsize(host). */
701c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj         struct {
702c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj            Addr32      dstGA;    /* next guest address */
703c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj            ARMAMode1*  amR15T;   /* amode in guest state for R15T */
704c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj            ARMCondCode cond;     /* can be ARMcc_AL */
705c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj            Bool        toFastEP; /* chain to the slow or fast point? */
706c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj         } XDirect;
707c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj         /* Boring transfer to a guest address not known at JIT time.
708c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj            Not chainable.  May be conditional. */
7096c299f3acab617581ea504e45fbb6cab24c2b29fsewardj         struct {
710c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj            HReg        dstGA;
711c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj            ARMAMode1*  amR15T;
712c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj            ARMCondCode cond; /* can be ARMcc_AL */
713c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj         } XIndir;
714c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj         /* Assisted transfer to a guest address, most general case.
715c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj            Not chainable.  May be conditional. */
716c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj         struct {
717c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj            HReg        dstGA;
718c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj            ARMAMode1*  amR15T;
719c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj            ARMCondCode cond; /* can be ARMcc_AL */
7206c299f3acab617581ea504e45fbb6cab24c2b29fsewardj            IRJumpKind  jk;
721c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj         } XAssisted;
7226c299f3acab617581ea504e45fbb6cab24c2b29fsewardj         /* Mov src to dst on the given condition, which may not
7236c299f3acab617581ea504e45fbb6cab24c2b29fsewardj            be ARMcc_AL. */
7246c299f3acab617581ea504e45fbb6cab24c2b29fsewardj         struct {
7256c299f3acab617581ea504e45fbb6cab24c2b29fsewardj            ARMCondCode cond;
7266c299f3acab617581ea504e45fbb6cab24c2b29fsewardj            HReg        dst;
7276c299f3acab617581ea504e45fbb6cab24c2b29fsewardj            ARMRI84*    src;
7286c299f3acab617581ea504e45fbb6cab24c2b29fsewardj         } CMov;
7296c299f3acab617581ea504e45fbb6cab24c2b29fsewardj         /* Pseudo-insn.  Call target (an absolute address), on given
7306c299f3acab617581ea504e45fbb6cab24c2b29fsewardj            condition (which could be ARMcc_AL). */
7316c299f3acab617581ea504e45fbb6cab24c2b29fsewardj         struct {
7326c299f3acab617581ea504e45fbb6cab24c2b29fsewardj            ARMCondCode cond;
73393a09742b0de3d61718882c2d999f64be402564dflorian            Addr32      target;
7346c299f3acab617581ea504e45fbb6cab24c2b29fsewardj            Int         nArgRegs; /* # regs carrying args: 0 .. 4 */
735cfe046e178666280b87da998b1b52ecda03ecd89sewardj            RetLoc      rloc;     /* where the return value will be */
7366c299f3acab617581ea504e45fbb6cab24c2b29fsewardj         } Call;
7376c299f3acab617581ea504e45fbb6cab24c2b29fsewardj         /* (PLAIN) 32 *  32 -> 32:  r0    = r2 * r3
7386c299f3acab617581ea504e45fbb6cab24c2b29fsewardj            (ZX)    32 *u 32 -> 64:  r1:r0 = r2 *u r3
7396c299f3acab617581ea504e45fbb6cab24c2b29fsewardj            (SX)    32 *s 32 -> 64:  r1:r0 = r2 *s r3
7406c299f3acab617581ea504e45fbb6cab24c2b29fsewardj            Why hardwired registers?  Because the ARM ARM specifies
7416c299f3acab617581ea504e45fbb6cab24c2b29fsewardj            (eg for straight MUL) the result (Rd) and the left arg (Rm)
7426c299f3acab617581ea504e45fbb6cab24c2b29fsewardj            may not be the same register.  That's not a constraint we
7436c299f3acab617581ea504e45fbb6cab24c2b29fsewardj            can enforce in the register allocator (without mucho extra
7446c299f3acab617581ea504e45fbb6cab24c2b29fsewardj            complexity).  Hence hardwire it.  At least using caller-saves
7456c299f3acab617581ea504e45fbb6cab24c2b29fsewardj            registers, which are less likely to be in use. */
7466c299f3acab617581ea504e45fbb6cab24c2b29fsewardj         struct {
7476c299f3acab617581ea504e45fbb6cab24c2b29fsewardj            ARMMulOp op;
7486c299f3acab617581ea504e45fbb6cab24c2b29fsewardj         } Mul;
749ff7f5b7ec308d0a2608be80ea9654184baa97272sewardj         /* LDREX{,H,B} r2, [r4]  and
750ff7f5b7ec308d0a2608be80ea9654184baa97272sewardj            LDREXD r2, r3, [r4]   (on LE hosts, transferred value is r3:r2)
7516c299f3acab617581ea504e45fbb6cab24c2b29fsewardj            Again, hardwired registers since this is not performance
7526c299f3acab617581ea504e45fbb6cab24c2b29fsewardj            critical, and there are possibly constraints on the
7536c299f3acab617581ea504e45fbb6cab24c2b29fsewardj            registers that we can't express in the register allocator.*/
7546c299f3acab617581ea504e45fbb6cab24c2b29fsewardj         struct {
755ff7f5b7ec308d0a2608be80ea9654184baa97272sewardj            Int  szB; /* 1, 2, 4 or 8 */
7566c299f3acab617581ea504e45fbb6cab24c2b29fsewardj         } LdrEX;
757ff7f5b7ec308d0a2608be80ea9654184baa97272sewardj         /* STREX{,H,B} r0, r2, [r4]  and
758ff7f5b7ec308d0a2608be80ea9654184baa97272sewardj            STREXD r0, r2, r3, [r4]   (on LE hosts, transferred value is r3:r2)
759ff7f5b7ec308d0a2608be80ea9654184baa97272sewardj            r0 = SC( [r4] = r2 )      (8, 16, 32 bit transfers)
760ff7f5b7ec308d0a2608be80ea9654184baa97272sewardj            r0 = SC( [r4] = r3:r2)    (64 bit transfers)
7616c299f3acab617581ea504e45fbb6cab24c2b29fsewardj            Ditto comment re fixed registers. */
7626c299f3acab617581ea504e45fbb6cab24c2b29fsewardj         struct {
763ff7f5b7ec308d0a2608be80ea9654184baa97272sewardj            Int  szB; /* 1, 2, 4 or 8 */
7646c299f3acab617581ea504e45fbb6cab24c2b29fsewardj         } StrEX;
7656c299f3acab617581ea504e45fbb6cab24c2b29fsewardj         /* VFP INSTRUCTIONS */
7666c299f3acab617581ea504e45fbb6cab24c2b29fsewardj         /* 64-bit Fp load/store */
7676c299f3acab617581ea504e45fbb6cab24c2b29fsewardj         struct {
7686c299f3acab617581ea504e45fbb6cab24c2b29fsewardj            Bool       isLoad;
7696c299f3acab617581ea504e45fbb6cab24c2b29fsewardj            HReg       dD;
7706c299f3acab617581ea504e45fbb6cab24c2b29fsewardj            ARMAModeV* amode;
7716c299f3acab617581ea504e45fbb6cab24c2b29fsewardj         } VLdStD;
7726c299f3acab617581ea504e45fbb6cab24c2b29fsewardj         /* 32-bit Fp load/store */
7736c299f3acab617581ea504e45fbb6cab24c2b29fsewardj         struct {
7746c299f3acab617581ea504e45fbb6cab24c2b29fsewardj            Bool       isLoad;
7756c299f3acab617581ea504e45fbb6cab24c2b29fsewardj            HReg       fD;
7766c299f3acab617581ea504e45fbb6cab24c2b29fsewardj            ARMAModeV* amode;
7776c299f3acab617581ea504e45fbb6cab24c2b29fsewardj         } VLdStS;
7786c299f3acab617581ea504e45fbb6cab24c2b29fsewardj         /* 64-bit FP binary arithmetic */
7796c299f3acab617581ea504e45fbb6cab24c2b29fsewardj         struct {
7806c299f3acab617581ea504e45fbb6cab24c2b29fsewardj            ARMVfpOp op;
7816c299f3acab617581ea504e45fbb6cab24c2b29fsewardj            HReg     dst;
7826c299f3acab617581ea504e45fbb6cab24c2b29fsewardj            HReg     argL;
7836c299f3acab617581ea504e45fbb6cab24c2b29fsewardj            HReg     argR;
7846c299f3acab617581ea504e45fbb6cab24c2b29fsewardj         } VAluD;
7856c299f3acab617581ea504e45fbb6cab24c2b29fsewardj         /* 32-bit FP binary arithmetic */
7866c299f3acab617581ea504e45fbb6cab24c2b29fsewardj         struct {
7876c299f3acab617581ea504e45fbb6cab24c2b29fsewardj            ARMVfpOp op;
7886c299f3acab617581ea504e45fbb6cab24c2b29fsewardj            HReg     dst;
7896c299f3acab617581ea504e45fbb6cab24c2b29fsewardj            HReg     argL;
7906c299f3acab617581ea504e45fbb6cab24c2b29fsewardj            HReg     argR;
7916c299f3acab617581ea504e45fbb6cab24c2b29fsewardj         } VAluS;
7926c299f3acab617581ea504e45fbb6cab24c2b29fsewardj         /* 64-bit FP unary, also reg-reg move */
7936c299f3acab617581ea504e45fbb6cab24c2b29fsewardj         struct {
7946c299f3acab617581ea504e45fbb6cab24c2b29fsewardj            ARMVfpUnaryOp op;
7956c299f3acab617581ea504e45fbb6cab24c2b29fsewardj            HReg          dst;
7966c299f3acab617581ea504e45fbb6cab24c2b29fsewardj            HReg          src;
7976c299f3acab617581ea504e45fbb6cab24c2b29fsewardj         } VUnaryD;
7986c299f3acab617581ea504e45fbb6cab24c2b29fsewardj         /* 32-bit FP unary, also reg-reg move */
7996c299f3acab617581ea504e45fbb6cab24c2b29fsewardj         struct {
8006c299f3acab617581ea504e45fbb6cab24c2b29fsewardj            ARMVfpUnaryOp op;
8016c299f3acab617581ea504e45fbb6cab24c2b29fsewardj            HReg          dst;
8026c299f3acab617581ea504e45fbb6cab24c2b29fsewardj            HReg          src;
8036c299f3acab617581ea504e45fbb6cab24c2b29fsewardj         } VUnaryS;
8046c299f3acab617581ea504e45fbb6cab24c2b29fsewardj         /* 64-bit FP compare and move results to CPSR (FCMPD;FMSTAT) */
8056c299f3acab617581ea504e45fbb6cab24c2b29fsewardj         struct {
8066c299f3acab617581ea504e45fbb6cab24c2b29fsewardj            HReg argL;
8076c299f3acab617581ea504e45fbb6cab24c2b29fsewardj            HReg argR;
8086c299f3acab617581ea504e45fbb6cab24c2b29fsewardj         } VCmpD;
8096c299f3acab617581ea504e45fbb6cab24c2b29fsewardj         /* 64-bit FP mov src to dst on the given condition, which may
8106c299f3acab617581ea504e45fbb6cab24c2b29fsewardj            not be ARMcc_AL. */
8116c299f3acab617581ea504e45fbb6cab24c2b29fsewardj         struct {
8126c299f3acab617581ea504e45fbb6cab24c2b29fsewardj            ARMCondCode cond;
8136c299f3acab617581ea504e45fbb6cab24c2b29fsewardj            HReg        dst;
8146c299f3acab617581ea504e45fbb6cab24c2b29fsewardj            HReg        src;
8156c299f3acab617581ea504e45fbb6cab24c2b29fsewardj         } VCMovD;
8166c299f3acab617581ea504e45fbb6cab24c2b29fsewardj         /* 32-bit FP mov src to dst on the given condition, which may
8176c299f3acab617581ea504e45fbb6cab24c2b29fsewardj            not be ARMcc_AL. */
8186c299f3acab617581ea504e45fbb6cab24c2b29fsewardj         struct {
8196c299f3acab617581ea504e45fbb6cab24c2b29fsewardj            ARMCondCode cond;
8206c299f3acab617581ea504e45fbb6cab24c2b29fsewardj            HReg        dst;
8216c299f3acab617581ea504e45fbb6cab24c2b29fsewardj            HReg        src;
8226c299f3acab617581ea504e45fbb6cab24c2b29fsewardj         } VCMovS;
8236c299f3acab617581ea504e45fbb6cab24c2b29fsewardj         /* Convert between 32-bit and 64-bit FP values (both ways).
8246c299f3acab617581ea504e45fbb6cab24c2b29fsewardj            (FCVTSD, FCVTDS) */
8256c299f3acab617581ea504e45fbb6cab24c2b29fsewardj         struct {
8266c299f3acab617581ea504e45fbb6cab24c2b29fsewardj            Bool sToD; /* True: F32->F64.  False: F64->F32 */
8276c299f3acab617581ea504e45fbb6cab24c2b29fsewardj            HReg dst;
8286c299f3acab617581ea504e45fbb6cab24c2b29fsewardj            HReg src;
8296c299f3acab617581ea504e45fbb6cab24c2b29fsewardj         } VCvtSD;
830a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes         /* Transfer a NEON Q reg to/from two D registers (VMOV x 2) */
831a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes         struct {
832a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes            Bool toQ;
833a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes            HReg qD;
834a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes            HReg dHi;
835a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes            HReg dLo;
836a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes         } VXferQ;
8376c299f3acab617581ea504e45fbb6cab24c2b29fsewardj         /* Transfer a VFP D reg to/from two integer registers (VMOV) */
8386c299f3acab617581ea504e45fbb6cab24c2b29fsewardj         struct {
8396c299f3acab617581ea504e45fbb6cab24c2b29fsewardj            Bool toD;
8406c299f3acab617581ea504e45fbb6cab24c2b29fsewardj            HReg dD;
8416c299f3acab617581ea504e45fbb6cab24c2b29fsewardj            HReg rHi;
8426c299f3acab617581ea504e45fbb6cab24c2b29fsewardj            HReg rLo;
8436c299f3acab617581ea504e45fbb6cab24c2b29fsewardj         } VXferD;
8446c299f3acab617581ea504e45fbb6cab24c2b29fsewardj         /* Transfer a VFP S reg to/from an integer register (VMOV) */
8456c299f3acab617581ea504e45fbb6cab24c2b29fsewardj         struct {
8466c299f3acab617581ea504e45fbb6cab24c2b29fsewardj            Bool toS;
8476c299f3acab617581ea504e45fbb6cab24c2b29fsewardj            HReg fD;
8486c299f3acab617581ea504e45fbb6cab24c2b29fsewardj            HReg rLo;
8496c299f3acab617581ea504e45fbb6cab24c2b29fsewardj         } VXferS;
8506c299f3acab617581ea504e45fbb6cab24c2b29fsewardj         /* Convert between 32-bit ints and 64-bit FP values (both ways
8516c299f3acab617581ea504e45fbb6cab24c2b29fsewardj            and both signednesses). (FSITOD, FUITOD, FTOSID, FTOUID) */
8526c299f3acab617581ea504e45fbb6cab24c2b29fsewardj         struct {
8536c299f3acab617581ea504e45fbb6cab24c2b29fsewardj            Bool iToD; /* True: I32->F64.  False: F64->I32 */
8546c299f3acab617581ea504e45fbb6cab24c2b29fsewardj            Bool syned; /* True: I32 is signed.  False: I32 is unsigned */
8556c299f3acab617581ea504e45fbb6cab24c2b29fsewardj            HReg dst;
8566c299f3acab617581ea504e45fbb6cab24c2b29fsewardj            HReg src;
8576c299f3acab617581ea504e45fbb6cab24c2b29fsewardj         } VCvtID;
858ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes         /* Round a F32 or F64 value to the nearest integral value,
859ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes            according to the FPSCR.RM.  For ARM >= V8 hosts only. */
860ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes         struct {
861ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes            Bool isF64;
862ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes            HReg dst;
863ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes            HReg src;
864ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes         } VRIntR;
865ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes         /* Do Min/Max of F32 or F64 values, propagating the numerical arg
866ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes            if the other is a qNaN.  For ARM >= V8 hosts only. */
867ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes         struct {
868ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes            Bool isF64;
869ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes            Bool isMax;
870ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes            HReg dst;
871ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes            HReg srcL;
872ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes            HReg srcR;
873ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes         } VMinMaxNum;
8746c299f3acab617581ea504e45fbb6cab24c2b29fsewardj         /* Move a 32-bit value to/from the FPSCR (FMXR, FMRX) */
8756c299f3acab617581ea504e45fbb6cab24c2b29fsewardj         struct {
8766c299f3acab617581ea504e45fbb6cab24c2b29fsewardj            Bool toFPSCR;
8776c299f3acab617581ea504e45fbb6cab24c2b29fsewardj            HReg iReg;
8786c299f3acab617581ea504e45fbb6cab24c2b29fsewardj         } FPSCR;
879412098cf3166995b33b34e20b96eae9845e74a50sewardj         /* Mem fence.  An insn which fences all loads and stores as
880412098cf3166995b33b34e20b96eae9845e74a50sewardj            much as possible before continuing.  On ARM we emit the
881412098cf3166995b33b34e20b96eae9845e74a50sewardj            sequence
882412098cf3166995b33b34e20b96eae9845e74a50sewardj               mcr 15,0,r0,c7,c10,4 (DSB)
883412098cf3166995b33b34e20b96eae9845e74a50sewardj               mcr 15,0,r0,c7,c10,5 (DMB)
884412098cf3166995b33b34e20b96eae9845e74a50sewardj               mcr 15,0,r0,c7,c5,4 (ISB)
885412098cf3166995b33b34e20b96eae9845e74a50sewardj            which is probably total overkill, but better safe than
886412098cf3166995b33b34e20b96eae9845e74a50sewardj            sorry.
887412098cf3166995b33b34e20b96eae9845e74a50sewardj         */
888412098cf3166995b33b34e20b96eae9845e74a50sewardj         struct {
889412098cf3166995b33b34e20b96eae9845e74a50sewardj         } MFence;
8906d615ba78d168bb4319120fff5ce83d3f7433022sewardj         /* A CLREX instruction. */
8916d615ba78d168bb4319120fff5ce83d3f7433022sewardj         struct {
8926d615ba78d168bb4319120fff5ce83d3f7433022sewardj         } CLREX;
8936c60b32ab93e77a2709549dbc6eaa649eb915204sewardj         /* Neon data processing instruction: 3 registers of the same
8946c60b32ab93e77a2709549dbc6eaa649eb915204sewardj            length */
8956c60b32ab93e77a2709549dbc6eaa649eb915204sewardj         struct {
8966c60b32ab93e77a2709549dbc6eaa649eb915204sewardj            ARMNeonBinOp op;
8976c60b32ab93e77a2709549dbc6eaa649eb915204sewardj            HReg dst;
8986c60b32ab93e77a2709549dbc6eaa649eb915204sewardj            HReg argL;
8996c60b32ab93e77a2709549dbc6eaa649eb915204sewardj            HReg argR;
9006c60b32ab93e77a2709549dbc6eaa649eb915204sewardj            UInt size;
9016c60b32ab93e77a2709549dbc6eaa649eb915204sewardj            Bool Q;
9026c60b32ab93e77a2709549dbc6eaa649eb915204sewardj         } NBinary;
9036c60b32ab93e77a2709549dbc6eaa649eb915204sewardj         struct {
9046c60b32ab93e77a2709549dbc6eaa649eb915204sewardj            ARMNeonBinOp op;
9056c60b32ab93e77a2709549dbc6eaa649eb915204sewardj            ARMNRS* dst;
9066c60b32ab93e77a2709549dbc6eaa649eb915204sewardj            ARMNRS* argL;
9076c60b32ab93e77a2709549dbc6eaa649eb915204sewardj            ARMNRS* argR;
9086c60b32ab93e77a2709549dbc6eaa649eb915204sewardj            UInt size;
9096c60b32ab93e77a2709549dbc6eaa649eb915204sewardj            Bool Q;
9106c60b32ab93e77a2709549dbc6eaa649eb915204sewardj         } NBinaryS;
9116c60b32ab93e77a2709549dbc6eaa649eb915204sewardj         struct {
9126c60b32ab93e77a2709549dbc6eaa649eb915204sewardj            ARMNeonShiftOp op;
9136c60b32ab93e77a2709549dbc6eaa649eb915204sewardj            HReg dst;
9146c60b32ab93e77a2709549dbc6eaa649eb915204sewardj            HReg argL;
9156c60b32ab93e77a2709549dbc6eaa649eb915204sewardj            HReg argR;
9166c60b32ab93e77a2709549dbc6eaa649eb915204sewardj            UInt size;
9176c60b32ab93e77a2709549dbc6eaa649eb915204sewardj            Bool Q;
9186c60b32ab93e77a2709549dbc6eaa649eb915204sewardj         } NShift;
9196c60b32ab93e77a2709549dbc6eaa649eb915204sewardj         struct {
920f78a81c0427ba930ee9ab73f41d1570e013af3acsewardj            HReg dst;
921f78a81c0427ba930ee9ab73f41d1570e013af3acsewardj            HReg src;
922f78a81c0427ba930ee9ab73f41d1570e013af3acsewardj            UInt amt; /* 1..63 only */
923f78a81c0427ba930ee9ab73f41d1570e013af3acsewardj         } NShl64;
924f78a81c0427ba930ee9ab73f41d1570e013af3acsewardj         struct {
9256c60b32ab93e77a2709549dbc6eaa649eb915204sewardj            Bool isLoad;
9266c60b32ab93e77a2709549dbc6eaa649eb915204sewardj            HReg dQ;
9276c60b32ab93e77a2709549dbc6eaa649eb915204sewardj            ARMAModeN *amode;
9286c60b32ab93e77a2709549dbc6eaa649eb915204sewardj         } NLdStQ;
9296c60b32ab93e77a2709549dbc6eaa649eb915204sewardj         struct {
9306c60b32ab93e77a2709549dbc6eaa649eb915204sewardj            Bool isLoad;
9316c60b32ab93e77a2709549dbc6eaa649eb915204sewardj            HReg dD;
9326c60b32ab93e77a2709549dbc6eaa649eb915204sewardj            ARMAModeN *amode;
9336c60b32ab93e77a2709549dbc6eaa649eb915204sewardj         } NLdStD;
9346c60b32ab93e77a2709549dbc6eaa649eb915204sewardj         struct {
9356aa87a6864b2f3c9d766784dd13a2d321a8b08bdsewardj            ARMNeonUnOpS op;
9366c60b32ab93e77a2709549dbc6eaa649eb915204sewardj            ARMNRS*  dst;
9376c60b32ab93e77a2709549dbc6eaa649eb915204sewardj            ARMNRS*  src;
9386c60b32ab93e77a2709549dbc6eaa649eb915204sewardj            UInt size;
9396c60b32ab93e77a2709549dbc6eaa649eb915204sewardj            Bool Q;
9406c60b32ab93e77a2709549dbc6eaa649eb915204sewardj         } NUnaryS;
9416c60b32ab93e77a2709549dbc6eaa649eb915204sewardj         struct {
9426c60b32ab93e77a2709549dbc6eaa649eb915204sewardj            ARMNeonUnOp op;
9436c60b32ab93e77a2709549dbc6eaa649eb915204sewardj            HReg  dst;
9446c60b32ab93e77a2709549dbc6eaa649eb915204sewardj            HReg  src;
9456c60b32ab93e77a2709549dbc6eaa649eb915204sewardj            UInt size;
9466c60b32ab93e77a2709549dbc6eaa649eb915204sewardj            Bool Q;
9476c60b32ab93e77a2709549dbc6eaa649eb915204sewardj         } NUnary;
9486c60b32ab93e77a2709549dbc6eaa649eb915204sewardj         /* Takes two arguments and modifies them both. */
9496c60b32ab93e77a2709549dbc6eaa649eb915204sewardj         struct {
9506c60b32ab93e77a2709549dbc6eaa649eb915204sewardj            ARMNeonDualOp op;
9516c60b32ab93e77a2709549dbc6eaa649eb915204sewardj            HReg  arg1;
9526c60b32ab93e77a2709549dbc6eaa649eb915204sewardj            HReg  arg2;
9536c60b32ab93e77a2709549dbc6eaa649eb915204sewardj            UInt size;
9546c60b32ab93e77a2709549dbc6eaa649eb915204sewardj            Bool Q;
9556c60b32ab93e77a2709549dbc6eaa649eb915204sewardj         } NDual;
9566c60b32ab93e77a2709549dbc6eaa649eb915204sewardj         struct {
9576c60b32ab93e77a2709549dbc6eaa649eb915204sewardj            HReg dst;
9586c60b32ab93e77a2709549dbc6eaa649eb915204sewardj            ARMNImm* imm;
9596c60b32ab93e77a2709549dbc6eaa649eb915204sewardj         } NeonImm;
9606c60b32ab93e77a2709549dbc6eaa649eb915204sewardj         /* 128-bit Neon move src to dst on the given condition, which
9616c60b32ab93e77a2709549dbc6eaa649eb915204sewardj            may not be ARMcc_AL. */
9626c60b32ab93e77a2709549dbc6eaa649eb915204sewardj         struct {
9636c60b32ab93e77a2709549dbc6eaa649eb915204sewardj            ARMCondCode cond;
9646c60b32ab93e77a2709549dbc6eaa649eb915204sewardj            HReg        dst;
9656c60b32ab93e77a2709549dbc6eaa649eb915204sewardj            HReg        src;
9666c60b32ab93e77a2709549dbc6eaa649eb915204sewardj         } NCMovQ;
9676c60b32ab93e77a2709549dbc6eaa649eb915204sewardj         struct {
9686c60b32ab93e77a2709549dbc6eaa649eb915204sewardj            /* Note: rD != rN */
9696c60b32ab93e77a2709549dbc6eaa649eb915204sewardj            HReg rD;
9706c60b32ab93e77a2709549dbc6eaa649eb915204sewardj            HReg rN;
9716c60b32ab93e77a2709549dbc6eaa649eb915204sewardj            UInt imm32;
9726c60b32ab93e77a2709549dbc6eaa649eb915204sewardj         } Add32;
973c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj         struct {
974c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj            ARMAMode1* amCounter;
975c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj            ARMAMode1* amFailAddr;
976c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj         } EvCheck;
977c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj         struct {
978c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj            /* No fields.  The address of the counter to inc is
979c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj               installed later, post-translation, by patching it in,
980c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj               as it is not known at translation time. */
981c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj         } ProfInc;
9820578287155cb60143bcf70fdf5e1c2beb0b92c07cerion      } ARMin;
9830578287155cb60143bcf70fdf5e1c2beb0b92c07cerion   }
9840578287155cb60143bcf70fdf5e1c2beb0b92c07cerion   ARMInstr;
9850578287155cb60143bcf70fdf5e1c2beb0b92c07cerion
986cee303178c1b607c1457346e7bcbf7fb20dbde55cerion
9876c299f3acab617581ea504e45fbb6cab24c2b29fsewardjextern ARMInstr* ARMInstr_Alu      ( ARMAluOp, HReg, HReg, ARMRI84* );
9886c299f3acab617581ea504e45fbb6cab24c2b29fsewardjextern ARMInstr* ARMInstr_Shift    ( ARMShiftOp, HReg, HReg, ARMRI5* );
9896c299f3acab617581ea504e45fbb6cab24c2b29fsewardjextern ARMInstr* ARMInstr_Unary    ( ARMUnaryOp, HReg, HReg );
9906c299f3acab617581ea504e45fbb6cab24c2b29fsewardjextern ARMInstr* ARMInstr_CmpOrTst ( Bool isCmp, HReg, ARMRI84* );
9916c299f3acab617581ea504e45fbb6cab24c2b29fsewardjextern ARMInstr* ARMInstr_Mov      ( HReg, ARMRI84* );
9926c299f3acab617581ea504e45fbb6cab24c2b29fsewardjextern ARMInstr* ARMInstr_Imm32    ( HReg, UInt );
993cfe046e178666280b87da998b1b52ecda03ecd89sewardjextern ARMInstr* ARMInstr_LdSt32   ( ARMCondCode,
994cfe046e178666280b87da998b1b52ecda03ecd89sewardj                                     Bool isLoad, HReg, ARMAMode1* );
995cfe046e178666280b87da998b1b52ecda03ecd89sewardjextern ARMInstr* ARMInstr_LdSt16   ( ARMCondCode,
996cfe046e178666280b87da998b1b52ecda03ecd89sewardj                                     Bool isLoad, Bool signedLoad,
9976c299f3acab617581ea504e45fbb6cab24c2b29fsewardj                                     HReg, ARMAMode2* );
998cfe046e178666280b87da998b1b52ecda03ecd89sewardjextern ARMInstr* ARMInstr_LdSt8U   ( ARMCondCode,
999cfe046e178666280b87da998b1b52ecda03ecd89sewardj                                     Bool isLoad, HReg, ARMAMode1* );
1000cfe046e178666280b87da998b1b52ecda03ecd89sewardjextern ARMInstr* ARMInstr_Ld8S     ( ARMCondCode, HReg, ARMAMode2* );
1001c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardjextern ARMInstr* ARMInstr_XDirect  ( Addr32 dstGA, ARMAMode1* amR15T,
1002c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj                                     ARMCondCode cond, Bool toFastEP );
1003c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardjextern ARMInstr* ARMInstr_XIndir   ( HReg dstGA, ARMAMode1* amR15T,
1004c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj                                     ARMCondCode cond );
1005c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardjextern ARMInstr* ARMInstr_XAssisted ( HReg dstGA, ARMAMode1* amR15T,
1006c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj                                      ARMCondCode cond, IRJumpKind jk );
10076c299f3acab617581ea504e45fbb6cab24c2b29fsewardjextern ARMInstr* ARMInstr_CMov     ( ARMCondCode, HReg dst, ARMRI84* src );
100893a09742b0de3d61718882c2d999f64be402564dflorianextern ARMInstr* ARMInstr_Call     ( ARMCondCode, Addr32, Int nArgRegs,
1009cfe046e178666280b87da998b1b52ecda03ecd89sewardj                                     RetLoc rloc );
10106c299f3acab617581ea504e45fbb6cab24c2b29fsewardjextern ARMInstr* ARMInstr_Mul      ( ARMMulOp op );
10116c299f3acab617581ea504e45fbb6cab24c2b29fsewardjextern ARMInstr* ARMInstr_LdrEX    ( Int szB );
10126c299f3acab617581ea504e45fbb6cab24c2b29fsewardjextern ARMInstr* ARMInstr_StrEX    ( Int szB );
10136c299f3acab617581ea504e45fbb6cab24c2b29fsewardjextern ARMInstr* ARMInstr_VLdStD   ( Bool isLoad, HReg, ARMAModeV* );
10146c299f3acab617581ea504e45fbb6cab24c2b29fsewardjextern ARMInstr* ARMInstr_VLdStS   ( Bool isLoad, HReg, ARMAModeV* );
10156c299f3acab617581ea504e45fbb6cab24c2b29fsewardjextern ARMInstr* ARMInstr_VAluD    ( ARMVfpOp op, HReg, HReg, HReg );
10166c299f3acab617581ea504e45fbb6cab24c2b29fsewardjextern ARMInstr* ARMInstr_VAluS    ( ARMVfpOp op, HReg, HReg, HReg );
10176c299f3acab617581ea504e45fbb6cab24c2b29fsewardjextern ARMInstr* ARMInstr_VUnaryD  ( ARMVfpUnaryOp, HReg dst, HReg src );
10186c299f3acab617581ea504e45fbb6cab24c2b29fsewardjextern ARMInstr* ARMInstr_VUnaryS  ( ARMVfpUnaryOp, HReg dst, HReg src );
10196c299f3acab617581ea504e45fbb6cab24c2b29fsewardjextern ARMInstr* ARMInstr_VCmpD    ( HReg argL, HReg argR );
10206c299f3acab617581ea504e45fbb6cab24c2b29fsewardjextern ARMInstr* ARMInstr_VCMovD   ( ARMCondCode, HReg dst, HReg src );
10216c299f3acab617581ea504e45fbb6cab24c2b29fsewardjextern ARMInstr* ARMInstr_VCMovS   ( ARMCondCode, HReg dst, HReg src );
10226c299f3acab617581ea504e45fbb6cab24c2b29fsewardjextern ARMInstr* ARMInstr_VCvtSD   ( Bool sToD, HReg dst, HReg src );
1023a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughesextern ARMInstr* ARMInstr_VXferQ   ( Bool toQ, HReg qD, HReg dHi, HReg dLo );
10246c299f3acab617581ea504e45fbb6cab24c2b29fsewardjextern ARMInstr* ARMInstr_VXferD   ( Bool toD, HReg dD, HReg rHi, HReg rLo );
10256c299f3acab617581ea504e45fbb6cab24c2b29fsewardjextern ARMInstr* ARMInstr_VXferS   ( Bool toS, HReg fD, HReg rLo );
10266c299f3acab617581ea504e45fbb6cab24c2b29fsewardjextern ARMInstr* ARMInstr_VCvtID   ( Bool iToD, Bool syned,
10276c299f3acab617581ea504e45fbb6cab24c2b29fsewardj                                     HReg dst, HReg src );
1028ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughesextern ARMInstr* ARMInstr_VRIntR   ( Bool isF64, HReg dst, HReg src );
1029ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughesextern ARMInstr* ARMInstr_VMinMaxNum ( Bool isF64, Bool isMax,
1030ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes                                       HReg dst, HReg srcL, HReg srcR );
10316c299f3acab617581ea504e45fbb6cab24c2b29fsewardjextern ARMInstr* ARMInstr_FPSCR    ( Bool toFPSCR, HReg iReg );
1032412098cf3166995b33b34e20b96eae9845e74a50sewardjextern ARMInstr* ARMInstr_MFence   ( void );
10336d615ba78d168bb4319120fff5ce83d3f7433022sewardjextern ARMInstr* ARMInstr_CLREX    ( void );
10346c60b32ab93e77a2709549dbc6eaa649eb915204sewardjextern ARMInstr* ARMInstr_NLdStQ   ( Bool isLoad, HReg, ARMAModeN* );
10356c60b32ab93e77a2709549dbc6eaa649eb915204sewardjextern ARMInstr* ARMInstr_NLdStD   ( Bool isLoad, HReg, ARMAModeN* );
10366c60b32ab93e77a2709549dbc6eaa649eb915204sewardjextern ARMInstr* ARMInstr_NUnary   ( ARMNeonUnOp, HReg, HReg, UInt, Bool );
1037cb9ad0ddb5793ac0652b383dc95606cedeac8118sewardjextern ARMInstr* ARMInstr_NUnaryS  ( ARMNeonUnOpS, ARMNRS*, ARMNRS*,
10386c60b32ab93e77a2709549dbc6eaa649eb915204sewardj                                     UInt, Bool );
10396c60b32ab93e77a2709549dbc6eaa649eb915204sewardjextern ARMInstr* ARMInstr_NDual    ( ARMNeonDualOp, HReg, HReg, UInt, Bool );
10406c60b32ab93e77a2709549dbc6eaa649eb915204sewardjextern ARMInstr* ARMInstr_NBinary  ( ARMNeonBinOp, HReg, HReg, HReg,
10416c60b32ab93e77a2709549dbc6eaa649eb915204sewardj                                     UInt, Bool );
10426c60b32ab93e77a2709549dbc6eaa649eb915204sewardjextern ARMInstr* ARMInstr_NShift   ( ARMNeonShiftOp, HReg, HReg, HReg,
10436c60b32ab93e77a2709549dbc6eaa649eb915204sewardj                                     UInt, Bool );
1044f78a81c0427ba930ee9ab73f41d1570e013af3acsewardjextern ARMInstr* ARMInstr_NShl64   ( HReg, HReg, UInt );
10456c60b32ab93e77a2709549dbc6eaa649eb915204sewardjextern ARMInstr* ARMInstr_NeonImm  ( HReg, ARMNImm* );
10466c60b32ab93e77a2709549dbc6eaa649eb915204sewardjextern ARMInstr* ARMInstr_NCMovQ   ( ARMCondCode, HReg, HReg );
10476c60b32ab93e77a2709549dbc6eaa649eb915204sewardjextern ARMInstr* ARMInstr_Add32    ( HReg rD, HReg rN, UInt imm32 );
1048c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardjextern ARMInstr* ARMInstr_EvCheck  ( ARMAMode1* amCounter,
1049c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj                                     ARMAMode1* amFailAddr );
1050c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardjextern ARMInstr* ARMInstr_ProfInc  ( void );
10510578287155cb60143bcf70fdf5e1c2beb0b92c07cerion
1052d8c64e082224b2e688abdef9219cc76fd82b373bflorianextern void ppARMInstr ( const ARMInstr* );
10530578287155cb60143bcf70fdf5e1c2beb0b92c07cerion
10540578287155cb60143bcf70fdf5e1c2beb0b92c07cerion
10550578287155cb60143bcf70fdf5e1c2beb0b92c07cerion/* Some functions that insulate the register allocator from details
10560578287155cb60143bcf70fdf5e1c2beb0b92c07cerion   of the underlying instruction set. */
1057d8c64e082224b2e688abdef9219cc76fd82b373bflorianextern void getRegUsage_ARMInstr ( HRegUsage*, const ARMInstr*, Bool );
10586c299f3acab617581ea504e45fbb6cab24c2b29fsewardjextern void mapRegs_ARMInstr     ( HRegRemap*, ARMInstr*, Bool );
1059d8c64e082224b2e688abdef9219cc76fd82b373bflorianextern Bool isMove_ARMInstr      ( const ARMInstr*, HReg*, HReg* );
1060c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardjextern Int  emit_ARMInstr        ( /*MB_MOD*/Bool* is_profInc,
1061d8c64e082224b2e688abdef9219cc76fd82b373bflorian                                   UChar* buf, Int nbuf, const ARMInstr* i,
1062c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj                                   Bool mode64,
10639b76916dcc1628e133d57db001563429c6e3a590sewardj                                   VexEndness endness_host,
10648462d113e3efeacceb304222dada8d85f748295aflorian                                   const void* disp_cp_chain_me_to_slowEP,
10658462d113e3efeacceb304222dada8d85f748295aflorian                                   const void* disp_cp_chain_me_to_fastEP,
10668462d113e3efeacceb304222dada8d85f748295aflorian                                   const void* disp_cp_xindir,
10678462d113e3efeacceb304222dada8d85f748295aflorian                                   const void* disp_cp_xassisted );
10686c299f3acab617581ea504e45fbb6cab24c2b29fsewardj
10696c299f3acab617581ea504e45fbb6cab24c2b29fsewardjextern void genSpill_ARM  ( /*OUT*/HInstr** i1, /*OUT*/HInstr** i2,
10706c299f3acab617581ea504e45fbb6cab24c2b29fsewardj                            HReg rreg, Int offset, Bool );
10716c299f3acab617581ea504e45fbb6cab24c2b29fsewardjextern void genReload_ARM ( /*OUT*/HInstr** i1, /*OUT*/HInstr** i2,
10726c299f3acab617581ea504e45fbb6cab24c2b29fsewardj                            HReg rreg, Int offset, Bool );
10736c299f3acab617581ea504e45fbb6cab24c2b29fsewardj
1074a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardjextern const RRegUniverse* getRRegUniverse_ARM ( void );
1075a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardj
1076cacba8e675988fbf21b08feea1f317a9c896c053florianextern HInstrArray* iselSB_ARM   ( const IRSB*,
1077c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj                                   VexArch,
1078d8c64e082224b2e688abdef9219cc76fd82b373bflorian                                   const VexArchInfo*,
1079d8c64e082224b2e688abdef9219cc76fd82b373bflorian                                   const VexAbiInfo*,
1080c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj                                   Int offs_Host_EvC_Counter,
1081c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj                                   Int offs_Host_EvC_FailAddr,
1082c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj                                   Bool chainingAllowed,
1083c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj                                   Bool addProfInc,
1084dcd6d236c9aef7d4c84369d4c51f6b92ac910127florian                                   Addr max_ga );
1085c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj
1086c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj/* How big is an event check?  This is kind of a kludge because it
1087c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj   depends on the offsets of host_EvC_FAILADDR and
1088c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj   host_EvC_COUNTER. */
10897ce2cc883c5b36586babec833838951ecf9f2a76florianextern Int evCheckSzB_ARM (void);
1090c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj
1091c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj/* Perform a chaining and unchaining of an XDirect jump. */
10929b76916dcc1628e133d57db001563429c6e3a590sewardjextern VexInvalRange chainXDirect_ARM ( VexEndness endness_host,
10939b76916dcc1628e133d57db001563429c6e3a590sewardj                                        void* place_to_chain,
10947d6f81de12e6d8deb3e119ab318f361d97a10a65florian                                        const void* disp_cp_chain_me_EXPECTED,
10957d6f81de12e6d8deb3e119ab318f361d97a10a65florian                                        const void* place_to_jump_to );
1096c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj
10979b76916dcc1628e133d57db001563429c6e3a590sewardjextern VexInvalRange unchainXDirect_ARM ( VexEndness endness_host,
10989b76916dcc1628e133d57db001563429c6e3a590sewardj                                          void* place_to_unchain,
10997d6f81de12e6d8deb3e119ab318f361d97a10a65florian                                          const void* place_to_jump_to_EXPECTED,
11007d6f81de12e6d8deb3e119ab318f361d97a10a65florian                                          const void* disp_cp_chain_me );
1101c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj
1102c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj/* Patch the counter location into an existing ProfInc point. */
11039b76916dcc1628e133d57db001563429c6e3a590sewardjextern VexInvalRange patchProfInc_ARM ( VexEndness endness_host,
11049b76916dcc1628e133d57db001563429c6e3a590sewardj                                        void*  place_to_patch,
11057d6f81de12e6d8deb3e119ab318f361d97a10a65florian                                        const ULong* location_of_counter );
1106c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj
11070578287155cb60143bcf70fdf5e1c2beb0b92c07cerion
1108cef7d3e3df4796e35b4521158d9dc058f034aa87sewardj#endif /* ndef __VEX_HOST_ARM_DEFS_H */
11090578287155cb60143bcf70fdf5e1c2beb0b92c07cerion
11100578287155cb60143bcf70fdf5e1c2beb0b92c07cerion/*---------------------------------------------------------------*/
1111cef7d3e3df4796e35b4521158d9dc058f034aa87sewardj/*--- end                                     host_arm_defs.h ---*/
11120578287155cb60143bcf70fdf5e1c2beb0b92c07cerion/*---------------------------------------------------------------*/
1113