main_main.c revision a0664b9ca67b594bd6f570a61d3301167a24750c
1f3652c97c20265d3410ea75d9817e8323b6df5c8florian/* -*- mode: C; c-basic-offset: 3; -*- */
235421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj
335421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj/*---------------------------------------------------------------*/
41f5fe1fc3a37ca729925e8eec25aa1025b4a6cdbcarll/*--- Begin                                       main_main.c ---*/
535421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj/*---------------------------------------------------------------*/
635421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj
7f8ed9d874a7b8651654591c68c6d431c758d787csewardj/*
8752f90673ebbb6b2f55fc5e46606dea371313713sewardj   This file is part of Valgrind, a dynamic binary instrumentation
9752f90673ebbb6b2f55fc5e46606dea371313713sewardj   framework.
10f8ed9d874a7b8651654591c68c6d431c758d787csewardj
11785952d4bf502fa756b2ac58595fd31fe0f88559sewardj   Copyright (C) 2004-2015 OpenWorks LLP
12752f90673ebbb6b2f55fc5e46606dea371313713sewardj      info@open-works.net
137bd6ffe203f3aa9e7b25f7eae40a9b9cf48710cfsewardj
14752f90673ebbb6b2f55fc5e46606dea371313713sewardj   This program is free software; you can redistribute it and/or
15752f90673ebbb6b2f55fc5e46606dea371313713sewardj   modify it under the terms of the GNU General Public License as
16752f90673ebbb6b2f55fc5e46606dea371313713sewardj   published by the Free Software Foundation; either version 2 of the
17752f90673ebbb6b2f55fc5e46606dea371313713sewardj   License, or (at your option) any later version.
187bd6ffe203f3aa9e7b25f7eae40a9b9cf48710cfsewardj
19752f90673ebbb6b2f55fc5e46606dea371313713sewardj   This program is distributed in the hope that it will be useful, but
20752f90673ebbb6b2f55fc5e46606dea371313713sewardj   WITHOUT ANY WARRANTY; without even the implied warranty of
21752f90673ebbb6b2f55fc5e46606dea371313713sewardj   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
22752f90673ebbb6b2f55fc5e46606dea371313713sewardj   General Public License for more details.
23752f90673ebbb6b2f55fc5e46606dea371313713sewardj
24752f90673ebbb6b2f55fc5e46606dea371313713sewardj   You should have received a copy of the GNU General Public License
25752f90673ebbb6b2f55fc5e46606dea371313713sewardj   along with this program; if not, write to the Free Software
26752f90673ebbb6b2f55fc5e46606dea371313713sewardj   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
277bd6ffe203f3aa9e7b25f7eae40a9b9cf48710cfsewardj   02110-1301, USA.
287bd6ffe203f3aa9e7b25f7eae40a9b9cf48710cfsewardj
29752f90673ebbb6b2f55fc5e46606dea371313713sewardj   The GNU General Public License is contained in the file COPYING.
30f8ed9d874a7b8651654591c68c6d431c758d787csewardj
31f8ed9d874a7b8651654591c68c6d431c758d787csewardj   Neither the names of the U.S. Department of Energy nor the
32f8ed9d874a7b8651654591c68c6d431c758d787csewardj   University of California nor the names of its contributors may be
33f8ed9d874a7b8651654591c68c6d431c758d787csewardj   used to endorse or promote products derived from this software
34f8ed9d874a7b8651654591c68c6d431c758d787csewardj   without prior written permission.
35f8ed9d874a7b8651654591c68c6d431c758d787csewardj*/
36f8ed9d874a7b8651654591c68c6d431c758d787csewardj
37887a11a609f3e61d2ae8fe4e67f176207715da7esewardj#include "libvex.h"
3833b024301d2311965cc68dc4cc900f3d0fdd8085florian#include "libvex_emnote.h"
3981ec4189e287a97256f1e0a9fa7c0be316aaefc6sewardj#include "libvex_guest_x86.h"
4044d494dfad0c12f96f61cf9edfc889dfa69e3b30sewardj#include "libvex_guest_amd64.h"
412a9ad023890d3b34cf45e429df2a8ae88b419128sewardj#include "libvex_guest_arm.h"
42bbcf188f6ae64a44fb31414eb9e1a738b4befcc0sewardj#include "libvex_guest_arm64.h"
43aabdfbf4193a965a8c50c643e536129d1d33661bcerion#include "libvex_guest_ppc32.h"
44f0de28cf1a762b0d6f74c93d3532c89a230673bbcerion#include "libvex_guest_ppc64.h"
452019a976f07ff418dde2dfc7cc74667ef66d7764sewardj#include "libvex_guest_s390x.h"
46d0e5fe765fb79e5495206f8d0969133178b871f2sewardj#include "libvex_guest_mips32.h"
47b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj#include "libvex_guest_mips64.h"
480de80192f57cd132b31b233c65734de04939ce65sewardj#include "libvex_guest_tilegx.h"
49f13a16a82132fa2358899c7683193effecf9a56fsewardj
50cef7d3e3df4796e35b4521158d9dc058f034aa87sewardj#include "main_globals.h"
51cef7d3e3df4796e35b4521158d9dc058f034aa87sewardj#include "main_util.h"
52cef7d3e3df4796e35b4521158d9dc058f034aa87sewardj#include "host_generic_regs.h"
53cef7d3e3df4796e35b4521158d9dc058f034aa87sewardj#include "ir_opt.h"
542a9ad023890d3b34cf45e429df2a8ae88b419128sewardj
55cef7d3e3df4796e35b4521158d9dc058f034aa87sewardj#include "host_x86_defs.h"
56cef7d3e3df4796e35b4521158d9dc058f034aa87sewardj#include "host_amd64_defs.h"
57cef7d3e3df4796e35b4521158d9dc058f034aa87sewardj#include "host_ppc_defs.h"
586c299f3acab617581ea504e45fbb6cab24c2b29fsewardj#include "host_arm_defs.h"
59bbcf188f6ae64a44fb31414eb9e1a738b4befcc0sewardj#include "host_arm64_defs.h"
602019a976f07ff418dde2dfc7cc74667ef66d7764sewardj#include "host_s390_defs.h"
61d0e5fe765fb79e5495206f8d0969133178b871f2sewardj#include "host_mips_defs.h"
620de80192f57cd132b31b233c65734de04939ce65sewardj#include "host_tilegx_defs.h"
632a9ad023890d3b34cf45e429df2a8ae88b419128sewardj
64cef7d3e3df4796e35b4521158d9dc058f034aa87sewardj#include "guest_generic_bb_to_IR.h"
65cef7d3e3df4796e35b4521158d9dc058f034aa87sewardj#include "guest_x86_defs.h"
66cef7d3e3df4796e35b4521158d9dc058f034aa87sewardj#include "guest_amd64_defs.h"
67cef7d3e3df4796e35b4521158d9dc058f034aa87sewardj#include "guest_arm_defs.h"
68bbcf188f6ae64a44fb31414eb9e1a738b4befcc0sewardj#include "guest_arm64_defs.h"
69cef7d3e3df4796e35b4521158d9dc058f034aa87sewardj#include "guest_ppc_defs.h"
702019a976f07ff418dde2dfc7cc74667ef66d7764sewardj#include "guest_s390_defs.h"
71d0e5fe765fb79e5495206f8d0969133178b871f2sewardj#include "guest_mips_defs.h"
720de80192f57cd132b31b233c65734de04939ce65sewardj#include "guest_tilegx_defs.h"
7335421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj
7469d98e3853a63e578e039894e2ef00ca6f9878c8sewardj#include "host_generic_simd128.h"
7569d98e3853a63e578e039894e2ef00ca6f9878c8sewardj
7612b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe/* For each architecture <arch>, we define 2 macros:
7712b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe   <arch>FN that has as argument a pointer (typically to a function
7812b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe            or the return value of a function).
7912b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe   <arch>ST that has as argument a statement.
8012b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe   If main_main.c is compiled for <arch>, then these macros just expand
8112b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe   their arg.
8212b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe   Otherwise, the macros expand to respectively NULL and vassert(0).
8312b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe   These macros are used to avoid introducing dependencies to object
8412b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe   files not needed for the (only) architecture we are compiling for.
8512b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe
8612b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe   To still compile the below for all supported architectures, define
8712b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe   VEXMULTIARCH. This is used by the file multiarch_main_main.c */
8812b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe
8912b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe#if defined(VGA_x86) || defined(VEXMULTIARCH)
9012b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe#define X86FN(f) f
9112b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe#define X86ST(f) f
9212b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe#else
9312b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe#define X86FN(f) NULL
9412b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe#define X86ST(f) vassert(0)
9512b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe#endif
9612b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe
9712b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe#if defined(VGA_amd64) || defined(VEXMULTIARCH)
9812b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe#define AMD64FN(f) f
9912b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe#define AMD64ST(f) f
10012b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe#else
10112b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe#define AMD64FN(f) NULL
10212b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe#define AMD64ST(f) vassert(0)
10312b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe#endif
10412b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe
10512b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe#if defined(VGA_ppc32) || defined(VEXMULTIARCH)
10612b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe#define PPC32FN(f) f
10712b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe#define PPC32ST(f) f
10812b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe#else
10912b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe#define PPC32FN(f) NULL
11012b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe#define PPC32ST(f) vassert(0)
11112b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe#endif
11212b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe
11312b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe#if defined(VGA_ppc64be) || defined(VGA_ppc64le) || defined(VEXMULTIARCH)
11412b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe#define PPC64FN(f) f
11512b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe#define PPC64ST(f) f
11612b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe#else
11712b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe#define PPC64FN(f) NULL
11812b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe#define PPC64ST(f) vassert(0)
11912b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe#endif
12012b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe
12112b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe#if defined(VGA_s390x) || defined(VEXMULTIARCH)
12212b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe#define S390FN(f) f
12312b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe#define S390ST(f) f
12412b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe#else
12512b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe#define S390FN(f) NULL
12612b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe#define S390ST(f) vassert(0)
12712b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe#endif
12812b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe
12912b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe#if defined(VGA_arm) || defined(VEXMULTIARCH)
13012b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe#define ARMFN(f) f
13112b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe#define ARMST(f) f
13212b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe#else
13312b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe#define ARMFN(f) NULL
13412b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe#define ARMST(f) vassert(0)
13512b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe#endif
13612b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe
13712b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe#if defined(VGA_arm64) || defined(VEXMULTIARCH)
13812b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe#define ARM64FN(f) f
13912b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe#define ARM64ST(f) f
14012b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe#else
14112b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe#define ARM64FN(f) NULL
14212b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe#define ARM64ST(f) vassert(0)
14312b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe#endif
14412b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe
14512b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe#if defined(VGA_mips32) || defined(VEXMULTIARCH)
14612b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe#define MIPS32FN(f) f
14712b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe#define MIPS32ST(f) f
14812b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe#else
14912b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe#define MIPS32FN(f) NULL
15012b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe#define MIPS32ST(f) vassert(0)
15112b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe#endif
15212b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe
15312b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe#if defined(VGA_mips64) || defined(VEXMULTIARCH)
15412b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe#define MIPS64FN(f) f
15512b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe#define MIPS64ST(f) f
15612b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe#else
15712b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe#define MIPS64FN(f) NULL
15812b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe#define MIPS64ST(f) vassert(0)
15912b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe#endif
16035421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj
1610de80192f57cd132b31b233c65734de04939ce65sewardj#if defined(VGA_tilegx) || defined(VEXMULTIARCH)
1620de80192f57cd132b31b233c65734de04939ce65sewardj#define TILEGXFN(f) f
1630de80192f57cd132b31b233c65734de04939ce65sewardj#define TILEGXST(f) f
1640de80192f57cd132b31b233c65734de04939ce65sewardj#else
1650de80192f57cd132b31b233c65734de04939ce65sewardj#define TILEGXFN(f) NULL
1660de80192f57cd132b31b233c65734de04939ce65sewardj#define TILEGXST(f) vassert(0)
1670de80192f57cd132b31b233c65734de04939ce65sewardj#endif
1680de80192f57cd132b31b233c65734de04939ce65sewardj
1690de80192f57cd132b31b233c65734de04939ce65sewardj
17035421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj/* This file contains the top level interface to the library. */
17135421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj
1725117ce116f47141cb23d1b49cc826e19323add97sewardj/* --------- fwds ... --------- */
1735117ce116f47141cb23d1b49cc826e19323add97sewardj
174f3652c97c20265d3410ea75d9817e8323b6df5c8florianstatic void  check_hwcaps ( VexArch arch, UInt hwcaps );
17555085f8680acc89d727e321f3b34cae1a8c4093aflorianstatic const HChar* show_hwcaps ( VexArch arch, UInt hwcaps );
1765117ce116f47141cb23d1b49cc826e19323add97sewardj
1775117ce116f47141cb23d1b49cc826e19323add97sewardj
1788bde7f1c67483371551aac0d4019c24c919063f7sewardj/* --------- helpers --------- */
1798bde7f1c67483371551aac0d4019c24c919063f7sewardj
1808bde7f1c67483371551aac0d4019c24c919063f7sewardj__attribute__((noinline))
1818bde7f1c67483371551aac0d4019c24c919063f7sewardjstatic UInt udiv32 ( UInt x, UInt y ) { return x/y; }
1828bde7f1c67483371551aac0d4019c24c919063f7sewardj__attribute__((noinline))
1838bde7f1c67483371551aac0d4019c24c919063f7sewardjstatic  Int sdiv32 (  Int x,  Int y ) { return x/y; }
1848bde7f1c67483371551aac0d4019c24c919063f7sewardj
1858bde7f1c67483371551aac0d4019c24c919063f7sewardj
18635421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj/* --------- Initialise the library. --------- */
18735421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj
18835421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj/* Exported to library client. */
18935421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj
19008613749b639323cc7582c1bbe56c6e21c69774fsewardjvoid LibVEX_default_VexControl ( /*OUT*/ VexControl* vcon )
19108613749b639323cc7582c1bbe56c6e21c69774fsewardj{
19265902992da28822e4753594c7b72f7cb177fe3a6sewardj   vex_bzero(vcon, sizeof(*vcon));
193ca2c3c75784d35d136fc7c952717cdee5063c193sewardj   vcon->iropt_verbosity                = 0;
194ca2c3c75784d35d136fc7c952717cdee5063c193sewardj   vcon->iropt_level                    = 2;
195ca2c3c75784d35d136fc7c952717cdee5063c193sewardj   vcon->iropt_register_updates_default = VexRegUpdUnwindregsAtMemAccess;
196ca2c3c75784d35d136fc7c952717cdee5063c193sewardj   vcon->iropt_unroll_thresh            = 120;
197ca2c3c75784d35d136fc7c952717cdee5063c193sewardj   vcon->guest_max_insns                = 60;
198ca2c3c75784d35d136fc7c952717cdee5063c193sewardj   vcon->guest_chase_thresh             = 10;
199ca2c3c75784d35d136fc7c952717cdee5063c193sewardj   vcon->guest_chase_cond               = False;
20008613749b639323cc7582c1bbe56c6e21c69774fsewardj}
20108613749b639323cc7582c1bbe56c6e21c69774fsewardj
20208613749b639323cc7582c1bbe56c6e21c69774fsewardj
20308613749b639323cc7582c1bbe56c6e21c69774fsewardj/* Exported to library client. */
20408613749b639323cc7582c1bbe56c6e21c69774fsewardj
205887a11a609f3e61d2ae8fe4e67f176207715da7esewardjvoid LibVEX_Init (
20635421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj   /* failure exit function */
2072b51587159d1d7c331719886d896c0a9cf217ee4sewardj   __attribute__ ((noreturn))
20835421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj   void (*failure_exit) ( void ),
20935421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj   /* logging output function */
21004fc6b1eab791c7387b81b9fd820f4ae6aaf90a2florian   void (*log_bytes) ( const HChar*, SizeT nbytes ),
21135421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj   /* debug paranoia level */
21235421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj   Int debuglevel,
21308613749b639323cc7582c1bbe56c6e21c69774fsewardj   /* Control ... */
214f72c2c12a06fdfada40f8a42fac44514c2d9c181florian   const VexControl* vcon
21535421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj)
21635421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj{
21708613749b639323cc7582c1bbe56c6e21c69774fsewardj   /* First off, do enough minimal setup so that the following
21808613749b639323cc7582c1bbe56c6e21c69774fsewardj      assertions can fail in a sane fashion, if need be. */
219ea602bc23ecabe934348ef9ea4113a22d4e0bb80sewardj   vex_failure_exit = failure_exit;
220ea602bc23ecabe934348ef9ea4113a22d4e0bb80sewardj   vex_log_bytes    = log_bytes;
221ea602bc23ecabe934348ef9ea4113a22d4e0bb80sewardj
222ea602bc23ecabe934348ef9ea4113a22d4e0bb80sewardj   /* Now it's safe to check parameters for sanity. */
22335421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj   vassert(!vex_initdone);
22435421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj   vassert(failure_exit);
22535421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj   vassert(log_bytes);
22635421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj   vassert(debuglevel >= 0);
22708613749b639323cc7582c1bbe56c6e21c69774fsewardj
22808613749b639323cc7582c1bbe56c6e21c69774fsewardj   vassert(vcon->iropt_verbosity >= 0);
22908613749b639323cc7582c1bbe56c6e21c69774fsewardj   vassert(vcon->iropt_level >= 0);
23008613749b639323cc7582c1bbe56c6e21c69774fsewardj   vassert(vcon->iropt_level <= 2);
23108613749b639323cc7582c1bbe56c6e21c69774fsewardj   vassert(vcon->iropt_unroll_thresh >= 0);
23208613749b639323cc7582c1bbe56c6e21c69774fsewardj   vassert(vcon->iropt_unroll_thresh <= 400);
23308613749b639323cc7582c1bbe56c6e21c69774fsewardj   vassert(vcon->guest_max_insns >= 1);
23408613749b639323cc7582c1bbe56c6e21c69774fsewardj   vassert(vcon->guest_max_insns <= 100);
23508613749b639323cc7582c1bbe56c6e21c69774fsewardj   vassert(vcon->guest_chase_thresh >= 0);
23608613749b639323cc7582c1bbe56c6e21c69774fsewardj   vassert(vcon->guest_chase_thresh < vcon->guest_max_insns);
237984d9b164dd17f07e603c41fe1e506e641e57d18sewardj   vassert(vcon->guest_chase_cond == True
238984d9b164dd17f07e603c41fe1e506e641e57d18sewardj           || vcon->guest_chase_cond == False);
239443cd9d34617dd7608e5dd4b4b0b4674d4f433e7sewardj
240ea602bc23ecabe934348ef9ea4113a22d4e0bb80sewardj   /* Check that Vex has been built with sizes of basic types as
241ea602bc23ecabe934348ef9ea4113a22d4e0bb80sewardj      stated in priv/libvex_basictypes.h.  Failure of any of these is
242ea602bc23ecabe934348ef9ea4113a22d4e0bb80sewardj      a serious configuration error and should be corrected
243ea602bc23ecabe934348ef9ea4113a22d4e0bb80sewardj      immediately.  If any of these assertions fail you can fully
244ea602bc23ecabe934348ef9ea4113a22d4e0bb80sewardj      expect Vex not to work properly, if at all. */
245ea602bc23ecabe934348ef9ea4113a22d4e0bb80sewardj
246ea602bc23ecabe934348ef9ea4113a22d4e0bb80sewardj   vassert(1 == sizeof(UChar));
247ea602bc23ecabe934348ef9ea4113a22d4e0bb80sewardj   vassert(1 == sizeof(Char));
248ea602bc23ecabe934348ef9ea4113a22d4e0bb80sewardj   vassert(2 == sizeof(UShort));
249ea602bc23ecabe934348ef9ea4113a22d4e0bb80sewardj   vassert(2 == sizeof(Short));
250ea602bc23ecabe934348ef9ea4113a22d4e0bb80sewardj   vassert(4 == sizeof(UInt));
251ea602bc23ecabe934348ef9ea4113a22d4e0bb80sewardj   vassert(4 == sizeof(Int));
252ea602bc23ecabe934348ef9ea4113a22d4e0bb80sewardj   vassert(8 == sizeof(ULong));
253ea602bc23ecabe934348ef9ea4113a22d4e0bb80sewardj   vassert(8 == sizeof(Long));
254ea602bc23ecabe934348ef9ea4113a22d4e0bb80sewardj   vassert(4 == sizeof(Float));
255ea602bc23ecabe934348ef9ea4113a22d4e0bb80sewardj   vassert(8 == sizeof(Double));
256ea602bc23ecabe934348ef9ea4113a22d4e0bb80sewardj   vassert(1 == sizeof(Bool));
257ea602bc23ecabe934348ef9ea4113a22d4e0bb80sewardj   vassert(4 == sizeof(Addr32));
258ea602bc23ecabe934348ef9ea4113a22d4e0bb80sewardj   vassert(8 == sizeof(Addr64));
259c9a43665879a03886b27a65b68af2a2c11b04f59sewardj   vassert(16 == sizeof(U128));
26069d98e3853a63e578e039894e2ef00ca6f9878c8sewardj   vassert(16 == sizeof(V128));
261c9069f2908814843e9a4da00da9c8905440195a6sewardj   vassert(32 == sizeof(U256));
262ea602bc23ecabe934348ef9ea4113a22d4e0bb80sewardj
263ea602bc23ecabe934348ef9ea4113a22d4e0bb80sewardj   vassert(sizeof(void*) == 4 || sizeof(void*) == 8);
264ea602bc23ecabe934348ef9ea4113a22d4e0bb80sewardj   vassert(sizeof(void*) == sizeof(int*));
265ea602bc23ecabe934348ef9ea4113a22d4e0bb80sewardj   vassert(sizeof(void*) == sizeof(HWord));
266beac530a718fcc646bc61fe60a86f599df54e1d7florian   vassert(sizeof(void*) == sizeof(Addr));
267beac530a718fcc646bc61fe60a86f599df54e1d7florian   vassert(sizeof(unsigned long) == sizeof(SizeT));
268ea602bc23ecabe934348ef9ea4113a22d4e0bb80sewardj
26997e87935760215710e2d88bd66ca77fdeefd8dd7sewardj   vassert(VEX_HOST_WORDSIZE == sizeof(void*));
27097e87935760215710e2d88bd66ca77fdeefd8dd7sewardj   vassert(VEX_HOST_WORDSIZE == sizeof(HWord));
27197e87935760215710e2d88bd66ca77fdeefd8dd7sewardj
272c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj   /* These take a lot of space, so make sure we don't have
273c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj      any unnoticed size regressions. */
274c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj   if (VEX_HOST_WORDSIZE == 4) {
275420bfa9e0f6bc49d7682d334aa61189b4d50f7b8florian      vassert(sizeof(IRExpr) == 16);
276c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj      vassert(sizeof(IRStmt) == 20 /* x86 */
277c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj              || sizeof(IRStmt) == 24 /* arm */);
278c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj   } else {
279420bfa9e0f6bc49d7682d334aa61189b4d50f7b8florian      vassert(sizeof(IRExpr) == 32);
280d6f38b3f822f7d57adfc0da3410995d85d6a4597florian      vassert(sizeof(IRStmt) == 32);
281c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj   }
282c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj
283a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardj   /* Ditto */
284a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardj   vassert(sizeof(HReg) == 4);
285a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardj   /* If N_RREGUNIVERSE_REGS ever exceeds 64, the bitset fields in
286a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardj      RRegSet and HRegUsage will need to be changed to something
287a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardj      better than ULong. */
288a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardj   vassert(N_RREGUNIVERSE_REGS == 64);
289a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardj
2908bde7f1c67483371551aac0d4019c24c919063f7sewardj   /* Check that signed integer division on the host rounds towards
2918bde7f1c67483371551aac0d4019c24c919063f7sewardj      zero.  If not, h_calc_sdiv32_w_arm_semantics() won't work
2928bde7f1c67483371551aac0d4019c24c919063f7sewardj      correctly. */
2938bde7f1c67483371551aac0d4019c24c919063f7sewardj   /* 100.0 / 7.0 == 14.2857 */
2948bde7f1c67483371551aac0d4019c24c919063f7sewardj   vassert(udiv32(100, 7) == 14);
2958bde7f1c67483371551aac0d4019c24c919063f7sewardj   vassert(sdiv32(100, 7) == 14);
2968bde7f1c67483371551aac0d4019c24c919063f7sewardj   vassert(sdiv32(-100, 7) == -14); /* and not -15 */
2978bde7f1c67483371551aac0d4019c24c919063f7sewardj   vassert(sdiv32(100, -7) == -14); /* ditto */
2988bde7f1c67483371551aac0d4019c24c919063f7sewardj   vassert(sdiv32(-100, -7) == 14); /* not sure what this proves */
2998bde7f1c67483371551aac0d4019c24c919063f7sewardj
300ea602bc23ecabe934348ef9ea4113a22d4e0bb80sewardj   /* Really start up .. */
301443cd9d34617dd7608e5dd4b4b0b4674d4f433e7sewardj   vex_debuglevel         = debuglevel;
30208613749b639323cc7582c1bbe56c6e21c69774fsewardj   vex_control            = *vcon;
303443cd9d34617dd7608e5dd4b4b0b4674d4f433e7sewardj   vex_initdone           = True;
304d887b8634b2c2685f528bd968459c628e8f86a34sewardj   vexSetAllocMode ( VexAllocModeTEMP );
30535421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj}
30635421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj
30735421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj
30835421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj/* --------- Make a translation. --------- */
30912b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe/* KLUDGE: S390 need to know the hwcaps of the host when generating
31012b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe   code. But that info is not passed to emit_S390Instr. Only mode64 is
31112b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe   being passed. So, ideally, we want this passed as an argument, too.
31212b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe   Until then, we use a global variable. This variable is set as a side
31312b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe   effect of LibVEX_Translate. The variable is defined here rather than
31412b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe   in host_s390_defs.c to avoid having main_main.c dragging S390
31512b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe   object files in non VEXMULTIARCH. */
31612b2b5b44516d8b77a308e7ac258a16ec1c9c959philippeUInt s390_host_hwcaps;
31712b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe
31835421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj
31935421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj/* Exported to library client. */
32035421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj
32117c7f95c78bb3c8ced934e41a4bf1aae6d857d59sewardjVexTranslateResult LibVEX_Translate ( VexTranslateArgs* vta )
32235421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj{
32381bd550f9a1d58ceeedb159d18642d9790e75eb4sewardj   /* This the bundle of functions we need to do the back-end stuff
32481bd550f9a1d58ceeedb159d18642d9790e75eb4sewardj      (insn selection, reg-alloc, assembly) whilst being insulated
32581bd550f9a1d58ceeedb159d18642d9790e75eb4sewardj      from the target instruction set. */
326d8c64e082224b2e688abdef9219cc76fd82b373bflorian   Bool         (*isMove)       ( const HInstr*, HReg*, HReg* );
327d8c64e082224b2e688abdef9219cc76fd82b373bflorian   void         (*getRegUsage)  ( HRegUsage*, const HInstr*, Bool );
328fb7373aee5e8a3039f2916ecf09870f3ec0c1805sewardj   void         (*mapRegs)      ( HRegRemap*, HInstr*, Bool );
3296c299f3acab617581ea504e45fbb6cab24c2b29fsewardj   void         (*genSpill)     ( HInstr**, HInstr**, HReg, Int, Bool );
3306c299f3acab617581ea504e45fbb6cab24c2b29fsewardj   void         (*genReload)    ( HInstr**, HInstr**, HReg, Int, Bool );
331fb7373aee5e8a3039f2916ecf09870f3ec0c1805sewardj   HInstr*      (*directReload) ( HInstr*, HReg, Short );
332d8c64e082224b2e688abdef9219cc76fd82b373bflorian   void         (*ppInstr)      ( const HInstr*, Bool );
333fb7373aee5e8a3039f2916ecf09870f3ec0c1805sewardj   void         (*ppReg)        ( HReg );
334cacba8e675988fbf21b08feea1f317a9c896c053florian   HInstrArray* (*iselSB)       ( const IRSB*, VexArch, const VexArchInfo*,
335d8c64e082224b2e688abdef9219cc76fd82b373bflorian                                  const VexAbiInfo*, Int, Int, Bool, Bool,
336dcd6d236c9aef7d4c84369d4c51f6b92ac910127florian                                  Addr );
337c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj   Int          (*emit)         ( /*MB_MOD*/Bool*,
338d8c64e082224b2e688abdef9219cc76fd82b373bflorian                                  UChar*, Int, const HInstr*, Bool, VexEndness,
3398462d113e3efeacceb304222dada8d85f748295aflorian                                  const void*, const void*, const void*,
3408462d113e3efeacceb304222dada8d85f748295aflorian                                  const void* );
3411ff4756e1731485e6bf3cd96717cd8398daec1f2florian   IRExpr*      (*specHelper)   ( const HChar*, IRExpr**, IRStmt**, Int );
342ca2c3c75784d35d136fc7c952717cdee5063c193sewardj   Bool         (*preciseMemExnsFn) ( Int, Int, VexRegisterUpdates );
343f13a16a82132fa2358899c7683193effecf9a56fsewardj
344a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardj   const RRegUniverse* rRegUniv = NULL;
345a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardj
3469e6491ab55324b8e45e187b1e1e9632ac3cb3e27sewardj   DisOneInstrFn disInstrFn;
3479e6491ab55324b8e45e187b1e1e9632ac3cb3e27sewardj
348eeac841fbfcadbc19e97c7ef56bfa3354ba78637sewardj   VexGuestLayout* guest_layout;
349dd40fdf58cc8a6fe9466c4f00bdfc9fe9bf00449sewardj   IRSB*           irsb;
350eeac841fbfcadbc19e97c7ef56bfa3354ba78637sewardj   HInstrArray*    vcode;
351eeac841fbfcadbc19e97c7ef56bfa3354ba78637sewardj   HInstrArray*    rcode;
352eeac841fbfcadbc19e97c7ef56bfa3354ba78637sewardj   Int             i, j, k, out_used, guest_sizeB;
35305f5e0172384dd2983fb16fbb7deebd74d71cd35sewardj   Int             offB_CMSTART, offB_CMLEN, offB_GUEST_IP, szB_GUEST_IP;
354c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj   Int             offB_HOST_EvC_COUNTER, offB_HOST_EvC_FAILADDR;
355b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj   UChar           insn_bytes[128];
356cf7879021370aabcccb1a9347244fcc7d5680141sewardj   IRType          guest_word_type;
357cf7879021370aabcccb1a9347244fcc7d5680141sewardj   IRType          host_word_type;
358c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj   Bool            mode64, chainingAllowed;
359dcd6d236c9aef7d4c84369d4c51f6b92ac910127florian   Addr            max_ga;
360f13a16a82132fa2358899c7683193effecf9a56fsewardj
36149651f4b59b1ab7e0e70cccd34001630eafbe957sewardj   guest_layout           = NULL;
36236ca51378f8851635df814230fa23f2c409b9eddsewardj   isMove                 = NULL;
36336ca51378f8851635df814230fa23f2c409b9eddsewardj   getRegUsage            = NULL;
36436ca51378f8851635df814230fa23f2c409b9eddsewardj   mapRegs                = NULL;
36536ca51378f8851635df814230fa23f2c409b9eddsewardj   genSpill               = NULL;
36636ca51378f8851635df814230fa23f2c409b9eddsewardj   genReload              = NULL;
367fb7373aee5e8a3039f2916ecf09870f3ec0c1805sewardj   directReload           = NULL;
36836ca51378f8851635df814230fa23f2c409b9eddsewardj   ppInstr                = NULL;
36936ca51378f8851635df814230fa23f2c409b9eddsewardj   ppReg                  = NULL;
370dd40fdf58cc8a6fe9466c4f00bdfc9fe9bf00449sewardj   iselSB                 = NULL;
37136ca51378f8851635df814230fa23f2c409b9eddsewardj   emit                   = NULL;
37284ff0657940e62f38e618ea18bac6f27ce0e741fsewardj   specHelper             = NULL;
3738d2291c9199adf1d0d9a5c684932d7ffe6d8e0c9sewardj   preciseMemExnsFn       = NULL;
3749e6491ab55324b8e45e187b1e1e9632ac3cb3e27sewardj   disInstrFn             = NULL;
375cf7879021370aabcccb1a9347244fcc7d5680141sewardj   guest_word_type        = Ity_INVALID;
376cf7879021370aabcccb1a9347244fcc7d5680141sewardj   host_word_type         = Ity_INVALID;
37705f5e0172384dd2983fb16fbb7deebd74d71cd35sewardj   offB_CMSTART           = 0;
37805f5e0172384dd2983fb16fbb7deebd74d71cd35sewardj   offB_CMLEN             = 0;
379c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj   offB_GUEST_IP          = 0;
380c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj   szB_GUEST_IP           = 0;
381c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj   offB_HOST_EvC_COUNTER  = 0;
382c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj   offB_HOST_EvC_FAILADDR = 0;
38392b643609c5fa432b11fc726c2706ae3f3296eb4cerion   mode64                 = False;
384c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj   chainingAllowed        = False;
38536ca51378f8851635df814230fa23f2c409b9eddsewardj
38617c7f95c78bb3c8ced934e41a4bf1aae6d857d59sewardj   vex_traceflags = vta->traceflags;
38758800ff1f3bc35d5cae9885c9d8a51a8d9d33016sewardj
38835421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj   vassert(vex_initdone);
389c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj   vassert(vta->needs_self_check  != NULL);
390c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj   vassert(vta->disp_cp_xassisted != NULL);
391c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj   /* Both the chainers and the indir are either NULL or non-NULL. */
392c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj   if (vta->disp_cp_chain_me_to_slowEP        != NULL) {
393c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj      vassert(vta->disp_cp_chain_me_to_fastEP != NULL);
394c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj      vassert(vta->disp_cp_xindir             != NULL);
395c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj      chainingAllowed = True;
396c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj   } else {
397c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj      vassert(vta->disp_cp_chain_me_to_fastEP == NULL);
398c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj      vassert(vta->disp_cp_xindir             == NULL);
399c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj   }
4002eeeb9bc9367c26449deaa632e9f8eafa60c4685florian
4012d6b14aa64df2ff85f8da143516779d5d43574cbsewardj   vexSetAllocModeTEMP_and_clear();
4022d6b14aa64df2ff85f8da143516779d5d43574cbsewardj   vexAllocSanityCheck();
4032a9ad023890d3b34cf45e429df2a8ae88b419128sewardj
404f13a16a82132fa2358899c7683193effecf9a56fsewardj   /* First off, check that the guest and host insn sets
405f13a16a82132fa2358899c7683193effecf9a56fsewardj      are supported. */
4062a9ad023890d3b34cf45e429df2a8ae88b419128sewardj
40717c7f95c78bb3c8ced934e41a4bf1aae6d857d59sewardj   switch (vta->arch_host) {
4082a9ad023890d3b34cf45e429df2a8ae88b419128sewardj
409bef170b7e84713d1e2181b9204d9415d29de3d65sewardj      case VexArchX86:
410fb7373aee5e8a3039f2916ecf09870f3ec0c1805sewardj         mode64       = False;
41112b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe         rRegUniv     = X86FN(getRRegUniverse_X86());
41212b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe         isMove       = (__typeof__(isMove)) X86FN(isMove_X86Instr);
41312b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe         getRegUsage
41412b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe            = (__typeof__(getRegUsage)) X86FN(getRegUsage_X86Instr);
41512b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe         mapRegs      = (__typeof__(mapRegs)) X86FN(mapRegs_X86Instr);
41612b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe         genSpill     = (__typeof__(genSpill)) X86FN(genSpill_X86);
41712b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe         genReload    = (__typeof__(genReload)) X86FN(genReload_X86);
41812b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe         directReload = (__typeof__(directReload)) X86FN(directReload_X86);
41912b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe         ppInstr      = (__typeof__(ppInstr)) X86FN(ppX86Instr);
42012b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe         ppReg        = (__typeof__(ppReg)) X86FN(ppHRegX86);
42112b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe         iselSB       = X86FN(iselSB_X86);
42212b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe         emit         = (__typeof__(emit)) X86FN(emit_X86Instr);
423a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardj         host_word_type = Ity_I32;
4249b76916dcc1628e133d57db001563429c6e3a590sewardj         vassert(vta->archinfo_host.endness == VexEndnessLE);
425f13a16a82132fa2358899c7683193effecf9a56fsewardj         break;
4262a9ad023890d3b34cf45e429df2a8ae88b419128sewardj
427c33671d7b0e21edb1d1015e4cbccbc6ca139e6d8sewardj      case VexArchAMD64:
428a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardj         mode64       = True;
42912b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe         rRegUniv     = AMD64FN(getRRegUniverse_AMD64());
43012b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe         isMove       = (__typeof__(isMove)) AMD64FN(isMove_AMD64Instr);
43112b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe         getRegUsage
43212b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe            = (__typeof__(getRegUsage)) AMD64FN(getRegUsage_AMD64Instr);
43312b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe         mapRegs      = (__typeof__(mapRegs)) AMD64FN(mapRegs_AMD64Instr);
43412b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe         genSpill     = (__typeof__(genSpill)) AMD64FN(genSpill_AMD64);
43512b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe         genReload    = (__typeof__(genReload)) AMD64FN(genReload_AMD64);
43612b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe         ppInstr      = (__typeof__(ppInstr)) AMD64FN(ppAMD64Instr);
43712b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe         ppReg        = (__typeof__(ppReg)) AMD64FN(ppHRegAMD64);
43812b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe         iselSB       = AMD64FN(iselSB_AMD64);
43912b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe         emit         = (__typeof__(emit)) AMD64FN(emit_AMD64Instr);
440a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardj         host_word_type = Ity_I64;
4419b76916dcc1628e133d57db001563429c6e3a590sewardj         vassert(vta->archinfo_host.endness == VexEndnessLE);
442c33671d7b0e21edb1d1015e4cbccbc6ca139e6d8sewardj         break;
443c33671d7b0e21edb1d1015e4cbccbc6ca139e6d8sewardj
444487e4c9a453dfd32d87dbd4a51fac8aec054d563cerion      case VexArchPPC32:
445a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardj         mode64       = False;
44612b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe         rRegUniv     = PPC32FN(getRRegUniverse_PPC(mode64));
44712b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe         isMove       = (__typeof__(isMove)) PPC32FN(isMove_PPCInstr);
44812b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe         getRegUsage
44912b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe            = (__typeof__(getRegUsage)) PPC32FN(getRegUsage_PPCInstr);
45012b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe         mapRegs      = (__typeof__(mapRegs)) PPC32FN(mapRegs_PPCInstr);
45112b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe         genSpill     = (__typeof__(genSpill)) PPC32FN(genSpill_PPC);
45212b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe         genReload    = (__typeof__(genReload)) PPC32FN(genReload_PPC);
45312b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe         ppInstr      = (__typeof__(ppInstr)) PPC32FN(ppPPCInstr);
45412b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe         ppReg        = (__typeof__(ppReg)) PPC32FN(ppHRegPPC);
45512b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe         iselSB       = PPC32FN(iselSB_PPC);
45612b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe         emit         = (__typeof__(emit)) PPC32FN(emit_PPCInstr);
457a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardj         host_word_type = Ity_I32;
4589b76916dcc1628e133d57db001563429c6e3a590sewardj         vassert(vta->archinfo_host.endness == VexEndnessBE);
459487e4c9a453dfd32d87dbd4a51fac8aec054d563cerion         break;
460487e4c9a453dfd32d87dbd4a51fac8aec054d563cerion
461f0de28cf1a762b0d6f74c93d3532c89a230673bbcerion      case VexArchPPC64:
462a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardj         mode64       = True;
46312b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe         rRegUniv     = PPC64FN(getRRegUniverse_PPC(mode64));
46412b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe         isMove       = (__typeof__(isMove)) PPC64FN(isMove_PPCInstr);
46512b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe         getRegUsage
46612b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe            = (__typeof__(getRegUsage)) PPC64FN(getRegUsage_PPCInstr);
46712b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe         mapRegs      = (__typeof__(mapRegs)) PPC64FN(mapRegs_PPCInstr);
46812b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe         genSpill     = (__typeof__(genSpill)) PPC64FN(genSpill_PPC);
46912b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe         genReload    = (__typeof__(genReload)) PPC64FN(genReload_PPC);
47012b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe         ppInstr      = (__typeof__(ppInstr)) PPC64FN(ppPPCInstr);
47112b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe         ppReg        = (__typeof__(ppReg)) PPC64FN(ppHRegPPC);
47212b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe         iselSB       = PPC64FN(iselSB_PPC);
47312b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe         emit         = (__typeof__(emit)) PPC64FN(emit_PPCInstr);
474a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardj         host_word_type = Ity_I64;
4751f5fe1fc3a37ca729925e8eec25aa1025b4a6cdbcarll         vassert(vta->archinfo_host.endness == VexEndnessBE ||
4761f5fe1fc3a37ca729925e8eec25aa1025b4a6cdbcarll                 vta->archinfo_host.endness == VexEndnessLE );
477f0de28cf1a762b0d6f74c93d3532c89a230673bbcerion         break;
478f0de28cf1a762b0d6f74c93d3532c89a230673bbcerion
4792019a976f07ff418dde2dfc7cc74667ef66d7764sewardj      case VexArchS390X:
480a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardj         mode64       = True;
4813eb7babfeab2edfba2dc13dd1b86444b0c2674c2florian         /* KLUDGE: export hwcaps. */
4823eb7babfeab2edfba2dc13dd1b86444b0c2674c2florian         s390_host_hwcaps = vta->archinfo_host.hwcaps;
48312b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe         rRegUniv     = S390FN(getRRegUniverse_S390());
48412b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe         isMove       = (__typeof__(isMove)) S390FN(isMove_S390Instr);
48512b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe         getRegUsage
48612b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe            = (__typeof__(getRegUsage)) S390FN(getRegUsage_S390Instr);
48712b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe         mapRegs      = (__typeof__(mapRegs)) S390FN(mapRegs_S390Instr);
48812b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe         genSpill     = (__typeof__(genSpill)) S390FN(genSpill_S390);
48912b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe         genReload    = (__typeof__(genReload)) S390FN(genReload_S390);
490017c0d529daefd1f76c7d00a90b8cc810cc8e410florian         // fixs390: consider implementing directReload_S390
49112b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe         ppInstr      = (__typeof__(ppInstr)) S390FN(ppS390Instr);
49212b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe         ppReg        = (__typeof__(ppReg)) S390FN(ppHRegS390);
49312b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe         iselSB       = S390FN(iselSB_S390);
49412b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe         emit         = (__typeof__(emit)) S390FN(emit_S390Instr);
495a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardj         host_word_type = Ity_I64;
4969b76916dcc1628e133d57db001563429c6e3a590sewardj         vassert(vta->archinfo_host.endness == VexEndnessBE);
4972019a976f07ff418dde2dfc7cc74667ef66d7764sewardj         break;
4982019a976f07ff418dde2dfc7cc74667ef66d7764sewardj
4996c299f3acab617581ea504e45fbb6cab24c2b29fsewardj      case VexArchARM:
500a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardj         mode64       = False;
50112b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe         rRegUniv     = ARMFN(getRRegUniverse_ARM());
50212b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe         isMove       = (__typeof__(isMove)) ARMFN(isMove_ARMInstr);
50312b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe         getRegUsage
50412b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe            = (__typeof__(getRegUsage)) ARMFN(getRegUsage_ARMInstr);
50512b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe         mapRegs      = (__typeof__(mapRegs)) ARMFN(mapRegs_ARMInstr);
50612b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe         genSpill     = (__typeof__(genSpill)) ARMFN(genSpill_ARM);
50712b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe         genReload    = (__typeof__(genReload)) ARMFN(genReload_ARM);
50812b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe         ppInstr      = (__typeof__(ppInstr)) ARMFN(ppARMInstr);
50912b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe         ppReg        = (__typeof__(ppReg)) ARMFN(ppHRegARM);
51012b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe         iselSB       = ARMFN(iselSB_ARM);
51112b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe         emit         = (__typeof__(emit)) ARMFN(emit_ARMInstr);
512a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardj         host_word_type = Ity_I32;
5139b76916dcc1628e133d57db001563429c6e3a590sewardj         vassert(vta->archinfo_host.endness == VexEndnessLE);
5146c299f3acab617581ea504e45fbb6cab24c2b29fsewardj         break;
5156c299f3acab617581ea504e45fbb6cab24c2b29fsewardj
516bbcf188f6ae64a44fb31414eb9e1a738b4befcc0sewardj      case VexArchARM64:
517a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardj         mode64       = True;
51812b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe         rRegUniv     = ARM64FN(getRRegUniverse_ARM64());
51912b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe         isMove       = (__typeof__(isMove)) ARM64FN(isMove_ARM64Instr);
52012b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe         getRegUsage
52112b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe            = (__typeof__(getRegUsage)) ARM64FN(getRegUsage_ARM64Instr);
52212b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe         mapRegs      = (__typeof__(mapRegs)) ARM64FN(mapRegs_ARM64Instr);
52312b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe         genSpill     = (__typeof__(genSpill)) ARM64FN(genSpill_ARM64);
52412b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe         genReload    = (__typeof__(genReload)) ARM64FN(genReload_ARM64);
52512b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe         ppInstr      = (__typeof__(ppInstr)) ARM64FN(ppARM64Instr);
52612b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe         ppReg        = (__typeof__(ppReg)) ARM64FN(ppHRegARM64);
52712b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe         iselSB       = ARM64FN(iselSB_ARM64);
52812b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe         emit         = (__typeof__(emit)) ARM64FN(emit_ARM64Instr);
529a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardj         host_word_type = Ity_I64;
5309b76916dcc1628e133d57db001563429c6e3a590sewardj         vassert(vta->archinfo_host.endness == VexEndnessLE);
531bbcf188f6ae64a44fb31414eb9e1a738b4befcc0sewardj         break;
532bbcf188f6ae64a44fb31414eb9e1a738b4befcc0sewardj
533d0e5fe765fb79e5495206f8d0969133178b871f2sewardj      case VexArchMIPS32:
534a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardj         mode64       = False;
53512b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe         rRegUniv     = MIPS32FN(getRRegUniverse_MIPS(mode64));
53612b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe         isMove       = (__typeof__(isMove)) MIPS32FN(isMove_MIPSInstr);
53712b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe         getRegUsage
53812b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe            = (__typeof__(getRegUsage)) MIPS32FN(getRegUsage_MIPSInstr);
53912b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe         mapRegs      = (__typeof__(mapRegs)) MIPS32FN(mapRegs_MIPSInstr);
54012b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe         genSpill     = (__typeof__(genSpill)) MIPS32FN(genSpill_MIPS);
54112b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe         genReload    = (__typeof__(genReload)) MIPS32FN(genReload_MIPS);
54212b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe         ppInstr      = (__typeof__(ppInstr)) MIPS32FN(ppMIPSInstr);
54312b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe         ppReg        = (__typeof__(ppReg)) MIPS32FN(ppHRegMIPS);
54412b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe         iselSB       = MIPS32FN(iselSB_MIPS);
54512b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe         emit         = (__typeof__(emit)) MIPS32FN(emit_MIPSInstr);
546a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardj         host_word_type = Ity_I32;
5479b76916dcc1628e133d57db001563429c6e3a590sewardj         vassert(vta->archinfo_host.endness == VexEndnessLE
5489b76916dcc1628e133d57db001563429c6e3a590sewardj                 || vta->archinfo_host.endness == VexEndnessBE);
549d0e5fe765fb79e5495206f8d0969133178b871f2sewardj         break;
550d0e5fe765fb79e5495206f8d0969133178b871f2sewardj
551b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj      case VexArchMIPS64:
552a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardj         mode64       = True;
55312b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe         rRegUniv     = MIPS64FN(getRRegUniverse_MIPS(mode64));
55412b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe         isMove       = (__typeof__(isMove)) MIPS64FN(isMove_MIPSInstr);
55512b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe         getRegUsage
55612b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe            = (__typeof__(getRegUsage)) MIPS64FN(getRegUsage_MIPSInstr);
55712b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe         mapRegs      = (__typeof__(mapRegs)) MIPS64FN(mapRegs_MIPSInstr);
55812b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe         genSpill     = (__typeof__(genSpill)) MIPS64FN(genSpill_MIPS);
55912b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe         genReload    = (__typeof__(genReload)) MIPS64FN(genReload_MIPS);
56012b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe         ppInstr      = (__typeof__(ppInstr)) MIPS64FN(ppMIPSInstr);
56112b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe         ppReg        = (__typeof__(ppReg)) MIPS64FN(ppHRegMIPS);
56212b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe         iselSB       = MIPS64FN(iselSB_MIPS);
56312b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe         emit         = (__typeof__(emit)) MIPS64FN(emit_MIPSInstr);
564a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardj         host_word_type = Ity_I64;
5659b76916dcc1628e133d57db001563429c6e3a590sewardj         vassert(vta->archinfo_host.endness == VexEndnessLE
5669b76916dcc1628e133d57db001563429c6e3a590sewardj                 || vta->archinfo_host.endness == VexEndnessBE);
567b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj         break;
568b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj
5690de80192f57cd132b31b233c65734de04939ce65sewardj      case VexArchTILEGX:
5700de80192f57cd132b31b233c65734de04939ce65sewardj         mode64      = True;
5710de80192f57cd132b31b233c65734de04939ce65sewardj         rRegUniv    = TILEGXFN(getRRegUniverse_TILEGX());
5720de80192f57cd132b31b233c65734de04939ce65sewardj         isMove      = (__typeof__(isMove)) TILEGXFN(isMove_TILEGXInstr);
5730de80192f57cd132b31b233c65734de04939ce65sewardj         getRegUsage =
5740de80192f57cd132b31b233c65734de04939ce65sewardj            (__typeof__(getRegUsage)) TILEGXFN(getRegUsage_TILEGXInstr);
5750de80192f57cd132b31b233c65734de04939ce65sewardj         mapRegs     = (__typeof__(mapRegs)) TILEGXFN(mapRegs_TILEGXInstr);
5760de80192f57cd132b31b233c65734de04939ce65sewardj         genSpill    = (__typeof__(genSpill)) TILEGXFN(genSpill_TILEGX);
5770de80192f57cd132b31b233c65734de04939ce65sewardj         genReload   = (__typeof__(genReload)) TILEGXFN(genReload_TILEGX);
5780de80192f57cd132b31b233c65734de04939ce65sewardj         ppInstr     = (__typeof__(ppInstr)) TILEGXFN(ppTILEGXInstr);
5790de80192f57cd132b31b233c65734de04939ce65sewardj         ppReg       = (__typeof__(ppReg)) TILEGXFN(ppHRegTILEGX);
5800de80192f57cd132b31b233c65734de04939ce65sewardj         iselSB      = TILEGXFN(iselSB_TILEGX);
5810de80192f57cd132b31b233c65734de04939ce65sewardj         emit        = (__typeof__(emit)) TILEGXFN(emit_TILEGXInstr);
5820de80192f57cd132b31b233c65734de04939ce65sewardj         host_word_type    = Ity_I64;
5830de80192f57cd132b31b233c65734de04939ce65sewardj         vassert(vta->archinfo_host.endness == VexEndnessLE);
5840de80192f57cd132b31b233c65734de04939ce65sewardj         break;
5850de80192f57cd132b31b233c65734de04939ce65sewardj
586f13a16a82132fa2358899c7683193effecf9a56fsewardj      default:
5876c299f3acab617581ea504e45fbb6cab24c2b29fsewardj         vpanic("LibVEX_Translate: unsupported host insn set");
588f13a16a82132fa2358899c7683193effecf9a56fsewardj   }
589f13a16a82132fa2358899c7683193effecf9a56fsewardj
590f3652c97c20265d3410ea75d9817e8323b6df5c8florian   // Are the host's hardware capabilities feasible. The function will
591f3652c97c20265d3410ea75d9817e8323b6df5c8florian   // not return if hwcaps are infeasible in some sense.
592f3652c97c20265d3410ea75d9817e8323b6df5c8florian   check_hwcaps(vta->arch_host, vta->archinfo_host.hwcaps);
5932a9ad023890d3b34cf45e429df2a8ae88b419128sewardj
59417c7f95c78bb3c8ced934e41a4bf1aae6d857d59sewardj   switch (vta->arch_guest) {
5952a9ad023890d3b34cf45e429df2a8ae88b419128sewardj
596bef170b7e84713d1e2181b9204d9415d29de3d65sewardj      case VexArchX86:
59712b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe         preciseMemExnsFn
59812b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe            = X86FN(guest_x86_state_requires_precise_mem_exns);
59912b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe         disInstrFn             = X86FN(disInstr_X86);
60012b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe         specHelper             = X86FN(guest_x86_spechelper);
601c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj         guest_sizeB            = sizeof(VexGuestX86State);
602c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj         guest_word_type        = Ity_I32;
60312b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe         guest_layout           = X86FN(&x86guest_layout);
60405f5e0172384dd2983fb16fbb7deebd74d71cd35sewardj         offB_CMSTART           = offsetof(VexGuestX86State,guest_CMSTART);
60505f5e0172384dd2983fb16fbb7deebd74d71cd35sewardj         offB_CMLEN             = offsetof(VexGuestX86State,guest_CMLEN);
606c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj         offB_GUEST_IP          = offsetof(VexGuestX86State,guest_EIP);
607c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj         szB_GUEST_IP           = sizeof( ((VexGuestX86State*)0)->guest_EIP );
608c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj         offB_HOST_EvC_COUNTER  = offsetof(VexGuestX86State,host_EvC_COUNTER);
609c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj         offB_HOST_EvC_FAILADDR = offsetof(VexGuestX86State,host_EvC_FAILADDR);
6109b76916dcc1628e133d57db001563429c6e3a590sewardj         vassert(vta->archinfo_guest.endness == VexEndnessLE);
6115074b493ae4af5e6017fac208f823d283c6123c0florian         vassert(0 == sizeof(VexGuestX86State) % LibVEX_GUEST_STATE_ALIGN);
61205f5e0172384dd2983fb16fbb7deebd74d71cd35sewardj         vassert(sizeof( ((VexGuestX86State*)0)->guest_CMSTART) == 4);
61305f5e0172384dd2983fb16fbb7deebd74d71cd35sewardj         vassert(sizeof( ((VexGuestX86State*)0)->guest_CMLEN  ) == 4);
614ce02aa77bc02dbe225a068df0fb6b31faddedcdfsewardj         vassert(sizeof( ((VexGuestX86State*)0)->guest_NRADDR ) == 4);
615f13a16a82132fa2358899c7683193effecf9a56fsewardj         break;
6162a9ad023890d3b34cf45e429df2a8ae88b419128sewardj
61744d494dfad0c12f96f61cf9edfc889dfa69e3b30sewardj      case VexArchAMD64:
61812b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe         preciseMemExnsFn
61912b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe            = AMD64FN(guest_amd64_state_requires_precise_mem_exns);
62012b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe         disInstrFn             = AMD64FN(disInstr_AMD64);
62112b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe         specHelper             = AMD64FN(guest_amd64_spechelper);
622c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj         guest_sizeB            = sizeof(VexGuestAMD64State);
623c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj         guest_word_type        = Ity_I64;
62412b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe         guest_layout           = AMD64FN(&amd64guest_layout);
62505f5e0172384dd2983fb16fbb7deebd74d71cd35sewardj         offB_CMSTART           = offsetof(VexGuestAMD64State,guest_CMSTART);
62605f5e0172384dd2983fb16fbb7deebd74d71cd35sewardj         offB_CMLEN             = offsetof(VexGuestAMD64State,guest_CMLEN);
627c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj         offB_GUEST_IP          = offsetof(VexGuestAMD64State,guest_RIP);
628c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj         szB_GUEST_IP           = sizeof( ((VexGuestAMD64State*)0)->guest_RIP );
629c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj         offB_HOST_EvC_COUNTER  = offsetof(VexGuestAMD64State,host_EvC_COUNTER);
630c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj         offB_HOST_EvC_FAILADDR = offsetof(VexGuestAMD64State,host_EvC_FAILADDR);
6319b76916dcc1628e133d57db001563429c6e3a590sewardj         vassert(vta->archinfo_guest.endness == VexEndnessLE);
6325074b493ae4af5e6017fac208f823d283c6123c0florian         vassert(0 == sizeof(VexGuestAMD64State) % LibVEX_GUEST_STATE_ALIGN);
63305f5e0172384dd2983fb16fbb7deebd74d71cd35sewardj         vassert(sizeof( ((VexGuestAMD64State*)0)->guest_CMSTART ) == 8);
63405f5e0172384dd2983fb16fbb7deebd74d71cd35sewardj         vassert(sizeof( ((VexGuestAMD64State*)0)->guest_CMLEN   ) == 8);
635ce02aa77bc02dbe225a068df0fb6b31faddedcdfsewardj         vassert(sizeof( ((VexGuestAMD64State*)0)->guest_NRADDR  ) == 8);
63644d494dfad0c12f96f61cf9edfc889dfa69e3b30sewardj         break;
63744d494dfad0c12f96f61cf9edfc889dfa69e3b30sewardj
638aabdfbf4193a965a8c50c643e536129d1d33661bcerion      case VexArchPPC32:
63912b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe         preciseMemExnsFn
64012b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe            = PPC32FN(guest_ppc32_state_requires_precise_mem_exns);
64112b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe         disInstrFn             = PPC32FN(disInstr_PPC);
64212b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe         specHelper             = PPC32FN(guest_ppc32_spechelper);
6433dee849ec7c38746749065e67dc53b75daa7617dsewardj         guest_sizeB            = sizeof(VexGuestPPC32State);
6443dee849ec7c38746749065e67dc53b75daa7617dsewardj         guest_word_type        = Ity_I32;
64512b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe         guest_layout           = PPC32FN(&ppc32Guest_layout);
64605f5e0172384dd2983fb16fbb7deebd74d71cd35sewardj         offB_CMSTART           = offsetof(VexGuestPPC32State,guest_CMSTART);
64705f5e0172384dd2983fb16fbb7deebd74d71cd35sewardj         offB_CMLEN             = offsetof(VexGuestPPC32State,guest_CMLEN);
6483dee849ec7c38746749065e67dc53b75daa7617dsewardj         offB_GUEST_IP          = offsetof(VexGuestPPC32State,guest_CIA);
6493dee849ec7c38746749065e67dc53b75daa7617dsewardj         szB_GUEST_IP           = sizeof( ((VexGuestPPC32State*)0)->guest_CIA );
6503dee849ec7c38746749065e67dc53b75daa7617dsewardj         offB_HOST_EvC_COUNTER  = offsetof(VexGuestPPC32State,host_EvC_COUNTER);
6513dee849ec7c38746749065e67dc53b75daa7617dsewardj         offB_HOST_EvC_FAILADDR = offsetof(VexGuestPPC32State,host_EvC_FAILADDR);
6529b76916dcc1628e133d57db001563429c6e3a590sewardj         vassert(vta->archinfo_guest.endness == VexEndnessBE);
6535074b493ae4af5e6017fac208f823d283c6123c0florian         vassert(0 == sizeof(VexGuestPPC32State) % LibVEX_GUEST_STATE_ALIGN);
65405f5e0172384dd2983fb16fbb7deebd74d71cd35sewardj         vassert(sizeof( ((VexGuestPPC32State*)0)->guest_CMSTART ) == 4);
65505f5e0172384dd2983fb16fbb7deebd74d71cd35sewardj         vassert(sizeof( ((VexGuestPPC32State*)0)->guest_CMLEN   ) == 4);
656ce02aa77bc02dbe225a068df0fb6b31faddedcdfsewardj         vassert(sizeof( ((VexGuestPPC32State*)0)->guest_NRADDR  ) == 4);
657aabdfbf4193a965a8c50c643e536129d1d33661bcerion         break;
658aabdfbf4193a965a8c50c643e536129d1d33661bcerion
659f0de28cf1a762b0d6f74c93d3532c89a230673bbcerion      case VexArchPPC64:
66012b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe         preciseMemExnsFn
66112b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe            = PPC64FN(guest_ppc64_state_requires_precise_mem_exns);
66212b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe         disInstrFn             = PPC64FN(disInstr_PPC);
66312b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe         specHelper             = PPC64FN(guest_ppc64_spechelper);
6649e1cf1522d17dd5ca8a0599168a4d38ead0b71eesewardj         guest_sizeB            = sizeof(VexGuestPPC64State);
6659e1cf1522d17dd5ca8a0599168a4d38ead0b71eesewardj         guest_word_type        = Ity_I64;
66612b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe         guest_layout           = PPC64FN(&ppc64Guest_layout);
66705f5e0172384dd2983fb16fbb7deebd74d71cd35sewardj         offB_CMSTART           = offsetof(VexGuestPPC64State,guest_CMSTART);
66805f5e0172384dd2983fb16fbb7deebd74d71cd35sewardj         offB_CMLEN             = offsetof(VexGuestPPC64State,guest_CMLEN);
6699e1cf1522d17dd5ca8a0599168a4d38ead0b71eesewardj         offB_GUEST_IP          = offsetof(VexGuestPPC64State,guest_CIA);
6709e1cf1522d17dd5ca8a0599168a4d38ead0b71eesewardj         szB_GUEST_IP           = sizeof( ((VexGuestPPC64State*)0)->guest_CIA );
6719e1cf1522d17dd5ca8a0599168a4d38ead0b71eesewardj         offB_HOST_EvC_COUNTER  = offsetof(VexGuestPPC64State,host_EvC_COUNTER);
6729e1cf1522d17dd5ca8a0599168a4d38ead0b71eesewardj         offB_HOST_EvC_FAILADDR = offsetof(VexGuestPPC64State,host_EvC_FAILADDR);
6731f5fe1fc3a37ca729925e8eec25aa1025b4a6cdbcarll         vassert(vta->archinfo_guest.endness == VexEndnessBE ||
6741f5fe1fc3a37ca729925e8eec25aa1025b4a6cdbcarll                 vta->archinfo_guest.endness == VexEndnessLE );
6755074b493ae4af5e6017fac208f823d283c6123c0florian         vassert(0 == sizeof(VexGuestPPC64State) % LibVEX_GUEST_STATE_ALIGN);
67605f5e0172384dd2983fb16fbb7deebd74d71cd35sewardj         vassert(sizeof( ((VexGuestPPC64State*)0)->guest_CMSTART    ) == 8);
67705f5e0172384dd2983fb16fbb7deebd74d71cd35sewardj         vassert(sizeof( ((VexGuestPPC64State*)0)->guest_CMLEN      ) == 8);
6783fd3967db856eb90b2030ebeb42b685d45bc3276sewardj         vassert(sizeof( ((VexGuestPPC64State*)0)->guest_NRADDR     ) == 8);
6793fd3967db856eb90b2030ebeb42b685d45bc3276sewardj         vassert(sizeof( ((VexGuestPPC64State*)0)->guest_NRADDR_GPR2) == 8);
680f0de28cf1a762b0d6f74c93d3532c89a230673bbcerion         break;
681f0de28cf1a762b0d6f74c93d3532c89a230673bbcerion
6822019a976f07ff418dde2dfc7cc74667ef66d7764sewardj      case VexArchS390X:
68312b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe         preciseMemExnsFn
68412b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe            = S390FN(guest_s390x_state_requires_precise_mem_exns);
68512b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe         disInstrFn       = S390FN(disInstr_S390);
68612b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe         specHelper       = S390FN(guest_s390x_spechelper);
6872019a976f07ff418dde2dfc7cc74667ef66d7764sewardj         guest_sizeB      = sizeof(VexGuestS390XState);
6882019a976f07ff418dde2dfc7cc74667ef66d7764sewardj         guest_word_type  = Ity_I64;
68912b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe         guest_layout     = S390FN(&s390xGuest_layout);
69005f5e0172384dd2983fb16fbb7deebd74d71cd35sewardj         offB_CMSTART     = offsetof(VexGuestS390XState,guest_CMSTART);
69105f5e0172384dd2983fb16fbb7deebd74d71cd35sewardj         offB_CMLEN       = offsetof(VexGuestS390XState,guest_CMLEN);
6928844a6329d275814456e3a2a5a7bffac75da0957florian         offB_GUEST_IP          = offsetof(VexGuestS390XState,guest_IA);
6938844a6329d275814456e3a2a5a7bffac75da0957florian         szB_GUEST_IP           = sizeof( ((VexGuestS390XState*)0)->guest_IA);
6948844a6329d275814456e3a2a5a7bffac75da0957florian         offB_HOST_EvC_COUNTER  = offsetof(VexGuestS390XState,host_EvC_COUNTER);
6958844a6329d275814456e3a2a5a7bffac75da0957florian         offB_HOST_EvC_FAILADDR = offsetof(VexGuestS390XState,host_EvC_FAILADDR);
6969b76916dcc1628e133d57db001563429c6e3a590sewardj         vassert(vta->archinfo_guest.endness == VexEndnessBE);
6975074b493ae4af5e6017fac208f823d283c6123c0florian         vassert(0 == sizeof(VexGuestS390XState) % LibVEX_GUEST_STATE_ALIGN);
69805f5e0172384dd2983fb16fbb7deebd74d71cd35sewardj         vassert(sizeof( ((VexGuestS390XState*)0)->guest_CMSTART    ) == 8);
69905f5e0172384dd2983fb16fbb7deebd74d71cd35sewardj         vassert(sizeof( ((VexGuestS390XState*)0)->guest_CMLEN      ) == 8);
7002019a976f07ff418dde2dfc7cc74667ef66d7764sewardj         vassert(sizeof( ((VexGuestS390XState*)0)->guest_NRADDR     ) == 8);
7012019a976f07ff418dde2dfc7cc74667ef66d7764sewardj         break;
7022019a976f07ff418dde2dfc7cc74667ef66d7764sewardj
7036c299f3acab617581ea504e45fbb6cab24c2b29fsewardj      case VexArchARM:
70412b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe         preciseMemExnsFn
70512b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe            = ARMFN(guest_arm_state_requires_precise_mem_exns);
70612b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe         disInstrFn             = ARMFN(disInstr_ARM);
70712b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe         specHelper             = ARMFN(guest_arm_spechelper);
708c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj         guest_sizeB            = sizeof(VexGuestARMState);
709c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj         guest_word_type        = Ity_I32;
71012b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe         guest_layout           = ARMFN(&armGuest_layout);
71105f5e0172384dd2983fb16fbb7deebd74d71cd35sewardj         offB_CMSTART           = offsetof(VexGuestARMState,guest_CMSTART);
71205f5e0172384dd2983fb16fbb7deebd74d71cd35sewardj         offB_CMLEN             = offsetof(VexGuestARMState,guest_CMLEN);
713c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj         offB_GUEST_IP          = offsetof(VexGuestARMState,guest_R15T);
714c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj         szB_GUEST_IP           = sizeof( ((VexGuestARMState*)0)->guest_R15T );
715c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj         offB_HOST_EvC_COUNTER  = offsetof(VexGuestARMState,host_EvC_COUNTER);
716c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj         offB_HOST_EvC_FAILADDR = offsetof(VexGuestARMState,host_EvC_FAILADDR);
7179b76916dcc1628e133d57db001563429c6e3a590sewardj         vassert(vta->archinfo_guest.endness == VexEndnessLE);
7185074b493ae4af5e6017fac208f823d283c6123c0florian         vassert(0 == sizeof(VexGuestARMState) % LibVEX_GUEST_STATE_ALIGN);
71905f5e0172384dd2983fb16fbb7deebd74d71cd35sewardj         vassert(sizeof( ((VexGuestARMState*)0)->guest_CMSTART) == 4);
72005f5e0172384dd2983fb16fbb7deebd74d71cd35sewardj         vassert(sizeof( ((VexGuestARMState*)0)->guest_CMLEN  ) == 4);
7216c299f3acab617581ea504e45fbb6cab24c2b29fsewardj         vassert(sizeof( ((VexGuestARMState*)0)->guest_NRADDR ) == 4);
7226c299f3acab617581ea504e45fbb6cab24c2b29fsewardj         break;
7236c299f3acab617581ea504e45fbb6cab24c2b29fsewardj
724bbcf188f6ae64a44fb31414eb9e1a738b4befcc0sewardj      case VexArchARM64:
72512b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe         preciseMemExnsFn
72612b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe            = ARM64FN(guest_arm64_state_requires_precise_mem_exns);
72712b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe         disInstrFn           = ARM64FN(disInstr_ARM64);
72812b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe         specHelper           = ARM64FN(guest_arm64_spechelper);
729bbcf188f6ae64a44fb31414eb9e1a738b4befcc0sewardj         guest_sizeB          = sizeof(VexGuestARM64State);
730bbcf188f6ae64a44fb31414eb9e1a738b4befcc0sewardj         guest_word_type      = Ity_I64;
73112b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe         guest_layout         = ARM64FN(&arm64Guest_layout);
73205f5e0172384dd2983fb16fbb7deebd74d71cd35sewardj         offB_CMSTART         = offsetof(VexGuestARM64State,guest_CMSTART);
73305f5e0172384dd2983fb16fbb7deebd74d71cd35sewardj         offB_CMLEN           = offsetof(VexGuestARM64State,guest_CMLEN);
734bbcf188f6ae64a44fb31414eb9e1a738b4befcc0sewardj         offB_GUEST_IP        = offsetof(VexGuestARM64State,guest_PC);
735bbcf188f6ae64a44fb31414eb9e1a738b4befcc0sewardj         szB_GUEST_IP         = sizeof( ((VexGuestARM64State*)0)->guest_PC );
736bbcf188f6ae64a44fb31414eb9e1a738b4befcc0sewardj         offB_HOST_EvC_COUNTER  = offsetof(VexGuestARM64State,host_EvC_COUNTER);
737bbcf188f6ae64a44fb31414eb9e1a738b4befcc0sewardj         offB_HOST_EvC_FAILADDR = offsetof(VexGuestARM64State,host_EvC_FAILADDR);
7389b76916dcc1628e133d57db001563429c6e3a590sewardj         vassert(vta->archinfo_guest.endness == VexEndnessLE);
7395074b493ae4af5e6017fac208f823d283c6123c0florian         vassert(0 == sizeof(VexGuestARM64State) % LibVEX_GUEST_STATE_ALIGN);
74005f5e0172384dd2983fb16fbb7deebd74d71cd35sewardj         vassert(sizeof( ((VexGuestARM64State*)0)->guest_CMSTART) == 8);
74105f5e0172384dd2983fb16fbb7deebd74d71cd35sewardj         vassert(sizeof( ((VexGuestARM64State*)0)->guest_CMLEN  ) == 8);
742bbcf188f6ae64a44fb31414eb9e1a738b4befcc0sewardj         vassert(sizeof( ((VexGuestARM64State*)0)->guest_NRADDR ) == 8);
743bbcf188f6ae64a44fb31414eb9e1a738b4befcc0sewardj         break;
744bbcf188f6ae64a44fb31414eb9e1a738b4befcc0sewardj
745d0e5fe765fb79e5495206f8d0969133178b871f2sewardj      case VexArchMIPS32:
74612b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe         preciseMemExnsFn
74712b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe            = MIPS32FN(guest_mips32_state_requires_precise_mem_exns);
74812b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe         disInstrFn             = MIPS32FN(disInstr_MIPS);
74912b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe         specHelper             = MIPS32FN(guest_mips32_spechelper);
750d0e5fe765fb79e5495206f8d0969133178b871f2sewardj         guest_sizeB            = sizeof(VexGuestMIPS32State);
751d0e5fe765fb79e5495206f8d0969133178b871f2sewardj         guest_word_type        = Ity_I32;
75212b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe         guest_layout           = MIPS32FN(&mips32Guest_layout);
75305f5e0172384dd2983fb16fbb7deebd74d71cd35sewardj         offB_CMSTART           = offsetof(VexGuestMIPS32State,guest_CMSTART);
75405f5e0172384dd2983fb16fbb7deebd74d71cd35sewardj         offB_CMLEN             = offsetof(VexGuestMIPS32State,guest_CMLEN);
755d0e5fe765fb79e5495206f8d0969133178b871f2sewardj         offB_GUEST_IP          = offsetof(VexGuestMIPS32State,guest_PC);
756d0e5fe765fb79e5495206f8d0969133178b871f2sewardj         szB_GUEST_IP           = sizeof( ((VexGuestMIPS32State*)0)->guest_PC );
757d0e5fe765fb79e5495206f8d0969133178b871f2sewardj         offB_HOST_EvC_COUNTER  = offsetof(VexGuestMIPS32State,host_EvC_COUNTER);
758d0e5fe765fb79e5495206f8d0969133178b871f2sewardj         offB_HOST_EvC_FAILADDR = offsetof(VexGuestMIPS32State,host_EvC_FAILADDR);
7599b76916dcc1628e133d57db001563429c6e3a590sewardj         vassert(vta->archinfo_guest.endness == VexEndnessLE
7609b76916dcc1628e133d57db001563429c6e3a590sewardj                 || vta->archinfo_guest.endness == VexEndnessBE);
7615074b493ae4af5e6017fac208f823d283c6123c0florian         vassert(0 == sizeof(VexGuestMIPS32State) % LibVEX_GUEST_STATE_ALIGN);
76205f5e0172384dd2983fb16fbb7deebd74d71cd35sewardj         vassert(sizeof( ((VexGuestMIPS32State*)0)->guest_CMSTART) == 4);
76305f5e0172384dd2983fb16fbb7deebd74d71cd35sewardj         vassert(sizeof( ((VexGuestMIPS32State*)0)->guest_CMLEN  ) == 4);
764d0e5fe765fb79e5495206f8d0969133178b871f2sewardj         vassert(sizeof( ((VexGuestMIPS32State*)0)->guest_NRADDR ) == 4);
765d0e5fe765fb79e5495206f8d0969133178b871f2sewardj         break;
766d0e5fe765fb79e5495206f8d0969133178b871f2sewardj
767b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj      case VexArchMIPS64:
76812b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe         preciseMemExnsFn
76912b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe            = MIPS64FN(guest_mips64_state_requires_precise_mem_exns);
77012b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe         disInstrFn             = MIPS64FN(disInstr_MIPS);
77112b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe         specHelper             = MIPS64FN(guest_mips64_spechelper);
772b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj         guest_sizeB            = sizeof(VexGuestMIPS64State);
773b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj         guest_word_type        = Ity_I64;
77412b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe         guest_layout           = MIPS64FN(&mips64Guest_layout);
77505f5e0172384dd2983fb16fbb7deebd74d71cd35sewardj         offB_CMSTART           = offsetof(VexGuestMIPS64State,guest_CMSTART);
77605f5e0172384dd2983fb16fbb7deebd74d71cd35sewardj         offB_CMLEN             = offsetof(VexGuestMIPS64State,guest_CMLEN);
777b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj         offB_GUEST_IP          = offsetof(VexGuestMIPS64State,guest_PC);
778b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj         szB_GUEST_IP           = sizeof( ((VexGuestMIPS64State*)0)->guest_PC );
779b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj         offB_HOST_EvC_COUNTER  = offsetof(VexGuestMIPS64State,host_EvC_COUNTER);
780b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj         offB_HOST_EvC_FAILADDR = offsetof(VexGuestMIPS64State,host_EvC_FAILADDR);
7819b76916dcc1628e133d57db001563429c6e3a590sewardj         vassert(vta->archinfo_guest.endness == VexEndnessLE
7829b76916dcc1628e133d57db001563429c6e3a590sewardj                 || vta->archinfo_guest.endness == VexEndnessBE);
7835074b493ae4af5e6017fac208f823d283c6123c0florian         vassert(0 == sizeof(VexGuestMIPS64State) % LibVEX_GUEST_STATE_ALIGN);
78405f5e0172384dd2983fb16fbb7deebd74d71cd35sewardj         vassert(sizeof( ((VexGuestMIPS64State*)0)->guest_CMSTART) == 8);
78505f5e0172384dd2983fb16fbb7deebd74d71cd35sewardj         vassert(sizeof( ((VexGuestMIPS64State*)0)->guest_CMLEN  ) == 8);
786b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj         vassert(sizeof( ((VexGuestMIPS64State*)0)->guest_NRADDR ) == 8);
787b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj         break;
788b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj
7890de80192f57cd132b31b233c65734de04939ce65sewardj      case VexArchTILEGX:
7900de80192f57cd132b31b233c65734de04939ce65sewardj         preciseMemExnsFn =
7910de80192f57cd132b31b233c65734de04939ce65sewardj            TILEGXFN(guest_tilegx_state_requires_precise_mem_exns);
7920de80192f57cd132b31b233c65734de04939ce65sewardj         disInstrFn       = TILEGXFN(disInstr_TILEGX);
7930de80192f57cd132b31b233c65734de04939ce65sewardj         specHelper       = TILEGXFN(guest_tilegx_spechelper);
7940de80192f57cd132b31b233c65734de04939ce65sewardj         guest_sizeB      = sizeof(VexGuestTILEGXState);
7950de80192f57cd132b31b233c65734de04939ce65sewardj         guest_word_type  = Ity_I64;
7960de80192f57cd132b31b233c65734de04939ce65sewardj         guest_layout     = TILEGXFN(&tilegxGuest_layout);
7970de80192f57cd132b31b233c65734de04939ce65sewardj         offB_CMSTART     = offsetof(VexGuestTILEGXState,guest_CMSTART);
7980de80192f57cd132b31b233c65734de04939ce65sewardj         offB_CMLEN       = offsetof(VexGuestTILEGXState,guest_CMLEN);
7990de80192f57cd132b31b233c65734de04939ce65sewardj         offB_GUEST_IP          = offsetof(VexGuestTILEGXState,guest_pc);
8000de80192f57cd132b31b233c65734de04939ce65sewardj         szB_GUEST_IP           = sizeof( ((VexGuestTILEGXState*)0)->guest_pc );
8010de80192f57cd132b31b233c65734de04939ce65sewardj         offB_HOST_EvC_COUNTER  = offsetof(VexGuestTILEGXState,host_EvC_COUNTER);
8020de80192f57cd132b31b233c65734de04939ce65sewardj         offB_HOST_EvC_FAILADDR = offsetof(VexGuestTILEGXState,host_EvC_FAILADDR);
8030de80192f57cd132b31b233c65734de04939ce65sewardj         vassert(vta->archinfo_guest.endness == VexEndnessLE);
8040de80192f57cd132b31b233c65734de04939ce65sewardj         vassert(0 ==
80580d145c3b1b74f880ab64415e0c6d0585eb3cadcflorian                 sizeof(VexGuestTILEGXState) % LibVEX_GUEST_STATE_ALIGN);
8060de80192f57cd132b31b233c65734de04939ce65sewardj         vassert(sizeof( ((VexGuestTILEGXState*)0)->guest_CMSTART    ) == 8);
8070de80192f57cd132b31b233c65734de04939ce65sewardj         vassert(sizeof( ((VexGuestTILEGXState*)0)->guest_CMLEN      ) == 8);
8080de80192f57cd132b31b233c65734de04939ce65sewardj         vassert(sizeof( ((VexGuestTILEGXState*)0)->guest_NRADDR     ) == 8);
8090de80192f57cd132b31b233c65734de04939ce65sewardj         break;
8100de80192f57cd132b31b233c65734de04939ce65sewardj
811f13a16a82132fa2358899c7683193effecf9a56fsewardj      default:
812887a11a609f3e61d2ae8fe4e67f176207715da7esewardj         vpanic("LibVEX_Translate: unsupported guest insn set");
813f13a16a82132fa2358899c7683193effecf9a56fsewardj   }
814f13a16a82132fa2358899c7683193effecf9a56fsewardj
815f3652c97c20265d3410ea75d9817e8323b6df5c8florian   // Are the guest's hardware capabilities feasible. The function will
816f3652c97c20265d3410ea75d9817e8323b6df5c8florian   // not return if hwcaps are infeasible in some sense.
817f3652c97c20265d3410ea75d9817e8323b6df5c8florian   // FIXME: how can we know the guest's hardware capabilities?
818f3652c97c20265d3410ea75d9817e8323b6df5c8florian   check_hwcaps(vta->arch_guest, vta->archinfo_guest.hwcaps);
819f3652c97c20265d3410ea75d9817e8323b6df5c8florian
820bc161a407b3cbd722821812afb8fb47420ae538fsewardj   /* Set up result struct. */
821bc161a407b3cbd722821812afb8fb47420ae538fsewardj   VexTranslateResult res;
822fadbbe2870ffba4e4565563f21fc20b9ab89fd8fsewardj   res.status         = VexTransOK;
823fadbbe2870ffba4e4565563f21fc20b9ab89fd8fsewardj   res.n_sc_extents   = 0;
824fadbbe2870ffba4e4565563f21fc20b9ab89fd8fsewardj   res.offs_profInc   = -1;
825fadbbe2870ffba4e4565563f21fc20b9ab89fd8fsewardj   res.n_guest_instrs = 0;
826bc161a407b3cbd722821812afb8fb47420ae538fsewardj
8279df271d97c0f79a58a8eabdcfbe6f8bf4d17876asewardj   /* yet more sanity checks ... */
82817c7f95c78bb3c8ced934e41a4bf1aae6d857d59sewardj   if (vta->arch_guest == vta->arch_host) {
8299df271d97c0f79a58a8eabdcfbe6f8bf4d17876asewardj      /* doesn't necessarily have to be true, but if it isn't it means
8300ec57c595719a395e71b48792a4d62c5b896b6d3sewardj         we are simulating one flavour of an architecture a different
8310ec57c595719a395e71b48792a4d62c5b896b6d3sewardj         flavour of the same architecture, which is pretty strange. */
8325117ce116f47141cb23d1b49cc826e19323add97sewardj      vassert(vta->archinfo_guest.hwcaps == vta->archinfo_host.hwcaps);
8339b76916dcc1628e133d57db001563429c6e3a590sewardj      /* ditto */
8349b76916dcc1628e133d57db001563429c6e3a590sewardj      vassert(vta->archinfo_guest.endness == vta->archinfo_host.endness);
8359df271d97c0f79a58a8eabdcfbe6f8bf4d17876asewardj   }
8362a9ad023890d3b34cf45e429df2a8ae88b419128sewardj
8372d6b14aa64df2ff85f8da143516779d5d43574cbsewardj   vexAllocSanityCheck();
8382d6b14aa64df2ff85f8da143516779d5d43574cbsewardj
839f48ac19a67a98af44fe452c8c2be4192ac94b62dsewardj   if (vex_traceflags & VEX_TRACE_FE)
840f48ac19a67a98af44fe452c8c2be4192ac94b62dsewardj      vex_printf("\n------------------------"
841f48ac19a67a98af44fe452c8c2be4192ac94b62dsewardj                   " Front end "
842f48ac19a67a98af44fe452c8c2be4192ac94b62dsewardj                   "------------------------\n\n");
843f48ac19a67a98af44fe452c8c2be4192ac94b62dsewardj
844ca2c3c75784d35d136fc7c952717cdee5063c193sewardj   VexRegisterUpdates pxControl = vex_control.iropt_register_updates_default;
845ca2c3c75784d35d136fc7c952717cdee5063c193sewardj   vassert(pxControl >= VexRegUpdSpAtMemAccess
846ca2c3c75784d35d136fc7c952717cdee5063c193sewardj           && pxControl <= VexRegUpdAllregsAtEachInsn);
847ca2c3c75784d35d136fc7c952717cdee5063c193sewardj
848dd40fdf58cc8a6fe9466c4f00bdfc9fe9bf00449sewardj   irsb = bb_to_IR ( vta->guest_extents,
849bc161a407b3cbd722821812afb8fb47420ae538fsewardj                     &res.n_sc_extents,
850fadbbe2870ffba4e4565563f21fc20b9ab89fd8fsewardj                     &res.n_guest_instrs,
851ca2c3c75784d35d136fc7c952717cdee5063c193sewardj                     &pxControl,
852c716aea1cafe66ee431dc7d6909c98f18788a028sewardj                     vta->callback_opaque,
8539e6491ab55324b8e45e187b1e1e9632ac3cb3e27sewardj                     disInstrFn,
85417c7f95c78bb3c8ced934e41a4bf1aae6d857d59sewardj                     vta->guest_bytes,
85517c7f95c78bb3c8ced934e41a4bf1aae6d857d59sewardj                     vta->guest_bytes_addr,
85617c7f95c78bb3c8ced934e41a4bf1aae6d857d59sewardj                     vta->chase_into_ok,
8579b76916dcc1628e133d57db001563429c6e3a590sewardj                     vta->archinfo_host.endness,
858442e51a26cf3bc7f243167a4ff3fbfb02206f6e6sewardj                     vta->sigill_diag,
859a5f55da7e956978fddad927436da5fab9568f3f1sewardj                     vta->arch_guest,
86017c7f95c78bb3c8ced934e41a4bf1aae6d857d59sewardj                     &vta->archinfo_guest,
861dd40fdf58cc8a6fe9466c4f00bdfc9fe9bf00449sewardj                     &vta->abiinfo_both,
862db4738ab05bf88fabe7fd931a24fab2fa2060e73sewardj                     guest_word_type,
863bc161a407b3cbd722821812afb8fb47420ae538fsewardj                     vta->needs_self_check,
864c716aea1cafe66ee431dc7d6909c98f18788a028sewardj                     vta->preamble_function,
86505f5e0172384dd2983fb16fbb7deebd74d71cd35sewardj                     offB_CMSTART,
86605f5e0172384dd2983fb16fbb7deebd74d71cd35sewardj                     offB_CMLEN,
867c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj                     offB_GUEST_IP,
868c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj                     szB_GUEST_IP );
869f13a16a82132fa2358899c7683193effecf9a56fsewardj
8702d6b14aa64df2ff85f8da143516779d5d43574cbsewardj   vexAllocSanityCheck();
8712d6b14aa64df2ff85f8da143516779d5d43574cbsewardj
872dd40fdf58cc8a6fe9466c4f00bdfc9fe9bf00449sewardj   if (irsb == NULL) {
873f13a16a82132fa2358899c7683193effecf9a56fsewardj      /* Access failure. */
8742d6b14aa64df2ff85f8da143516779d5d43574cbsewardj      vexSetAllocModeTEMP_and_clear();
875f48ac19a67a98af44fe452c8c2be4192ac94b62dsewardj      vex_traceflags = 0;
876bc161a407b3cbd722821812afb8fb47420ae538fsewardj      res.status = VexTransAccessFail; return res;
877f13a16a82132fa2358899c7683193effecf9a56fsewardj   }
878aa59f942f729b5c98703d84321265313daeb32b8sewardj
87917c7f95c78bb3c8ced934e41a4bf1aae6d857d59sewardj   vassert(vta->guest_extents->n_used >= 1 && vta->guest_extents->n_used <= 3);
88017c7f95c78bb3c8ced934e41a4bf1aae6d857d59sewardj   vassert(vta->guest_extents->base[0] == vta->guest_bytes_addr);
88117c7f95c78bb3c8ced934e41a4bf1aae6d857d59sewardj   for (i = 0; i < vta->guest_extents->n_used; i++) {
88217c7f95c78bb3c8ced934e41a4bf1aae6d857d59sewardj      vassert(vta->guest_extents->len[i] < 10000); /* sanity */
88372c72814ab82c51d8ee8accad1a00f2d37942545sewardj   }
88472c72814ab82c51d8ee8accad1a00f2d37942545sewardj
885ca2c3c75784d35d136fc7c952717cdee5063c193sewardj   /* bb_to_IR() could have caused pxControl to change. */
886ca2c3c75784d35d136fc7c952717cdee5063c193sewardj   vassert(pxControl >= VexRegUpdSpAtMemAccess
887ca2c3c75784d35d136fc7c952717cdee5063c193sewardj           && pxControl <= VexRegUpdAllregsAtEachInsn);
888ca2c3c75784d35d136fc7c952717cdee5063c193sewardj
889aa59f942f729b5c98703d84321265313daeb32b8sewardj   /* If debugging, show the raw guest bytes for this bb. */
890109ffdbb31ff652ae83d0ad400966f68c46cd4f1sewardj   if (0 || (vex_traceflags & VEX_TRACE_FE)) {
89117c7f95c78bb3c8ced934e41a4bf1aae6d857d59sewardj      if (vta->guest_extents->n_used > 1) {
89272c72814ab82c51d8ee8accad1a00f2d37942545sewardj         vex_printf("can't show code due to extents > 1\n");
89372c72814ab82c51d8ee8accad1a00f2d37942545sewardj      } else {
89472c72814ab82c51d8ee8accad1a00f2d37942545sewardj         /* HACK */
8958462d113e3efeacceb304222dada8d85f748295aflorian         const UChar* p = vta->guest_bytes;
89601f8cce97179cf4363240784a26adde19287a3a6sewardj         UInt   sum = 0;
89717c7f95c78bb3c8ced934e41a4bf1aae6d857d59sewardj         UInt   guest_bytes_read = (UInt)vta->guest_extents->len[0];
898d4cc0deec55ec0be1f2ac3b20f0d340265341f83florian         vex_printf("GuestBytes %lx %u ", vta->guest_bytes_addr,
899d4cc0deec55ec0be1f2ac3b20f0d340265341f83florian                                          guest_bytes_read );
90001f8cce97179cf4363240784a26adde19287a3a6sewardj         for (i = 0; i < guest_bytes_read; i++) {
90101f8cce97179cf4363240784a26adde19287a3a6sewardj            UInt b = (UInt)p[i];
90201f8cce97179cf4363240784a26adde19287a3a6sewardj            vex_printf(" %02x", b );
90301f8cce97179cf4363240784a26adde19287a3a6sewardj            sum = (sum << 1) ^ b;
90401f8cce97179cf4363240784a26adde19287a3a6sewardj         }
90501f8cce97179cf4363240784a26adde19287a3a6sewardj         vex_printf("  %08x\n\n", sum);
90672c72814ab82c51d8ee8accad1a00f2d37942545sewardj      }
907aa59f942f729b5c98703d84321265313daeb32b8sewardj   }
908aa59f942f729b5c98703d84321265313daeb32b8sewardj
909aa59f942f729b5c98703d84321265313daeb32b8sewardj   /* Sanity check the initial IR. */
910dd40fdf58cc8a6fe9466c4f00bdfc9fe9bf00449sewardj   sanityCheckIRSB( irsb, "initial IR",
911b92307503d4fb9265136e182d10c42ebb9dd8272sewardj                    False/*can be non-flat*/, guest_word_type );
912e8e9d73817f92d295f45b1c6c823c613bc2e90aesewardj
9132d6b14aa64df2ff85f8da143516779d5d43574cbsewardj   vexAllocSanityCheck();
9142d6b14aa64df2ff85f8da143516779d5d43574cbsewardj
915edf4d69c8477cad95851d0f6ccf91ab323e5a446sewardj   /* Clean it up, hopefully a lot. */
916ca2c3c75784d35d136fc7c952717cdee5063c193sewardj   irsb = do_iropt_BB ( irsb, specHelper, preciseMemExnsFn, pxControl,
917ec0d9a028955060c5216341c6fc37400ec0cb4besewardj                              vta->guest_bytes_addr,
918ec0d9a028955060c5216341c6fc37400ec0cb4besewardj                              vta->arch_guest );
919a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes
920a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes   // JRS 2016 Aug 03: Sanity checking is expensive, we already checked
921a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes   // the output of the front end, and iropt never screws up the IR by
922a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes   // itself, unless it is being hacked on.  So remove this post-iropt
923a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes   // check in "production" use.
924a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes   // sanityCheckIRSB( irsb, "after initial iropt",
925a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes   //                  True/*must be flat*/, guest_word_type );
926edf4d69c8477cad95851d0f6ccf91ab323e5a446sewardj
927f48ac19a67a98af44fe452c8c2be4192ac94b62dsewardj   if (vex_traceflags & VEX_TRACE_OPT1) {
928f48ac19a67a98af44fe452c8c2be4192ac94b62dsewardj      vex_printf("\n------------------------"
929f48ac19a67a98af44fe452c8c2be4192ac94b62dsewardj                   " After pre-instr IR optimisation "
930f48ac19a67a98af44fe452c8c2be4192ac94b62dsewardj                   "------------------------\n\n");
931dd40fdf58cc8a6fe9466c4f00bdfc9fe9bf00449sewardj      ppIRSB ( irsb );
932edf4d69c8477cad95851d0f6ccf91ab323e5a446sewardj      vex_printf("\n");
933edf4d69c8477cad95851d0f6ccf91ab323e5a446sewardj   }
934edf4d69c8477cad95851d0f6ccf91ab323e5a446sewardj
9352d6b14aa64df2ff85f8da143516779d5d43574cbsewardj   vexAllocSanityCheck();
9362d6b14aa64df2ff85f8da143516779d5d43574cbsewardj
937f13a16a82132fa2358899c7683193effecf9a56fsewardj   /* Get the thing instrumented. */
93817c7f95c78bb3c8ced934e41a4bf1aae6d857d59sewardj   if (vta->instrument1)
939dd40fdf58cc8a6fe9466c4f00bdfc9fe9bf00449sewardj      irsb = vta->instrument1(vta->callback_opaque,
940dd40fdf58cc8a6fe9466c4f00bdfc9fe9bf00449sewardj                              irsb, guest_layout,
94117c7f95c78bb3c8ced934e41a4bf1aae6d857d59sewardj                              vta->guest_extents,
94250481921c3c61054b5629c4dcebf5ec680dbf6e9florian                              &vta->archinfo_host,
94317c7f95c78bb3c8ced934e41a4bf1aae6d857d59sewardj                              guest_word_type, host_word_type);
9442d6b14aa64df2ff85f8da143516779d5d43574cbsewardj   vexAllocSanityCheck();
9452d6b14aa64df2ff85f8da143516779d5d43574cbsewardj
94617c7f95c78bb3c8ced934e41a4bf1aae6d857d59sewardj   if (vta->instrument2)
947dd40fdf58cc8a6fe9466c4f00bdfc9fe9bf00449sewardj      irsb = vta->instrument2(vta->callback_opaque,
948dd40fdf58cc8a6fe9466c4f00bdfc9fe9bf00449sewardj                              irsb, guest_layout,
94917c7f95c78bb3c8ced934e41a4bf1aae6d857d59sewardj                              vta->guest_extents,
95050481921c3c61054b5629c4dcebf5ec680dbf6e9florian                              &vta->archinfo_host,
95117c7f95c78bb3c8ced934e41a4bf1aae6d857d59sewardj                              guest_word_type, host_word_type);
95249651f4b59b1ab7e0e70cccd34001630eafbe957sewardj
953f48ac19a67a98af44fe452c8c2be4192ac94b62dsewardj   if (vex_traceflags & VEX_TRACE_INST) {
954f48ac19a67a98af44fe452c8c2be4192ac94b62dsewardj      vex_printf("\n------------------------"
955f48ac19a67a98af44fe452c8c2be4192ac94b62dsewardj                   " After instrumentation "
956f48ac19a67a98af44fe452c8c2be4192ac94b62dsewardj                   "------------------------\n\n");
957dd40fdf58cc8a6fe9466c4f00bdfc9fe9bf00449sewardj      ppIRSB ( irsb );
958f48ac19a67a98af44fe452c8c2be4192ac94b62dsewardj      vex_printf("\n");
959f48ac19a67a98af44fe452c8c2be4192ac94b62dsewardj   }
960f48ac19a67a98af44fe452c8c2be4192ac94b62dsewardj
961a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes   // JRS 2016 Aug 03: as above, this never actually fails in practice.
962a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes   // And we'll sanity check anyway after the post-instrumentation
963a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes   // cleanup pass.  So skip this check in "production" use.
964a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes   // if (vta->instrument1 || vta->instrument2)
965a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes   //    sanityCheckIRSB( irsb, "after instrumentation",
966a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes   //                     True/*must be flat*/, guest_word_type );
967f13a16a82132fa2358899c7683193effecf9a56fsewardj
9689578a8bf6159d81eeadeb771c3214109cfee3715sewardj   /* Do a post-instrumentation cleanup pass. */
96917c7f95c78bb3c8ced934e41a4bf1aae6d857d59sewardj   if (vta->instrument1 || vta->instrument2) {
970dd40fdf58cc8a6fe9466c4f00bdfc9fe9bf00449sewardj      do_deadcode_BB( irsb );
971dd40fdf58cc8a6fe9466c4f00bdfc9fe9bf00449sewardj      irsb = cprop_BB( irsb );
972dd40fdf58cc8a6fe9466c4f00bdfc9fe9bf00449sewardj      do_deadcode_BB( irsb );
973dd40fdf58cc8a6fe9466c4f00bdfc9fe9bf00449sewardj      sanityCheckIRSB( irsb, "after post-instrumentation cleanup",
974b92307503d4fb9265136e182d10c42ebb9dd8272sewardj                       True/*must be flat*/, guest_word_type );
9759578a8bf6159d81eeadeb771c3214109cfee3715sewardj   }
9769578a8bf6159d81eeadeb771c3214109cfee3715sewardj
9772d6b14aa64df2ff85f8da143516779d5d43574cbsewardj   vexAllocSanityCheck();
9782d6b14aa64df2ff85f8da143516779d5d43574cbsewardj
9799578a8bf6159d81eeadeb771c3214109cfee3715sewardj   if (vex_traceflags & VEX_TRACE_OPT2) {
9809578a8bf6159d81eeadeb771c3214109cfee3715sewardj      vex_printf("\n------------------------"
9819578a8bf6159d81eeadeb771c3214109cfee3715sewardj                   " After post-instr IR optimisation "
9829578a8bf6159d81eeadeb771c3214109cfee3715sewardj                   "------------------------\n\n");
983dd40fdf58cc8a6fe9466c4f00bdfc9fe9bf00449sewardj      ppIRSB ( irsb );
9849578a8bf6159d81eeadeb771c3214109cfee3715sewardj      vex_printf("\n");
9859578a8bf6159d81eeadeb771c3214109cfee3715sewardj   }
9869578a8bf6159d81eeadeb771c3214109cfee3715sewardj
987f9517d0d452899780e8c34f02bef004ef7c5a163sewardj   /* Turn it into virtual-registerised code.  Build trees -- this
988f9517d0d452899780e8c34f02bef004ef7c5a163sewardj      also throws away any dead bindings. */
989ca2c3c75784d35d136fc7c952717cdee5063c193sewardj   max_ga = ado_treebuild_BB( irsb, preciseMemExnsFn, pxControl );
990f48ac19a67a98af44fe452c8c2be4192ac94b62dsewardj
991be1b6ff6cdb576c59734762fb778ae48eb8e7a10sewardj   if (vta->finaltidy) {
992be1b6ff6cdb576c59734762fb778ae48eb8e7a10sewardj      irsb = vta->finaltidy(irsb);
993be1b6ff6cdb576c59734762fb778ae48eb8e7a10sewardj   }
994be1b6ff6cdb576c59734762fb778ae48eb8e7a10sewardj
9952d6b14aa64df2ff85f8da143516779d5d43574cbsewardj   vexAllocSanityCheck();
9962d6b14aa64df2ff85f8da143516779d5d43574cbsewardj
997f48ac19a67a98af44fe452c8c2be4192ac94b62dsewardj   if (vex_traceflags & VEX_TRACE_TREES) {
998f48ac19a67a98af44fe452c8c2be4192ac94b62dsewardj      vex_printf("\n------------------------"
999f48ac19a67a98af44fe452c8c2be4192ac94b62dsewardj                   "  After tree-building "
1000f48ac19a67a98af44fe452c8c2be4192ac94b62dsewardj                   "------------------------\n\n");
1001dd40fdf58cc8a6fe9466c4f00bdfc9fe9bf00449sewardj      ppIRSB ( irsb );
1002f48ac19a67a98af44fe452c8c2be4192ac94b62dsewardj      vex_printf("\n");
1003f48ac19a67a98af44fe452c8c2be4192ac94b62dsewardj   }
1004f48ac19a67a98af44fe452c8c2be4192ac94b62dsewardj
1005e908c426bc9991611a1731ee881208d148e913fbsewardj   /* HACK */
1006bc161a407b3cbd722821812afb8fb47420ae538fsewardj   if (0) {
1007bc161a407b3cbd722821812afb8fb47420ae538fsewardj      *(vta->host_bytes_used) = 0;
1008bc161a407b3cbd722821812afb8fb47420ae538fsewardj      res.status = VexTransOK; return res;
1009bc161a407b3cbd722821812afb8fb47420ae538fsewardj   }
1010e908c426bc9991611a1731ee881208d148e913fbsewardj   /* end HACK */
1011c33671d7b0e21edb1d1015e4cbccbc6ca139e6d8sewardj
1012f48ac19a67a98af44fe452c8c2be4192ac94b62dsewardj   if (vex_traceflags & VEX_TRACE_VCODE)
1013f48ac19a67a98af44fe452c8c2be4192ac94b62dsewardj      vex_printf("\n------------------------"
1014f48ac19a67a98af44fe452c8c2be4192ac94b62dsewardj                   " Instruction selection "
1015f48ac19a67a98af44fe452c8c2be4192ac94b62dsewardj                   "------------------------\n");
1016f48ac19a67a98af44fe452c8c2be4192ac94b62dsewardj
1017c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj   /* No guest has its IP field at offset zero.  If this fails it
1018c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj      means some transformation pass somewhere failed to update/copy
1019c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj      irsb->offsIP properly. */
1020c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj   vassert(irsb->offsIP >= 16);
1021c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj
1022c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj   vcode = iselSB ( irsb, vta->arch_host,
1023c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj                    &vta->archinfo_host,
1024c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj                    &vta->abiinfo_both,
1025c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj                    offB_HOST_EvC_COUNTER,
1026c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj                    offB_HOST_EvC_FAILADDR,
1027c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj                    chainingAllowed,
1028c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj                    vta->addProfInc,
1029c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj                    max_ga );
1030f13a16a82132fa2358899c7683193effecf9a56fsewardj
10312d6b14aa64df2ff85f8da143516779d5d43574cbsewardj   vexAllocSanityCheck();
10322d6b14aa64df2ff85f8da143516779d5d43574cbsewardj
1033f48ac19a67a98af44fe452c8c2be4192ac94b62dsewardj   if (vex_traceflags & VEX_TRACE_VCODE)
1034f48ac19a67a98af44fe452c8c2be4192ac94b62dsewardj      vex_printf("\n");
1035f48ac19a67a98af44fe452c8c2be4192ac94b62dsewardj
1036f48ac19a67a98af44fe452c8c2be4192ac94b62dsewardj   if (vex_traceflags & VEX_TRACE_VCODE) {
10371f40a0a104034009e253675288ebefdcccf30da8sewardj      for (i = 0; i < vcode->arr_used; i++) {
10381f40a0a104034009e253675288ebefdcccf30da8sewardj         vex_printf("%3d   ", i);
103992b643609c5fa432b11fc726c2706ae3f3296eb4cerion         ppInstr(vcode->arr[i], mode64);
10401f40a0a104034009e253675288ebefdcccf30da8sewardj         vex_printf("\n");
10411f40a0a104034009e253675288ebefdcccf30da8sewardj      }
1042fbcaf3312f39fb73d54821636c6168db76245f61sewardj      vex_printf("\n");
1043fbcaf3312f39fb73d54821636c6168db76245f61sewardj   }
1044fbcaf3312f39fb73d54821636c6168db76245f61sewardj
1045f13a16a82132fa2358899c7683193effecf9a56fsewardj   /* Register allocate. */
1046a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardj   rcode = doRegisterAllocation ( vcode, rRegUniv,
104772c72814ab82c51d8ee8accad1a00f2d37942545sewardj                                  isMove, getRegUsage, mapRegs,
1048fb7373aee5e8a3039f2916ecf09870f3ec0c1805sewardj                                  genSpill, genReload, directReload,
1049fb7373aee5e8a3039f2916ecf09870f3ec0c1805sewardj                                  guest_sizeB,
105092b643609c5fa432b11fc726c2706ae3f3296eb4cerion                                  ppInstr, ppReg, mode64 );
1051f13a16a82132fa2358899c7683193effecf9a56fsewardj
10522d6b14aa64df2ff85f8da143516779d5d43574cbsewardj   vexAllocSanityCheck();
10532d6b14aa64df2ff85f8da143516779d5d43574cbsewardj
1054f48ac19a67a98af44fe452c8c2be4192ac94b62dsewardj   if (vex_traceflags & VEX_TRACE_RCODE) {
1055f48ac19a67a98af44fe452c8c2be4192ac94b62dsewardj      vex_printf("\n------------------------"
1056f48ac19a67a98af44fe452c8c2be4192ac94b62dsewardj                   " Register-allocated code "
1057f48ac19a67a98af44fe452c8c2be4192ac94b62dsewardj                   "------------------------\n\n");
10581f40a0a104034009e253675288ebefdcccf30da8sewardj      for (i = 0; i < rcode->arr_used; i++) {
10591f40a0a104034009e253675288ebefdcccf30da8sewardj         vex_printf("%3d   ", i);
106092b643609c5fa432b11fc726c2706ae3f3296eb4cerion         ppInstr(rcode->arr[i], mode64);
10611f40a0a104034009e253675288ebefdcccf30da8sewardj         vex_printf("\n");
10621f40a0a104034009e253675288ebefdcccf30da8sewardj      }
1063fbcaf3312f39fb73d54821636c6168db76245f61sewardj      vex_printf("\n");
1064fbcaf3312f39fb73d54821636c6168db76245f61sewardj   }
1065fbcaf3312f39fb73d54821636c6168db76245f61sewardj
1066e908c426bc9991611a1731ee881208d148e913fbsewardj   /* HACK */
1067bc161a407b3cbd722821812afb8fb47420ae538fsewardj   if (0) {
1068bc161a407b3cbd722821812afb8fb47420ae538fsewardj      *(vta->host_bytes_used) = 0;
1069bc161a407b3cbd722821812afb8fb47420ae538fsewardj      res.status = VexTransOK; return res;
1070bc161a407b3cbd722821812afb8fb47420ae538fsewardj   }
1071e908c426bc9991611a1731ee881208d148e913fbsewardj   /* end HACK */
1072e908c426bc9991611a1731ee881208d148e913fbsewardj
107381bd550f9a1d58ceeedb159d18642d9790e75eb4sewardj   /* Assemble */
1074f48ac19a67a98af44fe452c8c2be4192ac94b62dsewardj   if (vex_traceflags & VEX_TRACE_ASM) {
1075f48ac19a67a98af44fe452c8c2be4192ac94b62dsewardj      vex_printf("\n------------------------"
1076f48ac19a67a98af44fe452c8c2be4192ac94b62dsewardj                   " Assembly "
1077f48ac19a67a98af44fe452c8c2be4192ac94b62dsewardj                   "------------------------\n\n");
1078f48ac19a67a98af44fe452c8c2be4192ac94b62dsewardj   }
1079f48ac19a67a98af44fe452c8c2be4192ac94b62dsewardj
108081bd550f9a1d58ceeedb159d18642d9790e75eb4sewardj   out_used = 0; /* tracks along the host_bytes array */
108181bd550f9a1d58ceeedb159d18642d9790e75eb4sewardj   for (i = 0; i < rcode->arr_used; i++) {
1082c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj      HInstr* hi           = rcode->arr[i];
1083c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj      Bool    hi_isProfInc = False;
1084c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj      if (UNLIKELY(vex_traceflags & VEX_TRACE_ASM)) {
1085c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj         ppInstr(hi, mode64);
1086bad34a9c950dcc0c3f68ea2904206f3341fb5e91sewardj         vex_printf("\n");
1087bad34a9c950dcc0c3f68ea2904206f3341fb5e91sewardj      }
1088c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj      j = emit( &hi_isProfInc,
10899b76916dcc1628e133d57db001563429c6e3a590sewardj                insn_bytes, sizeof insn_bytes, hi,
10909b76916dcc1628e133d57db001563429c6e3a590sewardj                mode64, vta->archinfo_host.endness,
1091c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj                vta->disp_cp_chain_me_to_slowEP,
1092c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj                vta->disp_cp_chain_me_to_fastEP,
1093c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj                vta->disp_cp_xindir,
1094c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj                vta->disp_cp_xassisted );
1095c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj      if (UNLIKELY(vex_traceflags & VEX_TRACE_ASM)) {
1096bad34a9c950dcc0c3f68ea2904206f3341fb5e91sewardj         for (k = 0; k < j; k++)
1097e554042a0d0211287313a7d20a66baf7f6d1c9a8florian            vex_printf("%02x ", (UInt)insn_bytes[k]);
1098bad34a9c950dcc0c3f68ea2904206f3341fb5e91sewardj         vex_printf("\n\n");
1099bad34a9c950dcc0c3f68ea2904206f3341fb5e91sewardj      }
1100c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj      if (UNLIKELY(out_used + j > vta->host_bytes_size)) {
11012d6b14aa64df2ff85f8da143516779d5d43574cbsewardj         vexSetAllocModeTEMP_and_clear();
1102f48ac19a67a98af44fe452c8c2be4192ac94b62dsewardj         vex_traceflags = 0;
1103bc161a407b3cbd722821812afb8fb47420ae538fsewardj         res.status = VexTransOutputFull;
1104bc161a407b3cbd722821812afb8fb47420ae538fsewardj         return res;
110581bd550f9a1d58ceeedb159d18642d9790e75eb4sewardj      }
1106c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj      if (UNLIKELY(hi_isProfInc)) {
1107c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj         vassert(vta->addProfInc); /* else where did it come from? */
1108c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj         vassert(res.offs_profInc == -1); /* there can be only one (tm) */
1109c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj         vassert(out_used >= 0);
1110c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj         res.offs_profInc = out_used;
1111c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj      }
1112c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj      { UChar* dst = &vta->host_bytes[out_used];
1113c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj        for (k = 0; k < j; k++) {
1114c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj           dst[k] = insn_bytes[k];
1115c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj        }
1116c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj        out_used += j;
111781bd550f9a1d58ceeedb159d18642d9790e75eb4sewardj      }
111881bd550f9a1d58ceeedb159d18642d9790e75eb4sewardj   }
111917c7f95c78bb3c8ced934e41a4bf1aae6d857d59sewardj   *(vta->host_bytes_used) = out_used;
112081bd550f9a1d58ceeedb159d18642d9790e75eb4sewardj
11212d6b14aa64df2ff85f8da143516779d5d43574cbsewardj   vexAllocSanityCheck();
11222d6b14aa64df2ff85f8da143516779d5d43574cbsewardj
11232d6b14aa64df2ff85f8da143516779d5d43574cbsewardj   vexSetAllocModeTEMP_and_clear();
1124f13a16a82132fa2358899c7683193effecf9a56fsewardj
112565ea17e33e244e3615a6e0d9c9a388a12d758f06sewardj   if (vex_traceflags) {
112665ea17e33e244e3615a6e0d9c9a388a12d758f06sewardj      /* Print the expansion ratio for this SB. */
112765ea17e33e244e3615a6e0d9c9a388a12d758f06sewardj      j = 0; /* total guest bytes */
112865ea17e33e244e3615a6e0d9c9a388a12d758f06sewardj      for (i = 0; i < vta->guest_extents->n_used; i++) {
112965ea17e33e244e3615a6e0d9c9a388a12d758f06sewardj         j += vta->guest_extents->len[i];
113065ea17e33e244e3615a6e0d9c9a388a12d758f06sewardj      }
113165ea17e33e244e3615a6e0d9c9a388a12d758f06sewardj      if (1) vex_printf("VexExpansionRatio %d %d   %d :10\n\n",
113265ea17e33e244e3615a6e0d9c9a388a12d758f06sewardj                        j, out_used, (10 * out_used) / (j == 0 ? 1 : j));
113365ea17e33e244e3615a6e0d9c9a388a12d758f06sewardj   }
113465ea17e33e244e3615a6e0d9c9a388a12d758f06sewardj
1135f48ac19a67a98af44fe452c8c2be4192ac94b62dsewardj   vex_traceflags = 0;
1136bc161a407b3cbd722821812afb8fb47420ae538fsewardj   res.status = VexTransOK;
1137bc161a407b3cbd722821812afb8fb47420ae538fsewardj   return res;
113835421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj}
113935421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj
114035421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj
1141c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj/* --------- Chain/Unchain XDirects. --------- */
1142c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj
11437d6f81de12e6d8deb3e119ab318f361d97a10a65florianVexInvalRange LibVEX_Chain ( VexArch     arch_host,
11447d6f81de12e6d8deb3e119ab318f361d97a10a65florian                             VexEndness  endness_host,
11457d6f81de12e6d8deb3e119ab318f361d97a10a65florian                             void*       place_to_chain,
11467d6f81de12e6d8deb3e119ab318f361d97a10a65florian                             const void* disp_cp_chain_me_EXPECTED,
11477d6f81de12e6d8deb3e119ab318f361d97a10a65florian                             const void* place_to_jump_to )
1148c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj{
1149c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj   switch (arch_host) {
1150c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj      case VexArchX86:
115112b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe         X86ST(return chainXDirect_X86(endness_host,
115212b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe                                       place_to_chain,
115312b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe                                       disp_cp_chain_me_EXPECTED,
115412b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe                                       place_to_jump_to));
1155c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj      case VexArchAMD64:
115612b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe         AMD64ST(return chainXDirect_AMD64(endness_host,
115712b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe                                           place_to_chain,
115812b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe                                           disp_cp_chain_me_EXPECTED,
115912b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe                                           place_to_jump_to));
1160c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj      case VexArchARM:
116112b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe         ARMST(return chainXDirect_ARM(endness_host,
116212b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe                                       place_to_chain,
116312b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe                                       disp_cp_chain_me_EXPECTED,
116412b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe                                       place_to_jump_to));
1165bbcf188f6ae64a44fb31414eb9e1a738b4befcc0sewardj      case VexArchARM64:
116612b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe         ARM64ST(return chainXDirect_ARM64(endness_host,
116712b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe                                           place_to_chain,
116812b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe                                           disp_cp_chain_me_EXPECTED,
116912b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe                                           place_to_jump_to));
11708844a6329d275814456e3a2a5a7bffac75da0957florian      case VexArchS390X:
117112b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe         S390ST(return chainXDirect_S390(endness_host,
117212b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe                                         place_to_chain,
117312b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe                                         disp_cp_chain_me_EXPECTED,
117412b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe                                         place_to_jump_to));
11753dee849ec7c38746749065e67dc53b75daa7617dsewardj      case VexArchPPC32:
117612b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe         PPC32ST(return chainXDirect_PPC(endness_host,
117712b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe                                         place_to_chain,
117812b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe                                         disp_cp_chain_me_EXPECTED,
117912b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe                                         place_to_jump_to, False/*!mode64*/));
1180f252de5ec83a5cc72f96fe4decf662cfbb28df8bsewardj      case VexArchPPC64:
118112b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe         PPC64ST(return chainXDirect_PPC(endness_host,
118212b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe                                         place_to_chain,
118312b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe                                         disp_cp_chain_me_EXPECTED,
118412b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe                                         place_to_jump_to, True/*mode64*/));
1185d0e5fe765fb79e5495206f8d0969133178b871f2sewardj      case VexArchMIPS32:
118612b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe         MIPS32ST(return chainXDirect_MIPS(endness_host,
118712b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe                                           place_to_chain,
118812b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe                                           disp_cp_chain_me_EXPECTED,
118912b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe                                           place_to_jump_to, False/*!mode64*/));
1190b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj      case VexArchMIPS64:
119112b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe         MIPS64ST(return chainXDirect_MIPS(endness_host,
119212b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe                                           place_to_chain,
119312b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe                                           disp_cp_chain_me_EXPECTED,
119412b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe                                           place_to_jump_to, True/*!mode64*/));
11950de80192f57cd132b31b233c65734de04939ce65sewardj
11960de80192f57cd132b31b233c65734de04939ce65sewardj      case VexArchTILEGX:
11970de80192f57cd132b31b233c65734de04939ce65sewardj         TILEGXST(return chainXDirect_TILEGX(endness_host,
11980de80192f57cd132b31b233c65734de04939ce65sewardj                                             place_to_chain,
11990de80192f57cd132b31b233c65734de04939ce65sewardj                                             disp_cp_chain_me_EXPECTED,
12000de80192f57cd132b31b233c65734de04939ce65sewardj                                             place_to_jump_to, True/*!mode64*/));
1201c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj      default:
1202c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj         vassert(0);
1203c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj   }
1204c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj}
1205c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj
12067d6f81de12e6d8deb3e119ab318f361d97a10a65florianVexInvalRange LibVEX_UnChain ( VexArch     arch_host,
12077d6f81de12e6d8deb3e119ab318f361d97a10a65florian                               VexEndness  endness_host,
12087d6f81de12e6d8deb3e119ab318f361d97a10a65florian                               void*       place_to_unchain,
12097d6f81de12e6d8deb3e119ab318f361d97a10a65florian                               const void* place_to_jump_to_EXPECTED,
12107d6f81de12e6d8deb3e119ab318f361d97a10a65florian                               const void* disp_cp_chain_me )
1211c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj{
1212c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj   switch (arch_host) {
1213c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj      case VexArchX86:
121412b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe         X86ST(return unchainXDirect_X86(endness_host,
121512b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe                                         place_to_unchain,
121612b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe                                         place_to_jump_to_EXPECTED,
121712b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe                                         disp_cp_chain_me));
1218c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj      case VexArchAMD64:
121912b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe         AMD64ST(return unchainXDirect_AMD64(endness_host,
122012b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe                                             place_to_unchain,
122112b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe                                             place_to_jump_to_EXPECTED,
122212b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe                                             disp_cp_chain_me));
1223c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj      case VexArchARM:
122412b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe         ARMST(return unchainXDirect_ARM(endness_host,
122512b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe                                         place_to_unchain,
122612b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe                                         place_to_jump_to_EXPECTED,
122712b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe                                         disp_cp_chain_me));
1228c6acaa420e6f1c60e1d46f52c1e9b79c0490ce09sewardj      case VexArchARM64:
122912b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe         ARM64ST(return unchainXDirect_ARM64(endness_host,
123012b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe                                             place_to_unchain,
123112b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe                                             place_to_jump_to_EXPECTED,
123212b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe                                             disp_cp_chain_me));
12338844a6329d275814456e3a2a5a7bffac75da0957florian      case VexArchS390X:
123412b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe         S390ST(return unchainXDirect_S390(endness_host,
123512b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe                                           place_to_unchain,
123612b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe                                           place_to_jump_to_EXPECTED,
123712b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe                                           disp_cp_chain_me));
12383dee849ec7c38746749065e67dc53b75daa7617dsewardj      case VexArchPPC32:
123912b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe         PPC32ST(return unchainXDirect_PPC(endness_host,
124012b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe                                           place_to_unchain,
124112b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe                                           place_to_jump_to_EXPECTED,
124212b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe                                           disp_cp_chain_me, False/*!mode64*/));
1243f252de5ec83a5cc72f96fe4decf662cfbb28df8bsewardj      case VexArchPPC64:
124412b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe         PPC64ST(return unchainXDirect_PPC(endness_host,
124512b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe                                           place_to_unchain,
124612b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe                                           place_to_jump_to_EXPECTED,
124712b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe                                           disp_cp_chain_me, True/*mode64*/));
1248d0e5fe765fb79e5495206f8d0969133178b871f2sewardj      case VexArchMIPS32:
124912b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe         MIPS32ST(return unchainXDirect_MIPS(endness_host,
125012b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe                                             place_to_unchain,
125112b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe                                             place_to_jump_to_EXPECTED,
125212b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe                                             disp_cp_chain_me, False/*!mode64*/));
1253b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj      case VexArchMIPS64:
125412b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe         MIPS64ST(return unchainXDirect_MIPS(endness_host,
125512b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe                                             place_to_unchain,
125612b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe                                             place_to_jump_to_EXPECTED,
125712b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe                                             disp_cp_chain_me, True/*!mode64*/));
12580de80192f57cd132b31b233c65734de04939ce65sewardj
12590de80192f57cd132b31b233c65734de04939ce65sewardj      case VexArchTILEGX:
12600de80192f57cd132b31b233c65734de04939ce65sewardj         TILEGXST(return unchainXDirect_TILEGX(endness_host,
12610de80192f57cd132b31b233c65734de04939ce65sewardj                                      place_to_unchain,
12620de80192f57cd132b31b233c65734de04939ce65sewardj                                      place_to_jump_to_EXPECTED,
12630de80192f57cd132b31b233c65734de04939ce65sewardj                                               disp_cp_chain_me, True/*!mode64*/));
12640de80192f57cd132b31b233c65734de04939ce65sewardj
1265c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj      default:
1266c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj         vassert(0);
1267c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj   }
1268c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj}
1269c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj
12707ce2cc883c5b36586babec833838951ecf9f2a76florianInt LibVEX_evCheckSzB ( VexArch    arch_host )
1271c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj{
1272c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj   static Int cached = 0; /* DO NOT MAKE NON-STATIC */
1273c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj   if (UNLIKELY(cached == 0)) {
1274c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj      switch (arch_host) {
1275c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj         case VexArchX86:
127612b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe            X86ST(cached = evCheckSzB_X86()); break;
1277c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj         case VexArchAMD64:
127812b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe            AMD64ST(cached = evCheckSzB_AMD64()); break;
1279c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj         case VexArchARM:
128012b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe            ARMST(cached = evCheckSzB_ARM()); break;
1281bbcf188f6ae64a44fb31414eb9e1a738b4befcc0sewardj         case VexArchARM64:
128212b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe            ARM64ST(cached = evCheckSzB_ARM64()); break;
12838844a6329d275814456e3a2a5a7bffac75da0957florian         case VexArchS390X:
128412b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe            S390ST(cached = evCheckSzB_S390()); break;
12853dee849ec7c38746749065e67dc53b75daa7617dsewardj         case VexArchPPC32:
128612b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe            PPC32ST(cached = evCheckSzB_PPC()); break;
1287f252de5ec83a5cc72f96fe4decf662cfbb28df8bsewardj         case VexArchPPC64:
128812b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe            PPC64ST(cached = evCheckSzB_PPC()); break;
1289d0e5fe765fb79e5495206f8d0969133178b871f2sewardj         case VexArchMIPS32:
129012b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe            MIPS32ST(cached = evCheckSzB_MIPS()); break;
1291b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj         case VexArchMIPS64:
129212b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe            MIPS64ST(cached = evCheckSzB_MIPS()); break;
12930de80192f57cd132b31b233c65734de04939ce65sewardj         case VexArchTILEGX:
12940de80192f57cd132b31b233c65734de04939ce65sewardj            TILEGXST(cached = evCheckSzB_TILEGX()); break;
1295c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj         default:
1296c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj            vassert(0);
1297c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj      }
1298c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj   }
1299c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj   return cached;
1300c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj}
1301c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj
13029b76916dcc1628e133d57db001563429c6e3a590sewardjVexInvalRange LibVEX_PatchProfInc ( VexArch    arch_host,
13039b76916dcc1628e133d57db001563429c6e3a590sewardj                                    VexEndness endness_host,
13049b76916dcc1628e133d57db001563429c6e3a590sewardj                                    void*      place_to_patch,
13057d6f81de12e6d8deb3e119ab318f361d97a10a65florian                                    const ULong* location_of_counter )
1306c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj{
1307c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj   switch (arch_host) {
1308c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj      case VexArchX86:
130912b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe         X86ST(return patchProfInc_X86(endness_host, place_to_patch,
131012b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe                                       location_of_counter));
1311c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj      case VexArchAMD64:
131212b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe         AMD64ST(return patchProfInc_AMD64(endness_host, place_to_patch,
131312b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe                                           location_of_counter));
1314c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj      case VexArchARM:
131512b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe         ARMST(return patchProfInc_ARM(endness_host, place_to_patch,
131612b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe                                       location_of_counter));
13170ad37a9e5936c15460f067bee8948b900cdab036sewardj      case VexArchARM64:
131812b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe         ARM64ST(return patchProfInc_ARM64(endness_host, place_to_patch,
131912b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe                                           location_of_counter));
13208844a6329d275814456e3a2a5a7bffac75da0957florian      case VexArchS390X:
132112b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe         S390ST(return patchProfInc_S390(endness_host, place_to_patch,
132212b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe                                         location_of_counter));
13233dee849ec7c38746749065e67dc53b75daa7617dsewardj      case VexArchPPC32:
132412b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe         PPC32ST(return patchProfInc_PPC(endness_host, place_to_patch,
132512b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe                                         location_of_counter, False/*!mode64*/));
1326f252de5ec83a5cc72f96fe4decf662cfbb28df8bsewardj      case VexArchPPC64:
132712b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe         PPC64ST(return patchProfInc_PPC(endness_host, place_to_patch,
132812b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe                                         location_of_counter, True/*mode64*/));
1329d0e5fe765fb79e5495206f8d0969133178b871f2sewardj      case VexArchMIPS32:
133012b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe         MIPS32ST(return patchProfInc_MIPS(endness_host, place_to_patch,
133112b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe                                           location_of_counter, False/*!mode64*/));
1332b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj      case VexArchMIPS64:
133312b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe         MIPS64ST(return patchProfInc_MIPS(endness_host, place_to_patch,
133412b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe                                           location_of_counter, True/*!mode64*/));
13350de80192f57cd132b31b233c65734de04939ce65sewardj      case VexArchTILEGX:
13360de80192f57cd132b31b233c65734de04939ce65sewardj         TILEGXST(return patchProfInc_TILEGX(endness_host, place_to_patch,
13370de80192f57cd132b31b233c65734de04939ce65sewardj                                             location_of_counter,
13380de80192f57cd132b31b233c65734de04939ce65sewardj                                             True/*!mode64*/));
1339c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj      default:
1340c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj         vassert(0);
1341c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj   }
1342c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj}
1343c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj
1344c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj
1345893aadad7f29f7801ce26cb7575c16e90bd3767fsewardj/* --------- Emulation warnings. --------- */
1346893aadad7f29f7801ce26cb7575c16e90bd3767fsewardj
13471ff4756e1731485e6bf3cd96717cd8398daec1f2florianconst HChar* LibVEX_EmNote_string ( VexEmNote ew )
1348893aadad7f29f7801ce26cb7575c16e90bd3767fsewardj{
1349893aadad7f29f7801ce26cb7575c16e90bd3767fsewardj   switch (ew) {
13506ef84bed9bb3af22060eb1759788034602bbcc88florian     case EmNote_NONE:
1351893aadad7f29f7801ce26cb7575c16e90bd3767fsewardj        return "none";
1352893aadad7f29f7801ce26cb7575c16e90bd3767fsewardj     case EmWarn_X86_x87exns:
1353893aadad7f29f7801ce26cb7575c16e90bd3767fsewardj        return "Unmasking x87 FP exceptions";
1354893aadad7f29f7801ce26cb7575c16e90bd3767fsewardj     case EmWarn_X86_x87precision:
1355893aadad7f29f7801ce26cb7575c16e90bd3767fsewardj        return "Selection of non-80-bit x87 FP precision";
1356893aadad7f29f7801ce26cb7575c16e90bd3767fsewardj     case EmWarn_X86_sseExns:
13575edfc26d72ca8ebea2aa0443a1ed4dd218343d04sewardj        return "Unmasking SSE FP exceptions";
13585edfc26d72ca8ebea2aa0443a1ed4dd218343d04sewardj     case EmWarn_X86_fz:
13595edfc26d72ca8ebea2aa0443a1ed4dd218343d04sewardj        return "Setting %mxcsr.fz (SSE flush-underflows-to-zero mode)";
13605edfc26d72ca8ebea2aa0443a1ed4dd218343d04sewardj     case EmWarn_X86_daz:
13615edfc26d72ca8ebea2aa0443a1ed4dd218343d04sewardj        return "Setting %mxcsr.daz (SSE treat-denormals-as-zero mode)";
13626d26984a0df6a7d20b658bac6edf869eb872cca3sewardj     case EmWarn_X86_acFlag:
13636d26984a0df6a7d20b658bac6edf869eb872cca3sewardj        return "Setting %eflags.ac (setting noted but ignored)";
13649dd9cf1cb0b6915fc2f7dff642455ca41e162649sewardj     case EmWarn_PPCexns:
13659dd9cf1cb0b6915fc2f7dff642455ca41e162649sewardj        return "Unmasking PPC32/64 FP exceptions";
13669dd9cf1cb0b6915fc2f7dff642455ca41e162649sewardj     case EmWarn_PPC64_redir_overflow:
13679dd9cf1cb0b6915fc2f7dff642455ca41e162649sewardj        return "PPC64 function redirection stack overflow";
13689dd9cf1cb0b6915fc2f7dff642455ca41e162649sewardj     case EmWarn_PPC64_redir_underflow:
13699dd9cf1cb0b6915fc2f7dff642455ca41e162649sewardj        return "PPC64 function redirection stack underflow";
13704b8efad55c1c7f9941b605b2f171b71a094c1f33florian     case EmWarn_S390X_fpext_rounding:
13714b8efad55c1c7f9941b605b2f171b71a094c1f33florian        return "The specified rounding mode cannot be supported. That\n"
13722a4de0bb56f33835bab59c0e483acc8410baed98florian               "  feature requires the floating point extension facility\n"
13734b8efad55c1c7f9941b605b2f171b71a094c1f33florian               "  which is not available on this host. Continuing using\n"
13744b8efad55c1c7f9941b605b2f171b71a094c1f33florian               "  the rounding mode from FPC. Results may differ!";
1375f0fa1be734f2bcbc20ac638cc61dc149deb8b644florian     case EmWarn_S390X_invalid_rounding:
1376f0fa1be734f2bcbc20ac638cc61dc149deb8b644florian        return "The specified rounding mode is invalid.\n"
1377f0fa1be734f2bcbc20ac638cc61dc149deb8b644florian               "  Continuing using 'round to nearest'. Results may differ!";
1378e75dafa8ecce0a5cc64cf4b91b32b192250894dcflorian     case EmFail_S390X_stfle:
13794e0083ee421db6d2900eaa00dc70c86ee829e28bflorian        return "Instruction stfle is not supported on this host";
1380e75dafa8ecce0a5cc64cf4b91b32b192250894dcflorian     case EmFail_S390X_stckf:
1381c5c669b461e3cbcd89d6bdbb4ecb9bcfd2ad23f5florian        return "Instruction stckf is not supported on this host";
1382e75dafa8ecce0a5cc64cf4b91b32b192250894dcflorian     case EmFail_S390X_ecag:
13838c88cb6ae821021e1e00be18f5a8bea3c557080aflorian        return "Instruction ecag is not supported on this host";
1384ad00ea9f40f930d98bb2d278291a6c4c6636d6d6florian     case EmFail_S390X_pfpo:
1385ad00ea9f40f930d98bb2d278291a6c4c6636d6d6florian        return "Instruction pfpo is not supported on this host";
1386fb5966040a32f9da5be84e63ca23d848f6766faeflorian     case EmFail_S390X_DFP_insn:
1387fb5966040a32f9da5be84e63ca23d848f6766faeflorian        return "DFP instructions are not supported on this host";
1388e75dafa8ecce0a5cc64cf4b91b32b192250894dcflorian     case EmFail_S390X_fpext:
1389e75dafa8ecce0a5cc64cf4b91b32b192250894dcflorian        return "Encountered an instruction that requires the floating "
1390e75dafa8ecce0a5cc64cf4b91b32b192250894dcflorian               "point extension facility.\n"
1391e75dafa8ecce0a5cc64cf4b91b32b192250894dcflorian               "  That facility is not available on this host";
139278d5ef75d89e5aa6c629a2d47f7e04ddbf1253c3florian     case EmFail_S390X_invalid_PFPO_rounding_mode:
13932a4de0bb56f33835bab59c0e483acc8410baed98florian        return "The rounding mode in GPR 0 for the PFPO instruction"
139478d5ef75d89e5aa6c629a2d47f7e04ddbf1253c3florian               " is invalid";
139578d5ef75d89e5aa6c629a2d47f7e04ddbf1253c3florian     case EmFail_S390X_invalid_PFPO_function:
13962a4de0bb56f33835bab59c0e483acc8410baed98florian        return "The function code in GPR 0 for the PFPO instruction"
139778d5ef75d89e5aa6c629a2d47f7e04ddbf1253c3florian               " is invalid";
1398893aadad7f29f7801ce26cb7575c16e90bd3767fsewardj     default:
13996ef84bed9bb3af22060eb1759788034602bbcc88florian        vpanic("LibVEX_EmNote_string: unknown warning");
1400893aadad7f29f7801ce26cb7575c16e90bd3767fsewardj   }
1401893aadad7f29f7801ce26cb7575c16e90bd3767fsewardj}
140235421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj
14035117ce116f47141cb23d1b49cc826e19323add97sewardj/* ------------------ Arch/HwCaps stuff. ------------------ */
1404bef170b7e84713d1e2181b9204d9415d29de3d65sewardj
1405bef170b7e84713d1e2181b9204d9415d29de3d65sewardjconst HChar* LibVEX_ppVexArch ( VexArch arch )
1406bef170b7e84713d1e2181b9204d9415d29de3d65sewardj{
1407bef170b7e84713d1e2181b9204d9415d29de3d65sewardj   switch (arch) {
1408bef170b7e84713d1e2181b9204d9415d29de3d65sewardj      case VexArch_INVALID: return "INVALID";
1409bef170b7e84713d1e2181b9204d9415d29de3d65sewardj      case VexArchX86:      return "X86";
1410bef170b7e84713d1e2181b9204d9415d29de3d65sewardj      case VexArchAMD64:    return "AMD64";
1411bef170b7e84713d1e2181b9204d9415d29de3d65sewardj      case VexArchARM:      return "ARM";
1412bbcf188f6ae64a44fb31414eb9e1a738b4befcc0sewardj      case VexArchARM64:    return "ARM64";
14130ec57c595719a395e71b48792a4d62c5b896b6d3sewardj      case VexArchPPC32:    return "PPC32";
1414f0de28cf1a762b0d6f74c93d3532c89a230673bbcerion      case VexArchPPC64:    return "PPC64";
14152019a976f07ff418dde2dfc7cc74667ef66d7764sewardj      case VexArchS390X:    return "S390X";
1416d0e5fe765fb79e5495206f8d0969133178b871f2sewardj      case VexArchMIPS32:   return "MIPS32";
1417b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj      case VexArchMIPS64:   return "MIPS64";
14180de80192f57cd132b31b233c65734de04939ce65sewardj      case VexArchTILEGX:   return "TILEGX";
1419bef170b7e84713d1e2181b9204d9415d29de3d65sewardj      default:              return "VexArch???";
1420bef170b7e84713d1e2181b9204d9415d29de3d65sewardj   }
1421bef170b7e84713d1e2181b9204d9415d29de3d65sewardj}
1422bef170b7e84713d1e2181b9204d9415d29de3d65sewardj
14239b76916dcc1628e133d57db001563429c6e3a590sewardjconst HChar* LibVEX_ppVexEndness ( VexEndness endness )
14249b76916dcc1628e133d57db001563429c6e3a590sewardj{
14259b76916dcc1628e133d57db001563429c6e3a590sewardj   switch (endness) {
14269b76916dcc1628e133d57db001563429c6e3a590sewardj      case VexEndness_INVALID: return "INVALID";
14279b76916dcc1628e133d57db001563429c6e3a590sewardj      case VexEndnessLE:       return "LittleEndian";
14289b76916dcc1628e133d57db001563429c6e3a590sewardj      case VexEndnessBE:       return "BigEndian";
14299b76916dcc1628e133d57db001563429c6e3a590sewardj      default:                 return "VexEndness???";
14309b76916dcc1628e133d57db001563429c6e3a590sewardj   }
14319b76916dcc1628e133d57db001563429c6e3a590sewardj}
14329b76916dcc1628e133d57db001563429c6e3a590sewardj
1433f3652c97c20265d3410ea75d9817e8323b6df5c8florian/* Return a string with the hardware capabilities to the extent as
1434f3652c97c20265d3410ea75d9817e8323b6df5c8florian   they pertain to the translation process. No attempt is made, to
1435f3652c97c20265d3410ea75d9817e8323b6df5c8florian   detect *all* capabilities an architecture may have. */
14365117ce116f47141cb23d1b49cc826e19323add97sewardjconst HChar* LibVEX_ppVexHwCaps ( VexArch arch, UInt hwcaps )
1437bef170b7e84713d1e2181b9204d9415d29de3d65sewardj{
1438f3652c97c20265d3410ea75d9817e8323b6df5c8florian   return show_hwcaps(arch, hwcaps);
1439bef170b7e84713d1e2181b9204d9415d29de3d65sewardj}
1440bef170b7e84713d1e2181b9204d9415d29de3d65sewardj
14415117ce116f47141cb23d1b49cc826e19323add97sewardj
144227e1dd6317760f3222f8a82185fa0e8ba138c85bsewardj/* Write default settings info *vai. */
144327e1dd6317760f3222f8a82185fa0e8ba138c85bsewardjvoid LibVEX_default_VexArchInfo ( /*OUT*/VexArchInfo* vai )
144427e1dd6317760f3222f8a82185fa0e8ba138c85bsewardj{
144565902992da28822e4753594c7b72f7cb177fe3a6sewardj   vex_bzero(vai, sizeof(*vai));
14469b76916dcc1628e133d57db001563429c6e3a590sewardj   vai->hwcaps                  = 0;
14479b76916dcc1628e133d57db001563429c6e3a590sewardj   vai->endness                 = VexEndness_INVALID;
14489b76916dcc1628e133d57db001563429c6e3a590sewardj   vai->ppc_icache_line_szB     = 0;
14499b76916dcc1628e133d57db001563429c6e3a590sewardj   vai->ppc_dcbz_szB            = 0;
14509b76916dcc1628e133d57db001563429c6e3a590sewardj   vai->ppc_dcbzl_szB           = 0;
145165902992da28822e4753594c7b72f7cb177fe3a6sewardj   vai->arm64_dMinLine_lg2_szB  = 0;
145265902992da28822e4753594c7b72f7cb177fe3a6sewardj   vai->arm64_iMinLine_lg2_szB  = 0;
1453f192a391bc556ff6e074ec055df5b883895e5b52florian   vai->hwcache_info.num_levels = 0;
1454f192a391bc556ff6e074ec055df5b883895e5b52florian   vai->hwcache_info.num_caches = 0;
145565902992da28822e4753594c7b72f7cb177fe3a6sewardj   vai->hwcache_info.caches     = NULL;
1456f192a391bc556ff6e074ec055df5b883895e5b52florian   vai->hwcache_info.icaches_maintain_coherence = True;  // whatever
145727e1dd6317760f3222f8a82185fa0e8ba138c85bsewardj}
145827e1dd6317760f3222f8a82185fa0e8ba138c85bsewardj
1459dd40fdf58cc8a6fe9466c4f00bdfc9fe9bf00449sewardj/* Write default settings info *vbi. */
1460dd40fdf58cc8a6fe9466c4f00bdfc9fe9bf00449sewardjvoid LibVEX_default_VexAbiInfo ( /*OUT*/VexAbiInfo* vbi )
1461aca070a5b3418a6a9b01e3c57a7eb0fbb5050908sewardj{
146265902992da28822e4753594c7b72f7cb177fe3a6sewardj   vex_bzero(vbi, sizeof(*vbi));
1463dd40fdf58cc8a6fe9466c4f00bdfc9fe9bf00449sewardj   vbi->guest_stack_redzone_size       = 0;
1464e2cc4defff3eec3be8e38ccc21df5ee460f930e9philippe   vbi->guest_amd64_assume_fs_is_const = False;
1465e2cc4defff3eec3be8e38ccc21df5ee460f930e9philippe   vbi->guest_amd64_assume_gs_is_const = False;
1466dd40fdf58cc8a6fe9466c4f00bdfc9fe9bf00449sewardj   vbi->guest_ppc_zap_RZ_at_blr        = False;
1467dd40fdf58cc8a6fe9466c4f00bdfc9fe9bf00449sewardj   vbi->guest_ppc_zap_RZ_at_bl         = NULL;
1468dd40fdf58cc8a6fe9466c4f00bdfc9fe9bf00449sewardj   vbi->host_ppc_calls_use_fndescrs    = False;
1469aca070a5b3418a6a9b01e3c57a7eb0fbb5050908sewardj}
1470aca070a5b3418a6a9b01e3c57a7eb0fbb5050908sewardj
147127e1dd6317760f3222f8a82185fa0e8ba138c85bsewardj
1472f3652c97c20265d3410ea75d9817e8323b6df5c8florian/* Convenience macro to be used in show_hwcaps_ARCH functions */
1473f3652c97c20265d3410ea75d9817e8323b6df5c8florian#define NUM_HWCAPS (sizeof hwcaps_list / sizeof hwcaps_list[0])
1474f3652c97c20265d3410ea75d9817e8323b6df5c8florian
14755117ce116f47141cb23d1b49cc826e19323add97sewardj/* Return a string showing the hwcaps in a nice way.  The string will
1476f3652c97c20265d3410ea75d9817e8323b6df5c8florian   be NULL for unrecognised hardware capabilities. */
14775117ce116f47141cb23d1b49cc826e19323add97sewardj
147855085f8680acc89d727e321f3b34cae1a8c4093aflorianstatic const HChar* show_hwcaps_x86 ( UInt hwcaps )
14795117ce116f47141cb23d1b49cc826e19323add97sewardj{
1480f3652c97c20265d3410ea75d9817e8323b6df5c8florian   static const HChar prefix[] = "x86";
1481f3652c97c20265d3410ea75d9817e8323b6df5c8florian   static const struct {
1482f3652c97c20265d3410ea75d9817e8323b6df5c8florian      UInt  hwcaps_bit;
1483f3652c97c20265d3410ea75d9817e8323b6df5c8florian      HChar name[7];
1484f3652c97c20265d3410ea75d9817e8323b6df5c8florian   } hwcaps_list[] = {
1485f3652c97c20265d3410ea75d9817e8323b6df5c8florian      { VEX_HWCAPS_X86_MMXEXT, "mmxext" },
1486f3652c97c20265d3410ea75d9817e8323b6df5c8florian      { VEX_HWCAPS_X86_SSE1,   "sse1"   },
1487f3652c97c20265d3410ea75d9817e8323b6df5c8florian      { VEX_HWCAPS_X86_SSE2,   "sse2"   },
1488f3652c97c20265d3410ea75d9817e8323b6df5c8florian      { VEX_HWCAPS_X86_SSE3,   "sse3"   },
1489f3652c97c20265d3410ea75d9817e8323b6df5c8florian      { VEX_HWCAPS_X86_LZCNT,  "lzcnt"  },
1490f3652c97c20265d3410ea75d9817e8323b6df5c8florian   };
1491f3652c97c20265d3410ea75d9817e8323b6df5c8florian   /* Allocate a large enough buffer */
1492f3652c97c20265d3410ea75d9817e8323b6df5c8florian   static HChar buf[sizeof prefix +
1493f3652c97c20265d3410ea75d9817e8323b6df5c8florian                    NUM_HWCAPS * (sizeof hwcaps_list[0].name + 1) + 1]; // '\0'
1494f3652c97c20265d3410ea75d9817e8323b6df5c8florian   if (buf[0] != '\0') return buf;  /* already constructed */
1495f3652c97c20265d3410ea75d9817e8323b6df5c8florian
1496f3652c97c20265d3410ea75d9817e8323b6df5c8florian   HChar *p = buf + vex_sprintf(buf, "%s", prefix);
1497f3652c97c20265d3410ea75d9817e8323b6df5c8florian
1498f3652c97c20265d3410ea75d9817e8323b6df5c8florian   if (hwcaps == 0) {
1499f3652c97c20265d3410ea75d9817e8323b6df5c8florian      vex_sprintf(p, "-%s", "sse0");
1500f3652c97c20265d3410ea75d9817e8323b6df5c8florian   } else {
1501f3652c97c20265d3410ea75d9817e8323b6df5c8florian      UInt i;
1502f3652c97c20265d3410ea75d9817e8323b6df5c8florian      for (i = 0 ; i < NUM_HWCAPS; ++i) {
1503f3652c97c20265d3410ea75d9817e8323b6df5c8florian         if (hwcaps & hwcaps_list[i].hwcaps_bit)
1504f3652c97c20265d3410ea75d9817e8323b6df5c8florian            p = p + vex_sprintf(p, "-%s", hwcaps_list[i].name);
1505f3652c97c20265d3410ea75d9817e8323b6df5c8florian      }
1506536fbabcc3770f42bb7370efd75e8e30e9a841c8sewardj   }
1507f3652c97c20265d3410ea75d9817e8323b6df5c8florian   return buf;
15085117ce116f47141cb23d1b49cc826e19323add97sewardj}
15095117ce116f47141cb23d1b49cc826e19323add97sewardj
151055085f8680acc89d727e321f3b34cae1a8c4093aflorianstatic const HChar* show_hwcaps_amd64 ( UInt hwcaps )
15115117ce116f47141cb23d1b49cc826e19323add97sewardj{
1512f3652c97c20265d3410ea75d9817e8323b6df5c8florian   static const HChar prefix[] = "amd64";
1513f3652c97c20265d3410ea75d9817e8323b6df5c8florian   static const struct {
1514f3652c97c20265d3410ea75d9817e8323b6df5c8florian      UInt  hwcaps_bit;
1515f3652c97c20265d3410ea75d9817e8323b6df5c8florian      HChar name[7];
1516f3652c97c20265d3410ea75d9817e8323b6df5c8florian   } hwcaps_list[] = {
1517f3652c97c20265d3410ea75d9817e8323b6df5c8florian      { VEX_HWCAPS_AMD64_CX16,   "cx16"   },
1518f3652c97c20265d3410ea75d9817e8323b6df5c8florian      { VEX_HWCAPS_AMD64_LZCNT,  "lzcnt"  },
1519f3652c97c20265d3410ea75d9817e8323b6df5c8florian      { VEX_HWCAPS_AMD64_RDTSCP, "rdtscp" },
1520f3652c97c20265d3410ea75d9817e8323b6df5c8florian      { VEX_HWCAPS_AMD64_SSE3,   "sse3"   },
1521f3652c97c20265d3410ea75d9817e8323b6df5c8florian      { VEX_HWCAPS_AMD64_AVX,    "avx"    },
1522f3652c97c20265d3410ea75d9817e8323b6df5c8florian      { VEX_HWCAPS_AMD64_AVX2,   "avx2"   },
1523f3652c97c20265d3410ea75d9817e8323b6df5c8florian      { VEX_HWCAPS_AMD64_BMI,    "bmi"    },
1524f3652c97c20265d3410ea75d9817e8323b6df5c8florian   };
1525f3652c97c20265d3410ea75d9817e8323b6df5c8florian   /* Allocate a large enough buffer */
1526f3652c97c20265d3410ea75d9817e8323b6df5c8florian   static HChar buf[sizeof prefix +
1527f3652c97c20265d3410ea75d9817e8323b6df5c8florian                    NUM_HWCAPS * (sizeof hwcaps_list[0].name + 1) + 1]; // '\0'
1528f3652c97c20265d3410ea75d9817e8323b6df5c8florian   if (buf[0] != '\0') return buf;  /* already constructed */
1529f3652c97c20265d3410ea75d9817e8323b6df5c8florian
1530f3652c97c20265d3410ea75d9817e8323b6df5c8florian   HChar *p = buf + vex_sprintf(buf, "%s", prefix);
1531f3652c97c20265d3410ea75d9817e8323b6df5c8florian
1532818c730f624828ef2d5532e32e952924094b699esewardj   if (hwcaps == 0) {
1533f3652c97c20265d3410ea75d9817e8323b6df5c8florian      vex_sprintf(p, "-%s", "sse2");
1534f3652c97c20265d3410ea75d9817e8323b6df5c8florian   } else {
1535f3652c97c20265d3410ea75d9817e8323b6df5c8florian      UInt i;
1536f3652c97c20265d3410ea75d9817e8323b6df5c8florian      for (i = 0 ; i < NUM_HWCAPS; ++i) {
1537f3652c97c20265d3410ea75d9817e8323b6df5c8florian         if (hwcaps & hwcaps_list[i].hwcaps_bit)
1538f3652c97c20265d3410ea75d9817e8323b6df5c8florian            p = p + vex_sprintf(p, "-%s", hwcaps_list[i].name);
1539f3652c97c20265d3410ea75d9817e8323b6df5c8florian      }
1540cc3d219c3120150c9ab67f1f4850be0f39a9499csewardj   }
1541818c730f624828ef2d5532e32e952924094b699esewardj   return buf;
15425117ce116f47141cb23d1b49cc826e19323add97sewardj}
15435117ce116f47141cb23d1b49cc826e19323add97sewardj
154455085f8680acc89d727e321f3b34cae1a8c4093aflorianstatic const HChar* show_hwcaps_ppc32 ( UInt hwcaps )
15455117ce116f47141cb23d1b49cc826e19323add97sewardj{
1546f3652c97c20265d3410ea75d9817e8323b6df5c8florian   static const HChar prefix[] = "ppc32-int";
1547f3652c97c20265d3410ea75d9817e8323b6df5c8florian   static const struct {
1548f3652c97c20265d3410ea75d9817e8323b6df5c8florian      UInt  hwcaps_bit;
1549f3652c97c20265d3410ea75d9817e8323b6df5c8florian      HChar name[8];
1550f3652c97c20265d3410ea75d9817e8323b6df5c8florian   } hwcaps_list[] = {
1551f3652c97c20265d3410ea75d9817e8323b6df5c8florian      { VEX_HWCAPS_PPC32_F,       "flt"     },
1552f3652c97c20265d3410ea75d9817e8323b6df5c8florian      { VEX_HWCAPS_PPC32_V,       "vmx"     },
1553f3652c97c20265d3410ea75d9817e8323b6df5c8florian      { VEX_HWCAPS_PPC32_FX,      "FX"      },
1554f3652c97c20265d3410ea75d9817e8323b6df5c8florian      { VEX_HWCAPS_PPC32_GX,      "GX"      },
1555f3652c97c20265d3410ea75d9817e8323b6df5c8florian      { VEX_HWCAPS_PPC32_VX,      "VX"      },
1556f3652c97c20265d3410ea75d9817e8323b6df5c8florian      { VEX_HWCAPS_PPC32_DFP,     "DFP"     },
1557f3652c97c20265d3410ea75d9817e8323b6df5c8florian      { VEX_HWCAPS_PPC32_ISA2_07, "ISA2_07" },
1558a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes      { VEX_HWCAPS_PPC32_ISA3_0,  "ISA3_0"  },
1559f3652c97c20265d3410ea75d9817e8323b6df5c8florian   };
1560f3652c97c20265d3410ea75d9817e8323b6df5c8florian   /* Allocate a large enough buffer */
1561f3652c97c20265d3410ea75d9817e8323b6df5c8florian   static HChar buf[sizeof prefix +
1562f3652c97c20265d3410ea75d9817e8323b6df5c8florian                    NUM_HWCAPS * (sizeof hwcaps_list[0].name + 1) + 1]; // '\0'
1563f3652c97c20265d3410ea75d9817e8323b6df5c8florian   if (buf[0] != '\0') return buf;  /* already constructed */
1564f3652c97c20265d3410ea75d9817e8323b6df5c8florian
1565f3652c97c20265d3410ea75d9817e8323b6df5c8florian   HChar *p = buf + vex_sprintf(buf, "%s", prefix);
1566f3652c97c20265d3410ea75d9817e8323b6df5c8florian
1567f3652c97c20265d3410ea75d9817e8323b6df5c8florian   if (hwcaps == 0) return buf;
1568f3652c97c20265d3410ea75d9817e8323b6df5c8florian
1569f3652c97c20265d3410ea75d9817e8323b6df5c8florian   UInt i;
1570f3652c97c20265d3410ea75d9817e8323b6df5c8florian   for (i = 0 ; i < NUM_HWCAPS; ++i) {
1571f3652c97c20265d3410ea75d9817e8323b6df5c8florian      if (hwcaps & hwcaps_list[i].hwcaps_bit)
1572f3652c97c20265d3410ea75d9817e8323b6df5c8florian         p = p + vex_sprintf(p, "-%s", hwcaps_list[i].name);
1573f3652c97c20265d3410ea75d9817e8323b6df5c8florian   }
1574f3652c97c20265d3410ea75d9817e8323b6df5c8florian   return buf;
15755117ce116f47141cb23d1b49cc826e19323add97sewardj}
15765117ce116f47141cb23d1b49cc826e19323add97sewardj
157755085f8680acc89d727e321f3b34cae1a8c4093aflorianstatic const HChar* show_hwcaps_ppc64 ( UInt hwcaps )
15785117ce116f47141cb23d1b49cc826e19323add97sewardj{
1579f3652c97c20265d3410ea75d9817e8323b6df5c8florian   static const HChar prefix[] = "ppc64-int-flt";
1580f3652c97c20265d3410ea75d9817e8323b6df5c8florian   static const struct {
1581f3652c97c20265d3410ea75d9817e8323b6df5c8florian      UInt  hwcaps_bit;
1582f3652c97c20265d3410ea75d9817e8323b6df5c8florian      HChar name[8];
1583f3652c97c20265d3410ea75d9817e8323b6df5c8florian   } hwcaps_list[] = {
1584f3652c97c20265d3410ea75d9817e8323b6df5c8florian      { VEX_HWCAPS_PPC64_FX,      "FX"      },
1585f3652c97c20265d3410ea75d9817e8323b6df5c8florian      { VEX_HWCAPS_PPC64_GX,      "GX"      },
1586f3652c97c20265d3410ea75d9817e8323b6df5c8florian      { VEX_HWCAPS_PPC64_V,       "vmx"     },
1587f3652c97c20265d3410ea75d9817e8323b6df5c8florian      { VEX_HWCAPS_PPC64_DFP,     "DFP"     },
1588f3652c97c20265d3410ea75d9817e8323b6df5c8florian      { VEX_HWCAPS_PPC64_ISA2_07, "ISA2_07" },
1589a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes      { VEX_HWCAPS_PPC64_ISA3_0,  "ISA3_0"  },
1590f3652c97c20265d3410ea75d9817e8323b6df5c8florian   };
1591f3652c97c20265d3410ea75d9817e8323b6df5c8florian   /* Allocate a large enough buffer */
1592f3652c97c20265d3410ea75d9817e8323b6df5c8florian   static HChar buf[sizeof prefix +
1593f3652c97c20265d3410ea75d9817e8323b6df5c8florian                    NUM_HWCAPS * (sizeof hwcaps_list[0].name + 1) + 1]; // '\0'
1594f3652c97c20265d3410ea75d9817e8323b6df5c8florian   if (buf[0] != '\0') return buf;  /* already constructed */
1595f3652c97c20265d3410ea75d9817e8323b6df5c8florian
1596f3652c97c20265d3410ea75d9817e8323b6df5c8florian   HChar *p = buf + vex_sprintf(buf, "%s", prefix);
1597f3652c97c20265d3410ea75d9817e8323b6df5c8florian
1598f3652c97c20265d3410ea75d9817e8323b6df5c8florian   if (hwcaps == 0) return buf;
1599f3652c97c20265d3410ea75d9817e8323b6df5c8florian
1600f3652c97c20265d3410ea75d9817e8323b6df5c8florian   UInt i;
1601f3652c97c20265d3410ea75d9817e8323b6df5c8florian   for (i = 0 ; i < NUM_HWCAPS; ++i) {
1602f3652c97c20265d3410ea75d9817e8323b6df5c8florian      if (hwcaps & hwcaps_list[i].hwcaps_bit)
1603f3652c97c20265d3410ea75d9817e8323b6df5c8florian         p = p + vex_sprintf(p, "-%s", hwcaps_list[i].name);
1604f3652c97c20265d3410ea75d9817e8323b6df5c8florian   }
1605f3652c97c20265d3410ea75d9817e8323b6df5c8florian   return buf;
16065117ce116f47141cb23d1b49cc826e19323add97sewardj}
16075117ce116f47141cb23d1b49cc826e19323add97sewardj
160855085f8680acc89d727e321f3b34cae1a8c4093aflorianstatic const HChar* show_hwcaps_arm ( UInt hwcaps )
16095117ce116f47141cb23d1b49cc826e19323add97sewardj{
1610f3652c97c20265d3410ea75d9817e8323b6df5c8florian   static const HChar prefix[] = "ARM";
1611f3652c97c20265d3410ea75d9817e8323b6df5c8florian   static const struct {
1612f3652c97c20265d3410ea75d9817e8323b6df5c8florian      UInt  hwcaps_bit;
1613f3652c97c20265d3410ea75d9817e8323b6df5c8florian      HChar name[6];
1614f3652c97c20265d3410ea75d9817e8323b6df5c8florian   } hwcaps_list[] = {
1615f3652c97c20265d3410ea75d9817e8323b6df5c8florian      { VEX_HWCAPS_ARM_NEON, "neon" },
1616f3652c97c20265d3410ea75d9817e8323b6df5c8florian      { VEX_HWCAPS_ARM_VFP | VEX_HWCAPS_ARM_VFP2 | VEX_HWCAPS_ARM_VFP3, "vfp" },
1617f3652c97c20265d3410ea75d9817e8323b6df5c8florian   };
1618f3652c97c20265d3410ea75d9817e8323b6df5c8florian   /* Allocate a large enough buffer */
1619f3652c97c20265d3410ea75d9817e8323b6df5c8florian   static HChar buf[sizeof prefix + 12 +    // level
1620f3652c97c20265d3410ea75d9817e8323b6df5c8florian                    NUM_HWCAPS * (sizeof hwcaps_list[0].name + 1) + 1]; // '\0'
1621f3652c97c20265d3410ea75d9817e8323b6df5c8florian   if (buf[0] != '\0') return buf;  /* already constructed */
1622f3652c97c20265d3410ea75d9817e8323b6df5c8florian
1623f3652c97c20265d3410ea75d9817e8323b6df5c8florian   HChar *p;
1624f3652c97c20265d3410ea75d9817e8323b6df5c8florian   UInt i, level;
1625f3652c97c20265d3410ea75d9817e8323b6df5c8florian
1626f3652c97c20265d3410ea75d9817e8323b6df5c8florian   level = VEX_ARM_ARCHLEVEL(hwcaps);
1627f3652c97c20265d3410ea75d9817e8323b6df5c8florian
1628f3652c97c20265d3410ea75d9817e8323b6df5c8florian   p = buf + vex_sprintf(buf, "%sv%u", prefix, level);
1629f3652c97c20265d3410ea75d9817e8323b6df5c8florian   for (i = 0 ; i < NUM_HWCAPS; ++i) {
1630f3652c97c20265d3410ea75d9817e8323b6df5c8florian      if (hwcaps & hwcaps_list[i].hwcaps_bit)
1631f3652c97c20265d3410ea75d9817e8323b6df5c8florian         p = p + vex_sprintf(p, "-%s", hwcaps_list[i].name);
1632ec0d9a028955060c5216341c6fc37400ec0cb4besewardj   }
1633f3652c97c20265d3410ea75d9817e8323b6df5c8florian   return buf;
16345117ce116f47141cb23d1b49cc826e19323add97sewardj}
16355117ce116f47141cb23d1b49cc826e19323add97sewardj
1636bbcf188f6ae64a44fb31414eb9e1a738b4befcc0sewardjstatic const HChar* show_hwcaps_arm64 ( UInt hwcaps )
1637bbcf188f6ae64a44fb31414eb9e1a738b4befcc0sewardj{
1638bbcf188f6ae64a44fb31414eb9e1a738b4befcc0sewardj   /* Since there are no variants, just insist that hwcaps is zero,
1639bbcf188f6ae64a44fb31414eb9e1a738b4befcc0sewardj      and declare it invalid otherwise. */
1640bbcf188f6ae64a44fb31414eb9e1a738b4befcc0sewardj  if (hwcaps == 0)
1641bbcf188f6ae64a44fb31414eb9e1a738b4befcc0sewardj     return "baseline";
1642f3652c97c20265d3410ea75d9817e8323b6df5c8florian  return "Unsupported";
1643bbcf188f6ae64a44fb31414eb9e1a738b4befcc0sewardj}
1644bbcf188f6ae64a44fb31414eb9e1a738b4befcc0sewardj
164555085f8680acc89d727e321f3b34cae1a8c4093aflorianstatic const HChar* show_hwcaps_s390x ( UInt hwcaps )
16462019a976f07ff418dde2dfc7cc74667ef66d7764sewardj{
1647d07b8566ab17faf70748cfce1304699f1d15c34esewardj   static const HChar prefix[] = "s390x";
16489061eb34b539df910f64354e8f3495aad47e8891florian   static const struct {
16499061eb34b539df910f64354e8f3495aad47e8891florian      UInt  hwcaps_bit;
16509061eb34b539df910f64354e8f3495aad47e8891florian      HChar name[6];
16519061eb34b539df910f64354e8f3495aad47e8891florian   } hwcaps_list[] = {
16529061eb34b539df910f64354e8f3495aad47e8891florian      { VEX_HWCAPS_S390X_LDISP, "ldisp" },
16539061eb34b539df910f64354e8f3495aad47e8891florian      { VEX_HWCAPS_S390X_EIMM,  "eimm" },
16549061eb34b539df910f64354e8f3495aad47e8891florian      { VEX_HWCAPS_S390X_GIE,   "gie" },
16559061eb34b539df910f64354e8f3495aad47e8891florian      { VEX_HWCAPS_S390X_DFP,   "dfp" },
16569061eb34b539df910f64354e8f3495aad47e8891florian      { VEX_HWCAPS_S390X_FGX,   "fgx" },
16579061eb34b539df910f64354e8f3495aad47e8891florian      { VEX_HWCAPS_S390X_STFLE, "stfle" },
16589061eb34b539df910f64354e8f3495aad47e8891florian      { VEX_HWCAPS_S390X_ETF2,  "etf2" },
16599061eb34b539df910f64354e8f3495aad47e8891florian      { VEX_HWCAPS_S390X_ETF3,  "etf3" },
16609061eb34b539df910f64354e8f3495aad47e8891florian      { VEX_HWCAPS_S390X_STCKF, "stckf" },
16619061eb34b539df910f64354e8f3495aad47e8891florian      { VEX_HWCAPS_S390X_FPEXT, "fpext" },
16629061eb34b539df910f64354e8f3495aad47e8891florian      { VEX_HWCAPS_S390X_LSC,   "lsc" },
166378d5ef75d89e5aa6c629a2d47f7e04ddbf1253c3florian      { VEX_HWCAPS_S390X_PFPO,  "pfpo" },
1664d07b8566ab17faf70748cfce1304699f1d15c34esewardj   };
1665f3652c97c20265d3410ea75d9817e8323b6df5c8florian   /* Allocate a large enough buffer */
16669061eb34b539df910f64354e8f3495aad47e8891florian   static HChar buf[sizeof prefix +
1667f3652c97c20265d3410ea75d9817e8323b6df5c8florian                    NUM_HWCAPS * (sizeof hwcaps_list[0].name + 1) + 1]; // '\0'
1668d07b8566ab17faf70748cfce1304699f1d15c34esewardj
1669d07b8566ab17faf70748cfce1304699f1d15c34esewardj   if (buf[0] != '\0') return buf;  /* already constructed */
16702019a976f07ff418dde2dfc7cc74667ef66d7764sewardj
1671f3652c97c20265d3410ea75d9817e8323b6df5c8florian   HChar *p;
1672f3652c97c20265d3410ea75d9817e8323b6df5c8florian   UInt i;
1673f3652c97c20265d3410ea75d9817e8323b6df5c8florian
1674652b56aecd7af6012e82801557b3833f74b19b59sewardj   hwcaps = VEX_HWCAPS_S390X(hwcaps);
1675652b56aecd7af6012e82801557b3833f74b19b59sewardj
1676d07b8566ab17faf70748cfce1304699f1d15c34esewardj   p = buf + vex_sprintf(buf, "%s", prefix);
16779061eb34b539df910f64354e8f3495aad47e8891florian   for (i = 0 ; i < NUM_HWCAPS; ++i) {
16789061eb34b539df910f64354e8f3495aad47e8891florian      if (hwcaps & hwcaps_list[i].hwcaps_bit)
16799061eb34b539df910f64354e8f3495aad47e8891florian         p = p + vex_sprintf(p, "-%s", hwcaps_list[i].name);
16809061eb34b539df910f64354e8f3495aad47e8891florian   }
1681d07b8566ab17faf70748cfce1304699f1d15c34esewardj
1682d07b8566ab17faf70748cfce1304699f1d15c34esewardj   /* If there are no facilities, add "zarch" */
1683d07b8566ab17faf70748cfce1304699f1d15c34esewardj   if (hwcaps == 0)
1684d07b8566ab17faf70748cfce1304699f1d15c34esewardj     vex_sprintf(p, "-%s", "zarch");
1685d07b8566ab17faf70748cfce1304699f1d15c34esewardj
1686d07b8566ab17faf70748cfce1304699f1d15c34esewardj   return buf;
16872019a976f07ff418dde2dfc7cc74667ef66d7764sewardj}
16882019a976f07ff418dde2dfc7cc74667ef66d7764sewardj
168955085f8680acc89d727e321f3b34cae1a8c4093aflorianstatic const HChar* show_hwcaps_mips32 ( UInt hwcaps )
1690d0e5fe765fb79e5495206f8d0969133178b871f2sewardj{
1691c3fee0debd7287a8c6a3b89ee6bc1ec58241938bdejanj   /* MIPS baseline. */
1692bc7d6f46346df80207c8454b35055b04f16bc1adpetarj   if (VEX_MIPS_COMP_ID(hwcaps) == VEX_PRID_COMP_MIPS) {
1693c3fee0debd7287a8c6a3b89ee6bc1ec58241938bdejanj      /* MIPS baseline with dspr2. */
1694bc7d6f46346df80207c8454b35055b04f16bc1adpetarj      if (VEX_MIPS_PROC_DSP2(hwcaps)) {
1695c3fee0debd7287a8c6a3b89ee6bc1ec58241938bdejanj         return "MIPS-baseline-dspr2";
1696c3fee0debd7287a8c6a3b89ee6bc1ec58241938bdejanj      }
1697c3fee0debd7287a8c6a3b89ee6bc1ec58241938bdejanj      /* MIPS baseline with dsp. */
1698bc7d6f46346df80207c8454b35055b04f16bc1adpetarj      if (VEX_MIPS_PROC_DSP(hwcaps)) {
1699c3fee0debd7287a8c6a3b89ee6bc1ec58241938bdejanj         return "MIPS-baseline-dsp";
1700c3fee0debd7287a8c6a3b89ee6bc1ec58241938bdejanj      }
1701c3fee0debd7287a8c6a3b89ee6bc1ec58241938bdejanj      return "MIPS-baseline";
1702c3fee0debd7287a8c6a3b89ee6bc1ec58241938bdejanj   }
1703c3fee0debd7287a8c6a3b89ee6bc1ec58241938bdejanj
1704c3fee0debd7287a8c6a3b89ee6bc1ec58241938bdejanj   /* Broadcom baseline. */
1705bc7d6f46346df80207c8454b35055b04f16bc1adpetarj   if (VEX_MIPS_COMP_ID(hwcaps) == VEX_PRID_COMP_BROADCOM) {
1706c3fee0debd7287a8c6a3b89ee6bc1ec58241938bdejanj      return "Broadcom-baseline";
1707c3fee0debd7287a8c6a3b89ee6bc1ec58241938bdejanj   }
1708c3fee0debd7287a8c6a3b89ee6bc1ec58241938bdejanj
1709c3fee0debd7287a8c6a3b89ee6bc1ec58241938bdejanj   /* Netlogic baseline. */
1710bc7d6f46346df80207c8454b35055b04f16bc1adpetarj   if (VEX_MIPS_COMP_ID(hwcaps) == VEX_PRID_COMP_NETLOGIC) {
1711c3fee0debd7287a8c6a3b89ee6bc1ec58241938bdejanj      return "Netlogic-baseline";
1712c3fee0debd7287a8c6a3b89ee6bc1ec58241938bdejanj   }
1713c3fee0debd7287a8c6a3b89ee6bc1ec58241938bdejanj
1714bc7d6f46346df80207c8454b35055b04f16bc1adpetarj   /* Cavium baseline. */
1715bc7d6f46346df80207c8454b35055b04f16bc1adpetarj   if (VEX_MIPS_COMP_ID(hwcaps) == VEX_PRID_COMP_CAVIUM) {
1716bc7d6f46346df80207c8454b35055b04f16bc1adpetarj      return "Cavium-baseline";
1717bc7d6f46346df80207c8454b35055b04f16bc1adpetarj   }
1718bc7d6f46346df80207c8454b35055b04f16bc1adpetarj
1719a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes   /* Ingenic baseline. */
1720a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes   if (VEX_MIPS_COMP_ID(hwcaps) == VEX_PRID_COMP_INGENIC_E1) {
1721a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes      return "Ingenic-baseline";
1722a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes   }
1723a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes
1724a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes   /* Loongson baseline. */
1725a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes   if ((VEX_MIPS_COMP_ID(hwcaps) == VEX_PRID_COMP_LEGACY) &&
1726a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes       (VEX_MIPS_PROC_ID(hwcaps) == VEX_PRID_IMP_LOONGSON_64)) {
1727a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes      return "Loongson-baseline";
1728a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes   }
1729a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes
1730f3652c97c20265d3410ea75d9817e8323b6df5c8florian   return "Unsupported baseline";
1731d0e5fe765fb79e5495206f8d0969133178b871f2sewardj}
1732d0e5fe765fb79e5495206f8d0969133178b871f2sewardj
1733b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarjstatic const HChar* show_hwcaps_mips64 ( UInt hwcaps )
1734b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj{
1735a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes   /* Netlogic baseline. */
1736a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes   if (VEX_MIPS_COMP_ID(hwcaps) == VEX_PRID_COMP_NETLOGIC) {
1737a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes      return "Netlogic-baseline";
1738a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes   }
1739a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes
1740a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes   /* Cavium baseline. */
1741a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes   if (VEX_MIPS_COMP_ID(hwcaps) == VEX_PRID_COMP_CAVIUM) {
1742a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes      return "Cavium-baseline";
1743a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes   }
1744a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes
1745a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes   /* Loongson baseline. */
1746a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes   if ((VEX_MIPS_COMP_ID(hwcaps) == VEX_PRID_COMP_LEGACY) &&
1747a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes       (VEX_MIPS_PROC_ID(hwcaps) == VEX_PRID_IMP_LOONGSON_64)) {
1748a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes      return "Loongson-baseline";
1749a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes   }
1750a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes
1751a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes   /* MIPS64 baseline. */
1752a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes   if (VEX_MIPS_COMP_ID(hwcaps) == VEX_PRID_COMP_MIPS) {
1753a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes      return "mips64-baseline";
1754a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes   }
1755a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes
1756a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes   return "Unsupported baseline";
1757b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj}
1758b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj
17590de80192f57cd132b31b233c65734de04939ce65sewardjstatic const HChar* show_hwcaps_tilegx ( UInt hwcaps )
17600de80192f57cd132b31b233c65734de04939ce65sewardj{
17610de80192f57cd132b31b233c65734de04939ce65sewardj   return "tilegx-baseline";
17620de80192f57cd132b31b233c65734de04939ce65sewardj}
17630de80192f57cd132b31b233c65734de04939ce65sewardj
1764f3652c97c20265d3410ea75d9817e8323b6df5c8florian#undef NUM_HWCAPS
1765f3652c97c20265d3410ea75d9817e8323b6df5c8florian
1766f3652c97c20265d3410ea75d9817e8323b6df5c8florian/* Thie function must not return NULL. */
17670de80192f57cd132b31b233c65734de04939ce65sewardj
176855085f8680acc89d727e321f3b34cae1a8c4093aflorianstatic const HChar* show_hwcaps ( VexArch arch, UInt hwcaps )
17695117ce116f47141cb23d1b49cc826e19323add97sewardj{
17705117ce116f47141cb23d1b49cc826e19323add97sewardj   switch (arch) {
1771d0e5fe765fb79e5495206f8d0969133178b871f2sewardj      case VexArchX86:    return show_hwcaps_x86(hwcaps);
1772d0e5fe765fb79e5495206f8d0969133178b871f2sewardj      case VexArchAMD64:  return show_hwcaps_amd64(hwcaps);
1773d0e5fe765fb79e5495206f8d0969133178b871f2sewardj      case VexArchPPC32:  return show_hwcaps_ppc32(hwcaps);
1774d0e5fe765fb79e5495206f8d0969133178b871f2sewardj      case VexArchPPC64:  return show_hwcaps_ppc64(hwcaps);
1775d0e5fe765fb79e5495206f8d0969133178b871f2sewardj      case VexArchARM:    return show_hwcaps_arm(hwcaps);
1776bbcf188f6ae64a44fb31414eb9e1a738b4befcc0sewardj      case VexArchARM64:  return show_hwcaps_arm64(hwcaps);
1777d0e5fe765fb79e5495206f8d0969133178b871f2sewardj      case VexArchS390X:  return show_hwcaps_s390x(hwcaps);
1778d0e5fe765fb79e5495206f8d0969133178b871f2sewardj      case VexArchMIPS32: return show_hwcaps_mips32(hwcaps);
1779b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj      case VexArchMIPS64: return show_hwcaps_mips64(hwcaps);
17800de80192f57cd132b31b233c65734de04939ce65sewardj      case VexArchTILEGX: return show_hwcaps_tilegx(hwcaps);
17815117ce116f47141cb23d1b49cc826e19323add97sewardj      default: return NULL;
17825117ce116f47141cb23d1b49cc826e19323add97sewardj   }
17835117ce116f47141cb23d1b49cc826e19323add97sewardj}
17845117ce116f47141cb23d1b49cc826e19323add97sewardj
1785f3652c97c20265d3410ea75d9817e8323b6df5c8florian/* To be used to complain about hwcaps we cannot handle */
1786f3652c97c20265d3410ea75d9817e8323b6df5c8florian__attribute__((noreturn))
1787f3652c97c20265d3410ea75d9817e8323b6df5c8florianstatic void invalid_hwcaps ( VexArch arch, UInt hwcaps, const HChar *message )
1788f3652c97c20265d3410ea75d9817e8323b6df5c8florian{
1789f3652c97c20265d3410ea75d9817e8323b6df5c8florian   vfatal("\nVEX: %s"
1790f3652c97c20265d3410ea75d9817e8323b6df5c8florian          "     Found: %s\n", message, show_hwcaps(arch, hwcaps));
1791f3652c97c20265d3410ea75d9817e8323b6df5c8florian}
1792f3652c97c20265d3410ea75d9817e8323b6df5c8florian
1793f3652c97c20265d3410ea75d9817e8323b6df5c8florian/* This function will not return iff the hwcaps don't pass the test. */
1794f3652c97c20265d3410ea75d9817e8323b6df5c8florianstatic void check_hwcaps ( VexArch arch, UInt hwcaps )
17955117ce116f47141cb23d1b49cc826e19323add97sewardj{
1796f3652c97c20265d3410ea75d9817e8323b6df5c8florian   switch (arch) {
1797f3652c97c20265d3410ea75d9817e8323b6df5c8florian      case VexArchX86: {
1798f3652c97c20265d3410ea75d9817e8323b6df5c8florian         if (hwcaps == 0) return;    // baseline
1799f3652c97c20265d3410ea75d9817e8323b6df5c8florian
1800f3652c97c20265d3410ea75d9817e8323b6df5c8florian         /* Monotonic: SSE3 > SSE2 > SSE1 > MMXEXT > baseline. */
1801f3652c97c20265d3410ea75d9817e8323b6df5c8florian         static const UInt extras[] = {
1802f3652c97c20265d3410ea75d9817e8323b6df5c8florian            VEX_HWCAPS_X86_MMXEXT, VEX_HWCAPS_X86_SSE1, VEX_HWCAPS_X86_SSE2,
1803f3652c97c20265d3410ea75d9817e8323b6df5c8florian            VEX_HWCAPS_X86_SSE3
1804f3652c97c20265d3410ea75d9817e8323b6df5c8florian         };
1805f3652c97c20265d3410ea75d9817e8323b6df5c8florian
1806f3652c97c20265d3410ea75d9817e8323b6df5c8florian         UInt i, caps = 0;
1807f3652c97c20265d3410ea75d9817e8323b6df5c8florian         for (i = 0; i < sizeof extras / sizeof extras[0]; ++i) {
1808f3652c97c20265d3410ea75d9817e8323b6df5c8florian            caps |= extras[i];
1809f3652c97c20265d3410ea75d9817e8323b6df5c8florian            if (caps == hwcaps) return;
181075ba1300092d44f42971d3e09da93b5feca8392fflorian            /* For SSE2 or later LZCNT is optional */
1811f3652c97c20265d3410ea75d9817e8323b6df5c8florian            if ((caps & VEX_HWCAPS_X86_SSE2) != 0) {
181275ba1300092d44f42971d3e09da93b5feca8392fflorian               if ((caps | VEX_HWCAPS_X86_LZCNT) == hwcaps) return;
1813f3652c97c20265d3410ea75d9817e8323b6df5c8florian            }
1814f3652c97c20265d3410ea75d9817e8323b6df5c8florian         }
1815f3652c97c20265d3410ea75d9817e8323b6df5c8florian         invalid_hwcaps(arch, hwcaps, "Cannot handle capabilities\n");
1816f3652c97c20265d3410ea75d9817e8323b6df5c8florian      }
1817f3652c97c20265d3410ea75d9817e8323b6df5c8florian
1818f3652c97c20265d3410ea75d9817e8323b6df5c8florian      case VexArchAMD64: {
1819f3652c97c20265d3410ea75d9817e8323b6df5c8florian         /* SSE3 and CX16 are orthogonal and > baseline, although we really
1820f3652c97c20265d3410ea75d9817e8323b6df5c8florian            don't expect to come across anything which can do SSE3 but can't
1821f3652c97c20265d3410ea75d9817e8323b6df5c8florian            do CX16.  Still, we can handle that case.  LZCNT is similarly
1822f3652c97c20265d3410ea75d9817e8323b6df5c8florian            orthogonal. */
1823f3652c97c20265d3410ea75d9817e8323b6df5c8florian
1824f3652c97c20265d3410ea75d9817e8323b6df5c8florian         /* Throw out obviously stupid cases: */
1825f3652c97c20265d3410ea75d9817e8323b6df5c8florian         Bool have_sse3 = (hwcaps & VEX_HWCAPS_AMD64_SSE3) != 0;
1826f3652c97c20265d3410ea75d9817e8323b6df5c8florian         Bool have_avx  = (hwcaps & VEX_HWCAPS_AMD64_AVX)  != 0;
1827f3652c97c20265d3410ea75d9817e8323b6df5c8florian         Bool have_bmi  = (hwcaps & VEX_HWCAPS_AMD64_BMI)  != 0;
1828f3652c97c20265d3410ea75d9817e8323b6df5c8florian         Bool have_avx2 = (hwcaps & VEX_HWCAPS_AMD64_AVX2) != 0;
1829f3652c97c20265d3410ea75d9817e8323b6df5c8florian
1830f3652c97c20265d3410ea75d9817e8323b6df5c8florian         /* AVX without SSE3 */
1831f3652c97c20265d3410ea75d9817e8323b6df5c8florian         if (have_avx && !have_sse3)
1832f3652c97c20265d3410ea75d9817e8323b6df5c8florian            invalid_hwcaps(arch, hwcaps,
1833f3652c97c20265d3410ea75d9817e8323b6df5c8florian                           "Support for AVX requires SSE3 capabilities\n");
1834f3652c97c20265d3410ea75d9817e8323b6df5c8florian         /* AVX2 or BMI without AVX */
1835f3652c97c20265d3410ea75d9817e8323b6df5c8florian         if (have_avx2 && !have_avx)
1836f3652c97c20265d3410ea75d9817e8323b6df5c8florian            invalid_hwcaps(arch, hwcaps,
1837f3652c97c20265d3410ea75d9817e8323b6df5c8florian                           "Support for AVX2 requires AVX capabilities\n");
1838f3652c97c20265d3410ea75d9817e8323b6df5c8florian         if (have_bmi && !have_avx)
1839f3652c97c20265d3410ea75d9817e8323b6df5c8florian            invalid_hwcaps(arch, hwcaps,
1840f3652c97c20265d3410ea75d9817e8323b6df5c8florian                           "Support for BMI requires AVX capabilities\n");
1841f3652c97c20265d3410ea75d9817e8323b6df5c8florian         return;
1842f3652c97c20265d3410ea75d9817e8323b6df5c8florian      }
1843f3652c97c20265d3410ea75d9817e8323b6df5c8florian
1844f3652c97c20265d3410ea75d9817e8323b6df5c8florian      case VexArchPPC32: {
1845f3652c97c20265d3410ea75d9817e8323b6df5c8florian         /* Monotonic with complications.  Basically V > F > baseline,
1846f3652c97c20265d3410ea75d9817e8323b6df5c8florian            but once you have F then you can have FX or GX too. */
1847f3652c97c20265d3410ea75d9817e8323b6df5c8florian         if (hwcaps == 0) return;   // baseline
1848f3652c97c20265d3410ea75d9817e8323b6df5c8florian
1849f3652c97c20265d3410ea75d9817e8323b6df5c8florian         if ((hwcaps & VEX_HWCAPS_PPC32_F) == 0)
1850f3652c97c20265d3410ea75d9817e8323b6df5c8florian            invalid_hwcaps(arch, hwcaps,
1851f3652c97c20265d3410ea75d9817e8323b6df5c8florian                           "Missing floating point capability\n");
1852f3652c97c20265d3410ea75d9817e8323b6df5c8florian         /* V, FX, and GX can appear in any combination */
1853f3652c97c20265d3410ea75d9817e8323b6df5c8florian
1854f3652c97c20265d3410ea75d9817e8323b6df5c8florian         /* DFP requires V and FX and GX */
1855f3652c97c20265d3410ea75d9817e8323b6df5c8florian         UInt v_fx_gx = VEX_HWCAPS_PPC32_V | VEX_HWCAPS_PPC32_FX |
1856f3652c97c20265d3410ea75d9817e8323b6df5c8florian                        VEX_HWCAPS_PPC32_GX;
1857f3652c97c20265d3410ea75d9817e8323b6df5c8florian         Bool has_v_fx_gx = (hwcaps & v_fx_gx) == v_fx_gx;
1858f3652c97c20265d3410ea75d9817e8323b6df5c8florian
1859f3652c97c20265d3410ea75d9817e8323b6df5c8florian         if ((hwcaps & VEX_HWCAPS_PPC32_DFP) && ! has_v_fx_gx)
1860f3652c97c20265d3410ea75d9817e8323b6df5c8florian            invalid_hwcaps(arch, hwcaps,
1861f3652c97c20265d3410ea75d9817e8323b6df5c8florian                           "DFP requires VMX and FX and GX capabilities\n");
1862f3652c97c20265d3410ea75d9817e8323b6df5c8florian
1863f3652c97c20265d3410ea75d9817e8323b6df5c8florian         /* VX requires V and FX and GX */
1864f3652c97c20265d3410ea75d9817e8323b6df5c8florian         if ((hwcaps & VEX_HWCAPS_PPC32_VX) && ! has_v_fx_gx)
1865f3652c97c20265d3410ea75d9817e8323b6df5c8florian            invalid_hwcaps(arch, hwcaps,
1866f3652c97c20265d3410ea75d9817e8323b6df5c8florian                           "VX requires VMX and FX and GX capabilities\n");
1867f3652c97c20265d3410ea75d9817e8323b6df5c8florian
1868f3652c97c20265d3410ea75d9817e8323b6df5c8florian         /* ISA2_07 requires everything else */
1869f3652c97c20265d3410ea75d9817e8323b6df5c8florian         if ((hwcaps & VEX_HWCAPS_PPC32_ISA2_07) != 0) {
1870f3652c97c20265d3410ea75d9817e8323b6df5c8florian            if (! has_v_fx_gx)
1871f3652c97c20265d3410ea75d9817e8323b6df5c8florian               invalid_hwcaps(arch, hwcaps,
1872f3652c97c20265d3410ea75d9817e8323b6df5c8florian                          "ISA2_07 requires VMX and FX and GX capabilities\n");
1873f3652c97c20265d3410ea75d9817e8323b6df5c8florian            if (! (hwcaps & VEX_HWCAPS_PPC32_VX))
1874f3652c97c20265d3410ea75d9817e8323b6df5c8florian               invalid_hwcaps(arch, hwcaps,
1875f3652c97c20265d3410ea75d9817e8323b6df5c8florian                              "ISA2_07 requires VX capabilities\n");
1876f3652c97c20265d3410ea75d9817e8323b6df5c8florian            if (! (hwcaps & VEX_HWCAPS_PPC32_DFP))
1877f3652c97c20265d3410ea75d9817e8323b6df5c8florian               invalid_hwcaps(arch, hwcaps,
1878f3652c97c20265d3410ea75d9817e8323b6df5c8florian                              "ISA2_07 requires DFP capabilities\n");
1879f3652c97c20265d3410ea75d9817e8323b6df5c8florian         }
1880a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes
1881a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes         /* ISA 3.0 not supported on 32-bit machines */
1882a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes         if ((hwcaps & VEX_HWCAPS_PPC32_ISA3_0) != 0) {
1883a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes            invalid_hwcaps(arch, hwcaps,
1884a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes                           "ISA 3.0 not supported in 32-bit mode \n");
1885a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes         }
1886f3652c97c20265d3410ea75d9817e8323b6df5c8florian         return;
1887f3652c97c20265d3410ea75d9817e8323b6df5c8florian      }
1888f3652c97c20265d3410ea75d9817e8323b6df5c8florian
1889f3652c97c20265d3410ea75d9817e8323b6df5c8florian      case VexArchPPC64: {
1890f3652c97c20265d3410ea75d9817e8323b6df5c8florian         /* Monotonic with complications.  Basically V > baseline(==F),
1891f3652c97c20265d3410ea75d9817e8323b6df5c8florian            but once you have F then you can have FX or GX too. */
1892f3652c97c20265d3410ea75d9817e8323b6df5c8florian         if (hwcaps == 0) return;   // baseline
1893f3652c97c20265d3410ea75d9817e8323b6df5c8florian
1894f3652c97c20265d3410ea75d9817e8323b6df5c8florian         /* V, FX, and GX can appear in any combination */
1895f3652c97c20265d3410ea75d9817e8323b6df5c8florian
1896f3652c97c20265d3410ea75d9817e8323b6df5c8florian         /* DFP requires V and FX and GX */
1897f3652c97c20265d3410ea75d9817e8323b6df5c8florian         UInt v_fx_gx = VEX_HWCAPS_PPC64_V | VEX_HWCAPS_PPC64_FX |
1898f3652c97c20265d3410ea75d9817e8323b6df5c8florian                        VEX_HWCAPS_PPC64_GX;
1899f3652c97c20265d3410ea75d9817e8323b6df5c8florian         Bool has_v_fx_gx = (hwcaps & v_fx_gx) == v_fx_gx;
1900f3652c97c20265d3410ea75d9817e8323b6df5c8florian
1901f3652c97c20265d3410ea75d9817e8323b6df5c8florian         if ((hwcaps & VEX_HWCAPS_PPC64_DFP) && ! has_v_fx_gx)
1902f3652c97c20265d3410ea75d9817e8323b6df5c8florian            invalid_hwcaps(arch, hwcaps,
1903f3652c97c20265d3410ea75d9817e8323b6df5c8florian                           "DFP requires VMX and FX and GX capabilities\n");
1904f3652c97c20265d3410ea75d9817e8323b6df5c8florian
1905f3652c97c20265d3410ea75d9817e8323b6df5c8florian         /* VX requires V and FX and GX */
1906f3652c97c20265d3410ea75d9817e8323b6df5c8florian         if ((hwcaps & VEX_HWCAPS_PPC32_VX) && ! has_v_fx_gx)
1907f3652c97c20265d3410ea75d9817e8323b6df5c8florian            invalid_hwcaps(arch, hwcaps,
1908f3652c97c20265d3410ea75d9817e8323b6df5c8florian                           "VX requires VMX and FX and GX capabilities\n");
1909f3652c97c20265d3410ea75d9817e8323b6df5c8florian
1910f3652c97c20265d3410ea75d9817e8323b6df5c8florian         /* ISA2_07 requires everything else */
1911f3652c97c20265d3410ea75d9817e8323b6df5c8florian         if ((hwcaps & VEX_HWCAPS_PPC64_ISA2_07) != 0) {
1912f3652c97c20265d3410ea75d9817e8323b6df5c8florian            if (! has_v_fx_gx)
1913f3652c97c20265d3410ea75d9817e8323b6df5c8florian               invalid_hwcaps(arch, hwcaps,
1914f3652c97c20265d3410ea75d9817e8323b6df5c8florian                        "ISA2_07 requires VMX and FX and GX capabilities\n");
1915f3652c97c20265d3410ea75d9817e8323b6df5c8florian            if (! (hwcaps & VEX_HWCAPS_PPC64_VX))
1916f3652c97c20265d3410ea75d9817e8323b6df5c8florian               invalid_hwcaps(arch, hwcaps,
1917f3652c97c20265d3410ea75d9817e8323b6df5c8florian                              "ISA2_07 requires VX capabilities\n");
1918f3652c97c20265d3410ea75d9817e8323b6df5c8florian            if (! (hwcaps & VEX_HWCAPS_PPC64_DFP))
1919f3652c97c20265d3410ea75d9817e8323b6df5c8florian               invalid_hwcaps(arch, hwcaps,
1920f3652c97c20265d3410ea75d9817e8323b6df5c8florian                              "ISA2_07 requires DFP capabilities\n");
1921f3652c97c20265d3410ea75d9817e8323b6df5c8florian         }
1922a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes
1923a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes         /* ISA3_0 requires everything else */
1924a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes         if ((hwcaps & VEX_HWCAPS_PPC64_ISA3_0) != 0) {
1925a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes            if ( !((hwcaps
1926a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes                    & VEX_HWCAPS_PPC64_ISA2_07) == VEX_HWCAPS_PPC64_ISA2_07))
1927a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes               invalid_hwcaps(arch, hwcaps,
1928a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes                          "ISA3_0 requires ISA2_07 capabilities\n");
1929a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes            if ( !has_v_fx_gx)
1930a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes               invalid_hwcaps(arch, hwcaps,
1931a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes                        "ISA3_0 requires VMX and FX and GX capabilities\n");
1932a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes            if ( !(hwcaps & VEX_HWCAPS_PPC64_VX))
1933a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes               invalid_hwcaps(arch, hwcaps,
1934a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes                              "ISA3_0 requires VX capabilities\n");
1935a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes            if ( !(hwcaps & VEX_HWCAPS_PPC64_DFP))
1936a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes               invalid_hwcaps(arch, hwcaps,
1937a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes                              "ISA3_0 requires DFP capabilities\n");
1938a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes         }
1939f3652c97c20265d3410ea75d9817e8323b6df5c8florian         return;
1940f3652c97c20265d3410ea75d9817e8323b6df5c8florian      }
1941f3652c97c20265d3410ea75d9817e8323b6df5c8florian
1942f3652c97c20265d3410ea75d9817e8323b6df5c8florian      case VexArchARM: {
1943f3652c97c20265d3410ea75d9817e8323b6df5c8florian         Bool NEON  = ((hwcaps & VEX_HWCAPS_ARM_NEON) != 0);
1944a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes         Bool VFP3  = ((hwcaps & VEX_HWCAPS_ARM_VFP3) != 0);
1945f3652c97c20265d3410ea75d9817e8323b6df5c8florian         UInt level = VEX_ARM_ARCHLEVEL(hwcaps);
1946f3652c97c20265d3410ea75d9817e8323b6df5c8florian         switch (level) {
1947f3652c97c20265d3410ea75d9817e8323b6df5c8florian            case 5:
1948f3652c97c20265d3410ea75d9817e8323b6df5c8florian               if (NEON)
1949f3652c97c20265d3410ea75d9817e8323b6df5c8florian                  invalid_hwcaps(arch, hwcaps,
1950f3652c97c20265d3410ea75d9817e8323b6df5c8florian                          "NEON instructions are not supported for ARMv5.\n");
1951f3652c97c20265d3410ea75d9817e8323b6df5c8florian               return;
1952f3652c97c20265d3410ea75d9817e8323b6df5c8florian            case 6:
1953f3652c97c20265d3410ea75d9817e8323b6df5c8florian               if (NEON)
1954f3652c97c20265d3410ea75d9817e8323b6df5c8florian                  invalid_hwcaps(arch, hwcaps,
1955f3652c97c20265d3410ea75d9817e8323b6df5c8florian                          "NEON instructions are not supported for ARMv6.\n");
1956f3652c97c20265d3410ea75d9817e8323b6df5c8florian               return;
1957f3652c97c20265d3410ea75d9817e8323b6df5c8florian            case 7:
1958f3652c97c20265d3410ea75d9817e8323b6df5c8florian               return;
1959a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes            case 8:
1960a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes               if (!NEON || !VFP3)
1961a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes                  invalid_hwcaps(arch, hwcaps,
1962a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes                          "NEON and VFP3 are required for ARMv8.\n");
1963a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes               return;
1964f3652c97c20265d3410ea75d9817e8323b6df5c8florian            default:
1965f3652c97c20265d3410ea75d9817e8323b6df5c8florian               invalid_hwcaps(arch, hwcaps,
1966f3652c97c20265d3410ea75d9817e8323b6df5c8florian                              "ARM architecture level is not supported.\n");
1967f3652c97c20265d3410ea75d9817e8323b6df5c8florian         }
1968f3652c97c20265d3410ea75d9817e8323b6df5c8florian      }
1969f3652c97c20265d3410ea75d9817e8323b6df5c8florian
1970f3652c97c20265d3410ea75d9817e8323b6df5c8florian      case VexArchARM64:
1971f3652c97c20265d3410ea75d9817e8323b6df5c8florian         if (hwcaps != 0)
1972f3652c97c20265d3410ea75d9817e8323b6df5c8florian            invalid_hwcaps(arch, hwcaps,
1973f3652c97c20265d3410ea75d9817e8323b6df5c8florian                           "Unsupported hardware capabilities.\n");
1974f3652c97c20265d3410ea75d9817e8323b6df5c8florian         return;
1975f3652c97c20265d3410ea75d9817e8323b6df5c8florian
1976f3652c97c20265d3410ea75d9817e8323b6df5c8florian      case VexArchS390X:
1977f3652c97c20265d3410ea75d9817e8323b6df5c8florian         if (! s390_host_has_ldisp)
1978f3652c97c20265d3410ea75d9817e8323b6df5c8florian            invalid_hwcaps(arch, hwcaps,
1979f3652c97c20265d3410ea75d9817e8323b6df5c8florian                           "Host does not have long displacement facility.\n");
1980f3652c97c20265d3410ea75d9817e8323b6df5c8florian         return;
1981a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes
1982f3652c97c20265d3410ea75d9817e8323b6df5c8florian      case VexArchMIPS32:
1983f3652c97c20265d3410ea75d9817e8323b6df5c8florian         switch (VEX_MIPS_COMP_ID(hwcaps)) {
1984f3652c97c20265d3410ea75d9817e8323b6df5c8florian            case VEX_PRID_COMP_MIPS:
1985a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes            case VEX_PRID_COMP_CAVIUM:
1986a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes            case VEX_PRID_COMP_INGENIC_E1:
1987f3652c97c20265d3410ea75d9817e8323b6df5c8florian            case VEX_PRID_COMP_BROADCOM:
1988f3652c97c20265d3410ea75d9817e8323b6df5c8florian            case VEX_PRID_COMP_NETLOGIC:
1989f3652c97c20265d3410ea75d9817e8323b6df5c8florian               return;
1990f3652c97c20265d3410ea75d9817e8323b6df5c8florian            default:
1991f3652c97c20265d3410ea75d9817e8323b6df5c8florian               invalid_hwcaps(arch, hwcaps, "Unsupported baseline\n");
1992f3652c97c20265d3410ea75d9817e8323b6df5c8florian         }
1993a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes
1994f3652c97c20265d3410ea75d9817e8323b6df5c8florian      case VexArchMIPS64:
1995a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes         switch (VEX_MIPS_COMP_ID(hwcaps)) {
1996a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes            case VEX_PRID_COMP_MIPS:
1997a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes            case VEX_PRID_COMP_CAVIUM:
1998a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes            case VEX_PRID_COMP_NETLOGIC:
1999a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes               return;
2000a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes            default:
2001a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes               invalid_hwcaps(arch, hwcaps, "Unsupported baseline\n");
2002a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes         }
2003f3652c97c20265d3410ea75d9817e8323b6df5c8florian
20040de80192f57cd132b31b233c65734de04939ce65sewardj      case VexArchTILEGX:
20050de80192f57cd132b31b233c65734de04939ce65sewardj         return;
20060de80192f57cd132b31b233c65734de04939ce65sewardj
2007f3652c97c20265d3410ea75d9817e8323b6df5c8florian      default:
2008f3652c97c20265d3410ea75d9817e8323b6df5c8florian         vpanic("unknown architecture");
2009dc6e7479625706946f1c5a0a699141930a245fdfflorian   }
20105117ce116f47141cb23d1b49cc826e19323add97sewardj}
20115117ce116f47141cb23d1b49cc826e19323add97sewardj
20125117ce116f47141cb23d1b49cc826e19323add97sewardj
201335421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj/*---------------------------------------------------------------*/
2014cef7d3e3df4796e35b4521158d9dc058f034aa87sewardj/*--- end                                         main_main.c ---*/
201535421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj/*---------------------------------------------------------------*/
2016