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
11ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes   Copyright (C) 2004-2017 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"
48f13a16a82132fa2358899c7683193effecf9a56fsewardj
49cef7d3e3df4796e35b4521158d9dc058f034aa87sewardj#include "main_globals.h"
50cef7d3e3df4796e35b4521158d9dc058f034aa87sewardj#include "main_util.h"
51cef7d3e3df4796e35b4521158d9dc058f034aa87sewardj#include "host_generic_regs.h"
52cef7d3e3df4796e35b4521158d9dc058f034aa87sewardj#include "ir_opt.h"
532a9ad023890d3b34cf45e429df2a8ae88b419128sewardj
54cef7d3e3df4796e35b4521158d9dc058f034aa87sewardj#include "host_x86_defs.h"
55cef7d3e3df4796e35b4521158d9dc058f034aa87sewardj#include "host_amd64_defs.h"
56cef7d3e3df4796e35b4521158d9dc058f034aa87sewardj#include "host_ppc_defs.h"
576c299f3acab617581ea504e45fbb6cab24c2b29fsewardj#include "host_arm_defs.h"
58bbcf188f6ae64a44fb31414eb9e1a738b4befcc0sewardj#include "host_arm64_defs.h"
592019a976f07ff418dde2dfc7cc74667ef66d7764sewardj#include "host_s390_defs.h"
60d0e5fe765fb79e5495206f8d0969133178b871f2sewardj#include "host_mips_defs.h"
612a9ad023890d3b34cf45e429df2a8ae88b419128sewardj
62cef7d3e3df4796e35b4521158d9dc058f034aa87sewardj#include "guest_generic_bb_to_IR.h"
63cef7d3e3df4796e35b4521158d9dc058f034aa87sewardj#include "guest_x86_defs.h"
64cef7d3e3df4796e35b4521158d9dc058f034aa87sewardj#include "guest_amd64_defs.h"
65cef7d3e3df4796e35b4521158d9dc058f034aa87sewardj#include "guest_arm_defs.h"
66bbcf188f6ae64a44fb31414eb9e1a738b4befcc0sewardj#include "guest_arm64_defs.h"
67cef7d3e3df4796e35b4521158d9dc058f034aa87sewardj#include "guest_ppc_defs.h"
682019a976f07ff418dde2dfc7cc74667ef66d7764sewardj#include "guest_s390_defs.h"
69d0e5fe765fb79e5495206f8d0969133178b871f2sewardj#include "guest_mips_defs.h"
7035421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj
7169d98e3853a63e578e039894e2ef00ca6f9878c8sewardj#include "host_generic_simd128.h"
7269d98e3853a63e578e039894e2ef00ca6f9878c8sewardj
7312b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe/* For each architecture <arch>, we define 2 macros:
7412b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe   <arch>FN that has as argument a pointer (typically to a function
7512b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe            or the return value of a function).
7612b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe   <arch>ST that has as argument a statement.
7712b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe   If main_main.c is compiled for <arch>, then these macros just expand
7812b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe   their arg.
7912b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe   Otherwise, the macros expand to respectively NULL and vassert(0).
8012b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe   These macros are used to avoid introducing dependencies to object
8112b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe   files not needed for the (only) architecture we are compiling for.
8212b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe
8312b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe   To still compile the below for all supported architectures, define
8412b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe   VEXMULTIARCH. This is used by the file multiarch_main_main.c */
8512b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe
8612b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe#if defined(VGA_x86) || defined(VEXMULTIARCH)
8712b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe#define X86FN(f) f
8812b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe#define X86ST(f) f
8912b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe#else
9012b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe#define X86FN(f) NULL
9112b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe#define X86ST(f) vassert(0)
9212b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe#endif
9312b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe
9412b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe#if defined(VGA_amd64) || defined(VEXMULTIARCH)
9512b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe#define AMD64FN(f) f
9612b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe#define AMD64ST(f) f
9712b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe#else
9812b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe#define AMD64FN(f) NULL
9912b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe#define AMD64ST(f) vassert(0)
10012b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe#endif
10112b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe
10212b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe#if defined(VGA_ppc32) || defined(VEXMULTIARCH)
10312b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe#define PPC32FN(f) f
10412b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe#define PPC32ST(f) f
10512b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe#else
10612b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe#define PPC32FN(f) NULL
10712b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe#define PPC32ST(f) vassert(0)
10812b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe#endif
10912b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe
11012b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe#if defined(VGA_ppc64be) || defined(VGA_ppc64le) || defined(VEXMULTIARCH)
11112b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe#define PPC64FN(f) f
11212b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe#define PPC64ST(f) f
11312b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe#else
11412b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe#define PPC64FN(f) NULL
11512b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe#define PPC64ST(f) vassert(0)
11612b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe#endif
11712b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe
11812b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe#if defined(VGA_s390x) || defined(VEXMULTIARCH)
11912b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe#define S390FN(f) f
12012b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe#define S390ST(f) f
12112b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe#else
12212b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe#define S390FN(f) NULL
12312b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe#define S390ST(f) vassert(0)
12412b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe#endif
12512b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe
12612b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe#if defined(VGA_arm) || defined(VEXMULTIARCH)
12712b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe#define ARMFN(f) f
12812b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe#define ARMST(f) f
12912b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe#else
13012b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe#define ARMFN(f) NULL
13112b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe#define ARMST(f) vassert(0)
13212b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe#endif
13312b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe
13412b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe#if defined(VGA_arm64) || defined(VEXMULTIARCH)
13512b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe#define ARM64FN(f) f
13612b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe#define ARM64ST(f) f
13712b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe#else
13812b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe#define ARM64FN(f) NULL
13912b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe#define ARM64ST(f) vassert(0)
14012b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe#endif
14112b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe
14212b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe#if defined(VGA_mips32) || defined(VEXMULTIARCH)
14312b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe#define MIPS32FN(f) f
14412b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe#define MIPS32ST(f) f
14512b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe#else
14612b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe#define MIPS32FN(f) NULL
14712b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe#define MIPS32ST(f) vassert(0)
14812b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe#endif
14912b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe
15012b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe#if defined(VGA_mips64) || defined(VEXMULTIARCH)
15112b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe#define MIPS64FN(f) f
15212b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe#define MIPS64ST(f) f
15312b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe#else
15412b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe#define MIPS64FN(f) NULL
15512b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe#define MIPS64ST(f) vassert(0)
15612b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe#endif
15735421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj
1580de80192f57cd132b31b233c65734de04939ce65sewardj
15935421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj/* This file contains the top level interface to the library. */
16035421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj
1615117ce116f47141cb23d1b49cc826e19323add97sewardj/* --------- fwds ... --------- */
1625117ce116f47141cb23d1b49cc826e19323add97sewardj
163f3652c97c20265d3410ea75d9817e8323b6df5c8florianstatic void  check_hwcaps ( VexArch arch, UInt hwcaps );
16455085f8680acc89d727e321f3b34cae1a8c4093aflorianstatic const HChar* show_hwcaps ( VexArch arch, UInt hwcaps );
165ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughesstatic IRType arch_word_size ( VexArch arch );
1665117ce116f47141cb23d1b49cc826e19323add97sewardj
1678bde7f1c67483371551aac0d4019c24c919063f7sewardj/* --------- helpers --------- */
1688bde7f1c67483371551aac0d4019c24c919063f7sewardj
1698bde7f1c67483371551aac0d4019c24c919063f7sewardj__attribute__((noinline))
1708bde7f1c67483371551aac0d4019c24c919063f7sewardjstatic UInt udiv32 ( UInt x, UInt y ) { return x/y; }
1718bde7f1c67483371551aac0d4019c24c919063f7sewardj__attribute__((noinline))
1728bde7f1c67483371551aac0d4019c24c919063f7sewardjstatic  Int sdiv32 (  Int x,  Int y ) { return x/y; }
1738bde7f1c67483371551aac0d4019c24c919063f7sewardj
1748bde7f1c67483371551aac0d4019c24c919063f7sewardj
17535421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj/* --------- Initialise the library. --------- */
17635421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj
17735421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj/* Exported to library client. */
17835421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj
17908613749b639323cc7582c1bbe56c6e21c69774fsewardjvoid LibVEX_default_VexControl ( /*OUT*/ VexControl* vcon )
18008613749b639323cc7582c1bbe56c6e21c69774fsewardj{
18165902992da28822e4753594c7b72f7cb177fe3a6sewardj   vex_bzero(vcon, sizeof(*vcon));
182ca2c3c75784d35d136fc7c952717cdee5063c193sewardj   vcon->iropt_verbosity                = 0;
183ca2c3c75784d35d136fc7c952717cdee5063c193sewardj   vcon->iropt_level                    = 2;
184ca2c3c75784d35d136fc7c952717cdee5063c193sewardj   vcon->iropt_register_updates_default = VexRegUpdUnwindregsAtMemAccess;
185ca2c3c75784d35d136fc7c952717cdee5063c193sewardj   vcon->iropt_unroll_thresh            = 120;
186ca2c3c75784d35d136fc7c952717cdee5063c193sewardj   vcon->guest_max_insns                = 60;
187ca2c3c75784d35d136fc7c952717cdee5063c193sewardj   vcon->guest_chase_thresh             = 10;
188ca2c3c75784d35d136fc7c952717cdee5063c193sewardj   vcon->guest_chase_cond               = False;
18908613749b639323cc7582c1bbe56c6e21c69774fsewardj}
19008613749b639323cc7582c1bbe56c6e21c69774fsewardj
19108613749b639323cc7582c1bbe56c6e21c69774fsewardj
19208613749b639323cc7582c1bbe56c6e21c69774fsewardj/* Exported to library client. */
19308613749b639323cc7582c1bbe56c6e21c69774fsewardj
194887a11a609f3e61d2ae8fe4e67f176207715da7esewardjvoid LibVEX_Init (
19535421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj   /* failure exit function */
1962b51587159d1d7c331719886d896c0a9cf217ee4sewardj   __attribute__ ((noreturn))
19735421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj   void (*failure_exit) ( void ),
19835421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj   /* logging output function */
19904fc6b1eab791c7387b81b9fd820f4ae6aaf90a2florian   void (*log_bytes) ( const HChar*, SizeT nbytes ),
20035421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj   /* debug paranoia level */
20135421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj   Int debuglevel,
20208613749b639323cc7582c1bbe56c6e21c69774fsewardj   /* Control ... */
203f72c2c12a06fdfada40f8a42fac44514c2d9c181florian   const VexControl* vcon
20435421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj)
20535421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj{
20608613749b639323cc7582c1bbe56c6e21c69774fsewardj   /* First off, do enough minimal setup so that the following
20708613749b639323cc7582c1bbe56c6e21c69774fsewardj      assertions can fail in a sane fashion, if need be. */
208ea602bc23ecabe934348ef9ea4113a22d4e0bb80sewardj   vex_failure_exit = failure_exit;
209ea602bc23ecabe934348ef9ea4113a22d4e0bb80sewardj   vex_log_bytes    = log_bytes;
210ea602bc23ecabe934348ef9ea4113a22d4e0bb80sewardj
211ea602bc23ecabe934348ef9ea4113a22d4e0bb80sewardj   /* Now it's safe to check parameters for sanity. */
21235421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj   vassert(!vex_initdone);
21335421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj   vassert(failure_exit);
21435421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj   vassert(log_bytes);
21535421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj   vassert(debuglevel >= 0);
21608613749b639323cc7582c1bbe56c6e21c69774fsewardj
21708613749b639323cc7582c1bbe56c6e21c69774fsewardj   vassert(vcon->iropt_verbosity >= 0);
21808613749b639323cc7582c1bbe56c6e21c69774fsewardj   vassert(vcon->iropt_level >= 0);
21908613749b639323cc7582c1bbe56c6e21c69774fsewardj   vassert(vcon->iropt_level <= 2);
22008613749b639323cc7582c1bbe56c6e21c69774fsewardj   vassert(vcon->iropt_unroll_thresh >= 0);
22108613749b639323cc7582c1bbe56c6e21c69774fsewardj   vassert(vcon->iropt_unroll_thresh <= 400);
22208613749b639323cc7582c1bbe56c6e21c69774fsewardj   vassert(vcon->guest_max_insns >= 1);
22308613749b639323cc7582c1bbe56c6e21c69774fsewardj   vassert(vcon->guest_max_insns <= 100);
22408613749b639323cc7582c1bbe56c6e21c69774fsewardj   vassert(vcon->guest_chase_thresh >= 0);
22508613749b639323cc7582c1bbe56c6e21c69774fsewardj   vassert(vcon->guest_chase_thresh < vcon->guest_max_insns);
226984d9b164dd17f07e603c41fe1e506e641e57d18sewardj   vassert(vcon->guest_chase_cond == True
227984d9b164dd17f07e603c41fe1e506e641e57d18sewardj           || vcon->guest_chase_cond == False);
228443cd9d34617dd7608e5dd4b4b0b4674d4f433e7sewardj
229ea602bc23ecabe934348ef9ea4113a22d4e0bb80sewardj   /* Check that Vex has been built with sizes of basic types as
230ea602bc23ecabe934348ef9ea4113a22d4e0bb80sewardj      stated in priv/libvex_basictypes.h.  Failure of any of these is
231ea602bc23ecabe934348ef9ea4113a22d4e0bb80sewardj      a serious configuration error and should be corrected
232ea602bc23ecabe934348ef9ea4113a22d4e0bb80sewardj      immediately.  If any of these assertions fail you can fully
233ea602bc23ecabe934348ef9ea4113a22d4e0bb80sewardj      expect Vex not to work properly, if at all. */
234ea602bc23ecabe934348ef9ea4113a22d4e0bb80sewardj
235ea602bc23ecabe934348ef9ea4113a22d4e0bb80sewardj   vassert(1 == sizeof(UChar));
236ea602bc23ecabe934348ef9ea4113a22d4e0bb80sewardj   vassert(1 == sizeof(Char));
237ea602bc23ecabe934348ef9ea4113a22d4e0bb80sewardj   vassert(2 == sizeof(UShort));
238ea602bc23ecabe934348ef9ea4113a22d4e0bb80sewardj   vassert(2 == sizeof(Short));
239ea602bc23ecabe934348ef9ea4113a22d4e0bb80sewardj   vassert(4 == sizeof(UInt));
240ea602bc23ecabe934348ef9ea4113a22d4e0bb80sewardj   vassert(4 == sizeof(Int));
241ea602bc23ecabe934348ef9ea4113a22d4e0bb80sewardj   vassert(8 == sizeof(ULong));
242ea602bc23ecabe934348ef9ea4113a22d4e0bb80sewardj   vassert(8 == sizeof(Long));
243ea602bc23ecabe934348ef9ea4113a22d4e0bb80sewardj   vassert(4 == sizeof(Float));
244ea602bc23ecabe934348ef9ea4113a22d4e0bb80sewardj   vassert(8 == sizeof(Double));
245ea602bc23ecabe934348ef9ea4113a22d4e0bb80sewardj   vassert(1 == sizeof(Bool));
246ea602bc23ecabe934348ef9ea4113a22d4e0bb80sewardj   vassert(4 == sizeof(Addr32));
247ea602bc23ecabe934348ef9ea4113a22d4e0bb80sewardj   vassert(8 == sizeof(Addr64));
248c9a43665879a03886b27a65b68af2a2c11b04f59sewardj   vassert(16 == sizeof(U128));
24969d98e3853a63e578e039894e2ef00ca6f9878c8sewardj   vassert(16 == sizeof(V128));
250c9069f2908814843e9a4da00da9c8905440195a6sewardj   vassert(32 == sizeof(U256));
251ea602bc23ecabe934348ef9ea4113a22d4e0bb80sewardj
252ea602bc23ecabe934348ef9ea4113a22d4e0bb80sewardj   vassert(sizeof(void*) == 4 || sizeof(void*) == 8);
253ea602bc23ecabe934348ef9ea4113a22d4e0bb80sewardj   vassert(sizeof(void*) == sizeof(int*));
254ea602bc23ecabe934348ef9ea4113a22d4e0bb80sewardj   vassert(sizeof(void*) == sizeof(HWord));
255beac530a718fcc646bc61fe60a86f599df54e1d7florian   vassert(sizeof(void*) == sizeof(Addr));
256beac530a718fcc646bc61fe60a86f599df54e1d7florian   vassert(sizeof(unsigned long) == sizeof(SizeT));
257ea602bc23ecabe934348ef9ea4113a22d4e0bb80sewardj
25897e87935760215710e2d88bd66ca77fdeefd8dd7sewardj   vassert(VEX_HOST_WORDSIZE == sizeof(void*));
25997e87935760215710e2d88bd66ca77fdeefd8dd7sewardj   vassert(VEX_HOST_WORDSIZE == sizeof(HWord));
26097e87935760215710e2d88bd66ca77fdeefd8dd7sewardj
261c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj   /* These take a lot of space, so make sure we don't have
262c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj      any unnoticed size regressions. */
263c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj   if (VEX_HOST_WORDSIZE == 4) {
264420bfa9e0f6bc49d7682d334aa61189b4d50f7b8florian      vassert(sizeof(IRExpr) == 16);
265c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj      vassert(sizeof(IRStmt) == 20 /* x86 */
266c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj              || sizeof(IRStmt) == 24 /* arm */);
267c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj   } else {
268420bfa9e0f6bc49d7682d334aa61189b4d50f7b8florian      vassert(sizeof(IRExpr) == 32);
269d6f38b3f822f7d57adfc0da3410995d85d6a4597florian      vassert(sizeof(IRStmt) == 32);
270c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj   }
271c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj
272a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardj   /* Ditto */
273a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardj   vassert(sizeof(HReg) == 4);
274a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardj   /* If N_RREGUNIVERSE_REGS ever exceeds 64, the bitset fields in
275a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardj      RRegSet and HRegUsage will need to be changed to something
276a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardj      better than ULong. */
277a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardj   vassert(N_RREGUNIVERSE_REGS == 64);
278a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardj
2798bde7f1c67483371551aac0d4019c24c919063f7sewardj   /* Check that signed integer division on the host rounds towards
2808bde7f1c67483371551aac0d4019c24c919063f7sewardj      zero.  If not, h_calc_sdiv32_w_arm_semantics() won't work
2818bde7f1c67483371551aac0d4019c24c919063f7sewardj      correctly. */
2828bde7f1c67483371551aac0d4019c24c919063f7sewardj   /* 100.0 / 7.0 == 14.2857 */
2838bde7f1c67483371551aac0d4019c24c919063f7sewardj   vassert(udiv32(100, 7) == 14);
2848bde7f1c67483371551aac0d4019c24c919063f7sewardj   vassert(sdiv32(100, 7) == 14);
2858bde7f1c67483371551aac0d4019c24c919063f7sewardj   vassert(sdiv32(-100, 7) == -14); /* and not -15 */
2868bde7f1c67483371551aac0d4019c24c919063f7sewardj   vassert(sdiv32(100, -7) == -14); /* ditto */
2878bde7f1c67483371551aac0d4019c24c919063f7sewardj   vassert(sdiv32(-100, -7) == 14); /* not sure what this proves */
2888bde7f1c67483371551aac0d4019c24c919063f7sewardj
289ea602bc23ecabe934348ef9ea4113a22d4e0bb80sewardj   /* Really start up .. */
290443cd9d34617dd7608e5dd4b4b0b4674d4f433e7sewardj   vex_debuglevel         = debuglevel;
29108613749b639323cc7582c1bbe56c6e21c69774fsewardj   vex_control            = *vcon;
292443cd9d34617dd7608e5dd4b4b0b4674d4f433e7sewardj   vex_initdone           = True;
293d887b8634b2c2685f528bd968459c628e8f86a34sewardj   vexSetAllocMode ( VexAllocModeTEMP );
29435421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj}
29535421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj
29635421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj
29735421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj/* --------- Make a translation. --------- */
298ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes
29912b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe/* KLUDGE: S390 need to know the hwcaps of the host when generating
30012b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe   code. But that info is not passed to emit_S390Instr. Only mode64 is
30112b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe   being passed. So, ideally, we want this passed as an argument, too.
30212b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe   Until then, we use a global variable. This variable is set as a side
30312b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe   effect of LibVEX_Translate. The variable is defined here rather than
30412b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe   in host_s390_defs.c to avoid having main_main.c dragging S390
30512b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe   object files in non VEXMULTIARCH. */
30612b2b5b44516d8b77a308e7ac258a16ec1c9c959philippeUInt s390_host_hwcaps;
30712b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe
30835421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj
30935421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj/* Exported to library client. */
31035421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj
311ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott HughesIRSB* LibVEX_FrontEnd ( /*MOD*/ VexTranslateArgs* vta,
312ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes                        /*OUT*/ VexTranslateResult* res,
313ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes                        /*OUT*/ VexRegisterUpdates* pxControl)
31435421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj{
3151ff4756e1731485e6bf3cd96717cd8398daec1f2florian   IRExpr*      (*specHelper)   ( const HChar*, IRExpr**, IRStmt**, Int );
316ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes   Bool (*preciseMemExnsFn) ( Int, Int, VexRegisterUpdates );
3179e6491ab55324b8e45e187b1e1e9632ac3cb3e27sewardj   DisOneInstrFn disInstrFn;
3189e6491ab55324b8e45e187b1e1e9632ac3cb3e27sewardj
319eeac841fbfcadbc19e97c7ef56bfa3354ba78637sewardj   VexGuestLayout* guest_layout;
320dd40fdf58cc8a6fe9466c4f00bdfc9fe9bf00449sewardj   IRSB*           irsb;
321ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes   Int             i;
32205f5e0172384dd2983fb16fbb7deebd74d71cd35sewardj   Int             offB_CMSTART, offB_CMLEN, offB_GUEST_IP, szB_GUEST_IP;
323cf7879021370aabcccb1a9347244fcc7d5680141sewardj   IRType          guest_word_type;
324cf7879021370aabcccb1a9347244fcc7d5680141sewardj   IRType          host_word_type;
325f13a16a82132fa2358899c7683193effecf9a56fsewardj
326ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes   guest_layout            = NULL;
327ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes   specHelper              = NULL;
328ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes   disInstrFn              = NULL;
329ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes   preciseMemExnsFn        = NULL;
330ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes   guest_word_type         = arch_word_size(vta->arch_guest);
331ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes   host_word_type          = arch_word_size(vta->arch_host);
332ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes   offB_CMSTART            = 0;
333ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes   offB_CMLEN              = 0;
334ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes   offB_GUEST_IP           = 0;
335ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes   szB_GUEST_IP            = 0;
33658800ff1f3bc35d5cae9885c9d8a51a8d9d33016sewardj
33735421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj   vassert(vex_initdone);
338c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj   vassert(vta->needs_self_check  != NULL);
339c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj   vassert(vta->disp_cp_xassisted != NULL);
340c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj   /* Both the chainers and the indir are either NULL or non-NULL. */
341c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj   if (vta->disp_cp_chain_me_to_slowEP        != NULL) {
342c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj      vassert(vta->disp_cp_chain_me_to_fastEP != NULL);
343c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj      vassert(vta->disp_cp_xindir             != NULL);
344c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj   } else {
345c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj      vassert(vta->disp_cp_chain_me_to_fastEP == NULL);
346c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj      vassert(vta->disp_cp_xindir             == NULL);
347c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj   }
3482eeeb9bc9367c26449deaa632e9f8eafa60c4685florian
3492d6b14aa64df2ff85f8da143516779d5d43574cbsewardj   vexSetAllocModeTEMP_and_clear();
3502d6b14aa64df2ff85f8da143516779d5d43574cbsewardj   vexAllocSanityCheck();
3512a9ad023890d3b34cf45e429df2a8ae88b419128sewardj
352ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes   vex_traceflags = vta->traceflags;
3530de80192f57cd132b31b233c65734de04939ce65sewardj
354ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes   /* KLUDGE: export hwcaps. */
355ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes   if (vta->arch_host == VexArchS390X) {
356ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes      s390_host_hwcaps = vta->archinfo_host.hwcaps;
357f13a16a82132fa2358899c7683193effecf9a56fsewardj   }
358f13a16a82132fa2358899c7683193effecf9a56fsewardj
359ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes   /* First off, check that the guest and host insn sets
360ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes      are supported. */
3612a9ad023890d3b34cf45e429df2a8ae88b419128sewardj
36217c7f95c78bb3c8ced934e41a4bf1aae6d857d59sewardj   switch (vta->arch_guest) {
3632a9ad023890d3b34cf45e429df2a8ae88b419128sewardj
364bef170b7e84713d1e2181b9204d9415d29de3d65sewardj      case VexArchX86:
36512b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe         preciseMemExnsFn
36612b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe            = X86FN(guest_x86_state_requires_precise_mem_exns);
367ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes         disInstrFn              = X86FN(disInstr_X86);
368ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes         specHelper              = X86FN(guest_x86_spechelper);
369ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes         guest_layout            = X86FN(&x86guest_layout);
370ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes         offB_CMSTART            = offsetof(VexGuestX86State,guest_CMSTART);
371ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes         offB_CMLEN              = offsetof(VexGuestX86State,guest_CMLEN);
372ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes         offB_GUEST_IP           = offsetof(VexGuestX86State,guest_EIP);
373ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes         szB_GUEST_IP            = sizeof( ((VexGuestX86State*)0)->guest_EIP );
3749b76916dcc1628e133d57db001563429c6e3a590sewardj         vassert(vta->archinfo_guest.endness == VexEndnessLE);
3755074b493ae4af5e6017fac208f823d283c6123c0florian         vassert(0 == sizeof(VexGuestX86State) % LibVEX_GUEST_STATE_ALIGN);
37605f5e0172384dd2983fb16fbb7deebd74d71cd35sewardj         vassert(sizeof( ((VexGuestX86State*)0)->guest_CMSTART) == 4);
37705f5e0172384dd2983fb16fbb7deebd74d71cd35sewardj         vassert(sizeof( ((VexGuestX86State*)0)->guest_CMLEN  ) == 4);
378ce02aa77bc02dbe225a068df0fb6b31faddedcdfsewardj         vassert(sizeof( ((VexGuestX86State*)0)->guest_NRADDR ) == 4);
379f13a16a82132fa2358899c7683193effecf9a56fsewardj         break;
3802a9ad023890d3b34cf45e429df2a8ae88b419128sewardj
38144d494dfad0c12f96f61cf9edfc889dfa69e3b30sewardj      case VexArchAMD64:
38212b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe         preciseMemExnsFn
38312b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe            = AMD64FN(guest_amd64_state_requires_precise_mem_exns);
384ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes         disInstrFn              = AMD64FN(disInstr_AMD64);
385ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes         specHelper              = AMD64FN(guest_amd64_spechelper);
386ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes         guest_layout            = AMD64FN(&amd64guest_layout);
387ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes         offB_CMSTART            = offsetof(VexGuestAMD64State,guest_CMSTART);
388ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes         offB_CMLEN              = offsetof(VexGuestAMD64State,guest_CMLEN);
389ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes         offB_GUEST_IP           = offsetof(VexGuestAMD64State,guest_RIP);
390ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes         szB_GUEST_IP            = sizeof( ((VexGuestAMD64State*)0)->guest_RIP );
3919b76916dcc1628e133d57db001563429c6e3a590sewardj         vassert(vta->archinfo_guest.endness == VexEndnessLE);
3925074b493ae4af5e6017fac208f823d283c6123c0florian         vassert(0 == sizeof(VexGuestAMD64State) % LibVEX_GUEST_STATE_ALIGN);
39305f5e0172384dd2983fb16fbb7deebd74d71cd35sewardj         vassert(sizeof( ((VexGuestAMD64State*)0)->guest_CMSTART ) == 8);
39405f5e0172384dd2983fb16fbb7deebd74d71cd35sewardj         vassert(sizeof( ((VexGuestAMD64State*)0)->guest_CMLEN   ) == 8);
395ce02aa77bc02dbe225a068df0fb6b31faddedcdfsewardj         vassert(sizeof( ((VexGuestAMD64State*)0)->guest_NRADDR  ) == 8);
39644d494dfad0c12f96f61cf9edfc889dfa69e3b30sewardj         break;
39744d494dfad0c12f96f61cf9edfc889dfa69e3b30sewardj
398aabdfbf4193a965a8c50c643e536129d1d33661bcerion      case VexArchPPC32:
39912b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe         preciseMemExnsFn
40012b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe            = PPC32FN(guest_ppc32_state_requires_precise_mem_exns);
401ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes         disInstrFn              = PPC32FN(disInstr_PPC);
402ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes         specHelper              = PPC32FN(guest_ppc32_spechelper);
403ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes         guest_layout            = PPC32FN(&ppc32Guest_layout);
404ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes         offB_CMSTART            = offsetof(VexGuestPPC32State,guest_CMSTART);
405ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes         offB_CMLEN              = offsetof(VexGuestPPC32State,guest_CMLEN);
406ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes         offB_GUEST_IP           = offsetof(VexGuestPPC32State,guest_CIA);
407ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes         szB_GUEST_IP            = sizeof( ((VexGuestPPC32State*)0)->guest_CIA );
4089b76916dcc1628e133d57db001563429c6e3a590sewardj         vassert(vta->archinfo_guest.endness == VexEndnessBE);
4095074b493ae4af5e6017fac208f823d283c6123c0florian         vassert(0 == sizeof(VexGuestPPC32State) % LibVEX_GUEST_STATE_ALIGN);
41005f5e0172384dd2983fb16fbb7deebd74d71cd35sewardj         vassert(sizeof( ((VexGuestPPC32State*)0)->guest_CMSTART ) == 4);
41105f5e0172384dd2983fb16fbb7deebd74d71cd35sewardj         vassert(sizeof( ((VexGuestPPC32State*)0)->guest_CMLEN   ) == 4);
412ce02aa77bc02dbe225a068df0fb6b31faddedcdfsewardj         vassert(sizeof( ((VexGuestPPC32State*)0)->guest_NRADDR  ) == 4);
413aabdfbf4193a965a8c50c643e536129d1d33661bcerion         break;
414aabdfbf4193a965a8c50c643e536129d1d33661bcerion
415f0de28cf1a762b0d6f74c93d3532c89a230673bbcerion      case VexArchPPC64:
41612b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe         preciseMemExnsFn
41712b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe            = PPC64FN(guest_ppc64_state_requires_precise_mem_exns);
418ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes         disInstrFn              = PPC64FN(disInstr_PPC);
419ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes         specHelper              = PPC64FN(guest_ppc64_spechelper);
420ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes         guest_layout            = PPC64FN(&ppc64Guest_layout);
421ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes         offB_CMSTART            = offsetof(VexGuestPPC64State,guest_CMSTART);
422ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes         offB_CMLEN              = offsetof(VexGuestPPC64State,guest_CMLEN);
423ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes         offB_GUEST_IP           = offsetof(VexGuestPPC64State,guest_CIA);
424ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes         szB_GUEST_IP            = sizeof( ((VexGuestPPC64State*)0)->guest_CIA );
4251f5fe1fc3a37ca729925e8eec25aa1025b4a6cdbcarll         vassert(vta->archinfo_guest.endness == VexEndnessBE ||
4261f5fe1fc3a37ca729925e8eec25aa1025b4a6cdbcarll                 vta->archinfo_guest.endness == VexEndnessLE );
4275074b493ae4af5e6017fac208f823d283c6123c0florian         vassert(0 == sizeof(VexGuestPPC64State) % LibVEX_GUEST_STATE_ALIGN);
42805f5e0172384dd2983fb16fbb7deebd74d71cd35sewardj         vassert(sizeof( ((VexGuestPPC64State*)0)->guest_CMSTART    ) == 8);
42905f5e0172384dd2983fb16fbb7deebd74d71cd35sewardj         vassert(sizeof( ((VexGuestPPC64State*)0)->guest_CMLEN      ) == 8);
4303fd3967db856eb90b2030ebeb42b685d45bc3276sewardj         vassert(sizeof( ((VexGuestPPC64State*)0)->guest_NRADDR     ) == 8);
4313fd3967db856eb90b2030ebeb42b685d45bc3276sewardj         vassert(sizeof( ((VexGuestPPC64State*)0)->guest_NRADDR_GPR2) == 8);
432f0de28cf1a762b0d6f74c93d3532c89a230673bbcerion         break;
433f0de28cf1a762b0d6f74c93d3532c89a230673bbcerion
4342019a976f07ff418dde2dfc7cc74667ef66d7764sewardj      case VexArchS390X:
43512b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe         preciseMemExnsFn
43612b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe            = S390FN(guest_s390x_state_requires_precise_mem_exns);
437ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes         disInstrFn              = S390FN(disInstr_S390);
438ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes         specHelper              = S390FN(guest_s390x_spechelper);
439ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes         guest_layout            = S390FN(&s390xGuest_layout);
440ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes         offB_CMSTART            = offsetof(VexGuestS390XState,guest_CMSTART);
441ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes         offB_CMLEN              = offsetof(VexGuestS390XState,guest_CMLEN);
442ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes         offB_GUEST_IP           = offsetof(VexGuestS390XState,guest_IA);
443ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes         szB_GUEST_IP            = sizeof( ((VexGuestS390XState*)0)->guest_IA);
4449b76916dcc1628e133d57db001563429c6e3a590sewardj         vassert(vta->archinfo_guest.endness == VexEndnessBE);
4455074b493ae4af5e6017fac208f823d283c6123c0florian         vassert(0 == sizeof(VexGuestS390XState) % LibVEX_GUEST_STATE_ALIGN);
44605f5e0172384dd2983fb16fbb7deebd74d71cd35sewardj         vassert(sizeof( ((VexGuestS390XState*)0)->guest_CMSTART    ) == 8);
44705f5e0172384dd2983fb16fbb7deebd74d71cd35sewardj         vassert(sizeof( ((VexGuestS390XState*)0)->guest_CMLEN      ) == 8);
4482019a976f07ff418dde2dfc7cc74667ef66d7764sewardj         vassert(sizeof( ((VexGuestS390XState*)0)->guest_NRADDR     ) == 8);
4492019a976f07ff418dde2dfc7cc74667ef66d7764sewardj         break;
4502019a976f07ff418dde2dfc7cc74667ef66d7764sewardj
4516c299f3acab617581ea504e45fbb6cab24c2b29fsewardj      case VexArchARM:
45212b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe         preciseMemExnsFn
45312b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe            = ARMFN(guest_arm_state_requires_precise_mem_exns);
454ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes         disInstrFn              = ARMFN(disInstr_ARM);
455ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes         specHelper              = ARMFN(guest_arm_spechelper);
456ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes         guest_layout            = ARMFN(&armGuest_layout);
457ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes         offB_CMSTART            = offsetof(VexGuestARMState,guest_CMSTART);
458ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes         offB_CMLEN              = offsetof(VexGuestARMState,guest_CMLEN);
459ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes         offB_GUEST_IP           = offsetof(VexGuestARMState,guest_R15T);
460ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes         szB_GUEST_IP            = sizeof( ((VexGuestARMState*)0)->guest_R15T );
4619b76916dcc1628e133d57db001563429c6e3a590sewardj         vassert(vta->archinfo_guest.endness == VexEndnessLE);
4625074b493ae4af5e6017fac208f823d283c6123c0florian         vassert(0 == sizeof(VexGuestARMState) % LibVEX_GUEST_STATE_ALIGN);
46305f5e0172384dd2983fb16fbb7deebd74d71cd35sewardj         vassert(sizeof( ((VexGuestARMState*)0)->guest_CMSTART) == 4);
46405f5e0172384dd2983fb16fbb7deebd74d71cd35sewardj         vassert(sizeof( ((VexGuestARMState*)0)->guest_CMLEN  ) == 4);
4656c299f3acab617581ea504e45fbb6cab24c2b29fsewardj         vassert(sizeof( ((VexGuestARMState*)0)->guest_NRADDR ) == 4);
4666c299f3acab617581ea504e45fbb6cab24c2b29fsewardj         break;
4676c299f3acab617581ea504e45fbb6cab24c2b29fsewardj
468bbcf188f6ae64a44fb31414eb9e1a738b4befcc0sewardj      case VexArchARM64:
46912b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe         preciseMemExnsFn
47012b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe            = ARM64FN(guest_arm64_state_requires_precise_mem_exns);
471ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes         disInstrFn              = ARM64FN(disInstr_ARM64);
472ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes         specHelper              = ARM64FN(guest_arm64_spechelper);
473ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes         guest_layout            = ARM64FN(&arm64Guest_layout);
474ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes         offB_CMSTART            = offsetof(VexGuestARM64State,guest_CMSTART);
475ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes         offB_CMLEN              = offsetof(VexGuestARM64State,guest_CMLEN);
476ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes         offB_GUEST_IP           = offsetof(VexGuestARM64State,guest_PC);
477ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes         szB_GUEST_IP            = sizeof( ((VexGuestARM64State*)0)->guest_PC );
4789b76916dcc1628e133d57db001563429c6e3a590sewardj         vassert(vta->archinfo_guest.endness == VexEndnessLE);
4795074b493ae4af5e6017fac208f823d283c6123c0florian         vassert(0 == sizeof(VexGuestARM64State) % LibVEX_GUEST_STATE_ALIGN);
48005f5e0172384dd2983fb16fbb7deebd74d71cd35sewardj         vassert(sizeof( ((VexGuestARM64State*)0)->guest_CMSTART) == 8);
48105f5e0172384dd2983fb16fbb7deebd74d71cd35sewardj         vassert(sizeof( ((VexGuestARM64State*)0)->guest_CMLEN  ) == 8);
482bbcf188f6ae64a44fb31414eb9e1a738b4befcc0sewardj         vassert(sizeof( ((VexGuestARM64State*)0)->guest_NRADDR ) == 8);
483bbcf188f6ae64a44fb31414eb9e1a738b4befcc0sewardj         break;
484bbcf188f6ae64a44fb31414eb9e1a738b4befcc0sewardj
485d0e5fe765fb79e5495206f8d0969133178b871f2sewardj      case VexArchMIPS32:
48612b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe         preciseMemExnsFn
48712b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe            = MIPS32FN(guest_mips32_state_requires_precise_mem_exns);
488ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes         disInstrFn              = MIPS32FN(disInstr_MIPS);
489ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes         specHelper              = MIPS32FN(guest_mips32_spechelper);
490ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes         guest_layout            = MIPS32FN(&mips32Guest_layout);
491ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes         offB_CMSTART            = offsetof(VexGuestMIPS32State,guest_CMSTART);
492ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes         offB_CMLEN              = offsetof(VexGuestMIPS32State,guest_CMLEN);
493ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes         offB_GUEST_IP           = offsetof(VexGuestMIPS32State,guest_PC);
494ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes         szB_GUEST_IP            = sizeof( ((VexGuestMIPS32State*)0)->guest_PC );
4959b76916dcc1628e133d57db001563429c6e3a590sewardj         vassert(vta->archinfo_guest.endness == VexEndnessLE
4969b76916dcc1628e133d57db001563429c6e3a590sewardj                 || vta->archinfo_guest.endness == VexEndnessBE);
4975074b493ae4af5e6017fac208f823d283c6123c0florian         vassert(0 == sizeof(VexGuestMIPS32State) % LibVEX_GUEST_STATE_ALIGN);
49805f5e0172384dd2983fb16fbb7deebd74d71cd35sewardj         vassert(sizeof( ((VexGuestMIPS32State*)0)->guest_CMSTART) == 4);
49905f5e0172384dd2983fb16fbb7deebd74d71cd35sewardj         vassert(sizeof( ((VexGuestMIPS32State*)0)->guest_CMLEN  ) == 4);
500d0e5fe765fb79e5495206f8d0969133178b871f2sewardj         vassert(sizeof( ((VexGuestMIPS32State*)0)->guest_NRADDR ) == 4);
501d0e5fe765fb79e5495206f8d0969133178b871f2sewardj         break;
502d0e5fe765fb79e5495206f8d0969133178b871f2sewardj
503b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj      case VexArchMIPS64:
50412b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe         preciseMemExnsFn
50512b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe            = MIPS64FN(guest_mips64_state_requires_precise_mem_exns);
506ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes         disInstrFn              = MIPS64FN(disInstr_MIPS);
507ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes         specHelper              = MIPS64FN(guest_mips64_spechelper);
508ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes         guest_layout            = MIPS64FN(&mips64Guest_layout);
509ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes         offB_CMSTART            = offsetof(VexGuestMIPS64State,guest_CMSTART);
510ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes         offB_CMLEN              = offsetof(VexGuestMIPS64State,guest_CMLEN);
511ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes         offB_GUEST_IP           = offsetof(VexGuestMIPS64State,guest_PC);
512ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes         szB_GUEST_IP            = sizeof( ((VexGuestMIPS64State*)0)->guest_PC );
5139b76916dcc1628e133d57db001563429c6e3a590sewardj         vassert(vta->archinfo_guest.endness == VexEndnessLE
5149b76916dcc1628e133d57db001563429c6e3a590sewardj                 || vta->archinfo_guest.endness == VexEndnessBE);
5155074b493ae4af5e6017fac208f823d283c6123c0florian         vassert(0 == sizeof(VexGuestMIPS64State) % LibVEX_GUEST_STATE_ALIGN);
51605f5e0172384dd2983fb16fbb7deebd74d71cd35sewardj         vassert(sizeof( ((VexGuestMIPS64State*)0)->guest_CMSTART) == 8);
51705f5e0172384dd2983fb16fbb7deebd74d71cd35sewardj         vassert(sizeof( ((VexGuestMIPS64State*)0)->guest_CMLEN  ) == 8);
518b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj         vassert(sizeof( ((VexGuestMIPS64State*)0)->guest_NRADDR ) == 8);
519b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj         break;
520b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj
521f13a16a82132fa2358899c7683193effecf9a56fsewardj      default:
522887a11a609f3e61d2ae8fe4e67f176207715da7esewardj         vpanic("LibVEX_Translate: unsupported guest insn set");
523f13a16a82132fa2358899c7683193effecf9a56fsewardj   }
524f13a16a82132fa2358899c7683193effecf9a56fsewardj
525f3652c97c20265d3410ea75d9817e8323b6df5c8florian   // Are the guest's hardware capabilities feasible. The function will
526f3652c97c20265d3410ea75d9817e8323b6df5c8florian   // not return if hwcaps are infeasible in some sense.
527f3652c97c20265d3410ea75d9817e8323b6df5c8florian   // FIXME: how can we know the guest's hardware capabilities?
528f3652c97c20265d3410ea75d9817e8323b6df5c8florian   check_hwcaps(vta->arch_guest, vta->archinfo_guest.hwcaps);
529f3652c97c20265d3410ea75d9817e8323b6df5c8florian
530ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes   res->status         = VexTransOK;
531ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes   res->n_sc_extents   = 0;
532ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes   res->offs_profInc   = -1;
533ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes   res->n_guest_instrs = 0;
534bc161a407b3cbd722821812afb8fb47420ae538fsewardj
535ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes#ifndef VEXMULTIARCH
5369df271d97c0f79a58a8eabdcfbe6f8bf4d17876asewardj   /* yet more sanity checks ... */
53717c7f95c78bb3c8ced934e41a4bf1aae6d857d59sewardj   if (vta->arch_guest == vta->arch_host) {
5389df271d97c0f79a58a8eabdcfbe6f8bf4d17876asewardj      /* doesn't necessarily have to be true, but if it isn't it means
5390ec57c595719a395e71b48792a4d62c5b896b6d3sewardj         we are simulating one flavour of an architecture a different
5400ec57c595719a395e71b48792a4d62c5b896b6d3sewardj         flavour of the same architecture, which is pretty strange. */
5415117ce116f47141cb23d1b49cc826e19323add97sewardj      vassert(vta->archinfo_guest.hwcaps == vta->archinfo_host.hwcaps);
5429b76916dcc1628e133d57db001563429c6e3a590sewardj      /* ditto */
5439b76916dcc1628e133d57db001563429c6e3a590sewardj      vassert(vta->archinfo_guest.endness == vta->archinfo_host.endness);
5449df271d97c0f79a58a8eabdcfbe6f8bf4d17876asewardj   }
545ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes#endif
5462a9ad023890d3b34cf45e429df2a8ae88b419128sewardj
5472d6b14aa64df2ff85f8da143516779d5d43574cbsewardj   vexAllocSanityCheck();
5482d6b14aa64df2ff85f8da143516779d5d43574cbsewardj
549f48ac19a67a98af44fe452c8c2be4192ac94b62dsewardj   if (vex_traceflags & VEX_TRACE_FE)
550f48ac19a67a98af44fe452c8c2be4192ac94b62dsewardj      vex_printf("\n------------------------"
551f48ac19a67a98af44fe452c8c2be4192ac94b62dsewardj                   " Front end "
552f48ac19a67a98af44fe452c8c2be4192ac94b62dsewardj                   "------------------------\n\n");
553f48ac19a67a98af44fe452c8c2be4192ac94b62dsewardj
554ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes   *pxControl = vex_control.iropt_register_updates_default;
555ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes   vassert(*pxControl >= VexRegUpdSpAtMemAccess
556ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes           && *pxControl <= VexRegUpdAllregsAtEachInsn);
557ca2c3c75784d35d136fc7c952717cdee5063c193sewardj
558dd40fdf58cc8a6fe9466c4f00bdfc9fe9bf00449sewardj   irsb = bb_to_IR ( vta->guest_extents,
559ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes                     &res->n_sc_extents,
560ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes                     &res->n_guest_instrs,
561ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes                     pxControl,
562c716aea1cafe66ee431dc7d6909c98f18788a028sewardj                     vta->callback_opaque,
5639e6491ab55324b8e45e187b1e1e9632ac3cb3e27sewardj                     disInstrFn,
56417c7f95c78bb3c8ced934e41a4bf1aae6d857d59sewardj                     vta->guest_bytes,
56517c7f95c78bb3c8ced934e41a4bf1aae6d857d59sewardj                     vta->guest_bytes_addr,
56617c7f95c78bb3c8ced934e41a4bf1aae6d857d59sewardj                     vta->chase_into_ok,
5679b76916dcc1628e133d57db001563429c6e3a590sewardj                     vta->archinfo_host.endness,
568442e51a26cf3bc7f243167a4ff3fbfb02206f6e6sewardj                     vta->sigill_diag,
569a5f55da7e956978fddad927436da5fab9568f3f1sewardj                     vta->arch_guest,
57017c7f95c78bb3c8ced934e41a4bf1aae6d857d59sewardj                     &vta->archinfo_guest,
571dd40fdf58cc8a6fe9466c4f00bdfc9fe9bf00449sewardj                     &vta->abiinfo_both,
572db4738ab05bf88fabe7fd931a24fab2fa2060e73sewardj                     guest_word_type,
573bc161a407b3cbd722821812afb8fb47420ae538fsewardj                     vta->needs_self_check,
574c716aea1cafe66ee431dc7d6909c98f18788a028sewardj                     vta->preamble_function,
57505f5e0172384dd2983fb16fbb7deebd74d71cd35sewardj                     offB_CMSTART,
57605f5e0172384dd2983fb16fbb7deebd74d71cd35sewardj                     offB_CMLEN,
577c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj                     offB_GUEST_IP,
578c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj                     szB_GUEST_IP );
579f13a16a82132fa2358899c7683193effecf9a56fsewardj
5802d6b14aa64df2ff85f8da143516779d5d43574cbsewardj   vexAllocSanityCheck();
5812d6b14aa64df2ff85f8da143516779d5d43574cbsewardj
582dd40fdf58cc8a6fe9466c4f00bdfc9fe9bf00449sewardj   if (irsb == NULL) {
583f13a16a82132fa2358899c7683193effecf9a56fsewardj      /* Access failure. */
5842d6b14aa64df2ff85f8da143516779d5d43574cbsewardj      vexSetAllocModeTEMP_and_clear();
585ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes      return NULL;
586f13a16a82132fa2358899c7683193effecf9a56fsewardj   }
587aa59f942f729b5c98703d84321265313daeb32b8sewardj
58817c7f95c78bb3c8ced934e41a4bf1aae6d857d59sewardj   vassert(vta->guest_extents->n_used >= 1 && vta->guest_extents->n_used <= 3);
58917c7f95c78bb3c8ced934e41a4bf1aae6d857d59sewardj   vassert(vta->guest_extents->base[0] == vta->guest_bytes_addr);
59017c7f95c78bb3c8ced934e41a4bf1aae6d857d59sewardj   for (i = 0; i < vta->guest_extents->n_used; i++) {
59117c7f95c78bb3c8ced934e41a4bf1aae6d857d59sewardj      vassert(vta->guest_extents->len[i] < 10000); /* sanity */
59272c72814ab82c51d8ee8accad1a00f2d37942545sewardj   }
59372c72814ab82c51d8ee8accad1a00f2d37942545sewardj
594ca2c3c75784d35d136fc7c952717cdee5063c193sewardj   /* bb_to_IR() could have caused pxControl to change. */
595ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes   vassert(*pxControl >= VexRegUpdSpAtMemAccess
596ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes           && *pxControl <= VexRegUpdAllregsAtEachInsn);
597ca2c3c75784d35d136fc7c952717cdee5063c193sewardj
598aa59f942f729b5c98703d84321265313daeb32b8sewardj   /* If debugging, show the raw guest bytes for this bb. */
599109ffdbb31ff652ae83d0ad400966f68c46cd4f1sewardj   if (0 || (vex_traceflags & VEX_TRACE_FE)) {
60017c7f95c78bb3c8ced934e41a4bf1aae6d857d59sewardj      if (vta->guest_extents->n_used > 1) {
60172c72814ab82c51d8ee8accad1a00f2d37942545sewardj         vex_printf("can't show code due to extents > 1\n");
60272c72814ab82c51d8ee8accad1a00f2d37942545sewardj      } else {
60372c72814ab82c51d8ee8accad1a00f2d37942545sewardj         /* HACK */
6048462d113e3efeacceb304222dada8d85f748295aflorian         const UChar* p = vta->guest_bytes;
60501f8cce97179cf4363240784a26adde19287a3a6sewardj         UInt   sum = 0;
60617c7f95c78bb3c8ced934e41a4bf1aae6d857d59sewardj         UInt   guest_bytes_read = (UInt)vta->guest_extents->len[0];
607d4cc0deec55ec0be1f2ac3b20f0d340265341f83florian         vex_printf("GuestBytes %lx %u ", vta->guest_bytes_addr,
608d4cc0deec55ec0be1f2ac3b20f0d340265341f83florian                                          guest_bytes_read );
60901f8cce97179cf4363240784a26adde19287a3a6sewardj         for (i = 0; i < guest_bytes_read; i++) {
61001f8cce97179cf4363240784a26adde19287a3a6sewardj            UInt b = (UInt)p[i];
61101f8cce97179cf4363240784a26adde19287a3a6sewardj            vex_printf(" %02x", b );
61201f8cce97179cf4363240784a26adde19287a3a6sewardj            sum = (sum << 1) ^ b;
61301f8cce97179cf4363240784a26adde19287a3a6sewardj         }
61401f8cce97179cf4363240784a26adde19287a3a6sewardj         vex_printf("  %08x\n\n", sum);
61572c72814ab82c51d8ee8accad1a00f2d37942545sewardj      }
616aa59f942f729b5c98703d84321265313daeb32b8sewardj   }
617aa59f942f729b5c98703d84321265313daeb32b8sewardj
618aa59f942f729b5c98703d84321265313daeb32b8sewardj   /* Sanity check the initial IR. */
619dd40fdf58cc8a6fe9466c4f00bdfc9fe9bf00449sewardj   sanityCheckIRSB( irsb, "initial IR",
620b92307503d4fb9265136e182d10c42ebb9dd8272sewardj                    False/*can be non-flat*/, guest_word_type );
621e8e9d73817f92d295f45b1c6c823c613bc2e90aesewardj
6222d6b14aa64df2ff85f8da143516779d5d43574cbsewardj   vexAllocSanityCheck();
6232d6b14aa64df2ff85f8da143516779d5d43574cbsewardj
624edf4d69c8477cad95851d0f6ccf91ab323e5a446sewardj   /* Clean it up, hopefully a lot. */
625ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes   irsb = do_iropt_BB ( irsb, specHelper, preciseMemExnsFn, *pxControl,
626ec0d9a028955060c5216341c6fc37400ec0cb4besewardj                              vta->guest_bytes_addr,
627ec0d9a028955060c5216341c6fc37400ec0cb4besewardj                              vta->arch_guest );
628a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes
629a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes   // JRS 2016 Aug 03: Sanity checking is expensive, we already checked
630a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes   // the output of the front end, and iropt never screws up the IR by
631a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes   // itself, unless it is being hacked on.  So remove this post-iropt
632a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes   // check in "production" use.
633a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes   // sanityCheckIRSB( irsb, "after initial iropt",
634a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes   //                  True/*must be flat*/, guest_word_type );
635edf4d69c8477cad95851d0f6ccf91ab323e5a446sewardj
636f48ac19a67a98af44fe452c8c2be4192ac94b62dsewardj   if (vex_traceflags & VEX_TRACE_OPT1) {
637f48ac19a67a98af44fe452c8c2be4192ac94b62dsewardj      vex_printf("\n------------------------"
638f48ac19a67a98af44fe452c8c2be4192ac94b62dsewardj                   " After pre-instr IR optimisation "
639f48ac19a67a98af44fe452c8c2be4192ac94b62dsewardj                   "------------------------\n\n");
640dd40fdf58cc8a6fe9466c4f00bdfc9fe9bf00449sewardj      ppIRSB ( irsb );
641edf4d69c8477cad95851d0f6ccf91ab323e5a446sewardj      vex_printf("\n");
642edf4d69c8477cad95851d0f6ccf91ab323e5a446sewardj   }
643edf4d69c8477cad95851d0f6ccf91ab323e5a446sewardj
6442d6b14aa64df2ff85f8da143516779d5d43574cbsewardj   vexAllocSanityCheck();
6452d6b14aa64df2ff85f8da143516779d5d43574cbsewardj
646f13a16a82132fa2358899c7683193effecf9a56fsewardj   /* Get the thing instrumented. */
64717c7f95c78bb3c8ced934e41a4bf1aae6d857d59sewardj   if (vta->instrument1)
648dd40fdf58cc8a6fe9466c4f00bdfc9fe9bf00449sewardj      irsb = vta->instrument1(vta->callback_opaque,
649dd40fdf58cc8a6fe9466c4f00bdfc9fe9bf00449sewardj                              irsb, guest_layout,
65017c7f95c78bb3c8ced934e41a4bf1aae6d857d59sewardj                              vta->guest_extents,
65150481921c3c61054b5629c4dcebf5ec680dbf6e9florian                              &vta->archinfo_host,
65217c7f95c78bb3c8ced934e41a4bf1aae6d857d59sewardj                              guest_word_type, host_word_type);
6532d6b14aa64df2ff85f8da143516779d5d43574cbsewardj   vexAllocSanityCheck();
6542d6b14aa64df2ff85f8da143516779d5d43574cbsewardj
65517c7f95c78bb3c8ced934e41a4bf1aae6d857d59sewardj   if (vta->instrument2)
656dd40fdf58cc8a6fe9466c4f00bdfc9fe9bf00449sewardj      irsb = vta->instrument2(vta->callback_opaque,
657dd40fdf58cc8a6fe9466c4f00bdfc9fe9bf00449sewardj                              irsb, guest_layout,
65817c7f95c78bb3c8ced934e41a4bf1aae6d857d59sewardj                              vta->guest_extents,
65950481921c3c61054b5629c4dcebf5ec680dbf6e9florian                              &vta->archinfo_host,
66017c7f95c78bb3c8ced934e41a4bf1aae6d857d59sewardj                              guest_word_type, host_word_type);
66149651f4b59b1ab7e0e70cccd34001630eafbe957sewardj
662f48ac19a67a98af44fe452c8c2be4192ac94b62dsewardj   if (vex_traceflags & VEX_TRACE_INST) {
663f48ac19a67a98af44fe452c8c2be4192ac94b62dsewardj      vex_printf("\n------------------------"
664f48ac19a67a98af44fe452c8c2be4192ac94b62dsewardj                   " After instrumentation "
665f48ac19a67a98af44fe452c8c2be4192ac94b62dsewardj                   "------------------------\n\n");
666dd40fdf58cc8a6fe9466c4f00bdfc9fe9bf00449sewardj      ppIRSB ( irsb );
667f48ac19a67a98af44fe452c8c2be4192ac94b62dsewardj      vex_printf("\n");
668f48ac19a67a98af44fe452c8c2be4192ac94b62dsewardj   }
669f48ac19a67a98af44fe452c8c2be4192ac94b62dsewardj
670a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes   // JRS 2016 Aug 03: as above, this never actually fails in practice.
671a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes   // And we'll sanity check anyway after the post-instrumentation
672a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes   // cleanup pass.  So skip this check in "production" use.
673a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes   // if (vta->instrument1 || vta->instrument2)
674a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes   //    sanityCheckIRSB( irsb, "after instrumentation",
675a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes   //                     True/*must be flat*/, guest_word_type );
676f13a16a82132fa2358899c7683193effecf9a56fsewardj
6779578a8bf6159d81eeadeb771c3214109cfee3715sewardj   /* Do a post-instrumentation cleanup pass. */
67817c7f95c78bb3c8ced934e41a4bf1aae6d857d59sewardj   if (vta->instrument1 || vta->instrument2) {
679dd40fdf58cc8a6fe9466c4f00bdfc9fe9bf00449sewardj      do_deadcode_BB( irsb );
680dd40fdf58cc8a6fe9466c4f00bdfc9fe9bf00449sewardj      irsb = cprop_BB( irsb );
681dd40fdf58cc8a6fe9466c4f00bdfc9fe9bf00449sewardj      do_deadcode_BB( irsb );
682dd40fdf58cc8a6fe9466c4f00bdfc9fe9bf00449sewardj      sanityCheckIRSB( irsb, "after post-instrumentation cleanup",
683b92307503d4fb9265136e182d10c42ebb9dd8272sewardj                       True/*must be flat*/, guest_word_type );
6849578a8bf6159d81eeadeb771c3214109cfee3715sewardj   }
6859578a8bf6159d81eeadeb771c3214109cfee3715sewardj
6862d6b14aa64df2ff85f8da143516779d5d43574cbsewardj   vexAllocSanityCheck();
6872d6b14aa64df2ff85f8da143516779d5d43574cbsewardj
6889578a8bf6159d81eeadeb771c3214109cfee3715sewardj   if (vex_traceflags & VEX_TRACE_OPT2) {
6899578a8bf6159d81eeadeb771c3214109cfee3715sewardj      vex_printf("\n------------------------"
6909578a8bf6159d81eeadeb771c3214109cfee3715sewardj                   " After post-instr IR optimisation "
6919578a8bf6159d81eeadeb771c3214109cfee3715sewardj                   "------------------------\n\n");
692dd40fdf58cc8a6fe9466c4f00bdfc9fe9bf00449sewardj      ppIRSB ( irsb );
6939578a8bf6159d81eeadeb771c3214109cfee3715sewardj      vex_printf("\n");
6949578a8bf6159d81eeadeb771c3214109cfee3715sewardj   }
6959578a8bf6159d81eeadeb771c3214109cfee3715sewardj
696ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes   return irsb;
697ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes}
698ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes
699ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes
700ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes/* Back end of the compilation pipeline.  Is not exported. */
701ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes
702ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughesstatic void libvex_BackEnd ( const VexTranslateArgs *vta,
703ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes                             /*MOD*/ VexTranslateResult* res,
704ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes                             /*MOD*/ IRSB* irsb,
705ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes                             VexRegisterUpdates pxControl )
706ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes{
707ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes   /* This the bundle of functions we need to do the back-end stuff
708ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes      (insn selection, reg-alloc, assembly) whilst being insulated
709ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes      from the target instruction set. */
710ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes   Bool         (*isMove)       ( const HInstr*, HReg*, HReg* );
711ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes   void         (*getRegUsage)  ( HRegUsage*, const HInstr*, Bool );
712ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes   void         (*mapRegs)      ( HRegRemap*, HInstr*, Bool );
713ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes   void         (*genSpill)     ( HInstr**, HInstr**, HReg, Int, Bool );
714ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes   void         (*genReload)    ( HInstr**, HInstr**, HReg, Int, Bool );
715ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes   HInstr*      (*directReload) ( HInstr*, HReg, Short );
716ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes   void         (*ppInstr)      ( const HInstr*, Bool );
717ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes   void         (*ppReg)        ( HReg );
718ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes   HInstrArray* (*iselSB)       ( const IRSB*, VexArch, const VexArchInfo*,
719ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes                                  const VexAbiInfo*, Int, Int, Bool, Bool,
720ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes                                  Addr );
721ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes   Int          (*emit)         ( /*MB_MOD*/Bool*,
722ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes                                  UChar*, Int, const HInstr*, Bool, VexEndness,
723ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes                                  const void*, const void*, const void*,
724ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes                                  const void* );
725ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes   Bool (*preciseMemExnsFn) ( Int, Int, VexRegisterUpdates );
726ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes
727ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes   const RRegUniverse* rRegUniv = NULL;
728ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes
729ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes   Bool            mode64, chainingAllowed;
730ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes   Int             i, j, k, out_used;
731ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes   Int guest_sizeB;
732ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes   Int offB_HOST_EvC_COUNTER;
733ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes   Int offB_HOST_EvC_FAILADDR;
734ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes   Addr            max_ga;
735ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes   UChar           insn_bytes[128];
736ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes   HInstrArray*    vcode;
737ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes   HInstrArray*    rcode;
738ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes
739ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes   isMove                  = NULL;
740ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes   getRegUsage             = NULL;
741ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes   mapRegs                 = NULL;
742ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes   genSpill                = NULL;
743ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes   genReload               = NULL;
744ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes   directReload            = NULL;
745ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes   ppInstr                 = NULL;
746ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes   ppReg                   = NULL;
747ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes   iselSB                  = NULL;
748ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes   emit                    = NULL;
749ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes
750ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes   mode64                 = False;
751ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes   chainingAllowed        = False;
752ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes   guest_sizeB            = 0;
753ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes   offB_HOST_EvC_COUNTER  = 0;
754ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes   offB_HOST_EvC_FAILADDR = 0;
755ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes   preciseMemExnsFn       = NULL;
756ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes
757ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes   vassert(vex_initdone);
758ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes   vassert(vta->disp_cp_xassisted != NULL);
759ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes
760ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes   vex_traceflags = vta->traceflags;
761ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes
762ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes   /* Both the chainers and the indir are either NULL or non-NULL. */
763ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes   if (vta->disp_cp_chain_me_to_slowEP        != NULL) {
764ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes      vassert(vta->disp_cp_chain_me_to_fastEP != NULL);
765ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes      vassert(vta->disp_cp_xindir             != NULL);
766ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes      chainingAllowed = True;
767ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes   } else {
768ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes      vassert(vta->disp_cp_chain_me_to_fastEP == NULL);
769ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes      vassert(vta->disp_cp_xindir             == NULL);
770ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes   }
771ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes
772ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes   switch (vta->arch_guest) {
773ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes
774ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes      case VexArchX86:
775ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes         preciseMemExnsFn
776ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes            = X86FN(guest_x86_state_requires_precise_mem_exns);
777ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes         guest_sizeB            = sizeof(VexGuestX86State);
778ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes         offB_HOST_EvC_COUNTER  = offsetof(VexGuestX86State,host_EvC_COUNTER);
779ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes         offB_HOST_EvC_FAILADDR = offsetof(VexGuestX86State,host_EvC_FAILADDR);
780ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes         break;
781ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes
782ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes      case VexArchAMD64:
783ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes         preciseMemExnsFn
784ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes            = AMD64FN(guest_amd64_state_requires_precise_mem_exns);
785ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes         guest_sizeB            = sizeof(VexGuestAMD64State);
786ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes         offB_HOST_EvC_COUNTER  = offsetof(VexGuestAMD64State,host_EvC_COUNTER);
787ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes         offB_HOST_EvC_FAILADDR = offsetof(VexGuestAMD64State,host_EvC_FAILADDR);
788ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes         break;
789ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes
790ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes      case VexArchPPC32:
791ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes         preciseMemExnsFn
792ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes            = PPC32FN(guest_ppc32_state_requires_precise_mem_exns);
793ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes         guest_sizeB            = sizeof(VexGuestPPC32State);
794ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes         offB_HOST_EvC_COUNTER  = offsetof(VexGuestPPC32State,host_EvC_COUNTER);
795ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes         offB_HOST_EvC_FAILADDR = offsetof(VexGuestPPC32State,host_EvC_FAILADDR);
796ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes         break;
797ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes
798ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes      case VexArchPPC64:
799ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes         preciseMemExnsFn
800ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes            = PPC64FN(guest_ppc64_state_requires_precise_mem_exns);
801ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes         guest_sizeB            = sizeof(VexGuestPPC64State);
802ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes         offB_HOST_EvC_COUNTER  = offsetof(VexGuestPPC64State,host_EvC_COUNTER);
803ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes         offB_HOST_EvC_FAILADDR = offsetof(VexGuestPPC64State,host_EvC_FAILADDR);
804ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes         break;
805ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes
806ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes      case VexArchS390X:
807ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes         preciseMemExnsFn
808ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes            = S390FN(guest_s390x_state_requires_precise_mem_exns);
809ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes         guest_sizeB            = sizeof(VexGuestS390XState);
810ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes         offB_HOST_EvC_COUNTER  = offsetof(VexGuestS390XState,host_EvC_COUNTER);
811ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes         offB_HOST_EvC_FAILADDR = offsetof(VexGuestS390XState,host_EvC_FAILADDR);
812ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes         break;
813ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes
814ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes      case VexArchARM:
815ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes         preciseMemExnsFn
816ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes            = ARMFN(guest_arm_state_requires_precise_mem_exns);
817ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes         guest_sizeB            = sizeof(VexGuestARMState);
818ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes         offB_HOST_EvC_COUNTER  = offsetof(VexGuestARMState,host_EvC_COUNTER);
819ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes         offB_HOST_EvC_FAILADDR = offsetof(VexGuestARMState,host_EvC_FAILADDR);
820ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes         break;
821ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes
822ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes      case VexArchARM64:
823ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes         preciseMemExnsFn
824ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes            = ARM64FN(guest_arm64_state_requires_precise_mem_exns);
825ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes         guest_sizeB            = sizeof(VexGuestARM64State);
826ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes         offB_HOST_EvC_COUNTER  = offsetof(VexGuestARM64State,host_EvC_COUNTER);
827ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes         offB_HOST_EvC_FAILADDR = offsetof(VexGuestARM64State,host_EvC_FAILADDR);
828ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes         break;
829ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes
830ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes      case VexArchMIPS32:
831ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes         preciseMemExnsFn
832ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes            = MIPS32FN(guest_mips32_state_requires_precise_mem_exns);
833ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes         guest_sizeB            = sizeof(VexGuestMIPS32State);
834ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes         offB_HOST_EvC_COUNTER  = offsetof(VexGuestMIPS32State,host_EvC_COUNTER);
835ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes         offB_HOST_EvC_FAILADDR = offsetof(VexGuestMIPS32State,host_EvC_FAILADDR);
836ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes         break;
837ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes
838ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes      case VexArchMIPS64:
839ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes         preciseMemExnsFn
840ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes            = MIPS64FN(guest_mips64_state_requires_precise_mem_exns);
841ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes         guest_sizeB            = sizeof(VexGuestMIPS64State);
842ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes         offB_HOST_EvC_COUNTER  = offsetof(VexGuestMIPS64State,host_EvC_COUNTER);
843ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes         offB_HOST_EvC_FAILADDR = offsetof(VexGuestMIPS64State,host_EvC_FAILADDR);
844ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes         break;
845ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes
846ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes      default:
847ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes         vpanic("LibVEX_Codegen: unsupported guest insn set");
848ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes   }
849ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes
850ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes
851ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes   switch (vta->arch_host) {
852ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes
853ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes      case VexArchX86:
854ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes         mode64       = False;
855ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes         rRegUniv     = X86FN(getRRegUniverse_X86());
856ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes         isMove       = CAST_TO_TYPEOF(isMove) X86FN(isMove_X86Instr);
857ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes         getRegUsage
858ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes            = CAST_TO_TYPEOF(getRegUsage) X86FN(getRegUsage_X86Instr);
859ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes         mapRegs      = CAST_TO_TYPEOF(mapRegs) X86FN(mapRegs_X86Instr);
860ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes         genSpill     = CAST_TO_TYPEOF(genSpill) X86FN(genSpill_X86);
861ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes         genReload    = CAST_TO_TYPEOF(genReload) X86FN(genReload_X86);
862ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes         directReload = CAST_TO_TYPEOF(directReload) X86FN(directReload_X86);
863ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes         ppInstr      = CAST_TO_TYPEOF(ppInstr) X86FN(ppX86Instr);
864ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes         ppReg        = CAST_TO_TYPEOF(ppReg) X86FN(ppHRegX86);
865ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes         iselSB       = X86FN(iselSB_X86);
866ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes         emit         = CAST_TO_TYPEOF(emit) X86FN(emit_X86Instr);
867ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes         vassert(vta->archinfo_host.endness == VexEndnessLE);
868ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes         break;
869ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes
870ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes      case VexArchAMD64:
871ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes         mode64       = True;
872ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes         rRegUniv     = AMD64FN(getRRegUniverse_AMD64());
873ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes         isMove       = CAST_TO_TYPEOF(isMove) AMD64FN(isMove_AMD64Instr);
874ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes         getRegUsage
875ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes            = CAST_TO_TYPEOF(getRegUsage) AMD64FN(getRegUsage_AMD64Instr);
876ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes         mapRegs      = CAST_TO_TYPEOF(mapRegs) AMD64FN(mapRegs_AMD64Instr);
877ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes         genSpill     = CAST_TO_TYPEOF(genSpill) AMD64FN(genSpill_AMD64);
878ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes         genReload    = CAST_TO_TYPEOF(genReload) AMD64FN(genReload_AMD64);
879ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes         directReload = CAST_TO_TYPEOF(directReload) AMD64FN(directReload_AMD64);
880ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes         ppInstr      = CAST_TO_TYPEOF(ppInstr) AMD64FN(ppAMD64Instr);
881ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes         ppReg        = CAST_TO_TYPEOF(ppReg) AMD64FN(ppHRegAMD64);
882ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes         iselSB       = AMD64FN(iselSB_AMD64);
883ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes         emit         = CAST_TO_TYPEOF(emit) AMD64FN(emit_AMD64Instr);
884ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes         vassert(vta->archinfo_host.endness == VexEndnessLE);
885ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes         break;
886ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes
887ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes      case VexArchPPC32:
888ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes         mode64       = False;
889ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes         rRegUniv     = PPC32FN(getRRegUniverse_PPC(mode64));
890ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes         isMove       = CAST_TO_TYPEOF(isMove) PPC32FN(isMove_PPCInstr);
891ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes         getRegUsage
892ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes            = CAST_TO_TYPEOF(getRegUsage) PPC32FN(getRegUsage_PPCInstr);
893ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes         mapRegs      = CAST_TO_TYPEOF(mapRegs) PPC32FN(mapRegs_PPCInstr);
894ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes         genSpill     = CAST_TO_TYPEOF(genSpill) PPC32FN(genSpill_PPC);
895ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes         genReload    = CAST_TO_TYPEOF(genReload) PPC32FN(genReload_PPC);
896ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes         ppInstr      = CAST_TO_TYPEOF(ppInstr) PPC32FN(ppPPCInstr);
897ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes         ppReg        = CAST_TO_TYPEOF(ppReg) PPC32FN(ppHRegPPC);
898ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes         iselSB       = PPC32FN(iselSB_PPC);
899ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes         emit         = CAST_TO_TYPEOF(emit) PPC32FN(emit_PPCInstr);
900ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes         vassert(vta->archinfo_host.endness == VexEndnessBE);
901ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes         break;
902ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes
903ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes      case VexArchPPC64:
904ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes         mode64       = True;
905ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes         rRegUniv     = PPC64FN(getRRegUniverse_PPC(mode64));
906ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes         isMove       = CAST_TO_TYPEOF(isMove) PPC64FN(isMove_PPCInstr);
907ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes         getRegUsage
908ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes            = CAST_TO_TYPEOF(getRegUsage) PPC64FN(getRegUsage_PPCInstr);
909ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes         mapRegs      = CAST_TO_TYPEOF(mapRegs) PPC64FN(mapRegs_PPCInstr);
910ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes         genSpill     = CAST_TO_TYPEOF(genSpill) PPC64FN(genSpill_PPC);
911ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes         genReload    = CAST_TO_TYPEOF(genReload) PPC64FN(genReload_PPC);
912ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes         ppInstr      = CAST_TO_TYPEOF(ppInstr) PPC64FN(ppPPCInstr);
913ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes         ppReg        = CAST_TO_TYPEOF(ppReg) PPC64FN(ppHRegPPC);
914ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes         iselSB       = PPC64FN(iselSB_PPC);
915ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes         emit         = CAST_TO_TYPEOF(emit) PPC64FN(emit_PPCInstr);
916ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes         vassert(vta->archinfo_host.endness == VexEndnessBE ||
917ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes                 vta->archinfo_host.endness == VexEndnessLE );
918ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes         break;
919ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes
920ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes      case VexArchS390X:
921ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes         mode64       = True;
922ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes         rRegUniv     = S390FN(getRRegUniverse_S390());
923ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes         isMove       = CAST_TO_TYPEOF(isMove) S390FN(isMove_S390Instr);
924ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes         getRegUsage
925ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes            = CAST_TO_TYPEOF(getRegUsage) S390FN(getRegUsage_S390Instr);
926ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes         mapRegs      = CAST_TO_TYPEOF(mapRegs) S390FN(mapRegs_S390Instr);
927ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes         genSpill     = CAST_TO_TYPEOF(genSpill) S390FN(genSpill_S390);
928ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes         genReload    = CAST_TO_TYPEOF(genReload) S390FN(genReload_S390);
929ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes         // fixs390: consider implementing directReload_S390
930ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes         ppInstr      = CAST_TO_TYPEOF(ppInstr) S390FN(ppS390Instr);
931ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes         ppReg        = CAST_TO_TYPEOF(ppReg) S390FN(ppHRegS390);
932ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes         iselSB       = S390FN(iselSB_S390);
933ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes         emit         = CAST_TO_TYPEOF(emit) S390FN(emit_S390Instr);
934ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes         vassert(vta->archinfo_host.endness == VexEndnessBE);
935ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes         break;
936ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes
937ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes      case VexArchARM:
938ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes         mode64       = False;
939ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes         rRegUniv     = ARMFN(getRRegUniverse_ARM());
940ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes         isMove       = CAST_TO_TYPEOF(isMove) ARMFN(isMove_ARMInstr);
941ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes         getRegUsage
942ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes            = CAST_TO_TYPEOF(getRegUsage) ARMFN(getRegUsage_ARMInstr);
943ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes         mapRegs      = CAST_TO_TYPEOF(mapRegs) ARMFN(mapRegs_ARMInstr);
944ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes         genSpill     = CAST_TO_TYPEOF(genSpill) ARMFN(genSpill_ARM);
945ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes         genReload    = CAST_TO_TYPEOF(genReload) ARMFN(genReload_ARM);
946ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes         ppInstr      = CAST_TO_TYPEOF(ppInstr) ARMFN(ppARMInstr);
947ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes         ppReg        = CAST_TO_TYPEOF(ppReg) ARMFN(ppHRegARM);
948ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes         iselSB       = ARMFN(iselSB_ARM);
949ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes         emit         = CAST_TO_TYPEOF(emit) ARMFN(emit_ARMInstr);
950ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes         vassert(vta->archinfo_host.endness == VexEndnessLE);
951ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes         break;
952ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes
953ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes      case VexArchARM64:
954ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes         mode64       = True;
955ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes         rRegUniv     = ARM64FN(getRRegUniverse_ARM64());
956ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes         isMove       = CAST_TO_TYPEOF(isMove) ARM64FN(isMove_ARM64Instr);
957ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes         getRegUsage
958ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes            = CAST_TO_TYPEOF(getRegUsage) ARM64FN(getRegUsage_ARM64Instr);
959ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes         mapRegs      = CAST_TO_TYPEOF(mapRegs) ARM64FN(mapRegs_ARM64Instr);
960ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes         genSpill     = CAST_TO_TYPEOF(genSpill) ARM64FN(genSpill_ARM64);
961ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes         genReload    = CAST_TO_TYPEOF(genReload) ARM64FN(genReload_ARM64);
962ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes         ppInstr      = CAST_TO_TYPEOF(ppInstr) ARM64FN(ppARM64Instr);
963ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes         ppReg        = CAST_TO_TYPEOF(ppReg) ARM64FN(ppHRegARM64);
964ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes         iselSB       = ARM64FN(iselSB_ARM64);
965ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes         emit         = CAST_TO_TYPEOF(emit) ARM64FN(emit_ARM64Instr);
966ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes         vassert(vta->archinfo_host.endness == VexEndnessLE);
967ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes         break;
968ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes
969ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes      case VexArchMIPS32:
970ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes         mode64       = False;
971ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes         rRegUniv     = MIPS32FN(getRRegUniverse_MIPS(mode64));
972ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes         isMove       = CAST_TO_TYPEOF(isMove) MIPS32FN(isMove_MIPSInstr);
973ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes         getRegUsage
974ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes            = CAST_TO_TYPEOF(getRegUsage) MIPS32FN(getRegUsage_MIPSInstr);
975ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes         mapRegs      = CAST_TO_TYPEOF(mapRegs) MIPS32FN(mapRegs_MIPSInstr);
976ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes         genSpill     = CAST_TO_TYPEOF(genSpill) MIPS32FN(genSpill_MIPS);
977ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes         genReload    = CAST_TO_TYPEOF(genReload) MIPS32FN(genReload_MIPS);
978ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes         ppInstr      = CAST_TO_TYPEOF(ppInstr) MIPS32FN(ppMIPSInstr);
979ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes         ppReg        = CAST_TO_TYPEOF(ppReg) MIPS32FN(ppHRegMIPS);
980ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes         iselSB       = MIPS32FN(iselSB_MIPS);
981ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes         emit         = CAST_TO_TYPEOF(emit) MIPS32FN(emit_MIPSInstr);
982ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes         vassert(vta->archinfo_host.endness == VexEndnessLE
983ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes                 || vta->archinfo_host.endness == VexEndnessBE);
984ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes         break;
985ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes
986ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes      case VexArchMIPS64:
987ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes         mode64       = True;
988ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes         rRegUniv     = MIPS64FN(getRRegUniverse_MIPS(mode64));
989ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes         isMove       = CAST_TO_TYPEOF(isMove) MIPS64FN(isMove_MIPSInstr);
990ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes         getRegUsage
991ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes            = CAST_TO_TYPEOF(getRegUsage) MIPS64FN(getRegUsage_MIPSInstr);
992ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes         mapRegs      = CAST_TO_TYPEOF(mapRegs) MIPS64FN(mapRegs_MIPSInstr);
993ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes         genSpill     = CAST_TO_TYPEOF(genSpill) MIPS64FN(genSpill_MIPS);
994ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes         genReload    = CAST_TO_TYPEOF(genReload) MIPS64FN(genReload_MIPS);
995ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes         ppInstr      = CAST_TO_TYPEOF(ppInstr) MIPS64FN(ppMIPSInstr);
996ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes         ppReg        = CAST_TO_TYPEOF(ppReg) MIPS64FN(ppHRegMIPS);
997ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes         iselSB       = MIPS64FN(iselSB_MIPS);
998ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes         emit         = CAST_TO_TYPEOF(emit) MIPS64FN(emit_MIPSInstr);
999ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes         vassert(vta->archinfo_host.endness == VexEndnessLE
1000ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes                 || vta->archinfo_host.endness == VexEndnessBE);
1001ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes         break;
1002ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes
1003ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes      default:
1004ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes         vpanic("LibVEX_Translate: unsupported host insn set");
1005ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes   }
1006ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes
1007ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes   // Are the host's hardware capabilities feasible. The function will
1008ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes   // not return if hwcaps are infeasible in some sense.
1009ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes   check_hwcaps(vta->arch_host, vta->archinfo_host.hwcaps);
1010ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes
1011ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes
1012f9517d0d452899780e8c34f02bef004ef7c5a163sewardj   /* Turn it into virtual-registerised code.  Build trees -- this
1013f9517d0d452899780e8c34f02bef004ef7c5a163sewardj      also throws away any dead bindings. */
1014ca2c3c75784d35d136fc7c952717cdee5063c193sewardj   max_ga = ado_treebuild_BB( irsb, preciseMemExnsFn, pxControl );
1015f48ac19a67a98af44fe452c8c2be4192ac94b62dsewardj
1016be1b6ff6cdb576c59734762fb778ae48eb8e7a10sewardj   if (vta->finaltidy) {
1017be1b6ff6cdb576c59734762fb778ae48eb8e7a10sewardj      irsb = vta->finaltidy(irsb);
1018be1b6ff6cdb576c59734762fb778ae48eb8e7a10sewardj   }
1019be1b6ff6cdb576c59734762fb778ae48eb8e7a10sewardj
10202d6b14aa64df2ff85f8da143516779d5d43574cbsewardj   vexAllocSanityCheck();
10212d6b14aa64df2ff85f8da143516779d5d43574cbsewardj
1022f48ac19a67a98af44fe452c8c2be4192ac94b62dsewardj   if (vex_traceflags & VEX_TRACE_TREES) {
1023f48ac19a67a98af44fe452c8c2be4192ac94b62dsewardj      vex_printf("\n------------------------"
1024f48ac19a67a98af44fe452c8c2be4192ac94b62dsewardj                   "  After tree-building "
1025f48ac19a67a98af44fe452c8c2be4192ac94b62dsewardj                   "------------------------\n\n");
1026dd40fdf58cc8a6fe9466c4f00bdfc9fe9bf00449sewardj      ppIRSB ( irsb );
1027f48ac19a67a98af44fe452c8c2be4192ac94b62dsewardj      vex_printf("\n");
1028f48ac19a67a98af44fe452c8c2be4192ac94b62dsewardj   }
1029f48ac19a67a98af44fe452c8c2be4192ac94b62dsewardj
1030e908c426bc9991611a1731ee881208d148e913fbsewardj   /* HACK */
1031bc161a407b3cbd722821812afb8fb47420ae538fsewardj   if (0) {
1032bc161a407b3cbd722821812afb8fb47420ae538fsewardj      *(vta->host_bytes_used) = 0;
1033ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes      res->status = VexTransOK; return;
1034bc161a407b3cbd722821812afb8fb47420ae538fsewardj   }
1035e908c426bc9991611a1731ee881208d148e913fbsewardj   /* end HACK */
1036c33671d7b0e21edb1d1015e4cbccbc6ca139e6d8sewardj
1037f48ac19a67a98af44fe452c8c2be4192ac94b62dsewardj   if (vex_traceflags & VEX_TRACE_VCODE)
1038f48ac19a67a98af44fe452c8c2be4192ac94b62dsewardj      vex_printf("\n------------------------"
1039f48ac19a67a98af44fe452c8c2be4192ac94b62dsewardj                   " Instruction selection "
1040f48ac19a67a98af44fe452c8c2be4192ac94b62dsewardj                   "------------------------\n");
1041f48ac19a67a98af44fe452c8c2be4192ac94b62dsewardj
1042c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj   /* No guest has its IP field at offset zero.  If this fails it
1043c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj      means some transformation pass somewhere failed to update/copy
1044c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj      irsb->offsIP properly. */
1045c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj   vassert(irsb->offsIP >= 16);
1046c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj
1047c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj   vcode = iselSB ( irsb, vta->arch_host,
1048c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj                    &vta->archinfo_host,
1049c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj                    &vta->abiinfo_both,
1050c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj                    offB_HOST_EvC_COUNTER,
1051c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj                    offB_HOST_EvC_FAILADDR,
1052c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj                    chainingAllowed,
1053c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj                    vta->addProfInc,
1054c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj                    max_ga );
1055f13a16a82132fa2358899c7683193effecf9a56fsewardj
10562d6b14aa64df2ff85f8da143516779d5d43574cbsewardj   vexAllocSanityCheck();
10572d6b14aa64df2ff85f8da143516779d5d43574cbsewardj
1058f48ac19a67a98af44fe452c8c2be4192ac94b62dsewardj   if (vex_traceflags & VEX_TRACE_VCODE)
1059f48ac19a67a98af44fe452c8c2be4192ac94b62dsewardj      vex_printf("\n");
1060f48ac19a67a98af44fe452c8c2be4192ac94b62dsewardj
1061f48ac19a67a98af44fe452c8c2be4192ac94b62dsewardj   if (vex_traceflags & VEX_TRACE_VCODE) {
10621f40a0a104034009e253675288ebefdcccf30da8sewardj      for (i = 0; i < vcode->arr_used; i++) {
10631f40a0a104034009e253675288ebefdcccf30da8sewardj         vex_printf("%3d   ", i);
106492b643609c5fa432b11fc726c2706ae3f3296eb4cerion         ppInstr(vcode->arr[i], mode64);
10651f40a0a104034009e253675288ebefdcccf30da8sewardj         vex_printf("\n");
10661f40a0a104034009e253675288ebefdcccf30da8sewardj      }
1067fbcaf3312f39fb73d54821636c6168db76245f61sewardj      vex_printf("\n");
1068fbcaf3312f39fb73d54821636c6168db76245f61sewardj   }
1069fbcaf3312f39fb73d54821636c6168db76245f61sewardj
1070f13a16a82132fa2358899c7683193effecf9a56fsewardj   /* Register allocate. */
1071a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardj   rcode = doRegisterAllocation ( vcode, rRegUniv,
107272c72814ab82c51d8ee8accad1a00f2d37942545sewardj                                  isMove, getRegUsage, mapRegs,
1073fb7373aee5e8a3039f2916ecf09870f3ec0c1805sewardj                                  genSpill, genReload, directReload,
1074fb7373aee5e8a3039f2916ecf09870f3ec0c1805sewardj                                  guest_sizeB,
107592b643609c5fa432b11fc726c2706ae3f3296eb4cerion                                  ppInstr, ppReg, mode64 );
1076f13a16a82132fa2358899c7683193effecf9a56fsewardj
10772d6b14aa64df2ff85f8da143516779d5d43574cbsewardj   vexAllocSanityCheck();
10782d6b14aa64df2ff85f8da143516779d5d43574cbsewardj
1079f48ac19a67a98af44fe452c8c2be4192ac94b62dsewardj   if (vex_traceflags & VEX_TRACE_RCODE) {
1080f48ac19a67a98af44fe452c8c2be4192ac94b62dsewardj      vex_printf("\n------------------------"
1081f48ac19a67a98af44fe452c8c2be4192ac94b62dsewardj                   " Register-allocated code "
1082f48ac19a67a98af44fe452c8c2be4192ac94b62dsewardj                   "------------------------\n\n");
10831f40a0a104034009e253675288ebefdcccf30da8sewardj      for (i = 0; i < rcode->arr_used; i++) {
10841f40a0a104034009e253675288ebefdcccf30da8sewardj         vex_printf("%3d   ", i);
108592b643609c5fa432b11fc726c2706ae3f3296eb4cerion         ppInstr(rcode->arr[i], mode64);
10861f40a0a104034009e253675288ebefdcccf30da8sewardj         vex_printf("\n");
10871f40a0a104034009e253675288ebefdcccf30da8sewardj      }
1088fbcaf3312f39fb73d54821636c6168db76245f61sewardj      vex_printf("\n");
1089fbcaf3312f39fb73d54821636c6168db76245f61sewardj   }
1090fbcaf3312f39fb73d54821636c6168db76245f61sewardj
1091e908c426bc9991611a1731ee881208d148e913fbsewardj   /* HACK */
1092bc161a407b3cbd722821812afb8fb47420ae538fsewardj   if (0) {
1093bc161a407b3cbd722821812afb8fb47420ae538fsewardj      *(vta->host_bytes_used) = 0;
1094ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes      res->status = VexTransOK; return;
1095bc161a407b3cbd722821812afb8fb47420ae538fsewardj   }
1096e908c426bc9991611a1731ee881208d148e913fbsewardj   /* end HACK */
1097e908c426bc9991611a1731ee881208d148e913fbsewardj
109881bd550f9a1d58ceeedb159d18642d9790e75eb4sewardj   /* Assemble */
1099f48ac19a67a98af44fe452c8c2be4192ac94b62dsewardj   if (vex_traceflags & VEX_TRACE_ASM) {
1100f48ac19a67a98af44fe452c8c2be4192ac94b62dsewardj      vex_printf("\n------------------------"
1101f48ac19a67a98af44fe452c8c2be4192ac94b62dsewardj                   " Assembly "
1102f48ac19a67a98af44fe452c8c2be4192ac94b62dsewardj                   "------------------------\n\n");
1103f48ac19a67a98af44fe452c8c2be4192ac94b62dsewardj   }
1104f48ac19a67a98af44fe452c8c2be4192ac94b62dsewardj
110581bd550f9a1d58ceeedb159d18642d9790e75eb4sewardj   out_used = 0; /* tracks along the host_bytes array */
110681bd550f9a1d58ceeedb159d18642d9790e75eb4sewardj   for (i = 0; i < rcode->arr_used; i++) {
1107c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj      HInstr* hi           = rcode->arr[i];
1108c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj      Bool    hi_isProfInc = False;
1109c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj      if (UNLIKELY(vex_traceflags & VEX_TRACE_ASM)) {
1110c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj         ppInstr(hi, mode64);
1111bad34a9c950dcc0c3f68ea2904206f3341fb5e91sewardj         vex_printf("\n");
1112bad34a9c950dcc0c3f68ea2904206f3341fb5e91sewardj      }
1113c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj      j = emit( &hi_isProfInc,
11149b76916dcc1628e133d57db001563429c6e3a590sewardj                insn_bytes, sizeof insn_bytes, hi,
11159b76916dcc1628e133d57db001563429c6e3a590sewardj                mode64, vta->archinfo_host.endness,
1116c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj                vta->disp_cp_chain_me_to_slowEP,
1117c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj                vta->disp_cp_chain_me_to_fastEP,
1118c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj                vta->disp_cp_xindir,
1119c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj                vta->disp_cp_xassisted );
1120c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj      if (UNLIKELY(vex_traceflags & VEX_TRACE_ASM)) {
1121bad34a9c950dcc0c3f68ea2904206f3341fb5e91sewardj         for (k = 0; k < j; k++)
1122e554042a0d0211287313a7d20a66baf7f6d1c9a8florian            vex_printf("%02x ", (UInt)insn_bytes[k]);
1123bad34a9c950dcc0c3f68ea2904206f3341fb5e91sewardj         vex_printf("\n\n");
1124bad34a9c950dcc0c3f68ea2904206f3341fb5e91sewardj      }
1125c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj      if (UNLIKELY(out_used + j > vta->host_bytes_size)) {
11262d6b14aa64df2ff85f8da143516779d5d43574cbsewardj         vexSetAllocModeTEMP_and_clear();
1127f48ac19a67a98af44fe452c8c2be4192ac94b62dsewardj         vex_traceflags = 0;
1128ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes         res->status = VexTransOutputFull;
1129ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes         return;
113081bd550f9a1d58ceeedb159d18642d9790e75eb4sewardj      }
1131c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj      if (UNLIKELY(hi_isProfInc)) {
1132c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj         vassert(vta->addProfInc); /* else where did it come from? */
1133ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes         vassert(res->offs_profInc == -1); /* there can be only one (tm) */
1134c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj         vassert(out_used >= 0);
1135ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes         res->offs_profInc = out_used;
1136c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj      }
1137c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj      { UChar* dst = &vta->host_bytes[out_used];
1138c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj        for (k = 0; k < j; k++) {
1139c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj           dst[k] = insn_bytes[k];
1140c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj        }
1141c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj        out_used += j;
114281bd550f9a1d58ceeedb159d18642d9790e75eb4sewardj      }
114381bd550f9a1d58ceeedb159d18642d9790e75eb4sewardj   }
114417c7f95c78bb3c8ced934e41a4bf1aae6d857d59sewardj   *(vta->host_bytes_used) = out_used;
114581bd550f9a1d58ceeedb159d18642d9790e75eb4sewardj
11462d6b14aa64df2ff85f8da143516779d5d43574cbsewardj   vexAllocSanityCheck();
11472d6b14aa64df2ff85f8da143516779d5d43574cbsewardj
11482d6b14aa64df2ff85f8da143516779d5d43574cbsewardj   vexSetAllocModeTEMP_and_clear();
1149f13a16a82132fa2358899c7683193effecf9a56fsewardj
115065ea17e33e244e3615a6e0d9c9a388a12d758f06sewardj   if (vex_traceflags) {
115165ea17e33e244e3615a6e0d9c9a388a12d758f06sewardj      /* Print the expansion ratio for this SB. */
115265ea17e33e244e3615a6e0d9c9a388a12d758f06sewardj      j = 0; /* total guest bytes */
115365ea17e33e244e3615a6e0d9c9a388a12d758f06sewardj      for (i = 0; i < vta->guest_extents->n_used; i++) {
115465ea17e33e244e3615a6e0d9c9a388a12d758f06sewardj         j += vta->guest_extents->len[i];
115565ea17e33e244e3615a6e0d9c9a388a12d758f06sewardj      }
115665ea17e33e244e3615a6e0d9c9a388a12d758f06sewardj      if (1) vex_printf("VexExpansionRatio %d %d   %d :10\n\n",
115765ea17e33e244e3615a6e0d9c9a388a12d758f06sewardj                        j, out_used, (10 * out_used) / (j == 0 ? 1 : j));
115865ea17e33e244e3615a6e0d9c9a388a12d758f06sewardj   }
115965ea17e33e244e3615a6e0d9c9a388a12d758f06sewardj
1160f48ac19a67a98af44fe452c8c2be4192ac94b62dsewardj   vex_traceflags = 0;
1161ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes   res->status = VexTransOK;
1162ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes   return;
1163ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes}
1164ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes
1165ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes
1166ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes/* Exported to library client. */
1167ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes
1168ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott HughesVexTranslateResult LibVEX_Translate ( /*MOD*/ VexTranslateArgs* vta )
1169ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes{
1170ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes   VexTranslateResult res = { 0 };
1171ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes   VexRegisterUpdates pxControl = VexRegUpd_INVALID;
1172ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes
1173ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes   IRSB* irsb = LibVEX_FrontEnd(vta, &res, &pxControl);
1174ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes   libvex_BackEnd(vta, &res, irsb, pxControl);
1175bc161a407b3cbd722821812afb8fb47420ae538fsewardj   return res;
117635421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj}
117735421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj
117835421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj
1179c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj/* --------- Chain/Unchain XDirects. --------- */
1180c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj
11817d6f81de12e6d8deb3e119ab318f361d97a10a65florianVexInvalRange LibVEX_Chain ( VexArch     arch_host,
11827d6f81de12e6d8deb3e119ab318f361d97a10a65florian                             VexEndness  endness_host,
11837d6f81de12e6d8deb3e119ab318f361d97a10a65florian                             void*       place_to_chain,
11847d6f81de12e6d8deb3e119ab318f361d97a10a65florian                             const void* disp_cp_chain_me_EXPECTED,
11857d6f81de12e6d8deb3e119ab318f361d97a10a65florian                             const void* place_to_jump_to )
1186c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj{
1187c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj   switch (arch_host) {
1188c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj      case VexArchX86:
118912b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe         X86ST(return chainXDirect_X86(endness_host,
119012b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe                                       place_to_chain,
119112b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe                                       disp_cp_chain_me_EXPECTED,
119212b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe                                       place_to_jump_to));
1193c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj      case VexArchAMD64:
119412b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe         AMD64ST(return chainXDirect_AMD64(endness_host,
119512b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe                                           place_to_chain,
119612b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe                                           disp_cp_chain_me_EXPECTED,
119712b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe                                           place_to_jump_to));
1198c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj      case VexArchARM:
119912b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe         ARMST(return chainXDirect_ARM(endness_host,
120012b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe                                       place_to_chain,
120112b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe                                       disp_cp_chain_me_EXPECTED,
120212b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe                                       place_to_jump_to));
1203bbcf188f6ae64a44fb31414eb9e1a738b4befcc0sewardj      case VexArchARM64:
120412b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe         ARM64ST(return chainXDirect_ARM64(endness_host,
120512b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe                                           place_to_chain,
120612b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe                                           disp_cp_chain_me_EXPECTED,
120712b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe                                           place_to_jump_to));
12088844a6329d275814456e3a2a5a7bffac75da0957florian      case VexArchS390X:
120912b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe         S390ST(return chainXDirect_S390(endness_host,
121012b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe                                         place_to_chain,
121112b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe                                         disp_cp_chain_me_EXPECTED,
121212b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe                                         place_to_jump_to));
12133dee849ec7c38746749065e67dc53b75daa7617dsewardj      case VexArchPPC32:
121412b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe         PPC32ST(return chainXDirect_PPC(endness_host,
121512b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe                                         place_to_chain,
121612b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe                                         disp_cp_chain_me_EXPECTED,
121712b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe                                         place_to_jump_to, False/*!mode64*/));
1218f252de5ec83a5cc72f96fe4decf662cfbb28df8bsewardj      case VexArchPPC64:
121912b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe         PPC64ST(return chainXDirect_PPC(endness_host,
122012b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe                                         place_to_chain,
122112b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe                                         disp_cp_chain_me_EXPECTED,
122212b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe                                         place_to_jump_to, True/*mode64*/));
1223d0e5fe765fb79e5495206f8d0969133178b871f2sewardj      case VexArchMIPS32:
122412b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe         MIPS32ST(return chainXDirect_MIPS(endness_host,
122512b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe                                           place_to_chain,
122612b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe                                           disp_cp_chain_me_EXPECTED,
122712b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe                                           place_to_jump_to, False/*!mode64*/));
1228b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj      case VexArchMIPS64:
122912b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe         MIPS64ST(return chainXDirect_MIPS(endness_host,
123012b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe                                           place_to_chain,
123112b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe                                           disp_cp_chain_me_EXPECTED,
123212b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe                                           place_to_jump_to, True/*!mode64*/));
1233c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj      default:
1234c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj         vassert(0);
1235c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj   }
1236c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj}
1237c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj
12387d6f81de12e6d8deb3e119ab318f361d97a10a65florianVexInvalRange LibVEX_UnChain ( VexArch     arch_host,
12397d6f81de12e6d8deb3e119ab318f361d97a10a65florian                               VexEndness  endness_host,
12407d6f81de12e6d8deb3e119ab318f361d97a10a65florian                               void*       place_to_unchain,
12417d6f81de12e6d8deb3e119ab318f361d97a10a65florian                               const void* place_to_jump_to_EXPECTED,
12427d6f81de12e6d8deb3e119ab318f361d97a10a65florian                               const void* disp_cp_chain_me )
1243c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj{
1244c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj   switch (arch_host) {
1245c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj      case VexArchX86:
124612b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe         X86ST(return unchainXDirect_X86(endness_host,
124712b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe                                         place_to_unchain,
124812b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe                                         place_to_jump_to_EXPECTED,
124912b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe                                         disp_cp_chain_me));
1250c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj      case VexArchAMD64:
125112b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe         AMD64ST(return unchainXDirect_AMD64(endness_host,
125212b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe                                             place_to_unchain,
125312b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe                                             place_to_jump_to_EXPECTED,
125412b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe                                             disp_cp_chain_me));
1255c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj      case VexArchARM:
125612b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe         ARMST(return unchainXDirect_ARM(endness_host,
125712b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe                                         place_to_unchain,
125812b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe                                         place_to_jump_to_EXPECTED,
125912b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe                                         disp_cp_chain_me));
1260c6acaa420e6f1c60e1d46f52c1e9b79c0490ce09sewardj      case VexArchARM64:
126112b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe         ARM64ST(return unchainXDirect_ARM64(endness_host,
126212b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe                                             place_to_unchain,
126312b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe                                             place_to_jump_to_EXPECTED,
126412b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe                                             disp_cp_chain_me));
12658844a6329d275814456e3a2a5a7bffac75da0957florian      case VexArchS390X:
126612b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe         S390ST(return unchainXDirect_S390(endness_host,
126712b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe                                           place_to_unchain,
126812b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe                                           place_to_jump_to_EXPECTED,
126912b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe                                           disp_cp_chain_me));
12703dee849ec7c38746749065e67dc53b75daa7617dsewardj      case VexArchPPC32:
127112b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe         PPC32ST(return unchainXDirect_PPC(endness_host,
127212b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe                                           place_to_unchain,
127312b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe                                           place_to_jump_to_EXPECTED,
127412b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe                                           disp_cp_chain_me, False/*!mode64*/));
1275f252de5ec83a5cc72f96fe4decf662cfbb28df8bsewardj      case VexArchPPC64:
127612b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe         PPC64ST(return unchainXDirect_PPC(endness_host,
127712b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe                                           place_to_unchain,
127812b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe                                           place_to_jump_to_EXPECTED,
127912b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe                                           disp_cp_chain_me, True/*mode64*/));
1280d0e5fe765fb79e5495206f8d0969133178b871f2sewardj      case VexArchMIPS32:
128112b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe         MIPS32ST(return unchainXDirect_MIPS(endness_host,
128212b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe                                             place_to_unchain,
128312b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe                                             place_to_jump_to_EXPECTED,
128412b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe                                             disp_cp_chain_me, False/*!mode64*/));
1285b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj      case VexArchMIPS64:
128612b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe         MIPS64ST(return unchainXDirect_MIPS(endness_host,
128712b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe                                             place_to_unchain,
128812b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe                                             place_to_jump_to_EXPECTED,
128912b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe                                             disp_cp_chain_me, True/*!mode64*/));
1290c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj      default:
1291c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj         vassert(0);
1292c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj   }
1293c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj}
1294c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj
12957ce2cc883c5b36586babec833838951ecf9f2a76florianInt LibVEX_evCheckSzB ( VexArch    arch_host )
1296c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj{
1297c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj   static Int cached = 0; /* DO NOT MAKE NON-STATIC */
1298c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj   if (UNLIKELY(cached == 0)) {
1299c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj      switch (arch_host) {
1300c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj         case VexArchX86:
130112b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe            X86ST(cached = evCheckSzB_X86()); break;
1302c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj         case VexArchAMD64:
130312b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe            AMD64ST(cached = evCheckSzB_AMD64()); break;
1304c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj         case VexArchARM:
130512b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe            ARMST(cached = evCheckSzB_ARM()); break;
1306bbcf188f6ae64a44fb31414eb9e1a738b4befcc0sewardj         case VexArchARM64:
130712b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe            ARM64ST(cached = evCheckSzB_ARM64()); break;
13088844a6329d275814456e3a2a5a7bffac75da0957florian         case VexArchS390X:
130912b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe            S390ST(cached = evCheckSzB_S390()); break;
13103dee849ec7c38746749065e67dc53b75daa7617dsewardj         case VexArchPPC32:
131112b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe            PPC32ST(cached = evCheckSzB_PPC()); break;
1312f252de5ec83a5cc72f96fe4decf662cfbb28df8bsewardj         case VexArchPPC64:
131312b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe            PPC64ST(cached = evCheckSzB_PPC()); break;
1314d0e5fe765fb79e5495206f8d0969133178b871f2sewardj         case VexArchMIPS32:
131512b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe            MIPS32ST(cached = evCheckSzB_MIPS()); break;
1316b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj         case VexArchMIPS64:
131712b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe            MIPS64ST(cached = evCheckSzB_MIPS()); break;
1318c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj         default:
1319c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj            vassert(0);
1320c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj      }
1321c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj   }
1322c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj   return cached;
1323c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj}
1324c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj
13259b76916dcc1628e133d57db001563429c6e3a590sewardjVexInvalRange LibVEX_PatchProfInc ( VexArch    arch_host,
13269b76916dcc1628e133d57db001563429c6e3a590sewardj                                    VexEndness endness_host,
13279b76916dcc1628e133d57db001563429c6e3a590sewardj                                    void*      place_to_patch,
13287d6f81de12e6d8deb3e119ab318f361d97a10a65florian                                    const ULong* location_of_counter )
1329c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj{
1330c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj   switch (arch_host) {
1331c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj      case VexArchX86:
133212b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe         X86ST(return patchProfInc_X86(endness_host, place_to_patch,
133312b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe                                       location_of_counter));
1334c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj      case VexArchAMD64:
133512b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe         AMD64ST(return patchProfInc_AMD64(endness_host, place_to_patch,
133612b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe                                           location_of_counter));
1337c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj      case VexArchARM:
133812b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe         ARMST(return patchProfInc_ARM(endness_host, place_to_patch,
133912b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe                                       location_of_counter));
13400ad37a9e5936c15460f067bee8948b900cdab036sewardj      case VexArchARM64:
134112b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe         ARM64ST(return patchProfInc_ARM64(endness_host, place_to_patch,
134212b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe                                           location_of_counter));
13438844a6329d275814456e3a2a5a7bffac75da0957florian      case VexArchS390X:
134412b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe         S390ST(return patchProfInc_S390(endness_host, place_to_patch,
134512b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe                                         location_of_counter));
13463dee849ec7c38746749065e67dc53b75daa7617dsewardj      case VexArchPPC32:
134712b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe         PPC32ST(return patchProfInc_PPC(endness_host, place_to_patch,
134812b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe                                         location_of_counter, False/*!mode64*/));
1349f252de5ec83a5cc72f96fe4decf662cfbb28df8bsewardj      case VexArchPPC64:
135012b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe         PPC64ST(return patchProfInc_PPC(endness_host, place_to_patch,
135112b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe                                         location_of_counter, True/*mode64*/));
1352d0e5fe765fb79e5495206f8d0969133178b871f2sewardj      case VexArchMIPS32:
135312b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe         MIPS32ST(return patchProfInc_MIPS(endness_host, place_to_patch,
135412b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe                                           location_of_counter, False/*!mode64*/));
1355b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj      case VexArchMIPS64:
135612b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe         MIPS64ST(return patchProfInc_MIPS(endness_host, place_to_patch,
135712b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe                                           location_of_counter, True/*!mode64*/));
1358c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj      default:
1359c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj         vassert(0);
1360c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj   }
1361c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj}
1362c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj
1363c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj
1364893aadad7f29f7801ce26cb7575c16e90bd3767fsewardj/* --------- Emulation warnings. --------- */
1365893aadad7f29f7801ce26cb7575c16e90bd3767fsewardj
13661ff4756e1731485e6bf3cd96717cd8398daec1f2florianconst HChar* LibVEX_EmNote_string ( VexEmNote ew )
1367893aadad7f29f7801ce26cb7575c16e90bd3767fsewardj{
1368893aadad7f29f7801ce26cb7575c16e90bd3767fsewardj   switch (ew) {
13696ef84bed9bb3af22060eb1759788034602bbcc88florian     case EmNote_NONE:
1370893aadad7f29f7801ce26cb7575c16e90bd3767fsewardj        return "none";
1371893aadad7f29f7801ce26cb7575c16e90bd3767fsewardj     case EmWarn_X86_x87exns:
1372893aadad7f29f7801ce26cb7575c16e90bd3767fsewardj        return "Unmasking x87 FP exceptions";
1373893aadad7f29f7801ce26cb7575c16e90bd3767fsewardj     case EmWarn_X86_x87precision:
1374893aadad7f29f7801ce26cb7575c16e90bd3767fsewardj        return "Selection of non-80-bit x87 FP precision";
1375893aadad7f29f7801ce26cb7575c16e90bd3767fsewardj     case EmWarn_X86_sseExns:
13765edfc26d72ca8ebea2aa0443a1ed4dd218343d04sewardj        return "Unmasking SSE FP exceptions";
13775edfc26d72ca8ebea2aa0443a1ed4dd218343d04sewardj     case EmWarn_X86_fz:
13785edfc26d72ca8ebea2aa0443a1ed4dd218343d04sewardj        return "Setting %mxcsr.fz (SSE flush-underflows-to-zero mode)";
13795edfc26d72ca8ebea2aa0443a1ed4dd218343d04sewardj     case EmWarn_X86_daz:
13805edfc26d72ca8ebea2aa0443a1ed4dd218343d04sewardj        return "Setting %mxcsr.daz (SSE treat-denormals-as-zero mode)";
13816d26984a0df6a7d20b658bac6edf869eb872cca3sewardj     case EmWarn_X86_acFlag:
13826d26984a0df6a7d20b658bac6edf869eb872cca3sewardj        return "Setting %eflags.ac (setting noted but ignored)";
13839dd9cf1cb0b6915fc2f7dff642455ca41e162649sewardj     case EmWarn_PPCexns:
13849dd9cf1cb0b6915fc2f7dff642455ca41e162649sewardj        return "Unmasking PPC32/64 FP exceptions";
13859dd9cf1cb0b6915fc2f7dff642455ca41e162649sewardj     case EmWarn_PPC64_redir_overflow:
13869dd9cf1cb0b6915fc2f7dff642455ca41e162649sewardj        return "PPC64 function redirection stack overflow";
13879dd9cf1cb0b6915fc2f7dff642455ca41e162649sewardj     case EmWarn_PPC64_redir_underflow:
13889dd9cf1cb0b6915fc2f7dff642455ca41e162649sewardj        return "PPC64 function redirection stack underflow";
13894b8efad55c1c7f9941b605b2f171b71a094c1f33florian     case EmWarn_S390X_fpext_rounding:
13904b8efad55c1c7f9941b605b2f171b71a094c1f33florian        return "The specified rounding mode cannot be supported. That\n"
13912a4de0bb56f33835bab59c0e483acc8410baed98florian               "  feature requires the floating point extension facility\n"
13924b8efad55c1c7f9941b605b2f171b71a094c1f33florian               "  which is not available on this host. Continuing using\n"
13934b8efad55c1c7f9941b605b2f171b71a094c1f33florian               "  the rounding mode from FPC. Results may differ!";
1394f0fa1be734f2bcbc20ac638cc61dc149deb8b644florian     case EmWarn_S390X_invalid_rounding:
1395f0fa1be734f2bcbc20ac638cc61dc149deb8b644florian        return "The specified rounding mode is invalid.\n"
1396f0fa1be734f2bcbc20ac638cc61dc149deb8b644florian               "  Continuing using 'round to nearest'. Results may differ!";
1397e75dafa8ecce0a5cc64cf4b91b32b192250894dcflorian     case EmFail_S390X_stfle:
13984e0083ee421db6d2900eaa00dc70c86ee829e28bflorian        return "Instruction stfle is not supported on this host";
1399e75dafa8ecce0a5cc64cf4b91b32b192250894dcflorian     case EmFail_S390X_stckf:
1400c5c669b461e3cbcd89d6bdbb4ecb9bcfd2ad23f5florian        return "Instruction stckf is not supported on this host";
1401e75dafa8ecce0a5cc64cf4b91b32b192250894dcflorian     case EmFail_S390X_ecag:
14028c88cb6ae821021e1e00be18f5a8bea3c557080aflorian        return "Instruction ecag is not supported on this host";
1403ad00ea9f40f930d98bb2d278291a6c4c6636d6d6florian     case EmFail_S390X_pfpo:
1404ad00ea9f40f930d98bb2d278291a6c4c6636d6d6florian        return "Instruction pfpo is not supported on this host";
1405fb5966040a32f9da5be84e63ca23d848f6766faeflorian     case EmFail_S390X_DFP_insn:
1406fb5966040a32f9da5be84e63ca23d848f6766faeflorian        return "DFP instructions are not supported on this host";
1407e75dafa8ecce0a5cc64cf4b91b32b192250894dcflorian     case EmFail_S390X_fpext:
1408e75dafa8ecce0a5cc64cf4b91b32b192250894dcflorian        return "Encountered an instruction that requires the floating "
1409e75dafa8ecce0a5cc64cf4b91b32b192250894dcflorian               "point extension facility.\n"
1410e75dafa8ecce0a5cc64cf4b91b32b192250894dcflorian               "  That facility is not available on this host";
141178d5ef75d89e5aa6c629a2d47f7e04ddbf1253c3florian     case EmFail_S390X_invalid_PFPO_rounding_mode:
14122a4de0bb56f33835bab59c0e483acc8410baed98florian        return "The rounding mode in GPR 0 for the PFPO instruction"
141378d5ef75d89e5aa6c629a2d47f7e04ddbf1253c3florian               " is invalid";
141478d5ef75d89e5aa6c629a2d47f7e04ddbf1253c3florian     case EmFail_S390X_invalid_PFPO_function:
14152a4de0bb56f33835bab59c0e483acc8410baed98florian        return "The function code in GPR 0 for the PFPO instruction"
141678d5ef75d89e5aa6c629a2d47f7e04ddbf1253c3florian               " is invalid";
1417893aadad7f29f7801ce26cb7575c16e90bd3767fsewardj     default:
14186ef84bed9bb3af22060eb1759788034602bbcc88florian        vpanic("LibVEX_EmNote_string: unknown warning");
1419893aadad7f29f7801ce26cb7575c16e90bd3767fsewardj   }
1420893aadad7f29f7801ce26cb7575c16e90bd3767fsewardj}
142135421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj
14225117ce116f47141cb23d1b49cc826e19323add97sewardj/* ------------------ Arch/HwCaps stuff. ------------------ */
1423bef170b7e84713d1e2181b9204d9415d29de3d65sewardj
1424bef170b7e84713d1e2181b9204d9415d29de3d65sewardjconst HChar* LibVEX_ppVexArch ( VexArch arch )
1425bef170b7e84713d1e2181b9204d9415d29de3d65sewardj{
1426bef170b7e84713d1e2181b9204d9415d29de3d65sewardj   switch (arch) {
1427bef170b7e84713d1e2181b9204d9415d29de3d65sewardj      case VexArch_INVALID: return "INVALID";
1428bef170b7e84713d1e2181b9204d9415d29de3d65sewardj      case VexArchX86:      return "X86";
1429bef170b7e84713d1e2181b9204d9415d29de3d65sewardj      case VexArchAMD64:    return "AMD64";
1430bef170b7e84713d1e2181b9204d9415d29de3d65sewardj      case VexArchARM:      return "ARM";
1431bbcf188f6ae64a44fb31414eb9e1a738b4befcc0sewardj      case VexArchARM64:    return "ARM64";
14320ec57c595719a395e71b48792a4d62c5b896b6d3sewardj      case VexArchPPC32:    return "PPC32";
1433f0de28cf1a762b0d6f74c93d3532c89a230673bbcerion      case VexArchPPC64:    return "PPC64";
14342019a976f07ff418dde2dfc7cc74667ef66d7764sewardj      case VexArchS390X:    return "S390X";
1435d0e5fe765fb79e5495206f8d0969133178b871f2sewardj      case VexArchMIPS32:   return "MIPS32";
1436b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj      case VexArchMIPS64:   return "MIPS64";
1437bef170b7e84713d1e2181b9204d9415d29de3d65sewardj      default:              return "VexArch???";
1438bef170b7e84713d1e2181b9204d9415d29de3d65sewardj   }
1439bef170b7e84713d1e2181b9204d9415d29de3d65sewardj}
1440bef170b7e84713d1e2181b9204d9415d29de3d65sewardj
14419b76916dcc1628e133d57db001563429c6e3a590sewardjconst HChar* LibVEX_ppVexEndness ( VexEndness endness )
14429b76916dcc1628e133d57db001563429c6e3a590sewardj{
14439b76916dcc1628e133d57db001563429c6e3a590sewardj   switch (endness) {
14449b76916dcc1628e133d57db001563429c6e3a590sewardj      case VexEndness_INVALID: return "INVALID";
14459b76916dcc1628e133d57db001563429c6e3a590sewardj      case VexEndnessLE:       return "LittleEndian";
14469b76916dcc1628e133d57db001563429c6e3a590sewardj      case VexEndnessBE:       return "BigEndian";
14479b76916dcc1628e133d57db001563429c6e3a590sewardj      default:                 return "VexEndness???";
14489b76916dcc1628e133d57db001563429c6e3a590sewardj   }
14499b76916dcc1628e133d57db001563429c6e3a590sewardj}
14509b76916dcc1628e133d57db001563429c6e3a590sewardj
1451f3652c97c20265d3410ea75d9817e8323b6df5c8florian/* Return a string with the hardware capabilities to the extent as
1452f3652c97c20265d3410ea75d9817e8323b6df5c8florian   they pertain to the translation process. No attempt is made, to
1453f3652c97c20265d3410ea75d9817e8323b6df5c8florian   detect *all* capabilities an architecture may have. */
14545117ce116f47141cb23d1b49cc826e19323add97sewardjconst HChar* LibVEX_ppVexHwCaps ( VexArch arch, UInt hwcaps )
1455bef170b7e84713d1e2181b9204d9415d29de3d65sewardj{
1456f3652c97c20265d3410ea75d9817e8323b6df5c8florian   return show_hwcaps(arch, hwcaps);
1457bef170b7e84713d1e2181b9204d9415d29de3d65sewardj}
1458bef170b7e84713d1e2181b9204d9415d29de3d65sewardj
14595117ce116f47141cb23d1b49cc826e19323add97sewardj
146027e1dd6317760f3222f8a82185fa0e8ba138c85bsewardj/* Write default settings info *vai. */
146127e1dd6317760f3222f8a82185fa0e8ba138c85bsewardjvoid LibVEX_default_VexArchInfo ( /*OUT*/VexArchInfo* vai )
146227e1dd6317760f3222f8a82185fa0e8ba138c85bsewardj{
146365902992da28822e4753594c7b72f7cb177fe3a6sewardj   vex_bzero(vai, sizeof(*vai));
14649b76916dcc1628e133d57db001563429c6e3a590sewardj   vai->hwcaps                  = 0;
14659b76916dcc1628e133d57db001563429c6e3a590sewardj   vai->endness                 = VexEndness_INVALID;
14669b76916dcc1628e133d57db001563429c6e3a590sewardj   vai->ppc_icache_line_szB     = 0;
14679b76916dcc1628e133d57db001563429c6e3a590sewardj   vai->ppc_dcbz_szB            = 0;
14689b76916dcc1628e133d57db001563429c6e3a590sewardj   vai->ppc_dcbzl_szB           = 0;
146965902992da28822e4753594c7b72f7cb177fe3a6sewardj   vai->arm64_dMinLine_lg2_szB  = 0;
147065902992da28822e4753594c7b72f7cb177fe3a6sewardj   vai->arm64_iMinLine_lg2_szB  = 0;
1471ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes   vai->arm64_requires_fallback_LLSC = False;
1472f192a391bc556ff6e074ec055df5b883895e5b52florian   vai->hwcache_info.num_levels = 0;
1473f192a391bc556ff6e074ec055df5b883895e5b52florian   vai->hwcache_info.num_caches = 0;
147465902992da28822e4753594c7b72f7cb177fe3a6sewardj   vai->hwcache_info.caches     = NULL;
1475f192a391bc556ff6e074ec055df5b883895e5b52florian   vai->hwcache_info.icaches_maintain_coherence = True;  // whatever
147627e1dd6317760f3222f8a82185fa0e8ba138c85bsewardj}
147727e1dd6317760f3222f8a82185fa0e8ba138c85bsewardj
1478dd40fdf58cc8a6fe9466c4f00bdfc9fe9bf00449sewardj/* Write default settings info *vbi. */
1479dd40fdf58cc8a6fe9466c4f00bdfc9fe9bf00449sewardjvoid LibVEX_default_VexAbiInfo ( /*OUT*/VexAbiInfo* vbi )
1480aca070a5b3418a6a9b01e3c57a7eb0fbb5050908sewardj{
148165902992da28822e4753594c7b72f7cb177fe3a6sewardj   vex_bzero(vbi, sizeof(*vbi));
1482dd40fdf58cc8a6fe9466c4f00bdfc9fe9bf00449sewardj   vbi->guest_stack_redzone_size       = 0;
1483e2cc4defff3eec3be8e38ccc21df5ee460f930e9philippe   vbi->guest_amd64_assume_fs_is_const = False;
1484e2cc4defff3eec3be8e38ccc21df5ee460f930e9philippe   vbi->guest_amd64_assume_gs_is_const = False;
1485dd40fdf58cc8a6fe9466c4f00bdfc9fe9bf00449sewardj   vbi->guest_ppc_zap_RZ_at_blr        = False;
1486dd40fdf58cc8a6fe9466c4f00bdfc9fe9bf00449sewardj   vbi->guest_ppc_zap_RZ_at_bl         = NULL;
1487ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes   vbi->guest__use_fallback_LLSC       = False;
1488dd40fdf58cc8a6fe9466c4f00bdfc9fe9bf00449sewardj   vbi->host_ppc_calls_use_fndescrs    = False;
1489aca070a5b3418a6a9b01e3c57a7eb0fbb5050908sewardj}
1490aca070a5b3418a6a9b01e3c57a7eb0fbb5050908sewardj
149127e1dd6317760f3222f8a82185fa0e8ba138c85bsewardj
1492ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughesstatic IRType arch_word_size (VexArch arch) {
1493ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes   switch (arch) {
1494ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes      case VexArchX86:
1495ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes      case VexArchARM:
1496ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes      case VexArchMIPS32:
1497ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes      case VexArchPPC32:
1498ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes         return Ity_I32;
1499ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes
1500ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes      case VexArchAMD64:
1501ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes      case VexArchARM64:
1502ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes      case VexArchMIPS64:
1503ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes      case VexArchPPC64:
1504ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes      case VexArchS390X:
1505ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes         return Ity_I64;
1506ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes
1507ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes      default:
1508ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes         vex_printf("Fatal: unknown arch in arch_word_size\n");
1509ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes         vassert(0);
1510ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes   }
1511ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes}
1512ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes
1513ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes
1514f3652c97c20265d3410ea75d9817e8323b6df5c8florian/* Convenience macro to be used in show_hwcaps_ARCH functions */
1515f3652c97c20265d3410ea75d9817e8323b6df5c8florian#define NUM_HWCAPS (sizeof hwcaps_list / sizeof hwcaps_list[0])
1516f3652c97c20265d3410ea75d9817e8323b6df5c8florian
15175117ce116f47141cb23d1b49cc826e19323add97sewardj/* Return a string showing the hwcaps in a nice way.  The string will
1518f3652c97c20265d3410ea75d9817e8323b6df5c8florian   be NULL for unrecognised hardware capabilities. */
15195117ce116f47141cb23d1b49cc826e19323add97sewardj
152055085f8680acc89d727e321f3b34cae1a8c4093aflorianstatic const HChar* show_hwcaps_x86 ( UInt hwcaps )
15215117ce116f47141cb23d1b49cc826e19323add97sewardj{
1522f3652c97c20265d3410ea75d9817e8323b6df5c8florian   static const HChar prefix[] = "x86";
1523f3652c97c20265d3410ea75d9817e8323b6df5c8florian   static const struct {
1524f3652c97c20265d3410ea75d9817e8323b6df5c8florian      UInt  hwcaps_bit;
1525f3652c97c20265d3410ea75d9817e8323b6df5c8florian      HChar name[7];
1526f3652c97c20265d3410ea75d9817e8323b6df5c8florian   } hwcaps_list[] = {
1527f3652c97c20265d3410ea75d9817e8323b6df5c8florian      { VEX_HWCAPS_X86_MMXEXT, "mmxext" },
1528f3652c97c20265d3410ea75d9817e8323b6df5c8florian      { VEX_HWCAPS_X86_SSE1,   "sse1"   },
1529f3652c97c20265d3410ea75d9817e8323b6df5c8florian      { VEX_HWCAPS_X86_SSE2,   "sse2"   },
1530f3652c97c20265d3410ea75d9817e8323b6df5c8florian      { VEX_HWCAPS_X86_SSE3,   "sse3"   },
1531f3652c97c20265d3410ea75d9817e8323b6df5c8florian      { VEX_HWCAPS_X86_LZCNT,  "lzcnt"  },
1532f3652c97c20265d3410ea75d9817e8323b6df5c8florian   };
1533f3652c97c20265d3410ea75d9817e8323b6df5c8florian   /* Allocate a large enough buffer */
1534f3652c97c20265d3410ea75d9817e8323b6df5c8florian   static HChar buf[sizeof prefix +
1535f3652c97c20265d3410ea75d9817e8323b6df5c8florian                    NUM_HWCAPS * (sizeof hwcaps_list[0].name + 1) + 1]; // '\0'
1536f3652c97c20265d3410ea75d9817e8323b6df5c8florian   if (buf[0] != '\0') return buf;  /* already constructed */
1537f3652c97c20265d3410ea75d9817e8323b6df5c8florian
1538f3652c97c20265d3410ea75d9817e8323b6df5c8florian   HChar *p = buf + vex_sprintf(buf, "%s", prefix);
1539f3652c97c20265d3410ea75d9817e8323b6df5c8florian
1540f3652c97c20265d3410ea75d9817e8323b6df5c8florian   if (hwcaps == 0) {
1541f3652c97c20265d3410ea75d9817e8323b6df5c8florian      vex_sprintf(p, "-%s", "sse0");
1542f3652c97c20265d3410ea75d9817e8323b6df5c8florian   } else {
1543f3652c97c20265d3410ea75d9817e8323b6df5c8florian      UInt i;
1544f3652c97c20265d3410ea75d9817e8323b6df5c8florian      for (i = 0 ; i < NUM_HWCAPS; ++i) {
1545f3652c97c20265d3410ea75d9817e8323b6df5c8florian         if (hwcaps & hwcaps_list[i].hwcaps_bit)
1546f3652c97c20265d3410ea75d9817e8323b6df5c8florian            p = p + vex_sprintf(p, "-%s", hwcaps_list[i].name);
1547f3652c97c20265d3410ea75d9817e8323b6df5c8florian      }
1548536fbabcc3770f42bb7370efd75e8e30e9a841c8sewardj   }
1549f3652c97c20265d3410ea75d9817e8323b6df5c8florian   return buf;
15505117ce116f47141cb23d1b49cc826e19323add97sewardj}
15515117ce116f47141cb23d1b49cc826e19323add97sewardj
155255085f8680acc89d727e321f3b34cae1a8c4093aflorianstatic const HChar* show_hwcaps_amd64 ( UInt hwcaps )
15535117ce116f47141cb23d1b49cc826e19323add97sewardj{
1554f3652c97c20265d3410ea75d9817e8323b6df5c8florian   static const HChar prefix[] = "amd64";
1555f3652c97c20265d3410ea75d9817e8323b6df5c8florian   static const struct {
1556f3652c97c20265d3410ea75d9817e8323b6df5c8florian      UInt  hwcaps_bit;
1557f3652c97c20265d3410ea75d9817e8323b6df5c8florian      HChar name[7];
1558f3652c97c20265d3410ea75d9817e8323b6df5c8florian   } hwcaps_list[] = {
1559f3652c97c20265d3410ea75d9817e8323b6df5c8florian      { VEX_HWCAPS_AMD64_CX16,   "cx16"   },
1560f3652c97c20265d3410ea75d9817e8323b6df5c8florian      { VEX_HWCAPS_AMD64_LZCNT,  "lzcnt"  },
1561f3652c97c20265d3410ea75d9817e8323b6df5c8florian      { VEX_HWCAPS_AMD64_RDTSCP, "rdtscp" },
1562f3652c97c20265d3410ea75d9817e8323b6df5c8florian      { VEX_HWCAPS_AMD64_SSE3,   "sse3"   },
1563f3652c97c20265d3410ea75d9817e8323b6df5c8florian      { VEX_HWCAPS_AMD64_AVX,    "avx"    },
1564f3652c97c20265d3410ea75d9817e8323b6df5c8florian      { VEX_HWCAPS_AMD64_AVX2,   "avx2"   },
1565f3652c97c20265d3410ea75d9817e8323b6df5c8florian      { VEX_HWCAPS_AMD64_BMI,    "bmi"    },
1566f3652c97c20265d3410ea75d9817e8323b6df5c8florian   };
1567f3652c97c20265d3410ea75d9817e8323b6df5c8florian   /* Allocate a large enough buffer */
1568f3652c97c20265d3410ea75d9817e8323b6df5c8florian   static HChar buf[sizeof prefix +
1569f3652c97c20265d3410ea75d9817e8323b6df5c8florian                    NUM_HWCAPS * (sizeof hwcaps_list[0].name + 1) + 1]; // '\0'
1570f3652c97c20265d3410ea75d9817e8323b6df5c8florian   if (buf[0] != '\0') return buf;  /* already constructed */
1571f3652c97c20265d3410ea75d9817e8323b6df5c8florian
1572f3652c97c20265d3410ea75d9817e8323b6df5c8florian   HChar *p = buf + vex_sprintf(buf, "%s", prefix);
1573f3652c97c20265d3410ea75d9817e8323b6df5c8florian
1574818c730f624828ef2d5532e32e952924094b699esewardj   if (hwcaps == 0) {
1575f3652c97c20265d3410ea75d9817e8323b6df5c8florian      vex_sprintf(p, "-%s", "sse2");
1576f3652c97c20265d3410ea75d9817e8323b6df5c8florian   } else {
1577f3652c97c20265d3410ea75d9817e8323b6df5c8florian      UInt i;
1578f3652c97c20265d3410ea75d9817e8323b6df5c8florian      for (i = 0 ; i < NUM_HWCAPS; ++i) {
1579f3652c97c20265d3410ea75d9817e8323b6df5c8florian         if (hwcaps & hwcaps_list[i].hwcaps_bit)
1580f3652c97c20265d3410ea75d9817e8323b6df5c8florian            p = p + vex_sprintf(p, "-%s", hwcaps_list[i].name);
1581f3652c97c20265d3410ea75d9817e8323b6df5c8florian      }
1582cc3d219c3120150c9ab67f1f4850be0f39a9499csewardj   }
1583818c730f624828ef2d5532e32e952924094b699esewardj   return buf;
15845117ce116f47141cb23d1b49cc826e19323add97sewardj}
15855117ce116f47141cb23d1b49cc826e19323add97sewardj
158655085f8680acc89d727e321f3b34cae1a8c4093aflorianstatic const HChar* show_hwcaps_ppc32 ( UInt hwcaps )
15875117ce116f47141cb23d1b49cc826e19323add97sewardj{
1588f3652c97c20265d3410ea75d9817e8323b6df5c8florian   static const HChar prefix[] = "ppc32-int";
1589f3652c97c20265d3410ea75d9817e8323b6df5c8florian   static const struct {
1590f3652c97c20265d3410ea75d9817e8323b6df5c8florian      UInt  hwcaps_bit;
1591f3652c97c20265d3410ea75d9817e8323b6df5c8florian      HChar name[8];
1592f3652c97c20265d3410ea75d9817e8323b6df5c8florian   } hwcaps_list[] = {
1593f3652c97c20265d3410ea75d9817e8323b6df5c8florian      { VEX_HWCAPS_PPC32_F,       "flt"     },
1594f3652c97c20265d3410ea75d9817e8323b6df5c8florian      { VEX_HWCAPS_PPC32_V,       "vmx"     },
1595f3652c97c20265d3410ea75d9817e8323b6df5c8florian      { VEX_HWCAPS_PPC32_FX,      "FX"      },
1596f3652c97c20265d3410ea75d9817e8323b6df5c8florian      { VEX_HWCAPS_PPC32_GX,      "GX"      },
1597f3652c97c20265d3410ea75d9817e8323b6df5c8florian      { VEX_HWCAPS_PPC32_VX,      "VX"      },
1598f3652c97c20265d3410ea75d9817e8323b6df5c8florian      { VEX_HWCAPS_PPC32_DFP,     "DFP"     },
1599f3652c97c20265d3410ea75d9817e8323b6df5c8florian      { VEX_HWCAPS_PPC32_ISA2_07, "ISA2_07" },
1600a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes      { VEX_HWCAPS_PPC32_ISA3_0,  "ISA3_0"  },
1601f3652c97c20265d3410ea75d9817e8323b6df5c8florian   };
1602f3652c97c20265d3410ea75d9817e8323b6df5c8florian   /* Allocate a large enough buffer */
1603f3652c97c20265d3410ea75d9817e8323b6df5c8florian   static HChar buf[sizeof prefix +
1604f3652c97c20265d3410ea75d9817e8323b6df5c8florian                    NUM_HWCAPS * (sizeof hwcaps_list[0].name + 1) + 1]; // '\0'
1605f3652c97c20265d3410ea75d9817e8323b6df5c8florian   if (buf[0] != '\0') return buf;  /* already constructed */
1606f3652c97c20265d3410ea75d9817e8323b6df5c8florian
1607f3652c97c20265d3410ea75d9817e8323b6df5c8florian   HChar *p = buf + vex_sprintf(buf, "%s", prefix);
1608f3652c97c20265d3410ea75d9817e8323b6df5c8florian
1609f3652c97c20265d3410ea75d9817e8323b6df5c8florian   if (hwcaps == 0) return buf;
1610f3652c97c20265d3410ea75d9817e8323b6df5c8florian
1611f3652c97c20265d3410ea75d9817e8323b6df5c8florian   UInt i;
1612f3652c97c20265d3410ea75d9817e8323b6df5c8florian   for (i = 0 ; i < NUM_HWCAPS; ++i) {
1613f3652c97c20265d3410ea75d9817e8323b6df5c8florian      if (hwcaps & hwcaps_list[i].hwcaps_bit)
1614f3652c97c20265d3410ea75d9817e8323b6df5c8florian         p = p + vex_sprintf(p, "-%s", hwcaps_list[i].name);
1615f3652c97c20265d3410ea75d9817e8323b6df5c8florian   }
1616f3652c97c20265d3410ea75d9817e8323b6df5c8florian   return buf;
16175117ce116f47141cb23d1b49cc826e19323add97sewardj}
16185117ce116f47141cb23d1b49cc826e19323add97sewardj
161955085f8680acc89d727e321f3b34cae1a8c4093aflorianstatic const HChar* show_hwcaps_ppc64 ( UInt hwcaps )
16205117ce116f47141cb23d1b49cc826e19323add97sewardj{
1621f3652c97c20265d3410ea75d9817e8323b6df5c8florian   static const HChar prefix[] = "ppc64-int-flt";
1622f3652c97c20265d3410ea75d9817e8323b6df5c8florian   static const struct {
1623f3652c97c20265d3410ea75d9817e8323b6df5c8florian      UInt  hwcaps_bit;
1624f3652c97c20265d3410ea75d9817e8323b6df5c8florian      HChar name[8];
1625f3652c97c20265d3410ea75d9817e8323b6df5c8florian   } hwcaps_list[] = {
1626f3652c97c20265d3410ea75d9817e8323b6df5c8florian      { VEX_HWCAPS_PPC64_FX,      "FX"      },
1627f3652c97c20265d3410ea75d9817e8323b6df5c8florian      { VEX_HWCAPS_PPC64_GX,      "GX"      },
1628f3652c97c20265d3410ea75d9817e8323b6df5c8florian      { VEX_HWCAPS_PPC64_V,       "vmx"     },
1629f3652c97c20265d3410ea75d9817e8323b6df5c8florian      { VEX_HWCAPS_PPC64_DFP,     "DFP"     },
1630f3652c97c20265d3410ea75d9817e8323b6df5c8florian      { VEX_HWCAPS_PPC64_ISA2_07, "ISA2_07" },
1631a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes      { VEX_HWCAPS_PPC64_ISA3_0,  "ISA3_0"  },
1632f3652c97c20265d3410ea75d9817e8323b6df5c8florian   };
1633f3652c97c20265d3410ea75d9817e8323b6df5c8florian   /* Allocate a large enough buffer */
1634f3652c97c20265d3410ea75d9817e8323b6df5c8florian   static HChar buf[sizeof prefix +
1635f3652c97c20265d3410ea75d9817e8323b6df5c8florian                    NUM_HWCAPS * (sizeof hwcaps_list[0].name + 1) + 1]; // '\0'
1636f3652c97c20265d3410ea75d9817e8323b6df5c8florian   if (buf[0] != '\0') return buf;  /* already constructed */
1637f3652c97c20265d3410ea75d9817e8323b6df5c8florian
1638f3652c97c20265d3410ea75d9817e8323b6df5c8florian   HChar *p = buf + vex_sprintf(buf, "%s", prefix);
1639f3652c97c20265d3410ea75d9817e8323b6df5c8florian
1640f3652c97c20265d3410ea75d9817e8323b6df5c8florian   if (hwcaps == 0) return buf;
1641f3652c97c20265d3410ea75d9817e8323b6df5c8florian
1642f3652c97c20265d3410ea75d9817e8323b6df5c8florian   UInt i;
1643f3652c97c20265d3410ea75d9817e8323b6df5c8florian   for (i = 0 ; i < NUM_HWCAPS; ++i) {
1644f3652c97c20265d3410ea75d9817e8323b6df5c8florian      if (hwcaps & hwcaps_list[i].hwcaps_bit)
1645f3652c97c20265d3410ea75d9817e8323b6df5c8florian         p = p + vex_sprintf(p, "-%s", hwcaps_list[i].name);
1646f3652c97c20265d3410ea75d9817e8323b6df5c8florian   }
1647f3652c97c20265d3410ea75d9817e8323b6df5c8florian   return buf;
16485117ce116f47141cb23d1b49cc826e19323add97sewardj}
16495117ce116f47141cb23d1b49cc826e19323add97sewardj
165055085f8680acc89d727e321f3b34cae1a8c4093aflorianstatic const HChar* show_hwcaps_arm ( UInt hwcaps )
16515117ce116f47141cb23d1b49cc826e19323add97sewardj{
1652f3652c97c20265d3410ea75d9817e8323b6df5c8florian   static const HChar prefix[] = "ARM";
1653f3652c97c20265d3410ea75d9817e8323b6df5c8florian   static const struct {
1654f3652c97c20265d3410ea75d9817e8323b6df5c8florian      UInt  hwcaps_bit;
1655f3652c97c20265d3410ea75d9817e8323b6df5c8florian      HChar name[6];
1656f3652c97c20265d3410ea75d9817e8323b6df5c8florian   } hwcaps_list[] = {
1657f3652c97c20265d3410ea75d9817e8323b6df5c8florian      { VEX_HWCAPS_ARM_NEON, "neon" },
1658f3652c97c20265d3410ea75d9817e8323b6df5c8florian      { VEX_HWCAPS_ARM_VFP | VEX_HWCAPS_ARM_VFP2 | VEX_HWCAPS_ARM_VFP3, "vfp" },
1659f3652c97c20265d3410ea75d9817e8323b6df5c8florian   };
1660f3652c97c20265d3410ea75d9817e8323b6df5c8florian   /* Allocate a large enough buffer */
1661f3652c97c20265d3410ea75d9817e8323b6df5c8florian   static HChar buf[sizeof prefix + 12 +    // level
1662f3652c97c20265d3410ea75d9817e8323b6df5c8florian                    NUM_HWCAPS * (sizeof hwcaps_list[0].name + 1) + 1]; // '\0'
1663f3652c97c20265d3410ea75d9817e8323b6df5c8florian   if (buf[0] != '\0') return buf;  /* already constructed */
1664f3652c97c20265d3410ea75d9817e8323b6df5c8florian
1665f3652c97c20265d3410ea75d9817e8323b6df5c8florian   HChar *p;
1666f3652c97c20265d3410ea75d9817e8323b6df5c8florian   UInt i, level;
1667f3652c97c20265d3410ea75d9817e8323b6df5c8florian
1668f3652c97c20265d3410ea75d9817e8323b6df5c8florian   level = VEX_ARM_ARCHLEVEL(hwcaps);
1669f3652c97c20265d3410ea75d9817e8323b6df5c8florian
1670f3652c97c20265d3410ea75d9817e8323b6df5c8florian   p = buf + vex_sprintf(buf, "%sv%u", prefix, level);
1671f3652c97c20265d3410ea75d9817e8323b6df5c8florian   for (i = 0 ; i < NUM_HWCAPS; ++i) {
1672f3652c97c20265d3410ea75d9817e8323b6df5c8florian      if (hwcaps & hwcaps_list[i].hwcaps_bit)
1673f3652c97c20265d3410ea75d9817e8323b6df5c8florian         p = p + vex_sprintf(p, "-%s", hwcaps_list[i].name);
1674ec0d9a028955060c5216341c6fc37400ec0cb4besewardj   }
1675f3652c97c20265d3410ea75d9817e8323b6df5c8florian   return buf;
16765117ce116f47141cb23d1b49cc826e19323add97sewardj}
16775117ce116f47141cb23d1b49cc826e19323add97sewardj
1678bbcf188f6ae64a44fb31414eb9e1a738b4befcc0sewardjstatic const HChar* show_hwcaps_arm64 ( UInt hwcaps )
1679bbcf188f6ae64a44fb31414eb9e1a738b4befcc0sewardj{
1680bbcf188f6ae64a44fb31414eb9e1a738b4befcc0sewardj   /* Since there are no variants, just insist that hwcaps is zero,
1681bbcf188f6ae64a44fb31414eb9e1a738b4befcc0sewardj      and declare it invalid otherwise. */
1682bbcf188f6ae64a44fb31414eb9e1a738b4befcc0sewardj  if (hwcaps == 0)
1683bbcf188f6ae64a44fb31414eb9e1a738b4befcc0sewardj     return "baseline";
1684f3652c97c20265d3410ea75d9817e8323b6df5c8florian  return "Unsupported";
1685bbcf188f6ae64a44fb31414eb9e1a738b4befcc0sewardj}
1686bbcf188f6ae64a44fb31414eb9e1a738b4befcc0sewardj
168755085f8680acc89d727e321f3b34cae1a8c4093aflorianstatic const HChar* show_hwcaps_s390x ( UInt hwcaps )
16882019a976f07ff418dde2dfc7cc74667ef66d7764sewardj{
1689d07b8566ab17faf70748cfce1304699f1d15c34esewardj   static const HChar prefix[] = "s390x";
16909061eb34b539df910f64354e8f3495aad47e8891florian   static const struct {
16919061eb34b539df910f64354e8f3495aad47e8891florian      UInt  hwcaps_bit;
16929061eb34b539df910f64354e8f3495aad47e8891florian      HChar name[6];
16939061eb34b539df910f64354e8f3495aad47e8891florian   } hwcaps_list[] = {
16949061eb34b539df910f64354e8f3495aad47e8891florian      { VEX_HWCAPS_S390X_LDISP, "ldisp" },
16959061eb34b539df910f64354e8f3495aad47e8891florian      { VEX_HWCAPS_S390X_EIMM,  "eimm" },
16969061eb34b539df910f64354e8f3495aad47e8891florian      { VEX_HWCAPS_S390X_GIE,   "gie" },
16979061eb34b539df910f64354e8f3495aad47e8891florian      { VEX_HWCAPS_S390X_DFP,   "dfp" },
16989061eb34b539df910f64354e8f3495aad47e8891florian      { VEX_HWCAPS_S390X_FGX,   "fgx" },
16999061eb34b539df910f64354e8f3495aad47e8891florian      { VEX_HWCAPS_S390X_STFLE, "stfle" },
17009061eb34b539df910f64354e8f3495aad47e8891florian      { VEX_HWCAPS_S390X_ETF2,  "etf2" },
17019061eb34b539df910f64354e8f3495aad47e8891florian      { VEX_HWCAPS_S390X_ETF3,  "etf3" },
17029061eb34b539df910f64354e8f3495aad47e8891florian      { VEX_HWCAPS_S390X_STCKF, "stckf" },
17039061eb34b539df910f64354e8f3495aad47e8891florian      { VEX_HWCAPS_S390X_FPEXT, "fpext" },
17049061eb34b539df910f64354e8f3495aad47e8891florian      { VEX_HWCAPS_S390X_LSC,   "lsc" },
170578d5ef75d89e5aa6c629a2d47f7e04ddbf1253c3florian      { VEX_HWCAPS_S390X_PFPO,  "pfpo" },
1706d07b8566ab17faf70748cfce1304699f1d15c34esewardj   };
1707f3652c97c20265d3410ea75d9817e8323b6df5c8florian   /* Allocate a large enough buffer */
17089061eb34b539df910f64354e8f3495aad47e8891florian   static HChar buf[sizeof prefix +
1709f3652c97c20265d3410ea75d9817e8323b6df5c8florian                    NUM_HWCAPS * (sizeof hwcaps_list[0].name + 1) + 1]; // '\0'
1710d07b8566ab17faf70748cfce1304699f1d15c34esewardj
1711d07b8566ab17faf70748cfce1304699f1d15c34esewardj   if (buf[0] != '\0') return buf;  /* already constructed */
17122019a976f07ff418dde2dfc7cc74667ef66d7764sewardj
1713f3652c97c20265d3410ea75d9817e8323b6df5c8florian   HChar *p;
1714f3652c97c20265d3410ea75d9817e8323b6df5c8florian   UInt i;
1715f3652c97c20265d3410ea75d9817e8323b6df5c8florian
1716652b56aecd7af6012e82801557b3833f74b19b59sewardj   hwcaps = VEX_HWCAPS_S390X(hwcaps);
1717652b56aecd7af6012e82801557b3833f74b19b59sewardj
1718d07b8566ab17faf70748cfce1304699f1d15c34esewardj   p = buf + vex_sprintf(buf, "%s", prefix);
17199061eb34b539df910f64354e8f3495aad47e8891florian   for (i = 0 ; i < NUM_HWCAPS; ++i) {
17209061eb34b539df910f64354e8f3495aad47e8891florian      if (hwcaps & hwcaps_list[i].hwcaps_bit)
17219061eb34b539df910f64354e8f3495aad47e8891florian         p = p + vex_sprintf(p, "-%s", hwcaps_list[i].name);
17229061eb34b539df910f64354e8f3495aad47e8891florian   }
1723d07b8566ab17faf70748cfce1304699f1d15c34esewardj
1724d07b8566ab17faf70748cfce1304699f1d15c34esewardj   /* If there are no facilities, add "zarch" */
1725d07b8566ab17faf70748cfce1304699f1d15c34esewardj   if (hwcaps == 0)
1726d07b8566ab17faf70748cfce1304699f1d15c34esewardj     vex_sprintf(p, "-%s", "zarch");
1727d07b8566ab17faf70748cfce1304699f1d15c34esewardj
1728d07b8566ab17faf70748cfce1304699f1d15c34esewardj   return buf;
17292019a976f07ff418dde2dfc7cc74667ef66d7764sewardj}
17302019a976f07ff418dde2dfc7cc74667ef66d7764sewardj
173155085f8680acc89d727e321f3b34cae1a8c4093aflorianstatic const HChar* show_hwcaps_mips32 ( UInt hwcaps )
1732d0e5fe765fb79e5495206f8d0969133178b871f2sewardj{
1733c3fee0debd7287a8c6a3b89ee6bc1ec58241938bdejanj   /* MIPS baseline. */
1734bc7d6f46346df80207c8454b35055b04f16bc1adpetarj   if (VEX_MIPS_COMP_ID(hwcaps) == VEX_PRID_COMP_MIPS) {
1735c3fee0debd7287a8c6a3b89ee6bc1ec58241938bdejanj      /* MIPS baseline with dspr2. */
1736bc7d6f46346df80207c8454b35055b04f16bc1adpetarj      if (VEX_MIPS_PROC_DSP2(hwcaps)) {
1737c3fee0debd7287a8c6a3b89ee6bc1ec58241938bdejanj         return "MIPS-baseline-dspr2";
1738c3fee0debd7287a8c6a3b89ee6bc1ec58241938bdejanj      }
1739c3fee0debd7287a8c6a3b89ee6bc1ec58241938bdejanj      /* MIPS baseline with dsp. */
1740bc7d6f46346df80207c8454b35055b04f16bc1adpetarj      if (VEX_MIPS_PROC_DSP(hwcaps)) {
1741c3fee0debd7287a8c6a3b89ee6bc1ec58241938bdejanj         return "MIPS-baseline-dsp";
1742c3fee0debd7287a8c6a3b89ee6bc1ec58241938bdejanj      }
1743c3fee0debd7287a8c6a3b89ee6bc1ec58241938bdejanj      return "MIPS-baseline";
1744c3fee0debd7287a8c6a3b89ee6bc1ec58241938bdejanj   }
1745c3fee0debd7287a8c6a3b89ee6bc1ec58241938bdejanj
1746c3fee0debd7287a8c6a3b89ee6bc1ec58241938bdejanj   /* Broadcom baseline. */
1747bc7d6f46346df80207c8454b35055b04f16bc1adpetarj   if (VEX_MIPS_COMP_ID(hwcaps) == VEX_PRID_COMP_BROADCOM) {
1748c3fee0debd7287a8c6a3b89ee6bc1ec58241938bdejanj      return "Broadcom-baseline";
1749c3fee0debd7287a8c6a3b89ee6bc1ec58241938bdejanj   }
1750c3fee0debd7287a8c6a3b89ee6bc1ec58241938bdejanj
1751c3fee0debd7287a8c6a3b89ee6bc1ec58241938bdejanj   /* Netlogic baseline. */
1752bc7d6f46346df80207c8454b35055b04f16bc1adpetarj   if (VEX_MIPS_COMP_ID(hwcaps) == VEX_PRID_COMP_NETLOGIC) {
1753c3fee0debd7287a8c6a3b89ee6bc1ec58241938bdejanj      return "Netlogic-baseline";
1754c3fee0debd7287a8c6a3b89ee6bc1ec58241938bdejanj   }
1755c3fee0debd7287a8c6a3b89ee6bc1ec58241938bdejanj
1756bc7d6f46346df80207c8454b35055b04f16bc1adpetarj   /* Cavium baseline. */
1757bc7d6f46346df80207c8454b35055b04f16bc1adpetarj   if (VEX_MIPS_COMP_ID(hwcaps) == VEX_PRID_COMP_CAVIUM) {
1758bc7d6f46346df80207c8454b35055b04f16bc1adpetarj      return "Cavium-baseline";
1759bc7d6f46346df80207c8454b35055b04f16bc1adpetarj   }
1760bc7d6f46346df80207c8454b35055b04f16bc1adpetarj
1761a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes   /* Ingenic baseline. */
1762a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes   if (VEX_MIPS_COMP_ID(hwcaps) == VEX_PRID_COMP_INGENIC_E1) {
1763a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes      return "Ingenic-baseline";
1764a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes   }
1765a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes
1766a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes   /* Loongson baseline. */
1767a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes   if ((VEX_MIPS_COMP_ID(hwcaps) == VEX_PRID_COMP_LEGACY) &&
1768a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes       (VEX_MIPS_PROC_ID(hwcaps) == VEX_PRID_IMP_LOONGSON_64)) {
1769a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes      return "Loongson-baseline";
1770a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes   }
1771a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes
1772f3652c97c20265d3410ea75d9817e8323b6df5c8florian   return "Unsupported baseline";
1773d0e5fe765fb79e5495206f8d0969133178b871f2sewardj}
1774d0e5fe765fb79e5495206f8d0969133178b871f2sewardj
1775b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarjstatic const HChar* show_hwcaps_mips64 ( UInt hwcaps )
1776b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj{
1777a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes   /* Netlogic baseline. */
1778a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes   if (VEX_MIPS_COMP_ID(hwcaps) == VEX_PRID_COMP_NETLOGIC) {
1779a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes      return "Netlogic-baseline";
1780a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes   }
1781a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes
1782a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes   /* Cavium baseline. */
1783a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes   if (VEX_MIPS_COMP_ID(hwcaps) == VEX_PRID_COMP_CAVIUM) {
1784a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes      return "Cavium-baseline";
1785a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes   }
1786a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes
1787a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes   /* Loongson baseline. */
1788a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes   if ((VEX_MIPS_COMP_ID(hwcaps) == VEX_PRID_COMP_LEGACY) &&
1789a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes       (VEX_MIPS_PROC_ID(hwcaps) == VEX_PRID_IMP_LOONGSON_64)) {
1790a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes      return "Loongson-baseline";
1791a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes   }
1792a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes
1793a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes   /* MIPS64 baseline. */
1794a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes   if (VEX_MIPS_COMP_ID(hwcaps) == VEX_PRID_COMP_MIPS) {
1795a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes      return "mips64-baseline";
1796a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes   }
1797a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes
1798a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes   return "Unsupported baseline";
1799b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj}
1800b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj
1801f3652c97c20265d3410ea75d9817e8323b6df5c8florian#undef NUM_HWCAPS
1802f3652c97c20265d3410ea75d9817e8323b6df5c8florian
1803f3652c97c20265d3410ea75d9817e8323b6df5c8florian/* Thie function must not return NULL. */
18040de80192f57cd132b31b233c65734de04939ce65sewardj
180555085f8680acc89d727e321f3b34cae1a8c4093aflorianstatic const HChar* show_hwcaps ( VexArch arch, UInt hwcaps )
18065117ce116f47141cb23d1b49cc826e19323add97sewardj{
18075117ce116f47141cb23d1b49cc826e19323add97sewardj   switch (arch) {
1808d0e5fe765fb79e5495206f8d0969133178b871f2sewardj      case VexArchX86:    return show_hwcaps_x86(hwcaps);
1809d0e5fe765fb79e5495206f8d0969133178b871f2sewardj      case VexArchAMD64:  return show_hwcaps_amd64(hwcaps);
1810d0e5fe765fb79e5495206f8d0969133178b871f2sewardj      case VexArchPPC32:  return show_hwcaps_ppc32(hwcaps);
1811d0e5fe765fb79e5495206f8d0969133178b871f2sewardj      case VexArchPPC64:  return show_hwcaps_ppc64(hwcaps);
1812d0e5fe765fb79e5495206f8d0969133178b871f2sewardj      case VexArchARM:    return show_hwcaps_arm(hwcaps);
1813bbcf188f6ae64a44fb31414eb9e1a738b4befcc0sewardj      case VexArchARM64:  return show_hwcaps_arm64(hwcaps);
1814d0e5fe765fb79e5495206f8d0969133178b871f2sewardj      case VexArchS390X:  return show_hwcaps_s390x(hwcaps);
1815d0e5fe765fb79e5495206f8d0969133178b871f2sewardj      case VexArchMIPS32: return show_hwcaps_mips32(hwcaps);
1816b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj      case VexArchMIPS64: return show_hwcaps_mips64(hwcaps);
18175117ce116f47141cb23d1b49cc826e19323add97sewardj      default: return NULL;
18185117ce116f47141cb23d1b49cc826e19323add97sewardj   }
18195117ce116f47141cb23d1b49cc826e19323add97sewardj}
18205117ce116f47141cb23d1b49cc826e19323add97sewardj
1821f3652c97c20265d3410ea75d9817e8323b6df5c8florian/* To be used to complain about hwcaps we cannot handle */
1822f3652c97c20265d3410ea75d9817e8323b6df5c8florian__attribute__((noreturn))
1823f3652c97c20265d3410ea75d9817e8323b6df5c8florianstatic void invalid_hwcaps ( VexArch arch, UInt hwcaps, const HChar *message )
1824f3652c97c20265d3410ea75d9817e8323b6df5c8florian{
1825f3652c97c20265d3410ea75d9817e8323b6df5c8florian   vfatal("\nVEX: %s"
1826f3652c97c20265d3410ea75d9817e8323b6df5c8florian          "     Found: %s\n", message, show_hwcaps(arch, hwcaps));
1827f3652c97c20265d3410ea75d9817e8323b6df5c8florian}
1828f3652c97c20265d3410ea75d9817e8323b6df5c8florian
1829f3652c97c20265d3410ea75d9817e8323b6df5c8florian/* This function will not return iff the hwcaps don't pass the test. */
1830f3652c97c20265d3410ea75d9817e8323b6df5c8florianstatic void check_hwcaps ( VexArch arch, UInt hwcaps )
18315117ce116f47141cb23d1b49cc826e19323add97sewardj{
1832f3652c97c20265d3410ea75d9817e8323b6df5c8florian   switch (arch) {
1833f3652c97c20265d3410ea75d9817e8323b6df5c8florian      case VexArchX86: {
1834f3652c97c20265d3410ea75d9817e8323b6df5c8florian         if (hwcaps == 0) return;    // baseline
1835f3652c97c20265d3410ea75d9817e8323b6df5c8florian
1836f3652c97c20265d3410ea75d9817e8323b6df5c8florian         /* Monotonic: SSE3 > SSE2 > SSE1 > MMXEXT > baseline. */
1837f3652c97c20265d3410ea75d9817e8323b6df5c8florian         static const UInt extras[] = {
1838f3652c97c20265d3410ea75d9817e8323b6df5c8florian            VEX_HWCAPS_X86_MMXEXT, VEX_HWCAPS_X86_SSE1, VEX_HWCAPS_X86_SSE2,
1839f3652c97c20265d3410ea75d9817e8323b6df5c8florian            VEX_HWCAPS_X86_SSE3
1840f3652c97c20265d3410ea75d9817e8323b6df5c8florian         };
1841f3652c97c20265d3410ea75d9817e8323b6df5c8florian
1842f3652c97c20265d3410ea75d9817e8323b6df5c8florian         UInt i, caps = 0;
1843f3652c97c20265d3410ea75d9817e8323b6df5c8florian         for (i = 0; i < sizeof extras / sizeof extras[0]; ++i) {
1844f3652c97c20265d3410ea75d9817e8323b6df5c8florian            caps |= extras[i];
1845f3652c97c20265d3410ea75d9817e8323b6df5c8florian            if (caps == hwcaps) return;
184675ba1300092d44f42971d3e09da93b5feca8392fflorian            /* For SSE2 or later LZCNT is optional */
1847f3652c97c20265d3410ea75d9817e8323b6df5c8florian            if ((caps & VEX_HWCAPS_X86_SSE2) != 0) {
184875ba1300092d44f42971d3e09da93b5feca8392fflorian               if ((caps | VEX_HWCAPS_X86_LZCNT) == hwcaps) return;
1849f3652c97c20265d3410ea75d9817e8323b6df5c8florian            }
1850f3652c97c20265d3410ea75d9817e8323b6df5c8florian         }
1851f3652c97c20265d3410ea75d9817e8323b6df5c8florian         invalid_hwcaps(arch, hwcaps, "Cannot handle capabilities\n");
1852f3652c97c20265d3410ea75d9817e8323b6df5c8florian      }
1853f3652c97c20265d3410ea75d9817e8323b6df5c8florian
1854f3652c97c20265d3410ea75d9817e8323b6df5c8florian      case VexArchAMD64: {
1855f3652c97c20265d3410ea75d9817e8323b6df5c8florian         /* SSE3 and CX16 are orthogonal and > baseline, although we really
1856f3652c97c20265d3410ea75d9817e8323b6df5c8florian            don't expect to come across anything which can do SSE3 but can't
1857f3652c97c20265d3410ea75d9817e8323b6df5c8florian            do CX16.  Still, we can handle that case.  LZCNT is similarly
1858f3652c97c20265d3410ea75d9817e8323b6df5c8florian            orthogonal. */
1859f3652c97c20265d3410ea75d9817e8323b6df5c8florian
1860f3652c97c20265d3410ea75d9817e8323b6df5c8florian         /* Throw out obviously stupid cases: */
1861f3652c97c20265d3410ea75d9817e8323b6df5c8florian         Bool have_sse3 = (hwcaps & VEX_HWCAPS_AMD64_SSE3) != 0;
1862f3652c97c20265d3410ea75d9817e8323b6df5c8florian         Bool have_avx  = (hwcaps & VEX_HWCAPS_AMD64_AVX)  != 0;
1863f3652c97c20265d3410ea75d9817e8323b6df5c8florian         Bool have_bmi  = (hwcaps & VEX_HWCAPS_AMD64_BMI)  != 0;
1864f3652c97c20265d3410ea75d9817e8323b6df5c8florian         Bool have_avx2 = (hwcaps & VEX_HWCAPS_AMD64_AVX2) != 0;
1865f3652c97c20265d3410ea75d9817e8323b6df5c8florian
1866f3652c97c20265d3410ea75d9817e8323b6df5c8florian         /* AVX without SSE3 */
1867f3652c97c20265d3410ea75d9817e8323b6df5c8florian         if (have_avx && !have_sse3)
1868f3652c97c20265d3410ea75d9817e8323b6df5c8florian            invalid_hwcaps(arch, hwcaps,
1869f3652c97c20265d3410ea75d9817e8323b6df5c8florian                           "Support for AVX requires SSE3 capabilities\n");
1870f3652c97c20265d3410ea75d9817e8323b6df5c8florian         /* AVX2 or BMI without AVX */
1871f3652c97c20265d3410ea75d9817e8323b6df5c8florian         if (have_avx2 && !have_avx)
1872f3652c97c20265d3410ea75d9817e8323b6df5c8florian            invalid_hwcaps(arch, hwcaps,
1873f3652c97c20265d3410ea75d9817e8323b6df5c8florian                           "Support for AVX2 requires AVX capabilities\n");
1874f3652c97c20265d3410ea75d9817e8323b6df5c8florian         if (have_bmi && !have_avx)
1875f3652c97c20265d3410ea75d9817e8323b6df5c8florian            invalid_hwcaps(arch, hwcaps,
1876f3652c97c20265d3410ea75d9817e8323b6df5c8florian                           "Support for BMI requires AVX capabilities\n");
1877f3652c97c20265d3410ea75d9817e8323b6df5c8florian         return;
1878f3652c97c20265d3410ea75d9817e8323b6df5c8florian      }
1879f3652c97c20265d3410ea75d9817e8323b6df5c8florian
1880f3652c97c20265d3410ea75d9817e8323b6df5c8florian      case VexArchPPC32: {
1881f3652c97c20265d3410ea75d9817e8323b6df5c8florian         /* Monotonic with complications.  Basically V > F > baseline,
1882f3652c97c20265d3410ea75d9817e8323b6df5c8florian            but once you have F then you can have FX or GX too. */
1883f3652c97c20265d3410ea75d9817e8323b6df5c8florian         if (hwcaps == 0) return;   // baseline
1884f3652c97c20265d3410ea75d9817e8323b6df5c8florian
1885f3652c97c20265d3410ea75d9817e8323b6df5c8florian         if ((hwcaps & VEX_HWCAPS_PPC32_F) == 0)
1886f3652c97c20265d3410ea75d9817e8323b6df5c8florian            invalid_hwcaps(arch, hwcaps,
1887f3652c97c20265d3410ea75d9817e8323b6df5c8florian                           "Missing floating point capability\n");
1888f3652c97c20265d3410ea75d9817e8323b6df5c8florian         /* V, FX, and GX can appear in any combination */
1889f3652c97c20265d3410ea75d9817e8323b6df5c8florian
1890f3652c97c20265d3410ea75d9817e8323b6df5c8florian         /* DFP requires V and FX and GX */
1891f3652c97c20265d3410ea75d9817e8323b6df5c8florian         UInt v_fx_gx = VEX_HWCAPS_PPC32_V | VEX_HWCAPS_PPC32_FX |
1892f3652c97c20265d3410ea75d9817e8323b6df5c8florian                        VEX_HWCAPS_PPC32_GX;
1893f3652c97c20265d3410ea75d9817e8323b6df5c8florian         Bool has_v_fx_gx = (hwcaps & v_fx_gx) == v_fx_gx;
1894f3652c97c20265d3410ea75d9817e8323b6df5c8florian
1895f3652c97c20265d3410ea75d9817e8323b6df5c8florian         if ((hwcaps & VEX_HWCAPS_PPC32_DFP) && ! has_v_fx_gx)
1896f3652c97c20265d3410ea75d9817e8323b6df5c8florian            invalid_hwcaps(arch, hwcaps,
1897f3652c97c20265d3410ea75d9817e8323b6df5c8florian                           "DFP requires VMX and FX and GX capabilities\n");
1898f3652c97c20265d3410ea75d9817e8323b6df5c8florian
1899f3652c97c20265d3410ea75d9817e8323b6df5c8florian         /* VX requires V and FX and GX */
1900f3652c97c20265d3410ea75d9817e8323b6df5c8florian         if ((hwcaps & VEX_HWCAPS_PPC32_VX) && ! has_v_fx_gx)
1901f3652c97c20265d3410ea75d9817e8323b6df5c8florian            invalid_hwcaps(arch, hwcaps,
1902f3652c97c20265d3410ea75d9817e8323b6df5c8florian                           "VX requires VMX and FX and GX capabilities\n");
1903f3652c97c20265d3410ea75d9817e8323b6df5c8florian
1904f3652c97c20265d3410ea75d9817e8323b6df5c8florian         /* ISA2_07 requires everything else */
1905f3652c97c20265d3410ea75d9817e8323b6df5c8florian         if ((hwcaps & VEX_HWCAPS_PPC32_ISA2_07) != 0) {
1906f3652c97c20265d3410ea75d9817e8323b6df5c8florian            if (! has_v_fx_gx)
1907f3652c97c20265d3410ea75d9817e8323b6df5c8florian               invalid_hwcaps(arch, hwcaps,
1908f3652c97c20265d3410ea75d9817e8323b6df5c8florian                          "ISA2_07 requires VMX and FX and GX capabilities\n");
1909f3652c97c20265d3410ea75d9817e8323b6df5c8florian            if (! (hwcaps & VEX_HWCAPS_PPC32_VX))
1910f3652c97c20265d3410ea75d9817e8323b6df5c8florian               invalid_hwcaps(arch, hwcaps,
1911f3652c97c20265d3410ea75d9817e8323b6df5c8florian                              "ISA2_07 requires VX capabilities\n");
1912f3652c97c20265d3410ea75d9817e8323b6df5c8florian            if (! (hwcaps & VEX_HWCAPS_PPC32_DFP))
1913f3652c97c20265d3410ea75d9817e8323b6df5c8florian               invalid_hwcaps(arch, hwcaps,
1914f3652c97c20265d3410ea75d9817e8323b6df5c8florian                              "ISA2_07 requires DFP capabilities\n");
1915f3652c97c20265d3410ea75d9817e8323b6df5c8florian         }
1916a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes
1917a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes         /* ISA 3.0 not supported on 32-bit machines */
1918a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes         if ((hwcaps & VEX_HWCAPS_PPC32_ISA3_0) != 0) {
1919a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes            invalid_hwcaps(arch, hwcaps,
1920a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes                           "ISA 3.0 not supported in 32-bit mode \n");
1921a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes         }
1922f3652c97c20265d3410ea75d9817e8323b6df5c8florian         return;
1923f3652c97c20265d3410ea75d9817e8323b6df5c8florian      }
1924f3652c97c20265d3410ea75d9817e8323b6df5c8florian
1925f3652c97c20265d3410ea75d9817e8323b6df5c8florian      case VexArchPPC64: {
1926f3652c97c20265d3410ea75d9817e8323b6df5c8florian         /* Monotonic with complications.  Basically V > baseline(==F),
1927f3652c97c20265d3410ea75d9817e8323b6df5c8florian            but once you have F then you can have FX or GX too. */
1928f3652c97c20265d3410ea75d9817e8323b6df5c8florian         if (hwcaps == 0) return;   // baseline
1929f3652c97c20265d3410ea75d9817e8323b6df5c8florian
1930f3652c97c20265d3410ea75d9817e8323b6df5c8florian         /* V, FX, and GX can appear in any combination */
1931f3652c97c20265d3410ea75d9817e8323b6df5c8florian
1932f3652c97c20265d3410ea75d9817e8323b6df5c8florian         /* DFP requires V and FX and GX */
1933f3652c97c20265d3410ea75d9817e8323b6df5c8florian         UInt v_fx_gx = VEX_HWCAPS_PPC64_V | VEX_HWCAPS_PPC64_FX |
1934f3652c97c20265d3410ea75d9817e8323b6df5c8florian                        VEX_HWCAPS_PPC64_GX;
1935f3652c97c20265d3410ea75d9817e8323b6df5c8florian         Bool has_v_fx_gx = (hwcaps & v_fx_gx) == v_fx_gx;
1936f3652c97c20265d3410ea75d9817e8323b6df5c8florian
1937f3652c97c20265d3410ea75d9817e8323b6df5c8florian         if ((hwcaps & VEX_HWCAPS_PPC64_DFP) && ! has_v_fx_gx)
1938f3652c97c20265d3410ea75d9817e8323b6df5c8florian            invalid_hwcaps(arch, hwcaps,
1939f3652c97c20265d3410ea75d9817e8323b6df5c8florian                           "DFP requires VMX and FX and GX capabilities\n");
1940f3652c97c20265d3410ea75d9817e8323b6df5c8florian
1941f3652c97c20265d3410ea75d9817e8323b6df5c8florian         /* VX requires V and FX and GX */
1942f3652c97c20265d3410ea75d9817e8323b6df5c8florian         if ((hwcaps & VEX_HWCAPS_PPC32_VX) && ! has_v_fx_gx)
1943f3652c97c20265d3410ea75d9817e8323b6df5c8florian            invalid_hwcaps(arch, hwcaps,
1944f3652c97c20265d3410ea75d9817e8323b6df5c8florian                           "VX requires VMX and FX and GX capabilities\n");
1945f3652c97c20265d3410ea75d9817e8323b6df5c8florian
1946f3652c97c20265d3410ea75d9817e8323b6df5c8florian         /* ISA2_07 requires everything else */
1947f3652c97c20265d3410ea75d9817e8323b6df5c8florian         if ((hwcaps & VEX_HWCAPS_PPC64_ISA2_07) != 0) {
1948f3652c97c20265d3410ea75d9817e8323b6df5c8florian            if (! has_v_fx_gx)
1949f3652c97c20265d3410ea75d9817e8323b6df5c8florian               invalid_hwcaps(arch, hwcaps,
1950f3652c97c20265d3410ea75d9817e8323b6df5c8florian                        "ISA2_07 requires VMX and FX and GX capabilities\n");
1951f3652c97c20265d3410ea75d9817e8323b6df5c8florian            if (! (hwcaps & VEX_HWCAPS_PPC64_VX))
1952f3652c97c20265d3410ea75d9817e8323b6df5c8florian               invalid_hwcaps(arch, hwcaps,
1953f3652c97c20265d3410ea75d9817e8323b6df5c8florian                              "ISA2_07 requires VX capabilities\n");
1954f3652c97c20265d3410ea75d9817e8323b6df5c8florian            if (! (hwcaps & VEX_HWCAPS_PPC64_DFP))
1955f3652c97c20265d3410ea75d9817e8323b6df5c8florian               invalid_hwcaps(arch, hwcaps,
1956f3652c97c20265d3410ea75d9817e8323b6df5c8florian                              "ISA2_07 requires DFP capabilities\n");
1957f3652c97c20265d3410ea75d9817e8323b6df5c8florian         }
1958a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes
1959a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes         /* ISA3_0 requires everything else */
1960a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes         if ((hwcaps & VEX_HWCAPS_PPC64_ISA3_0) != 0) {
1961a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes            if ( !((hwcaps
1962a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes                    & VEX_HWCAPS_PPC64_ISA2_07) == VEX_HWCAPS_PPC64_ISA2_07))
1963a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes               invalid_hwcaps(arch, hwcaps,
1964a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes                          "ISA3_0 requires ISA2_07 capabilities\n");
1965a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes            if ( !has_v_fx_gx)
1966a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes               invalid_hwcaps(arch, hwcaps,
1967a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes                        "ISA3_0 requires VMX and FX and GX capabilities\n");
1968a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes            if ( !(hwcaps & VEX_HWCAPS_PPC64_VX))
1969a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes               invalid_hwcaps(arch, hwcaps,
1970a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes                              "ISA3_0 requires VX capabilities\n");
1971a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes            if ( !(hwcaps & VEX_HWCAPS_PPC64_DFP))
1972a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes               invalid_hwcaps(arch, hwcaps,
1973a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes                              "ISA3_0 requires DFP capabilities\n");
1974a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes         }
1975f3652c97c20265d3410ea75d9817e8323b6df5c8florian         return;
1976f3652c97c20265d3410ea75d9817e8323b6df5c8florian      }
1977f3652c97c20265d3410ea75d9817e8323b6df5c8florian
1978f3652c97c20265d3410ea75d9817e8323b6df5c8florian      case VexArchARM: {
1979f3652c97c20265d3410ea75d9817e8323b6df5c8florian         Bool NEON  = ((hwcaps & VEX_HWCAPS_ARM_NEON) != 0);
1980a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes         Bool VFP3  = ((hwcaps & VEX_HWCAPS_ARM_VFP3) != 0);
1981f3652c97c20265d3410ea75d9817e8323b6df5c8florian         UInt level = VEX_ARM_ARCHLEVEL(hwcaps);
1982f3652c97c20265d3410ea75d9817e8323b6df5c8florian         switch (level) {
1983f3652c97c20265d3410ea75d9817e8323b6df5c8florian            case 5:
1984f3652c97c20265d3410ea75d9817e8323b6df5c8florian               if (NEON)
1985f3652c97c20265d3410ea75d9817e8323b6df5c8florian                  invalid_hwcaps(arch, hwcaps,
1986f3652c97c20265d3410ea75d9817e8323b6df5c8florian                          "NEON instructions are not supported for ARMv5.\n");
1987f3652c97c20265d3410ea75d9817e8323b6df5c8florian               return;
1988f3652c97c20265d3410ea75d9817e8323b6df5c8florian            case 6:
1989f3652c97c20265d3410ea75d9817e8323b6df5c8florian               if (NEON)
1990f3652c97c20265d3410ea75d9817e8323b6df5c8florian                  invalid_hwcaps(arch, hwcaps,
1991f3652c97c20265d3410ea75d9817e8323b6df5c8florian                          "NEON instructions are not supported for ARMv6.\n");
1992f3652c97c20265d3410ea75d9817e8323b6df5c8florian               return;
1993f3652c97c20265d3410ea75d9817e8323b6df5c8florian            case 7:
1994f3652c97c20265d3410ea75d9817e8323b6df5c8florian               return;
1995a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes            case 8:
1996a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes               if (!NEON || !VFP3)
1997a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes                  invalid_hwcaps(arch, hwcaps,
1998a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes                          "NEON and VFP3 are required for ARMv8.\n");
1999a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes               return;
2000f3652c97c20265d3410ea75d9817e8323b6df5c8florian            default:
2001f3652c97c20265d3410ea75d9817e8323b6df5c8florian               invalid_hwcaps(arch, hwcaps,
2002f3652c97c20265d3410ea75d9817e8323b6df5c8florian                              "ARM architecture level is not supported.\n");
2003f3652c97c20265d3410ea75d9817e8323b6df5c8florian         }
2004f3652c97c20265d3410ea75d9817e8323b6df5c8florian      }
2005f3652c97c20265d3410ea75d9817e8323b6df5c8florian
2006f3652c97c20265d3410ea75d9817e8323b6df5c8florian      case VexArchARM64:
2007f3652c97c20265d3410ea75d9817e8323b6df5c8florian         if (hwcaps != 0)
2008f3652c97c20265d3410ea75d9817e8323b6df5c8florian            invalid_hwcaps(arch, hwcaps,
2009f3652c97c20265d3410ea75d9817e8323b6df5c8florian                           "Unsupported hardware capabilities.\n");
2010f3652c97c20265d3410ea75d9817e8323b6df5c8florian         return;
2011f3652c97c20265d3410ea75d9817e8323b6df5c8florian
2012f3652c97c20265d3410ea75d9817e8323b6df5c8florian      case VexArchS390X:
2013f3652c97c20265d3410ea75d9817e8323b6df5c8florian         if (! s390_host_has_ldisp)
2014f3652c97c20265d3410ea75d9817e8323b6df5c8florian            invalid_hwcaps(arch, hwcaps,
2015f3652c97c20265d3410ea75d9817e8323b6df5c8florian                           "Host does not have long displacement facility.\n");
2016f3652c97c20265d3410ea75d9817e8323b6df5c8florian         return;
2017a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes
2018f3652c97c20265d3410ea75d9817e8323b6df5c8florian      case VexArchMIPS32:
2019f3652c97c20265d3410ea75d9817e8323b6df5c8florian         switch (VEX_MIPS_COMP_ID(hwcaps)) {
2020f3652c97c20265d3410ea75d9817e8323b6df5c8florian            case VEX_PRID_COMP_MIPS:
2021a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes            case VEX_PRID_COMP_CAVIUM:
2022a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes            case VEX_PRID_COMP_INGENIC_E1:
2023f3652c97c20265d3410ea75d9817e8323b6df5c8florian            case VEX_PRID_COMP_BROADCOM:
2024f3652c97c20265d3410ea75d9817e8323b6df5c8florian            case VEX_PRID_COMP_NETLOGIC:
2025f3652c97c20265d3410ea75d9817e8323b6df5c8florian               return;
2026f3652c97c20265d3410ea75d9817e8323b6df5c8florian            default:
2027f3652c97c20265d3410ea75d9817e8323b6df5c8florian               invalid_hwcaps(arch, hwcaps, "Unsupported baseline\n");
2028f3652c97c20265d3410ea75d9817e8323b6df5c8florian         }
2029a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes
2030f3652c97c20265d3410ea75d9817e8323b6df5c8florian      case VexArchMIPS64:
2031a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes         switch (VEX_MIPS_COMP_ID(hwcaps)) {
2032a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes            case VEX_PRID_COMP_MIPS:
2033a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes            case VEX_PRID_COMP_CAVIUM:
2034a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes            case VEX_PRID_COMP_NETLOGIC:
2035a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes               return;
2036a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes            default:
2037a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes               invalid_hwcaps(arch, hwcaps, "Unsupported baseline\n");
2038a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes         }
2039f3652c97c20265d3410ea75d9817e8323b6df5c8florian
2040f3652c97c20265d3410ea75d9817e8323b6df5c8florian      default:
2041f3652c97c20265d3410ea75d9817e8323b6df5c8florian         vpanic("unknown architecture");
2042dc6e7479625706946f1c5a0a699141930a245fdfflorian   }
20435117ce116f47141cb23d1b49cc826e19323add97sewardj}
20445117ce116f47141cb23d1b49cc826e19323add97sewardj
20455117ce116f47141cb23d1b49cc826e19323add97sewardj
204635421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj/*---------------------------------------------------------------*/
2047cef7d3e3df4796e35b4521158d9dc058f034aa87sewardj/*--- end                                         main_main.c ---*/
204835421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj/*---------------------------------------------------------------*/
2049