1436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 2436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov/*---------------------------------------------------------------*/ 3436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov/*--- begin host_arm64_defs.c ---*/ 4436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov/*---------------------------------------------------------------*/ 5436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 6436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov/* 7436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov This file is part of Valgrind, a dynamic binary instrumentation 8436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov framework. 9436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 10436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov Copyright (C) 2013-2013 OpenWorks 11436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov info@open-works.net 12436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 13436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov This program is free software; you can redistribute it and/or 14436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov modify it under the terms of the GNU General Public License as 15436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov published by the Free Software Foundation; either version 2 of the 16436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov License, or (at your option) any later version. 17436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 18436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov This program is distributed in the hope that it will be useful, but 19436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov WITHOUT ANY WARRANTY; without even the implied warranty of 20436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 21436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov General Public License for more details. 22436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 23436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov You should have received a copy of the GNU General Public License 24436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov along with this program; if not, write to the Free Software 25436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 26436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 02110-1301, USA. 27436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 28436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov The GNU General Public License is contained in the file COPYING. 29436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov*/ 30436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 31436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#include "libvex_basictypes.h" 32436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#include "libvex.h" 33436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#include "libvex_trc_values.h" 34436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 35436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#include "main_util.h" 36436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#include "host_generic_regs.h" 37436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#include "host_arm64_defs.h" 38436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 39436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ UInt arm_hwcaps = 0; 40436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 41436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 42436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov/* --------- Registers. --------- */ 43436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 44436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov/* The usual HReg abstraction. We use the following classes only: 45436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov X regs (64 bit int) 46436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov D regs (64 bit float, also used for 32 bit float) 47436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov Q regs (128 bit vector) 48436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov*/ 49436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 50436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovvoid ppHRegARM64 ( HReg reg ) { 51436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov Int r; 52436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* Be generic for all virtual regs. */ 53436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if (hregIsVirtual(reg)) { 54436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ppHReg(reg); 55436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return; 56436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 57436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* But specific for real regs. */ 58436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov switch (hregClass(reg)) { 59436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case HRcInt64: 60436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov r = hregNumber(reg); 61436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(r >= 0 && r < 31); 62436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vex_printf("x%d", r); 63436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return; 64436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case HRcFlt64: 65436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov r = hregNumber(reg); 66436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(r >= 0 && r < 32); 67436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vex_printf("d%d", r); 68436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return; 69436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case HRcVec128: 70436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov r = hregNumber(reg); 71436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(r >= 0 && r < 32); 72436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vex_printf("q%d", r); 73436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return; 74436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov default: 75436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vpanic("ppHRegARM64"); 76436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 77436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov} 78436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 79436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic void ppHRegARM64asSreg ( HReg reg ) { 80436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ppHRegARM64(reg); 81436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vex_printf("(S-reg)"); 82436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov} 83436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 84436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovHReg hregARM64_X0 ( void ) { return mkHReg(0, HRcInt64, False); } 85436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovHReg hregARM64_X1 ( void ) { return mkHReg(1, HRcInt64, False); } 86436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovHReg hregARM64_X2 ( void ) { return mkHReg(2, HRcInt64, False); } 87436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovHReg hregARM64_X3 ( void ) { return mkHReg(3, HRcInt64, False); } 88436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovHReg hregARM64_X4 ( void ) { return mkHReg(4, HRcInt64, False); } 89436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovHReg hregARM64_X5 ( void ) { return mkHReg(5, HRcInt64, False); } 90436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovHReg hregARM64_X6 ( void ) { return mkHReg(6, HRcInt64, False); } 91436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovHReg hregARM64_X7 ( void ) { return mkHReg(7, HRcInt64, False); } 92436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ HReg hregARM_R8 ( void ) { return mkHReg(8, HRcInt32, False); } 93436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovHReg hregARM64_X9 ( void ) { return mkHReg(9, HRcInt64, False); } 94436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovHReg hregARM64_X10 ( void ) { return mkHReg(10, HRcInt64, False); } 95436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovHReg hregARM64_X11 ( void ) { return mkHReg(11, HRcInt64, False); } 96436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovHReg hregARM64_X12 ( void ) { return mkHReg(12, HRcInt64, False); } 97436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovHReg hregARM64_X13 ( void ) { return mkHReg(13, HRcInt64, False); } 98436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovHReg hregARM64_X14 ( void ) { return mkHReg(14, HRcInt64, False); } 99436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovHReg hregARM64_X15 ( void ) { return mkHReg(15, HRcInt64, False); } 100436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovHReg hregARM64_X21 ( void ) { return mkHReg(21, HRcInt64, False); } 101436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovHReg hregARM64_X22 ( void ) { return mkHReg(22, HRcInt64, False); } 102436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovHReg hregARM64_X23 ( void ) { return mkHReg(23, HRcInt64, False); } 103436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovHReg hregARM64_X24 ( void ) { return mkHReg(24, HRcInt64, False); } 104436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovHReg hregARM64_X25 ( void ) { return mkHReg(25, HRcInt64, False); } 105436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovHReg hregARM64_X26 ( void ) { return mkHReg(26, HRcInt64, False); } 106436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovHReg hregARM64_X27 ( void ) { return mkHReg(27, HRcInt64, False); } 107436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovHReg hregARM64_X28 ( void ) { return mkHReg(28, HRcInt64, False); } 108436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 109436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov// Should really use D8 .. D15 for class F64, since they are callee 110436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov// save 111436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovHReg hregARM64_D8 ( void ) { return mkHReg(8, HRcFlt64, False); } 112436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovHReg hregARM64_D9 ( void ) { return mkHReg(9, HRcFlt64, False); } 113436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovHReg hregARM64_D10 ( void ) { return mkHReg(10, HRcFlt64, False); } 114436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovHReg hregARM64_D11 ( void ) { return mkHReg(11, HRcFlt64, False); } 115436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovHReg hregARM64_D12 ( void ) { return mkHReg(12, HRcFlt64, False); } 116436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovHReg hregARM64_D13 ( void ) { return mkHReg(13, HRcFlt64, False); } 117436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ HReg hregARM_S26 ( void ) { return mkHReg(26, HRcFlt32, False); } 118436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ HReg hregARM_S27 ( void ) { return mkHReg(27, HRcFlt32, False); } 119436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ HReg hregARM_S28 ( void ) { return mkHReg(28, HRcFlt32, False); } 120436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ HReg hregARM_S29 ( void ) { return mkHReg(29, HRcFlt32, False); } 121436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ HReg hregARM_S30 ( void ) { return mkHReg(30, HRcFlt32, False); } 122436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovHReg hregARM64_Q16 ( void ) { return mkHReg(16, HRcVec128, False); } 123436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovHReg hregARM64_Q17 ( void ) { return mkHReg(17, HRcVec128, False); } 124436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovHReg hregARM64_Q18 ( void ) { return mkHReg(18, HRcVec128, False); } 125436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ HReg hregARM_Q11 ( void ) { return mkHReg(11, HRcVec128, False); } 126436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ HReg hregARM_Q12 ( void ) { return mkHReg(12, HRcVec128, False); } 127436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ HReg hregARM_Q13 ( void ) { return mkHReg(13, HRcVec128, False); } 128436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ HReg hregARM_Q14 ( void ) { return mkHReg(14, HRcVec128, False); } 129436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ HReg hregARM_Q15 ( void ) { return mkHReg(15, HRcVec128, False); } 130436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 131436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovvoid getAllocableRegs_ARM64 ( Int* nregs, HReg** arr ) 132436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{ 133436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov Int i = 0; 134436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov *nregs = 24; 135436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov *arr = LibVEX_Alloc(*nregs * sizeof(HReg)); 136436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 137436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov // callee saves ones (22 to 28) are listed first, since we prefer 138436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov // them if they're available 139436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov (*arr)[i++] = hregARM64_X22(); 140436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov (*arr)[i++] = hregARM64_X23(); 141436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov (*arr)[i++] = hregARM64_X24(); 142436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov (*arr)[i++] = hregARM64_X25(); 143436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov (*arr)[i++] = hregARM64_X26(); 144436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov (*arr)[i++] = hregARM64_X27(); 145436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov (*arr)[i++] = hregARM64_X28(); 146436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 147436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov (*arr)[i++] = hregARM64_X0(); 148436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov (*arr)[i++] = hregARM64_X1(); 149436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov (*arr)[i++] = hregARM64_X2(); 150436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov (*arr)[i++] = hregARM64_X3(); 151436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov (*arr)[i++] = hregARM64_X4(); 152436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov (*arr)[i++] = hregARM64_X5(); 153436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov (*arr)[i++] = hregARM64_X6(); 154436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov (*arr)[i++] = hregARM64_X7(); 155436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov // X8 .. who knows. 156436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov // X9 is a chaining/spill temporary, not available to regalloc. 157436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 158436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov // Do we really need all these? 159436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov //(*arr)[i++] = hregARM64_X10(); 160436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov //(*arr)[i++] = hregARM64_X11(); 161436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov //(*arr)[i++] = hregARM64_X12(); 162436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov //(*arr)[i++] = hregARM64_X13(); 163436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov //(*arr)[i++] = hregARM64_X14(); 164436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov //(*arr)[i++] = hregARM64_X15(); 165436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov // X21 is the guest state pointer, not available to regalloc. 166436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 167436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov // vector regs. Unfortunately not callee-saved. 168436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov (*arr)[i++] = hregARM64_Q16(); 169436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov (*arr)[i++] = hregARM64_Q17(); 170436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov (*arr)[i++] = hregARM64_Q18(); 171436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 172436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov // F64 regs, all of which are callee-saved 173436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov (*arr)[i++] = hregARM64_D8(); 174436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov (*arr)[i++] = hregARM64_D9(); 175436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov (*arr)[i++] = hregARM64_D10(); 176436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov (*arr)[i++] = hregARM64_D11(); 177436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov (*arr)[i++] = hregARM64_D12(); 178436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov (*arr)[i++] = hregARM64_D13(); 179436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 180436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov // unavail: x21 as GSP 181436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov // x9 is used as a spill/reload/chaining/call temporary 182436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov // x8 is unassigned 183436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov // x30 as LR 184436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov // x31 because dealing with the SP-vs-ZR overloading is too 185436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov // confusing, and we don't need to do so, so let's just avoid 186436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov // the problem 187436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov // 188436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov // Currently, we have 15 allocatable integer registers: 189436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov // 0 1 2 3 4 5 6 7 22 23 24 25 26 27 28 190436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov // 191436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov // Hence for the allocatable integer registers we have: 192436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov // 193436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov // callee-saved: 22 23 24 25 26 27 28 194436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov // caller-saved: 0 1 2 3 4 5 6 7 195436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov // 196436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov // If the set of available registers changes or if the e/r status 197436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov // changes, be sure to re-check/sync the definition of 198436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov // getHRegUsage for ARMInstr_Call too. 199436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(i == *nregs); 200436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov} 201436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 202436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 203436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov/* --------- Condition codes, ARM64 encoding. --------- */ 204436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 205436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar* showARM64CondCode ( ARM64CondCode cond ) { 206436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov switch (cond) { 207436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64cc_EQ: return "eq"; 208436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64cc_NE: return "ne"; 209436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64cc_CS: return "cs"; 210436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64cc_CC: return "cc"; 211436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64cc_MI: return "mi"; 212436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64cc_PL: return "pl"; 213436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64cc_VS: return "vs"; 214436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64cc_VC: return "vc"; 215436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64cc_HI: return "hi"; 216436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64cc_LS: return "ls"; 217436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64cc_GE: return "ge"; 218436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64cc_LT: return "lt"; 219436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64cc_GT: return "gt"; 220436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64cc_LE: return "le"; 221436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64cc_AL: return "al"; // default 222436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64cc_NV: return "nv"; 223436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov default: vpanic("showARM64CondCode"); 224436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 225436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov} 226436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 227436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 228436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov/* --------- Memory address expressions (amodes). --------- */ 229436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 230436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovARM64AMode* ARM64AMode_RI9 ( HReg reg, Int simm9 ) { 231436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ARM64AMode* am = LibVEX_Alloc(sizeof(ARM64AMode)); 232436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov am->tag = ARM64am_RI9; 233436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov am->ARM64am.RI9.reg = reg; 234436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov am->ARM64am.RI9.simm9 = simm9; 235436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(-256 <= simm9 && simm9 <= 255); 236436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return am; 237436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov} 238436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 239436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovARM64AMode* ARM64AMode_RI12 ( HReg reg, Int uimm12, UChar szB ) { 240436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ARM64AMode* am = LibVEX_Alloc(sizeof(ARM64AMode)); 241436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov am->tag = ARM64am_RI12; 242436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov am->ARM64am.RI12.reg = reg; 243436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov am->ARM64am.RI12.uimm12 = uimm12; 244436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov am->ARM64am.RI12.szB = szB; 245436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(uimm12 >= 0 && uimm12 <= 4095); 246436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov switch (szB) { 247436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case 1: case 2: case 4: case 8: break; 248436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov default: vassert(0); 249436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 250436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return am; 251436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov} 252436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 253436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovARM64AMode* ARM64AMode_RR ( HReg base, HReg index ) { 254436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ARM64AMode* am = LibVEX_Alloc(sizeof(ARM64AMode)); 255436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov am->tag = ARM64am_RR; 256436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov am->ARM64am.RR.base = base; 257436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov am->ARM64am.RR.index = index; 258436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return am; 259436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov} 260436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 261436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic void ppARM64AMode ( ARM64AMode* am ) { 262436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov switch (am->tag) { 263436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64am_RI9: 264436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vex_printf("%d(", am->ARM64am.RI9.simm9); 265436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ppHRegARM64(am->ARM64am.RI9.reg); 266436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vex_printf(")"); 267436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov break; 268436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64am_RI12: 269436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vex_printf("%u(", (UInt)am->ARM64am.RI12.szB 270436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov * (UInt)am->ARM64am.RI12.uimm12); 271436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ppHRegARM64(am->ARM64am.RI12.reg); 272436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vex_printf(")"); 273436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov break; 274436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64am_RR: 275436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vex_printf("("); 276436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ppHRegARM64(am->ARM64am.RR.base); 277436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vex_printf(","); 278436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ppHRegARM64(am->ARM64am.RR.index); 279436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vex_printf(")"); 280436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov break; 281436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov default: 282436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(0); 283436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 284436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov} 285436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 286436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic void addRegUsage_ARM64AMode ( HRegUsage* u, ARM64AMode* am ) { 287436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov switch (am->tag) { 288436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64am_RI9: 289436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov addHRegUse(u, HRmRead, am->ARM64am.RI9.reg); 290436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return; 291436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64am_RI12: 292436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov addHRegUse(u, HRmRead, am->ARM64am.RI12.reg); 293436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return; 294436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64am_RR: 295436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov addHRegUse(u, HRmRead, am->ARM64am.RR.base); 296436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov addHRegUse(u, HRmRead, am->ARM64am.RR.index); 297436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return; 298436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov default: 299436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vpanic("addRegUsage_ARM64Amode"); 300436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 301436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov} 302436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 303436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic void mapRegs_ARM64AMode ( HRegRemap* m, ARM64AMode* am ) { 304436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov switch (am->tag) { 305436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64am_RI9: 306436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov am->ARM64am.RI9.reg = lookupHRegRemap(m, am->ARM64am.RI9.reg); 307436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return; 308436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64am_RI12: 309436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov am->ARM64am.RI12.reg = lookupHRegRemap(m, am->ARM64am.RI12.reg); 310436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return; 311436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64am_RR: 312436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov am->ARM64am.RR.base = lookupHRegRemap(m, am->ARM64am.RR.base); 313436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov am->ARM64am.RR.index = lookupHRegRemap(m, am->ARM64am.RR.index); 314436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return; 315436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov default: 316436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vpanic("mapRegs_ARM64Amode"); 317436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 318436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov} 319436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 320436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 321436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ /* --------- Mem AModes: Addressing Mode 2 --------- */ 322436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ 323436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ ARMAMode2* ARMAMode2_RI ( HReg reg, Int simm9 ) { 324436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ ARMAMode2* am = LibVEX_Alloc(sizeof(ARMAMode2)); 325436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ am->tag = ARMam2_RI; 326436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ am->ARMam2.RI.reg = reg; 327436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ am->ARMam2.RI.simm9 = simm9; 328436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ vassert(-255 <= simm9 && simm9 <= 255); 329436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ return am; 330436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ } 331436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ ARMAMode2* ARMAMode2_RR ( HReg base, HReg index ) { 332436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ ARMAMode2* am = LibVEX_Alloc(sizeof(ARMAMode2)); 333436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ am->tag = ARMam2_RR; 334436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ am->ARMam2.RR.base = base; 335436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ am->ARMam2.RR.index = index; 336436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ return am; 337436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ } 338436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ 339436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ void ppARMAMode2 ( ARMAMode2* am ) { 340436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ switch (am->tag) { 341436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMam2_RI: 342436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ vex_printf("%d(", am->ARMam2.RI.simm9); 343436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ ppHRegARM(am->ARMam2.RI.reg); 344436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ vex_printf(")"); 345436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ break; 346436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMam2_RR: 347436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ vex_printf("("); 348436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ ppHRegARM(am->ARMam2.RR.base); 349436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ vex_printf(","); 350436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ ppHRegARM(am->ARMam2.RR.index); 351436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ vex_printf(")"); 352436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ break; 353436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ default: 354436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ vassert(0); 355436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ } 356436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ } 357436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ 358436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ static void addRegUsage_ARMAMode2 ( HRegUsage* u, ARMAMode2* am ) { 359436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ switch (am->tag) { 360436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMam2_RI: 361436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ addHRegUse(u, HRmRead, am->ARMam2.RI.reg); 362436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ return; 363436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMam2_RR: 364436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ // addHRegUse(u, HRmRead, am->ARMam2.RR.base); 365436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ // addHRegUse(u, HRmRead, am->ARMam2.RR.index); 366436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ // return; 367436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ default: 368436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ vpanic("addRegUsage_ARMAmode2"); 369436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ } 370436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ } 371436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ 372436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ static void mapRegs_ARMAMode2 ( HRegRemap* m, ARMAMode2* am ) { 373436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ switch (am->tag) { 374436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMam2_RI: 375436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ am->ARMam2.RI.reg = lookupHRegRemap(m, am->ARMam2.RI.reg); 376436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ return; 377436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMam2_RR: 378436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ //am->ARMam2.RR.base =lookupHRegRemap(m, am->ARMam2.RR.base); 379436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ //am->ARMam2.RR.index = lookupHRegRemap(m, am->ARMam2.RR.index); 380436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ //return; 381436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ default: 382436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ vpanic("mapRegs_ARMAmode2"); 383436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ } 384436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ } 385436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ 386436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ 387436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ /* --------- Mem AModes: Addressing Mode VFP --------- */ 388436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ 389436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ ARMAModeV* mkARMAModeV ( HReg reg, Int simm11 ) { 390436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ ARMAModeV* am = LibVEX_Alloc(sizeof(ARMAModeV)); 391436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ vassert(simm11 >= -1020 && simm11 <= 1020); 392436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ vassert(0 == (simm11 & 3)); 393436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ am->reg = reg; 394436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ am->simm11 = simm11; 395436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ return am; 396436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ } 397436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ 398436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ void ppARMAModeV ( ARMAModeV* am ) { 399436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ vex_printf("%d(", am->simm11); 400436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ ppHRegARM(am->reg); 401436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ vex_printf(")"); 402436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ } 403436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ 404436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ static void addRegUsage_ARMAModeV ( HRegUsage* u, ARMAModeV* am ) { 405436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ addHRegUse(u, HRmRead, am->reg); 406436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ } 407436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ 408436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ static void mapRegs_ARMAModeV ( HRegRemap* m, ARMAModeV* am ) { 409436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ am->reg = lookupHRegRemap(m, am->reg); 410436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ } 411436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ 412436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ 413436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ /* --------- Mem AModes: Addressing Mode Neon ------- */ 414436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ 415436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ ARMAModeN *mkARMAModeN_RR ( HReg rN, HReg rM ) { 416436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ ARMAModeN* am = LibVEX_Alloc(sizeof(ARMAModeN)); 417436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ am->tag = ARMamN_RR; 418436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ am->ARMamN.RR.rN = rN; 419436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ am->ARMamN.RR.rM = rM; 420436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ return am; 421436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ } 422436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ 423436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ ARMAModeN *mkARMAModeN_R ( HReg rN ) { 424436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ ARMAModeN* am = LibVEX_Alloc(sizeof(ARMAModeN)); 425436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ am->tag = ARMamN_R; 426436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ am->ARMamN.R.rN = rN; 427436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ return am; 428436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ } 429436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ 430436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ static void addRegUsage_ARMAModeN ( HRegUsage* u, ARMAModeN* am ) { 431436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ if (am->tag == ARMamN_R) { 432436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ addHRegUse(u, HRmRead, am->ARMamN.R.rN); 433436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ } else { 434436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ addHRegUse(u, HRmRead, am->ARMamN.RR.rN); 435436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ addHRegUse(u, HRmRead, am->ARMamN.RR.rM); 436436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ } 437436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ } 438436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ 439436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ static void mapRegs_ARMAModeN ( HRegRemap* m, ARMAModeN* am ) { 440436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ if (am->tag == ARMamN_R) { 441436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ am->ARMamN.R.rN = lookupHRegRemap(m, am->ARMamN.R.rN); 442436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ } else { 443436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ am->ARMamN.RR.rN = lookupHRegRemap(m, am->ARMamN.RR.rN); 444436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ am->ARMamN.RR.rM = lookupHRegRemap(m, am->ARMamN.RR.rM); 445436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ } 446436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ } 447436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ 448436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ void ppARMAModeN ( ARMAModeN* am ) { 449436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ vex_printf("["); 450436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ if (am->tag == ARMamN_R) { 451436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ ppHRegARM(am->ARMamN.R.rN); 452436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ } else { 453436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ ppHRegARM(am->ARMamN.RR.rN); 454436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ } 455436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ vex_printf("]"); 456436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ if (am->tag == ARMamN_RR) { 457436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ vex_printf(", "); 458436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ ppHRegARM(am->ARMamN.RR.rM); 459436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ } 460436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ } 461436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 462436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 463436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov/* --------- Reg or uimm12<<{0,12} operands --------- */ 464436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 465436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovARM64RIA* ARM64RIA_I12 ( UShort imm12, UChar shift ) { 466436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ARM64RIA* riA = LibVEX_Alloc(sizeof(ARM64RIA)); 467436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov riA->tag = ARM64riA_I12; 468436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov riA->ARM64riA.I12.imm12 = imm12; 469436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov riA->ARM64riA.I12.shift = shift; 470436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(imm12 < 4096); 471436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(shift == 0 || shift == 12); 472436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return riA; 473436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov} 474436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovARM64RIA* ARM64RIA_R ( HReg reg ) { 475436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ARM64RIA* riA = LibVEX_Alloc(sizeof(ARM64RIA)); 476436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov riA->tag = ARM64riA_R; 477436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov riA->ARM64riA.R.reg = reg; 478436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return riA; 479436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov} 480436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 481436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic void ppARM64RIA ( ARM64RIA* riA ) { 482436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov switch (riA->tag) { 483436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64riA_I12: 484436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vex_printf("#%u",(UInt)(riA->ARM64riA.I12.imm12 485436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov << riA->ARM64riA.I12.shift)); 486436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov break; 487436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64riA_R: 488436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ppHRegARM64(riA->ARM64riA.R.reg); 489436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov break; 490436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov default: 491436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(0); 492436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 493436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov} 494436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 495436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic void addRegUsage_ARM64RIA ( HRegUsage* u, ARM64RIA* riA ) { 496436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov switch (riA->tag) { 497436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64riA_I12: 498436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return; 499436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64riA_R: 500436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov addHRegUse(u, HRmRead, riA->ARM64riA.R.reg); 501436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return; 502436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov default: 503436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vpanic("addRegUsage_ARM64RIA"); 504436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 505436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov} 506436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 507436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic void mapRegs_ARM64RIA ( HRegRemap* m, ARM64RIA* riA ) { 508436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov switch (riA->tag) { 509436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64riA_I12: 510436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return; 511436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64riA_R: 512436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov riA->ARM64riA.R.reg = lookupHRegRemap(m, riA->ARM64riA.R.reg); 513436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return; 514436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov default: 515436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vpanic("mapRegs_ARM64RIA"); 516436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 517436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov} 518436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 519436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 520436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov/* --------- Reg or "bitfield" (logic immediate) operands --------- */ 521436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 522436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovARM64RIL* ARM64RIL_I13 ( UChar bitN, UChar immR, UChar immS ) { 523436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ARM64RIL* riL = LibVEX_Alloc(sizeof(ARM64RIL)); 524436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov riL->tag = ARM64riL_I13; 525436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov riL->ARM64riL.I13.bitN = bitN; 526436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov riL->ARM64riL.I13.immR = immR; 527436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov riL->ARM64riL.I13.immS = immS; 528436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(bitN < 2); 529436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(immR < 64); 530436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(immS < 64); 531436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return riL; 532436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov} 533436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovARM64RIL* ARM64RIL_R ( HReg reg ) { 534436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ARM64RIL* riL = LibVEX_Alloc(sizeof(ARM64RIL)); 535436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov riL->tag = ARM64riL_R; 536436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov riL->ARM64riL.R.reg = reg; 537436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return riL; 538436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov} 539436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 540436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic void ppARM64RIL ( ARM64RIL* riL ) { 541436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov switch (riL->tag) { 542436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64riL_I13: 543436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vex_printf("#nrs(%u,%u,%u)", 544436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov (UInt)riL->ARM64riL.I13.bitN, 545436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov (UInt)riL->ARM64riL.I13.immR, 546436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov (UInt)riL->ARM64riL.I13.immS); 547436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov break; 548436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64riL_R: 549436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ppHRegARM64(riL->ARM64riL.R.reg); 550436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov break; 551436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov default: 552436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(0); 553436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 554436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov} 555436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 556436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic void addRegUsage_ARM64RIL ( HRegUsage* u, ARM64RIL* riL ) { 557436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov switch (riL->tag) { 558436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64riL_I13: 559436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return; 560436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64riL_R: 561436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov addHRegUse(u, HRmRead, riL->ARM64riL.R.reg); 562436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return; 563436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov default: 564436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vpanic("addRegUsage_ARM64RIL"); 565436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 566436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov} 567436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 568436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic void mapRegs_ARM64RIL ( HRegRemap* m, ARM64RIL* riL ) { 569436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov switch (riL->tag) { 570436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64riL_I13: 571436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return; 572436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64riL_R: 573436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov riL->ARM64riL.R.reg = lookupHRegRemap(m, riL->ARM64riL.R.reg); 574436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return; 575436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov default: 576436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vpanic("mapRegs_ARM64RIL"); 577436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 578436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov} 579436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 580436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 581436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov/* --------------- Reg or uimm6 operands --------------- */ 582436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 583436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovARM64RI6* ARM64RI6_I6 ( UInt imm6 ) { 584436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ARM64RI6* ri6 = LibVEX_Alloc(sizeof(ARM64RI6)); 585436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ri6->tag = ARM64ri6_I6; 586436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ri6->ARM64ri6.I6.imm6 = imm6; 587436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(imm6 > 0 && imm6 < 64); 588436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return ri6; 589436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov} 590436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovARM64RI6* ARM64RI6_R ( HReg reg ) { 591436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ARM64RI6* ri6 = LibVEX_Alloc(sizeof(ARM64RI6)); 592436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ri6->tag = ARM64ri6_R; 593436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ri6->ARM64ri6.R.reg = reg; 594436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return ri6; 595436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov} 596436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 597436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic void ppARM64RI6 ( ARM64RI6* ri6 ) { 598436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov switch (ri6->tag) { 599436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64ri6_I6: 600436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vex_printf("#%u", ri6->ARM64ri6.I6.imm6); 601436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov break; 602436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64ri6_R: 603436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ppHRegARM64(ri6->ARM64ri6.R.reg); 604436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov break; 605436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov default: 606436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(0); 607436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 608436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov} 609436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 610436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic void addRegUsage_ARM64RI6 ( HRegUsage* u, ARM64RI6* ri6 ) { 611436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov switch (ri6->tag) { 612436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64ri6_I6: 613436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return; 614436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64ri6_R: 615436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov addHRegUse(u, HRmRead, ri6->ARM64ri6.R.reg); 616436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return; 617436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov default: 618436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vpanic("addRegUsage_ARM64RI6"); 619436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 620436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov} 621436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 622436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic void mapRegs_ARM64RI6 ( HRegRemap* m, ARM64RI6* ri6 ) { 623436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov switch (ri6->tag) { 624436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64ri6_I6: 625436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return; 626436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64ri6_R: 627436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ri6->ARM64ri6.R.reg = lookupHRegRemap(m, ri6->ARM64ri6.R.reg); 628436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return; 629436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov default: 630436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vpanic("mapRegs_ARM64RI6"); 631436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 632436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov} 633436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 634436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 635436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ /* -------- Neon Immediate operatnd --------- */ 636436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ 637436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ ARMNImm* ARMNImm_TI ( UInt type, UInt imm8 ) { 638436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ ARMNImm* i = LibVEX_Alloc(sizeof(ARMNImm)); 639436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ i->type = type; 640436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ i->imm8 = imm8; 641436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ return i; 642436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ } 643436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ 644436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ ULong ARMNImm_to_Imm64 ( ARMNImm* imm ) { 645436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ int i, j; 646436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ ULong y, x = imm->imm8; 647436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ switch (imm->type) { 648436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case 3: 649436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ x = x << 8; /* fallthrough */ 650436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case 2: 651436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ x = x << 8; /* fallthrough */ 652436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case 1: 653436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ x = x << 8; /* fallthrough */ 654436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case 0: 655436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ return (x << 32) | x; 656436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case 5: 657436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case 6: 658436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ if (imm->type == 5) 659436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ x = x << 8; 660436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ else 661436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ x = (x << 8) | x; 662436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ /* fallthrough */ 663436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case 4: 664436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ x = (x << 16) | x; 665436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ return (x << 32) | x; 666436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case 8: 667436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ x = (x << 8) | 0xFF; 668436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ /* fallthrough */ 669436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case 7: 670436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ x = (x << 8) | 0xFF; 671436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ return (x << 32) | x; 672436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case 9: 673436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ x = 0; 674436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ for (i = 7; i >= 0; i--) { 675436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ y = ((ULong)imm->imm8 >> i) & 1; 676436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ for (j = 0; j < 8; j++) { 677436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ x = (x << 1) | y; 678436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ } 679436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ } 680436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ return x; 681436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case 10: 682436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ x |= (x & 0x80) << 5; 683436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ x |= (~x & 0x40) << 5; 684436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ x &= 0x187F; /* 0001 1000 0111 1111 */ 685436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ x |= (x & 0x40) << 4; 686436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ x |= (x & 0x40) << 3; 687436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ x |= (x & 0x40) << 2; 688436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ x |= (x & 0x40) << 1; 689436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ x = x << 19; 690436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ x = (x << 32) | x; 691436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ return x; 692436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ default: 693436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ vpanic("ARMNImm_to_Imm64"); 694436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ } 695436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ } 696436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ 697436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ ARMNImm* Imm64_to_ARMNImm ( ULong x ) { 698436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ ARMNImm tmp; 699436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ if ((x & 0xFFFFFFFF) == (x >> 32)) { 700436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ if ((x & 0xFFFFFF00) == 0) 701436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ return ARMNImm_TI(0, x & 0xFF); 702436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ if ((x & 0xFFFF00FF) == 0) 703436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ return ARMNImm_TI(1, (x >> 8) & 0xFF); 704436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ if ((x & 0xFF00FFFF) == 0) 705436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ return ARMNImm_TI(2, (x >> 16) & 0xFF); 706436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ if ((x & 0x00FFFFFF) == 0) 707436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ return ARMNImm_TI(3, (x >> 24) & 0xFF); 708436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ if ((x & 0xFFFF00FF) == 0xFF) 709436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ return ARMNImm_TI(7, (x >> 8) & 0xFF); 710436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ if ((x & 0xFF00FFFF) == 0xFFFF) 711436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ return ARMNImm_TI(8, (x >> 16) & 0xFF); 712436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ if ((x & 0xFFFF) == ((x >> 16) & 0xFFFF)) { 713436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ if ((x & 0xFF00) == 0) 714436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ return ARMNImm_TI(4, x & 0xFF); 715436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ if ((x & 0x00FF) == 0) 716436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ return ARMNImm_TI(5, (x >> 8) & 0xFF); 717436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ if ((x & 0xFF) == ((x >> 8) & 0xFF)) 718436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ return ARMNImm_TI(6, x & 0xFF); 719436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ } 720436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ if ((x & 0x7FFFF) == 0) { 721436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ tmp.type = 10; 722436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ tmp.imm8 = ((x >> 19) & 0x7F) | ((x >> 24) & 0x80); 723436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ if (ARMNImm_to_Imm64(&tmp) == x) 724436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ return ARMNImm_TI(tmp.type, tmp.imm8); 725436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ } 726436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ } else { 727436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ /* This can only be type 9. */ 728436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ tmp.imm8 = (((x >> 56) & 1) << 7) 729436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ | (((x >> 48) & 1) << 6) 730436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ | (((x >> 40) & 1) << 5) 731436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ | (((x >> 32) & 1) << 4) 732436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ | (((x >> 24) & 1) << 3) 733436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ | (((x >> 16) & 1) << 2) 734436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ | (((x >> 8) & 1) << 1) 735436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ | (((x >> 0) & 1) << 0); 736436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ tmp.type = 9; 737436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ if (ARMNImm_to_Imm64 (&tmp) == x) 738436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ return ARMNImm_TI(tmp.type, tmp.imm8); 739436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ } 740436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ return NULL; 741436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ } 742436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ 743436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ void ppARMNImm (ARMNImm* i) { 744436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ ULong x = ARMNImm_to_Imm64(i); 745436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ vex_printf("0x%llX%llX", x, x); 746436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ } 747436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ 748436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ /* -- Register or scalar operand --- */ 749436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ 750436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ ARMNRS* mkARMNRS(ARMNRS_tag tag, HReg reg, UInt index) 751436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ { 752436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ ARMNRS *p = LibVEX_Alloc(sizeof(ARMNRS)); 753436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ p->tag = tag; 754436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ p->reg = reg; 755436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ p->index = index; 756436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ return p; 757436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ } 758436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ 759436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ void ppARMNRS(ARMNRS *p) 760436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ { 761436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ ppHRegARM(p->reg); 762436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ if (p->tag == ARMNRS_Scalar) { 763436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ vex_printf("[%d]", p->index); 764436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ } 765436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ } 766436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 767436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov/* --------- Instructions. --------- */ 768436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 769436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar* showARM64LogicOp ( ARM64LogicOp op ) { 770436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov switch (op) { 771436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64lo_AND: return "and"; 772436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64lo_OR: return "orr"; 773436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64lo_XOR: return "eor"; 774436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov default: vpanic("showARM64LogicOp"); 775436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 776436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov} 777436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 778436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar* showARM64ShiftOp ( ARM64ShiftOp op ) { 779436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov switch (op) { 780436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64sh_SHL: return "lsl"; 781436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64sh_SHR: return "lsr"; 782436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64sh_SAR: return "asr"; 783436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov default: vpanic("showARM64ShiftOp"); 784436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 785436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov} 786436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 787436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar* showARM64UnaryOp ( ARM64UnaryOp op ) { 788436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov switch (op) { 789436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64un_NEG: return "neg"; 790436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64un_NOT: return "not"; 791436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64un_CLZ: return "clz"; 792436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov default: vpanic("showARM64UnaryOp"); 793436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 794436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov} 795436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 796436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar* showARM64MulOp ( ARM64MulOp op ) { 797436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov switch (op) { 798436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64mul_PLAIN: return "mul "; 799436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64mul_ZX: return "umulh"; 800436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64mul_SX: return "smulh"; 801436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov default: vpanic("showARM64MulOp"); 802436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 803436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov} 804436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 805436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic void characteriseARM64CvtOp ( /*OUT*/HChar* syn, 806436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /*OUT*/UInt* fszB, /*OUT*/UInt* iszB, 807436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ARM64CvtOp op ) { 808436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov switch (op) { 809436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64cvt_F32_I32S: 810436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov *syn = 's'; *fszB = 4; *iszB = 4; break; 811436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64cvt_F64_I32S: 812436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov *syn = 's'; *fszB = 8; *iszB = 4; break; 813436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64cvt_F32_I64S: 814436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov *syn = 's'; *fszB = 4; *iszB = 8; break; 815436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64cvt_F64_I64S: 816436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov *syn = 's'; *fszB = 8; *iszB = 8; break; 817436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64cvt_F32_I32U: 818436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov *syn = 'u'; *fszB = 4; *iszB = 4; break; 819436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64cvt_F64_I32U: 820436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov *syn = 'u'; *fszB = 8; *iszB = 4; break; 821436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64cvt_F32_I64U: 822436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov *syn = 'u'; *fszB = 4; *iszB = 8; break; 823436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64cvt_F64_I64U: 824436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov *syn = 'u'; *fszB = 8; *iszB = 8; break; 825436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov default: 826436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vpanic("characteriseARM64CvtOp"); 827436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 828436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov} 829436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 830436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar* showARM64FpBinOp ( ARM64FpBinOp op ) { 831436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov switch (op) { 832436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64fpb_ADD: return "add"; 833436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64fpb_SUB: return "sub"; 834436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64fpb_MUL: return "mul"; 835436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64fpb_DIV: return "div"; 836436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov default: vpanic("showARM64FpBinOp"); 837436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 838436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov} 839436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 840436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar* showARM64FpUnaryOp ( ARM64FpUnaryOp op ) { 841436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov switch (op) { 842436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64fpu_NEG: return "neg "; 843436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64fpu_ABS: return "abs "; 844436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64fpu_SQRT: return "sqrt "; 845436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64fpu_RINT: return "rinti"; 846436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov default: vpanic("showARM64FpUnaryOp"); 847436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 848436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov} 849436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 850436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic void showARM64VecBinOp(/*OUT*/const HChar** nm, 851436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /*OUT*/const HChar** ar, ARM64VecBinOp op ) { 852436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov switch (op) { 853eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov case ARM64vecb_ADD64x2: *nm = "add "; *ar = "2d"; return; 854eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov case ARM64vecb_ADD32x4: *nm = "add "; *ar = "4s"; return; 855eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov case ARM64vecb_ADD16x8: *nm = "add "; *ar = "8h"; return; 856eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov case ARM64vecb_ADD8x16: *nm = "add "; *ar = "16b"; return; 857eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov case ARM64vecb_SUB64x2: *nm = "sub "; *ar = "2d"; return; 858eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov case ARM64vecb_SUB32x4: *nm = "sub "; *ar = "4s"; return; 859eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov case ARM64vecb_SUB16x8: *nm = "sub "; *ar = "8h"; return; 860eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov case ARM64vecb_SUB8x16: *nm = "sub "; *ar = "16b"; return; 861eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov case ARM64vecb_MUL32x4: *nm = "mul "; *ar = "4s"; return; 862eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov case ARM64vecb_MUL16x8: *nm = "mul "; *ar = "8h"; return; 863eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov case ARM64vecb_MUL8x16: *nm = "mul "; *ar = "16b"; return; 864eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov case ARM64vecb_FADD64x2: *nm = "fadd"; *ar = "2d"; return; 865eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov case ARM64vecb_FSUB64x2: *nm = "fsub"; *ar = "2d"; return; 866eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov case ARM64vecb_FMUL64x2: *nm = "fmul"; *ar = "2d"; return; 867eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov case ARM64vecb_FDIV64x2: *nm = "fdiv"; *ar = "2d"; return; 868eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov case ARM64vecb_FADD32x4: *nm = "fadd"; *ar = "4s"; return; 869eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov case ARM64vecb_FSUB32x4: *nm = "fsub"; *ar = "4s"; return; 870eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov case ARM64vecb_FMUL32x4: *nm = "fmul"; *ar = "4s"; return; 871eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov case ARM64vecb_FDIV32x4: *nm = "fdiv"; *ar = "4s"; return; 872eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov case ARM64vecb_UMAX32x4: *nm = "umax"; *ar = "4s"; return; 873eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov case ARM64vecb_UMAX16x8: *nm = "umax"; *ar = "8h"; return; 874eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov case ARM64vecb_UMAX8x16: *nm = "umax"; *ar = "16b"; return; 875eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov case ARM64vecb_UMIN32x4: *nm = "umin"; *ar = "4s"; return; 876eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov case ARM64vecb_UMIN16x8: *nm = "umin"; *ar = "8h"; return; 877eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov case ARM64vecb_UMIN8x16: *nm = "umin"; *ar = "16b"; return; 8780a8046eb0993fb7e155b03cc5ef3323fca3467c0Dmitriy Ivanov case ARM64vecb_UMULL32x2: *nm = "umull"; *ar = "2d"; return; 8790a8046eb0993fb7e155b03cc5ef3323fca3467c0Dmitriy Ivanov case ARM64vecb_UMULL16x4: *nm = "umull"; *ar = "4s"; return; 8800a8046eb0993fb7e155b03cc5ef3323fca3467c0Dmitriy Ivanov case ARM64vecb_UMULL8x8: *nm = "umull"; *ar = "8b"; return; 881eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov case ARM64vecb_SMAX32x4: *nm = "smax"; *ar = "4s"; return; 882eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov case ARM64vecb_SMAX16x8: *nm = "smax"; *ar = "8h"; return; 883eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov case ARM64vecb_SMAX8x16: *nm = "smax"; *ar = "16b"; return; 884eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov case ARM64vecb_SMIN32x4: *nm = "smin"; *ar = "4s"; return; 885eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov case ARM64vecb_SMIN16x8: *nm = "smin"; *ar = "8h"; return; 886eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov case ARM64vecb_SMIN8x16: *nm = "smin"; *ar = "16b"; return; 887eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov case ARM64vecb_AND: *nm = "and "; *ar = "all"; return; 888eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov case ARM64vecb_ORR: *nm = "orr "; *ar = "all"; return; 889eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov case ARM64vecb_XOR: *nm = "eor "; *ar = "all"; return; 890eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov case ARM64vecb_CMEQ64x2: *nm = "cmeq"; *ar = "2d"; return; 891eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov case ARM64vecb_CMEQ32x4: *nm = "cmeq"; *ar = "4s"; return; 892eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov case ARM64vecb_CMEQ16x8: *nm = "cmeq"; *ar = "8h"; return; 893eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov case ARM64vecb_CMEQ8x16: *nm = "cmeq"; *ar = "16b"; return; 894eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov case ARM64vecb_CMHI64x2: *nm = "cmhi"; *ar = "2d"; return; 895eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov case ARM64vecb_CMHI32x4: *nm = "cmhi"; *ar = "4s"; return; 896eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov case ARM64vecb_CMHI16x8: *nm = "cmhi"; *ar = "8h"; return; 897eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov case ARM64vecb_CMHI8x16: *nm = "cmhi"; *ar = "16b"; return; 898eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov case ARM64vecb_CMGT64x2: *nm = "cmgt"; *ar = "2d"; return; 899eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov case ARM64vecb_CMGT32x4: *nm = "cmgt"; *ar = "4s"; return; 900eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov case ARM64vecb_CMGT16x8: *nm = "cmgt"; *ar = "8h"; return; 901eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov case ARM64vecb_CMGT8x16: *nm = "cmgt"; *ar = "16b"; return; 902eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov case ARM64vecb_FCMEQ64x2: *nm = "fcmeq"; *ar = "2d"; return; 903eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov case ARM64vecb_FCMEQ32x4: *nm = "fcmeq"; *ar = "4s"; return; 904eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov case ARM64vecb_FCMGE64x2: *nm = "fcmge"; *ar = "2d"; return; 905eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov case ARM64vecb_FCMGE32x4: *nm = "fcmge"; *ar = "4s"; return; 906eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov case ARM64vecb_FCMGT64x2: *nm = "fcmgt"; *ar = "2d"; return; 907eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov case ARM64vecb_FCMGT32x4: *nm = "fcmgt"; *ar = "4s"; return; 908eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov case ARM64vecb_TBL1: *nm = "tbl "; *ar = "16b"; return; 909436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov default: vpanic("showARM64VecBinOp"); 910436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 911436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov} 912436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 913436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic void showARM64VecUnaryOp(/*OUT*/const HChar** nm, 914436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /*OUT*/const HChar** ar, ARM64VecUnaryOp op ) 915436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{ 916436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov switch (op) { 917051d3b5d6376aa10a65793c3c2267d6ab233b896Dmitriy Ivanov case ARM64vecu_FNEG64x2: *nm = "fneg "; *ar = "2d"; return; 918051d3b5d6376aa10a65793c3c2267d6ab233b896Dmitriy Ivanov case ARM64vecu_FNEG32x4: *nm = "fneg "; *ar = "4s"; return; 919051d3b5d6376aa10a65793c3c2267d6ab233b896Dmitriy Ivanov case ARM64vecu_FABS64x2: *nm = "fabs "; *ar = "2d"; return; 920051d3b5d6376aa10a65793c3c2267d6ab233b896Dmitriy Ivanov case ARM64vecu_FABS32x4: *nm = "fabs "; *ar = "4s"; return; 9210a8046eb0993fb7e155b03cc5ef3323fca3467c0Dmitriy Ivanov case ARM64vecu_VMOVL8U: *nm = "vmovl.u8"; *ar = "all"; return; 9220a8046eb0993fb7e155b03cc5ef3323fca3467c0Dmitriy Ivanov case ARM64vecu_VMOVL16U: *nm = "vmovl.u16"; *ar = "all"; return; 9230a8046eb0993fb7e155b03cc5ef3323fca3467c0Dmitriy Ivanov case ARM64vecu_VMOVL32U: *nm = "vmovl.u32"; *ar = "all"; return; 9240a8046eb0993fb7e155b03cc5ef3323fca3467c0Dmitriy Ivanov case ARM64vecu_VMOVL8S: *nm = "vmovl.s8"; *ar = "all"; return; 9250a8046eb0993fb7e155b03cc5ef3323fca3467c0Dmitriy Ivanov case ARM64vecu_VMOVL16S: *nm = "vmovl.s16"; *ar = "all"; return; 9260a8046eb0993fb7e155b03cc5ef3323fca3467c0Dmitriy Ivanov case ARM64vecu_VMOVL32S: *nm = "vmovl.s32"; *ar = "all"; return; 927051d3b5d6376aa10a65793c3c2267d6ab233b896Dmitriy Ivanov case ARM64vecu_NOT: *nm = "not "; *ar = "all"; return; 928051d3b5d6376aa10a65793c3c2267d6ab233b896Dmitriy Ivanov case ARM64vecu_CNT: *nm = "cnt "; *ar = "16b"; return; 929051d3b5d6376aa10a65793c3c2267d6ab233b896Dmitriy Ivanov case ARM64vecu_UADDLV8x16: *nm = "uaddlv "; *ar = "16b"; return; 930051d3b5d6376aa10a65793c3c2267d6ab233b896Dmitriy Ivanov case ARM64vecu_UADDLV16x8: *nm = "uaddlv "; *ar = "8h"; return; 931051d3b5d6376aa10a65793c3c2267d6ab233b896Dmitriy Ivanov case ARM64vecu_UADDLV32x4: *nm = "uaddlv "; *ar = "4s"; return; 932051d3b5d6376aa10a65793c3c2267d6ab233b896Dmitriy Ivanov case ARM64vecu_SADDLV8x16: *nm = "saddlv "; *ar = "16b"; return; 933051d3b5d6376aa10a65793c3c2267d6ab233b896Dmitriy Ivanov case ARM64vecu_SADDLV16x8: *nm = "saddlv "; *ar = "8h"; return; 934051d3b5d6376aa10a65793c3c2267d6ab233b896Dmitriy Ivanov case ARM64vecu_SADDLV32x4: *nm = "saddlv "; *ar = "4s"; return; 935436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov default: vpanic("showARM64VecUnaryOp"); 936436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 937436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov} 938436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 939436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic void showARM64VecShiftOp(/*OUT*/const HChar** nm, 940436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /*OUT*/const HChar** ar, 941436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ARM64VecShiftOp op ) 942436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{ 943436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov switch (op) { 944436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64vecsh_USHR64x2: *nm = "ushr "; *ar = "2d"; return; 945eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov case ARM64vecsh_USHR32x4: *nm = "ushr "; *ar = "4s"; return; 9462ca80a6a6fc069acdb73186e8e578dbf8f46af80Dmitriy Ivanov case ARM64vecsh_USHR16x8: *nm = "ushr "; *ar = "8h"; return; 947eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov case ARM64vecsh_USHR8x16: *nm = "ushr "; *ar = "16b"; return; 948436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64vecsh_SSHR64x2: *nm = "sshr "; *ar = "2d"; return; 949eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov case ARM64vecsh_SSHR32x4: *nm = "sshr "; *ar = "4s"; return; 950eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov case ARM64vecsh_SSHR16x8: *nm = "sshr "; *ar = "8h"; return; 951eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov case ARM64vecsh_SSHR8x16: *nm = "sshr "; *ar = "16b"; return; 952eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov case ARM64vecsh_SHL64x2: *nm = "shl "; *ar = "2d"; return; 953436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64vecsh_SHL32x4: *nm = "shl "; *ar = "4s"; return; 954eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov case ARM64vecsh_SHL16x8: *nm = "shl "; *ar = "8h"; return; 955eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov case ARM64vecsh_SHL8x16: *nm = "shl "; *ar = "16b"; return; 956436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov default: vpanic("showARM64VecShiftImmOp"); 957436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 958436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov} 959436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 960436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ const HChar* showARMNeonBinOp ( ARMNeonBinOp op ) { 961436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ switch (op) { 962436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_VAND: return "vand"; 963436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_VORR: return "vorr"; 964436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_VXOR: return "veor"; 965436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_VADD: return "vadd"; 966436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_VRHADDS: return "vrhadd"; 967436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_VRHADDU: return "vrhadd"; 968436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_VADDFP: return "vadd"; 969436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_VPADDFP: return "vpadd"; 970436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_VABDFP: return "vabd"; 971436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_VSUB: return "vsub"; 972436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_VSUBFP: return "vsub"; 973436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_VMINU: return "vmin"; 974436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_VMINS: return "vmin"; 975436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_VMINF: return "vmin"; 976436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_VMAXU: return "vmax"; 977436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_VMAXS: return "vmax"; 978436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_VMAXF: return "vmax"; 979436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_VQADDU: return "vqadd"; 980436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_VQADDS: return "vqadd"; 981436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_VQSUBU: return "vqsub"; 982436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_VQSUBS: return "vqsub"; 983436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_VCGTU: return "vcgt"; 984436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_VCGTS: return "vcgt"; 985436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_VCGTF: return "vcgt"; 986436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_VCGEF: return "vcgt"; 987436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_VCGEU: return "vcge"; 988436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_VCGES: return "vcge"; 989436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_VCEQ: return "vceq"; 990436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_VCEQF: return "vceq"; 991436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_VPADD: return "vpadd"; 992436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_VPMINU: return "vpmin"; 993436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_VPMINS: return "vpmin"; 994436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_VPMINF: return "vpmin"; 995436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_VPMAXU: return "vpmax"; 996436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_VPMAXS: return "vpmax"; 997436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_VPMAXF: return "vpmax"; 998436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_VEXT: return "vext"; 999436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_VMUL: return "vmuli"; 1000436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_VMULLU: return "vmull"; 1001436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_VMULLS: return "vmull"; 1002436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_VMULP: return "vmul"; 1003436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_VMULFP: return "vmul"; 1004436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_VMULLP: return "vmul"; 1005436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_VQDMULH: return "vqdmulh"; 1006436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_VQRDMULH: return "vqrdmulh"; 1007436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_VQDMULL: return "vqdmull"; 1008436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_VTBL: return "vtbl"; 1009436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_VRECPS: return "vrecps"; 1010436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_VRSQRTS: return "vrecps"; 1011436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ /* ... */ 1012436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ default: vpanic("showARMNeonBinOp"); 1013436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ } 1014436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ } 1015436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ 1016436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ const HChar* showARMNeonBinOpDataType ( ARMNeonBinOp op ) { 1017436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ switch (op) { 1018436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_VAND: 1019436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_VORR: 1020436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_VXOR: 1021436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ return ""; 1022436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_VADD: 1023436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_VSUB: 1024436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_VEXT: 1025436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_VMUL: 1026436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_VPADD: 1027436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_VTBL: 1028436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_VCEQ: 1029436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ return ".i"; 1030436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_VRHADDU: 1031436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_VMINU: 1032436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_VMAXU: 1033436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_VQADDU: 1034436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_VQSUBU: 1035436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_VCGTU: 1036436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_VCGEU: 1037436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_VMULLU: 1038436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_VPMINU: 1039436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_VPMAXU: 1040436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ return ".u"; 1041436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_VRHADDS: 1042436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_VMINS: 1043436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_VMAXS: 1044436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_VQADDS: 1045436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_VQSUBS: 1046436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_VCGTS: 1047436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_VCGES: 1048436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_VQDMULL: 1049436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_VMULLS: 1050436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_VPMINS: 1051436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_VPMAXS: 1052436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_VQDMULH: 1053436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_VQRDMULH: 1054436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ return ".s"; 1055436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_VMULP: 1056436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_VMULLP: 1057436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ return ".p"; 1058436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_VADDFP: 1059436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_VABDFP: 1060436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_VPADDFP: 1061436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_VSUBFP: 1062436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_VMULFP: 1063436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_VMINF: 1064436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_VMAXF: 1065436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_VPMINF: 1066436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_VPMAXF: 1067436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_VCGTF: 1068436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_VCGEF: 1069436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_VCEQF: 1070436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_VRECPS: 1071436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_VRSQRTS: 1072436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ return ".f"; 1073436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ /* ... */ 1074436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ default: vpanic("showARMNeonBinOpDataType"); 1075436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ } 1076436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ } 1077436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ 1078436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ const HChar* showARMNeonUnOp ( ARMNeonUnOp op ) { 1079436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ switch (op) { 1080436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_COPY: return "vmov"; 1081436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_COPYLS: return "vmov"; 1082436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_COPYLU: return "vmov"; 1083436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_COPYN: return "vmov"; 1084436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_COPYQNSS: return "vqmovn"; 1085436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_COPYQNUS: return "vqmovun"; 1086436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_COPYQNUU: return "vqmovn"; 1087436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_NOT: return "vmvn"; 1088436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_EQZ: return "vceq"; 1089436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_CNT: return "vcnt"; 1090436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_CLS: return "vcls"; 1091436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_CLZ: return "vclz"; 1092436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_DUP: return "vdup"; 1093436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_PADDLS: return "vpaddl"; 1094436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_PADDLU: return "vpaddl"; 1095436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_VQSHLNSS: return "vqshl"; 1096436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_VQSHLNUU: return "vqshl"; 1097436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_VQSHLNUS: return "vqshlu"; 1098436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_REV16: return "vrev16"; 1099436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_REV32: return "vrev32"; 1100436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_REV64: return "vrev64"; 1101436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_VCVTFtoU: return "vcvt"; 1102436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_VCVTFtoS: return "vcvt"; 1103436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_VCVTUtoF: return "vcvt"; 1104436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_VCVTStoF: return "vcvt"; 1105436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_VCVTFtoFixedU: return "vcvt"; 1106436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_VCVTFtoFixedS: return "vcvt"; 1107436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_VCVTFixedUtoF: return "vcvt"; 1108436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_VCVTFixedStoF: return "vcvt"; 1109436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_VCVTF32toF16: return "vcvt"; 1110436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_VCVTF16toF32: return "vcvt"; 1111436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_VRECIP: return "vrecip"; 1112436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_VRECIPF: return "vrecipf"; 1113436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_VNEGF: return "vneg"; 1114436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_ABS: return "vabs"; 1115436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_VABSFP: return "vabsfp"; 1116436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_VRSQRTEFP: return "vrsqrtefp"; 1117436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_VRSQRTE: return "vrsqrte"; 1118436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ /* ... */ 1119436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ default: vpanic("showARMNeonUnOp"); 1120436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ } 1121436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ } 1122436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ 1123436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ const HChar* showARMNeonUnOpDataType ( ARMNeonUnOp op ) { 1124436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ switch (op) { 1125436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_COPY: 1126436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_NOT: 1127436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ return ""; 1128436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_COPYN: 1129436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_EQZ: 1130436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_CNT: 1131436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_DUP: 1132436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_REV16: 1133436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_REV32: 1134436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_REV64: 1135436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ return ".i"; 1136436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_COPYLU: 1137436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_PADDLU: 1138436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_COPYQNUU: 1139436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_VQSHLNUU: 1140436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_VRECIP: 1141436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_VRSQRTE: 1142436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ return ".u"; 1143436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_CLS: 1144436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_CLZ: 1145436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_COPYLS: 1146436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_PADDLS: 1147436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_COPYQNSS: 1148436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_COPYQNUS: 1149436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_VQSHLNSS: 1150436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_VQSHLNUS: 1151436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_ABS: 1152436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ return ".s"; 1153436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_VRECIPF: 1154436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_VNEGF: 1155436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_VABSFP: 1156436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_VRSQRTEFP: 1157436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ return ".f"; 1158436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_VCVTFtoU: return ".u32.f32"; 1159436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_VCVTFtoS: return ".s32.f32"; 1160436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_VCVTUtoF: return ".f32.u32"; 1161436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_VCVTStoF: return ".f32.s32"; 1162436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_VCVTF16toF32: return ".f32.f16"; 1163436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_VCVTF32toF16: return ".f16.f32"; 1164436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_VCVTFtoFixedU: return ".u32.f32"; 1165436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_VCVTFtoFixedS: return ".s32.f32"; 1166436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_VCVTFixedUtoF: return ".f32.u32"; 1167436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_VCVTFixedStoF: return ".f32.s32"; 1168436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ /* ... */ 1169436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ default: vpanic("showARMNeonUnOpDataType"); 1170436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ } 1171436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ } 1172436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ 1173436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ const HChar* showARMNeonUnOpS ( ARMNeonUnOpS op ) { 1174436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ switch (op) { 1175436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_SETELEM: return "vmov"; 1176436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_GETELEMU: return "vmov"; 1177436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_GETELEMS: return "vmov"; 1178436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_VDUP: return "vdup"; 1179436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ /* ... */ 1180436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ default: vpanic("showARMNeonUnarySOp"); 1181436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ } 1182436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ } 1183436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ 1184436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ const HChar* showARMNeonUnOpSDataType ( ARMNeonUnOpS op ) { 1185436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ switch (op) { 1186436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_SETELEM: 1187436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_VDUP: 1188436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ return ".i"; 1189436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_GETELEMS: 1190436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ return ".s"; 1191436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_GETELEMU: 1192436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ return ".u"; 1193436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ /* ... */ 1194436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ default: vpanic("showARMNeonUnarySOp"); 1195436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ } 1196436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ } 1197436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ 1198436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ const HChar* showARMNeonShiftOp ( ARMNeonShiftOp op ) { 1199436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ switch (op) { 1200436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_VSHL: return "vshl"; 1201436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_VSAL: return "vshl"; 1202436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_VQSHL: return "vqshl"; 1203436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_VQSAL: return "vqshl"; 1204436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ /* ... */ 1205436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ default: vpanic("showARMNeonShiftOp"); 1206436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ } 1207436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ } 1208436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ 1209436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ const HChar* showARMNeonShiftOpDataType ( ARMNeonShiftOp op ) { 1210436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ switch (op) { 1211436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_VSHL: 1212436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_VQSHL: 1213436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ return ".u"; 1214436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_VSAL: 1215436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_VQSAL: 1216436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ return ".s"; 1217436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ /* ... */ 1218436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ default: vpanic("showARMNeonShiftOpDataType"); 1219436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ } 1220436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ } 1221436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ 1222436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ const HChar* showARMNeonDualOp ( ARMNeonDualOp op ) { 1223436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ switch (op) { 1224436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_TRN: return "vtrn"; 1225436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_ZIP: return "vzip"; 1226436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_UZP: return "vuzp"; 1227436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ /* ... */ 1228436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ default: vpanic("showARMNeonDualOp"); 1229436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ } 1230436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ } 1231436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ 1232436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ const HChar* showARMNeonDualOpDataType ( ARMNeonDualOp op ) { 1233436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ switch (op) { 1234436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_TRN: 1235436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_ZIP: 1236436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_UZP: 1237436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ return "i"; 1238436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ /* ... */ 1239436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ default: vpanic("showARMNeonDualOp"); 1240436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ } 1241436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ } 1242436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ 1243436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ static const HChar* showARMNeonDataSize_wrk ( UInt size ) 1244436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ { 1245436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ switch (size) { 1246436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case 0: return "8"; 1247436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case 1: return "16"; 1248436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case 2: return "32"; 1249436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case 3: return "64"; 1250436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ default: vpanic("showARMNeonDataSize"); 1251436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ } 1252436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ } 1253436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ 1254436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ static const HChar* showARMNeonDataSize ( ARMInstr* i ) 1255436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ { 1256436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ switch (i->tag) { 1257436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMin_NBinary: 1258436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ if (i->ARMin.NBinary.op == ARMneon_VEXT) 1259436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ return "8"; 1260436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ if (i->ARMin.NBinary.op == ARMneon_VAND || 1261436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ i->ARMin.NBinary.op == ARMneon_VORR || 1262436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ i->ARMin.NBinary.op == ARMneon_VXOR) 1263436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ return ""; 1264436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ return showARMNeonDataSize_wrk(i->ARMin.NBinary.size); 1265436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMin_NUnary: 1266436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ if (i->ARMin.NUnary.op == ARMneon_COPY || 1267436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ i->ARMin.NUnary.op == ARMneon_NOT || 1268436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ i->ARMin.NUnary.op == ARMneon_VCVTF32toF16|| 1269436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ i->ARMin.NUnary.op == ARMneon_VCVTF16toF32|| 1270436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ i->ARMin.NUnary.op == ARMneon_VCVTFtoFixedS || 1271436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ i->ARMin.NUnary.op == ARMneon_VCVTFtoFixedU || 1272436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ i->ARMin.NUnary.op == ARMneon_VCVTFixedStoF || 1273436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ i->ARMin.NUnary.op == ARMneon_VCVTFixedUtoF || 1274436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ i->ARMin.NUnary.op == ARMneon_VCVTFtoS || 1275436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ i->ARMin.NUnary.op == ARMneon_VCVTFtoU || 1276436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ i->ARMin.NUnary.op == ARMneon_VCVTStoF || 1277436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ i->ARMin.NUnary.op == ARMneon_VCVTUtoF) 1278436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ return ""; 1279436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ if (i->ARMin.NUnary.op == ARMneon_VQSHLNSS || 1280436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ i->ARMin.NUnary.op == ARMneon_VQSHLNUU || 1281436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ i->ARMin.NUnary.op == ARMneon_VQSHLNUS) { 1282436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ UInt size; 1283436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ size = i->ARMin.NUnary.size; 1284436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ if (size & 0x40) 1285436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ return "64"; 1286436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ if (size & 0x20) 1287436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ return "32"; 1288436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ if (size & 0x10) 1289436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ return "16"; 1290436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ if (size & 0x08) 1291436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ return "8"; 1292436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ vpanic("showARMNeonDataSize"); 1293436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ } 1294436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ return showARMNeonDataSize_wrk(i->ARMin.NUnary.size); 1295436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMin_NUnaryS: 1296436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ if (i->ARMin.NUnaryS.op == ARMneon_VDUP) { 1297436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ int size; 1298436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ size = i->ARMin.NUnaryS.size; 1299436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ if ((size & 1) == 1) 1300436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ return "8"; 1301436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ if ((size & 3) == 2) 1302436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ return "16"; 1303436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ if ((size & 7) == 4) 1304436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ return "32"; 1305436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ vpanic("showARMNeonDataSize"); 1306436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ } 1307436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ return showARMNeonDataSize_wrk(i->ARMin.NUnaryS.size); 1308436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMin_NShift: 1309436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ return showARMNeonDataSize_wrk(i->ARMin.NShift.size); 1310436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMin_NDual: 1311436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ return showARMNeonDataSize_wrk(i->ARMin.NDual.size); 1312436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ default: 1313436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ vpanic("showARMNeonDataSize"); 1314436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ } 1315436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ } 1316436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 1317436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovARM64Instr* ARM64Instr_Arith ( HReg dst, 1318436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov HReg argL, ARM64RIA* argR, Bool isAdd ) { 1319436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ARM64Instr* i = LibVEX_Alloc(sizeof(ARM64Instr)); 1320436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->tag = ARM64in_Arith; 1321436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->ARM64in.Arith.dst = dst; 1322436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->ARM64in.Arith.argL = argL; 1323436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->ARM64in.Arith.argR = argR; 1324436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->ARM64in.Arith.isAdd = isAdd; 1325436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return i; 1326436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov} 1327436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovARM64Instr* ARM64Instr_Cmp ( HReg argL, ARM64RIA* argR, Bool is64 ) { 1328436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ARM64Instr* i = LibVEX_Alloc(sizeof(ARM64Instr)); 1329436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->tag = ARM64in_Cmp; 1330436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->ARM64in.Cmp.argL = argL; 1331436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->ARM64in.Cmp.argR = argR; 1332436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->ARM64in.Cmp.is64 = is64; 1333436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return i; 1334436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov} 1335436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovARM64Instr* ARM64Instr_Logic ( HReg dst, 1336436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov HReg argL, ARM64RIL* argR, ARM64LogicOp op ) { 1337436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ARM64Instr* i = LibVEX_Alloc(sizeof(ARM64Instr)); 1338436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->tag = ARM64in_Logic; 1339436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->ARM64in.Logic.dst = dst; 1340436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->ARM64in.Logic.argL = argL; 1341436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->ARM64in.Logic.argR = argR; 1342436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->ARM64in.Logic.op = op; 1343436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return i; 1344436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov} 1345436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovARM64Instr* ARM64Instr_Test ( HReg argL, ARM64RIL* argR ) { 1346436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ARM64Instr* i = LibVEX_Alloc(sizeof(ARM64Instr)); 1347436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->tag = ARM64in_Test; 1348436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->ARM64in.Test.argL = argL; 1349436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->ARM64in.Test.argR = argR; 1350436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return i; 1351436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov} 1352436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovARM64Instr* ARM64Instr_Shift ( HReg dst, 1353436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov HReg argL, ARM64RI6* argR, ARM64ShiftOp op ) { 1354436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ARM64Instr* i = LibVEX_Alloc(sizeof(ARM64Instr)); 1355436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->tag = ARM64in_Shift; 1356436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->ARM64in.Shift.dst = dst; 1357436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->ARM64in.Shift.argL = argL; 1358436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->ARM64in.Shift.argR = argR; 1359436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->ARM64in.Shift.op = op; 1360436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return i; 1361436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov} 1362436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovARM64Instr* ARM64Instr_Unary ( HReg dst, HReg src, ARM64UnaryOp op ) { 1363436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ARM64Instr* i = LibVEX_Alloc(sizeof(ARM64Instr)); 1364436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->tag = ARM64in_Unary; 1365436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->ARM64in.Unary.dst = dst; 1366436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->ARM64in.Unary.src = src; 1367436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->ARM64in.Unary.op = op; 1368436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return i; 1369436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov} 1370436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovARM64Instr* ARM64Instr_MovI ( HReg dst, HReg src ) { 1371436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ARM64Instr* i = LibVEX_Alloc(sizeof(ARM64Instr)); 1372436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->tag = ARM64in_MovI; 1373436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->ARM64in.MovI.dst = dst; 1374436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->ARM64in.MovI.src = src; 1375436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(hregClass(src) == HRcInt64); 1376436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(hregClass(dst) == HRcInt64); 1377436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return i; 1378436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov} 1379436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovARM64Instr* ARM64Instr_Imm64 ( HReg dst, ULong imm64 ) { 1380436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ARM64Instr* i = LibVEX_Alloc(sizeof(ARM64Instr)); 1381436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->tag = ARM64in_Imm64; 1382436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->ARM64in.Imm64.dst = dst; 1383436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->ARM64in.Imm64.imm64 = imm64; 1384436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return i; 1385436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov} 1386436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovARM64Instr* ARM64Instr_LdSt64 ( Bool isLoad, HReg rD, ARM64AMode* amode ) { 1387436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ARM64Instr* i = LibVEX_Alloc(sizeof(ARM64Instr)); 1388436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->tag = ARM64in_LdSt64; 1389436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->ARM64in.LdSt64.isLoad = isLoad; 1390436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->ARM64in.LdSt64.rD = rD; 1391436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->ARM64in.LdSt64.amode = amode; 1392436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return i; 1393436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov} 1394436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovARM64Instr* ARM64Instr_LdSt32 ( Bool isLoad, HReg rD, ARM64AMode* amode ) { 1395436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ARM64Instr* i = LibVEX_Alloc(sizeof(ARM64Instr)); 1396436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->tag = ARM64in_LdSt32; 1397436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->ARM64in.LdSt32.isLoad = isLoad; 1398436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->ARM64in.LdSt32.rD = rD; 1399436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->ARM64in.LdSt32.amode = amode; 1400436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return i; 1401436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov} 1402436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovARM64Instr* ARM64Instr_LdSt16 ( Bool isLoad, HReg rD, ARM64AMode* amode ) { 1403436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ARM64Instr* i = LibVEX_Alloc(sizeof(ARM64Instr)); 1404436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->tag = ARM64in_LdSt16; 1405436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->ARM64in.LdSt16.isLoad = isLoad; 1406436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->ARM64in.LdSt16.rD = rD; 1407436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->ARM64in.LdSt16.amode = amode; 1408436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return i; 1409436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov} 1410436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovARM64Instr* ARM64Instr_LdSt8 ( Bool isLoad, HReg rD, ARM64AMode* amode ) { 1411436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ARM64Instr* i = LibVEX_Alloc(sizeof(ARM64Instr)); 1412436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->tag = ARM64in_LdSt8; 1413436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->ARM64in.LdSt8.isLoad = isLoad; 1414436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->ARM64in.LdSt8.rD = rD; 1415436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->ARM64in.LdSt8.amode = amode; 1416436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return i; 1417436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov} 1418436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovARM64Instr* ARM64Instr_XDirect ( Addr64 dstGA, ARM64AMode* amPC, 1419436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ARM64CondCode cond, Bool toFastEP ) { 1420436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ARM64Instr* i = LibVEX_Alloc(sizeof(ARM64Instr)); 1421436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->tag = ARM64in_XDirect; 1422436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->ARM64in.XDirect.dstGA = dstGA; 1423436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->ARM64in.XDirect.amPC = amPC; 1424436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->ARM64in.XDirect.cond = cond; 1425436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->ARM64in.XDirect.toFastEP = toFastEP; 1426436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return i; 1427436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov} 1428436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovARM64Instr* ARM64Instr_XIndir ( HReg dstGA, ARM64AMode* amPC, 1429436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ARM64CondCode cond ) { 1430436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ARM64Instr* i = LibVEX_Alloc(sizeof(ARM64Instr)); 1431436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->tag = ARM64in_XIndir; 1432436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->ARM64in.XIndir.dstGA = dstGA; 1433436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->ARM64in.XIndir.amPC = amPC; 1434436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->ARM64in.XIndir.cond = cond; 1435436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return i; 1436436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov} 1437436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovARM64Instr* ARM64Instr_XAssisted ( HReg dstGA, ARM64AMode* amPC, 1438436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ARM64CondCode cond, IRJumpKind jk ) { 1439436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ARM64Instr* i = LibVEX_Alloc(sizeof(ARM64Instr)); 1440436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->tag = ARM64in_XAssisted; 1441436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->ARM64in.XAssisted.dstGA = dstGA; 1442436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->ARM64in.XAssisted.amPC = amPC; 1443436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->ARM64in.XAssisted.cond = cond; 1444436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->ARM64in.XAssisted.jk = jk; 1445436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return i; 1446436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov} 1447436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovARM64Instr* ARM64Instr_CSel ( HReg dst, HReg argL, HReg argR, 1448436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ARM64CondCode cond ) { 1449436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ARM64Instr* i = LibVEX_Alloc(sizeof(ARM64Instr)); 1450436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->tag = ARM64in_CSel; 1451436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->ARM64in.CSel.dst = dst; 1452436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->ARM64in.CSel.argL = argL; 1453436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->ARM64in.CSel.argR = argR; 1454436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->ARM64in.CSel.cond = cond; 1455436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return i; 1456436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov} 1457436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovARM64Instr* ARM64Instr_Call ( ARM64CondCode cond, HWord target, Int nArgRegs, 1458436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov RetLoc rloc ) { 1459436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ARM64Instr* i = LibVEX_Alloc(sizeof(ARM64Instr)); 1460436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->tag = ARM64in_Call; 1461436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->ARM64in.Call.cond = cond; 1462436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->ARM64in.Call.target = target; 1463436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->ARM64in.Call.nArgRegs = nArgRegs; 1464436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->ARM64in.Call.rloc = rloc; 1465436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(is_sane_RetLoc(rloc)); 1466436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return i; 1467436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov} 1468436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovextern ARM64Instr* ARM64Instr_AddToSP ( Int simm ) { 1469436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ARM64Instr* i = LibVEX_Alloc(sizeof(ARM64Instr)); 1470436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->tag = ARM64in_AddToSP; 1471436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->ARM64in.AddToSP.simm = simm; 1472436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(-4096 < simm && simm < 4096); 1473436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(0 == (simm & 0xF)); 1474436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return i; 1475436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov} 1476436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovextern ARM64Instr* ARM64Instr_FromSP ( HReg dst ) { 1477436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ARM64Instr* i = LibVEX_Alloc(sizeof(ARM64Instr)); 1478436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->tag = ARM64in_FromSP; 1479436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->ARM64in.FromSP.dst = dst; 1480436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return i; 1481436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov} 1482436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovARM64Instr* ARM64Instr_Mul ( HReg dst, HReg argL, HReg argR, 1483436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ARM64MulOp op ) { 1484436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ARM64Instr* i = LibVEX_Alloc(sizeof(ARM64Instr)); 1485436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->tag = ARM64in_Mul; 1486436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->ARM64in.Mul.dst = dst; 1487436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->ARM64in.Mul.argL = argL; 1488436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->ARM64in.Mul.argR = argR; 1489436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->ARM64in.Mul.op = op; 1490436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return i; 1491436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov} 1492436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovARM64Instr* ARM64Instr_LdrEX ( Int szB ) { 1493436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ARM64Instr* i = LibVEX_Alloc(sizeof(ARM64Instr)); 1494436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->tag = ARM64in_LdrEX; 1495436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->ARM64in.LdrEX.szB = szB; 1496436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(szB == 8 || szB == 4 || szB == 2 || szB == 1); 1497436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return i; 1498436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov} 1499436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovARM64Instr* ARM64Instr_StrEX ( Int szB ) { 1500436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ARM64Instr* i = LibVEX_Alloc(sizeof(ARM64Instr)); 1501436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->tag = ARM64in_StrEX; 1502436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->ARM64in.StrEX.szB = szB; 1503436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(szB == 8 || szB == 4 || szB == 2 || szB == 1); 1504436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return i; 1505436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov} 1506436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovARM64Instr* ARM64Instr_MFence ( void ) { 1507436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ARM64Instr* i = LibVEX_Alloc(sizeof(ARM64Instr)); 1508436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->tag = ARM64in_MFence; 1509436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return i; 1510436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov} 1511436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ ARM64Instr* ARM64Instr_CLREX( void ) { 1512436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ ARM64Instr* i = LibVEX_Alloc(sizeof(ARM64Instr)); 1513436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ i->tag = ARM64in_CLREX; 1514436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ return i; 1515436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ } 1516436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovARM64Instr* ARM64Instr_VLdStS ( Bool isLoad, HReg sD, HReg rN, UInt uimm12 ) { 1517436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ARM64Instr* i = LibVEX_Alloc(sizeof(ARM64Instr)); 1518436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->tag = ARM64in_VLdStS; 1519436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->ARM64in.VLdStS.isLoad = isLoad; 1520436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->ARM64in.VLdStS.sD = sD; 1521436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->ARM64in.VLdStS.rN = rN; 1522436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->ARM64in.VLdStS.uimm12 = uimm12; 1523436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(uimm12 < 16384 && 0 == (uimm12 & 3)); 1524436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return i; 1525436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov} 1526436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovARM64Instr* ARM64Instr_VLdStD ( Bool isLoad, HReg dD, HReg rN, UInt uimm12 ) { 1527436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ARM64Instr* i = LibVEX_Alloc(sizeof(ARM64Instr)); 1528436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->tag = ARM64in_VLdStD; 1529436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->ARM64in.VLdStD.isLoad = isLoad; 1530436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->ARM64in.VLdStD.dD = dD; 1531436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->ARM64in.VLdStD.rN = rN; 1532436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->ARM64in.VLdStD.uimm12 = uimm12; 1533436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(uimm12 < 32768 && 0 == (uimm12 & 7)); 1534436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return i; 1535436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov} 1536436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovARM64Instr* ARM64Instr_VLdStQ ( Bool isLoad, HReg rQ, HReg rN ) { 1537436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ARM64Instr* i = LibVEX_Alloc(sizeof(ARM64Instr)); 1538436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->tag = ARM64in_VLdStQ; 1539436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->ARM64in.VLdStQ.isLoad = isLoad; 1540436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->ARM64in.VLdStQ.rQ = rQ; 1541436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->ARM64in.VLdStQ.rN = rN; 1542436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return i; 1543436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov} 1544436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovARM64Instr* ARM64Instr_VCvtI2F ( ARM64CvtOp how, HReg rD, HReg rS ) { 1545436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ARM64Instr* i = LibVEX_Alloc(sizeof(ARM64Instr)); 1546436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->tag = ARM64in_VCvtI2F; 1547436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->ARM64in.VCvtI2F.how = how; 1548436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->ARM64in.VCvtI2F.rD = rD; 1549436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->ARM64in.VCvtI2F.rS = rS; 1550436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return i; 1551436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov} 1552436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovARM64Instr* ARM64Instr_VCvtF2I ( ARM64CvtOp how, HReg rD, HReg rS, 1553436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov UChar armRM ) { 1554436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ARM64Instr* i = LibVEX_Alloc(sizeof(ARM64Instr)); 1555436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->tag = ARM64in_VCvtF2I; 1556436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->ARM64in.VCvtF2I.how = how; 1557436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->ARM64in.VCvtF2I.rD = rD; 1558436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->ARM64in.VCvtF2I.rS = rS; 1559436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->ARM64in.VCvtF2I.armRM = armRM; 1560436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(armRM <= 3); 1561436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return i; 1562436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov} 1563436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovARM64Instr* ARM64Instr_VCvtSD ( Bool sToD, HReg dst, HReg src ) { 1564436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ARM64Instr* i = LibVEX_Alloc(sizeof(ARM64Instr)); 1565436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->tag = ARM64in_VCvtSD; 1566436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->ARM64in.VCvtSD.sToD = sToD; 1567436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->ARM64in.VCvtSD.dst = dst; 1568436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->ARM64in.VCvtSD.src = src; 1569436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return i; 1570436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov} 1571436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovARM64Instr* ARM64Instr_VUnaryD ( ARM64FpUnaryOp op, HReg dst, HReg src ) { 1572436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ARM64Instr* i = LibVEX_Alloc(sizeof(ARM64Instr)); 1573436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->tag = ARM64in_VUnaryD; 1574436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->ARM64in.VUnaryD.op = op; 1575436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->ARM64in.VUnaryD.dst = dst; 1576436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->ARM64in.VUnaryD.src = src; 1577436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return i; 1578436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov} 1579436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovARM64Instr* ARM64Instr_VUnaryS ( ARM64FpUnaryOp op, HReg dst, HReg src ) { 1580436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ARM64Instr* i = LibVEX_Alloc(sizeof(ARM64Instr)); 1581436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->tag = ARM64in_VUnaryS; 1582436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->ARM64in.VUnaryS.op = op; 1583436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->ARM64in.VUnaryS.dst = dst; 1584436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->ARM64in.VUnaryS.src = src; 1585436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return i; 1586436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov} 1587436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovARM64Instr* ARM64Instr_VBinD ( ARM64FpBinOp op, 1588436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov HReg dst, HReg argL, HReg argR ) { 1589436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ARM64Instr* i = LibVEX_Alloc(sizeof(ARM64Instr)); 1590436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->tag = ARM64in_VBinD; 1591436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->ARM64in.VBinD.op = op; 1592436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->ARM64in.VBinD.dst = dst; 1593436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->ARM64in.VBinD.argL = argL; 1594436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->ARM64in.VBinD.argR = argR; 1595436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return i; 1596436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov} 1597436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovARM64Instr* ARM64Instr_VBinS ( ARM64FpBinOp op, 1598436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov HReg dst, HReg argL, HReg argR ) { 1599436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ARM64Instr* i = LibVEX_Alloc(sizeof(ARM64Instr)); 1600436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->tag = ARM64in_VBinS; 1601436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->ARM64in.VBinS.op = op; 1602436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->ARM64in.VBinS.dst = dst; 1603436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->ARM64in.VBinS.argL = argL; 1604436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->ARM64in.VBinS.argR = argR; 1605436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return i; 1606436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov} 1607436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovARM64Instr* ARM64Instr_VCmpD ( HReg argL, HReg argR ) { 1608436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ARM64Instr* i = LibVEX_Alloc(sizeof(ARM64Instr)); 1609436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->tag = ARM64in_VCmpD; 1610436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->ARM64in.VCmpD.argL = argL; 1611436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->ARM64in.VCmpD.argR = argR; 1612436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return i; 1613436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov} 1614436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovARM64Instr* ARM64Instr_VCmpS ( HReg argL, HReg argR ) { 1615436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ARM64Instr* i = LibVEX_Alloc(sizeof(ARM64Instr)); 1616436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->tag = ARM64in_VCmpS; 1617436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->ARM64in.VCmpS.argL = argL; 1618436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->ARM64in.VCmpS.argR = argR; 1619436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return i; 1620436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov} 1621436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovARM64Instr* ARM64Instr_FPCR ( Bool toFPCR, HReg iReg ) { 1622436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ARM64Instr* i = LibVEX_Alloc(sizeof(ARM64Instr)); 1623436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->tag = ARM64in_FPCR; 1624436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->ARM64in.FPCR.toFPCR = toFPCR; 1625436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->ARM64in.FPCR.iReg = iReg; 1626436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return i; 1627436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov} 1628436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovARM64Instr* ARM64Instr_VBinV ( ARM64VecBinOp op, 1629436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov HReg dst, HReg argL, HReg argR ) { 1630436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ARM64Instr* i = LibVEX_Alloc(sizeof(ARM64Instr)); 1631436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->tag = ARM64in_VBinV; 1632436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->ARM64in.VBinV.op = op; 1633436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->ARM64in.VBinV.dst = dst; 1634436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->ARM64in.VBinV.argL = argL; 1635436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->ARM64in.VBinV.argR = argR; 1636436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return i; 1637436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov} 1638436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovARM64Instr* ARM64Instr_VUnaryV ( ARM64VecUnaryOp op, HReg dst, HReg arg ) { 1639436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ARM64Instr* i = LibVEX_Alloc(sizeof(ARM64Instr)); 1640436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->tag = ARM64in_VUnaryV; 1641436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->ARM64in.VUnaryV.op = op; 1642436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->ARM64in.VUnaryV.dst = dst; 1643436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->ARM64in.VUnaryV.arg = arg; 1644436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return i; 1645436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov} 1646436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovARM64Instr* ARM64Instr_VNarrowV ( UInt dszBlg2, HReg dst, HReg src ) { 1647436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ARM64Instr* i = LibVEX_Alloc(sizeof(ARM64Instr)); 1648436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->tag = ARM64in_VNarrowV; 1649436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->ARM64in.VNarrowV.dszBlg2 = dszBlg2; 1650436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->ARM64in.VNarrowV.dst = dst; 1651436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->ARM64in.VNarrowV.src = src; 1652436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(dszBlg2 == 0 || dszBlg2 == 1 || dszBlg2 == 2); 1653436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return i; 1654436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov} 1655436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovARM64Instr* ARM64Instr_VShiftImmV ( ARM64VecShiftOp op, 1656436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov HReg dst, HReg src, UInt amt ) { 1657436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ARM64Instr* i = LibVEX_Alloc(sizeof(ARM64Instr)); 1658436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->tag = ARM64in_VShiftImmV; 1659436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->ARM64in.VShiftImmV.op = op; 1660436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->ARM64in.VShiftImmV.dst = dst; 1661436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->ARM64in.VShiftImmV.src = src; 1662436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->ARM64in.VShiftImmV.amt = amt; 1663436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov UInt maxSh = 0; 1664436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov switch (op) { 1665436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64vecsh_USHR64x2: case ARM64vecsh_SSHR64x2: 1666eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov case ARM64vecsh_SHL64x2: 1667436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov maxSh = 63; break; 1668eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov case ARM64vecsh_USHR32x4: case ARM64vecsh_SSHR32x4: 1669436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64vecsh_SHL32x4: 1670436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov maxSh = 31; break; 1671eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov case ARM64vecsh_USHR16x8: case ARM64vecsh_SSHR16x8: 1672eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov case ARM64vecsh_SHL16x8: 16732ca80a6a6fc069acdb73186e8e578dbf8f46af80Dmitriy Ivanov maxSh = 15; break; 1674eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov case ARM64vecsh_USHR8x16: case ARM64vecsh_SSHR8x16: 1675eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov case ARM64vecsh_SHL8x16: 1676eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov maxSh = 7; break; 1677436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov default: 1678436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(0); 1679436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 1680436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(maxSh > 0); 1681436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(amt > 0 && amt <= maxSh); 1682436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return i; 1683436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov} 1684436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ ARMInstr* ARMInstr_VAluS ( ARMVfpOp op, HReg dst, HReg argL, HReg argR ) { 1685436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ ARMInstr* i = LibVEX_Alloc(sizeof(ARMInstr)); 1686436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ i->tag = ARMin_VAluS; 1687436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ i->ARMin.VAluS.op = op; 1688436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ i->ARMin.VAluS.dst = dst; 1689436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ i->ARMin.VAluS.argL = argL; 1690436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ i->ARMin.VAluS.argR = argR; 1691436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ return i; 1692436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ } 1693436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ ARMInstr* ARMInstr_VCMovD ( ARMCondCode cond, HReg dst, HReg src ) { 1694436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ ARMInstr* i = LibVEX_Alloc(sizeof(ARMInstr)); 1695436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ i->tag = ARMin_VCMovD; 1696436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ i->ARMin.VCMovD.cond = cond; 1697436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ i->ARMin.VCMovD.dst = dst; 1698436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ i->ARMin.VCMovD.src = src; 1699436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ vassert(cond != ARMcc_AL); 1700436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ return i; 1701436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ } 1702436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ ARMInstr* ARMInstr_VCMovS ( ARMCondCode cond, HReg dst, HReg src ) { 1703436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ ARMInstr* i = LibVEX_Alloc(sizeof(ARMInstr)); 1704436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ i->tag = ARMin_VCMovS; 1705436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ i->ARMin.VCMovS.cond = cond; 1706436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ i->ARMin.VCMovS.dst = dst; 1707436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ i->ARMin.VCMovS.src = src; 1708436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ vassert(cond != ARMcc_AL); 1709436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ return i; 1710436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ } 1711436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ ARMInstr* ARMInstr_VXferD ( Bool toD, HReg dD, HReg rHi, HReg rLo ) { 1712436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ ARMInstr* i = LibVEX_Alloc(sizeof(ARMInstr)); 1713436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ i->tag = ARMin_VXferD; 1714436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ i->ARMin.VXferD.toD = toD; 1715436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ i->ARMin.VXferD.dD = dD; 1716436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ i->ARMin.VXferD.rHi = rHi; 1717436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ i->ARMin.VXferD.rLo = rLo; 1718436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ return i; 1719436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ } 1720436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ ARMInstr* ARMInstr_VXferS ( Bool toS, HReg fD, HReg rLo ) { 1721436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ ARMInstr* i = LibVEX_Alloc(sizeof(ARMInstr)); 1722436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ i->tag = ARMin_VXferS; 1723436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ i->ARMin.VXferS.toS = toS; 1724436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ i->ARMin.VXferS.fD = fD; 1725436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ i->ARMin.VXferS.rLo = rLo; 1726436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ return i; 1727436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ } 1728436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ ARMInstr* ARMInstr_VCvtID ( Bool iToD, Bool syned, 1729436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ HReg dst, HReg src ) { 1730436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ ARMInstr* i = LibVEX_Alloc(sizeof(ARMInstr)); 1731436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ i->tag = ARMin_VCvtID; 1732436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ i->ARMin.VCvtID.iToD = iToD; 1733436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ i->ARMin.VCvtID.syned = syned; 1734436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ i->ARMin.VCvtID.dst = dst; 1735436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ i->ARMin.VCvtID.src = src; 1736436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ return i; 1737436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ } 1738436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ ARMInstr* ARMInstr_NLdStD ( Bool isLoad, HReg dD, ARMAModeN *amode ) { 1739436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ ARMInstr* i = LibVEX_Alloc(sizeof(ARMInstr)); 1740436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ i->tag = ARMin_NLdStD; 1741436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ i->ARMin.NLdStD.isLoad = isLoad; 1742436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ i->ARMin.NLdStD.dD = dD; 1743436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ i->ARMin.NLdStD.amode = amode; 1744436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ return i; 1745436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ } 1746436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ 1747436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ ARMInstr* ARMInstr_NUnary ( ARMNeonUnOp op, HReg dQ, HReg nQ, 1748436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ UInt size, Bool Q ) { 1749436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ ARMInstr* i = LibVEX_Alloc(sizeof(ARMInstr)); 1750436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ i->tag = ARMin_NUnary; 1751436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ i->ARMin.NUnary.op = op; 1752436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ i->ARMin.NUnary.src = nQ; 1753436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ i->ARMin.NUnary.dst = dQ; 1754436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ i->ARMin.NUnary.size = size; 1755436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ i->ARMin.NUnary.Q = Q; 1756436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ return i; 1757436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ } 1758436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ 1759436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ ARMInstr* ARMInstr_NUnaryS ( ARMNeonUnOpS op, ARMNRS* dst, ARMNRS* src, 1760436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ UInt size, Bool Q ) { 1761436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ ARMInstr* i = LibVEX_Alloc(sizeof(ARMInstr)); 1762436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ i->tag = ARMin_NUnaryS; 1763436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ i->ARMin.NUnaryS.op = op; 1764436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ i->ARMin.NUnaryS.src = src; 1765436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ i->ARMin.NUnaryS.dst = dst; 1766436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ i->ARMin.NUnaryS.size = size; 1767436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ i->ARMin.NUnaryS.Q = Q; 1768436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ return i; 1769436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ } 1770436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ 1771436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ ARMInstr* ARMInstr_NDual ( ARMNeonDualOp op, HReg nQ, HReg mQ, 1772436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ UInt size, Bool Q ) { 1773436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ ARMInstr* i = LibVEX_Alloc(sizeof(ARMInstr)); 1774436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ i->tag = ARMin_NDual; 1775436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ i->ARMin.NDual.op = op; 1776436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ i->ARMin.NDual.arg1 = nQ; 1777436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ i->ARMin.NDual.arg2 = mQ; 1778436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ i->ARMin.NDual.size = size; 1779436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ i->ARMin.NDual.Q = Q; 1780436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ return i; 1781436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ } 1782436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ 1783436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ ARMInstr* ARMInstr_NBinary ( ARMNeonBinOp op, 1784436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ HReg dst, HReg argL, HReg argR, 1785436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ UInt size, Bool Q ) { 1786436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ ARMInstr* i = LibVEX_Alloc(sizeof(ARMInstr)); 1787436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ i->tag = ARMin_NBinary; 1788436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ i->ARMin.NBinary.op = op; 1789436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ i->ARMin.NBinary.argL = argL; 1790436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ i->ARMin.NBinary.argR = argR; 1791436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ i->ARMin.NBinary.dst = dst; 1792436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ i->ARMin.NBinary.size = size; 1793436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ i->ARMin.NBinary.Q = Q; 1794436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ return i; 1795436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ } 1796436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 1797436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovARM64Instr* ARM64Instr_VImmQ (HReg rQ, UShort imm) { 1798436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ARM64Instr* i = LibVEX_Alloc(sizeof(ARM64Instr)); 1799436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->tag = ARM64in_VImmQ; 1800436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->ARM64in.VImmQ.rQ = rQ; 1801436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->ARM64in.VImmQ.imm = imm; 1802436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return i; 1803436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov} 1804436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovARM64Instr* ARM64Instr_VDfromX ( HReg rD, HReg rX ) { 1805436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ARM64Instr* i = LibVEX_Alloc(sizeof(ARM64Instr)); 1806436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->tag = ARM64in_VDfromX; 1807436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->ARM64in.VDfromX.rD = rD; 1808436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->ARM64in.VDfromX.rX = rX; 1809436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return i; 1810436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov} 1811436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovARM64Instr* ARM64Instr_VQfromXX ( HReg rQ, HReg rXhi, HReg rXlo ) { 1812436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ARM64Instr* i = LibVEX_Alloc(sizeof(ARM64Instr)); 1813436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->tag = ARM64in_VQfromXX; 1814436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->ARM64in.VQfromXX.rQ = rQ; 1815436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->ARM64in.VQfromXX.rXhi = rXhi; 1816436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->ARM64in.VQfromXX.rXlo = rXlo; 1817436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return i; 1818436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov} 1819436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovARM64Instr* ARM64Instr_VXfromQ ( HReg rX, HReg rQ, UInt laneNo ) { 1820436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ARM64Instr* i = LibVEX_Alloc(sizeof(ARM64Instr)); 1821436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->tag = ARM64in_VXfromQ; 1822436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->ARM64in.VXfromQ.rX = rX; 1823436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->ARM64in.VXfromQ.rQ = rQ; 1824436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->ARM64in.VXfromQ.laneNo = laneNo; 1825436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(laneNo <= 1); 1826436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return i; 1827436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov} 1828436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovARM64Instr* ARM64Instr_VMov ( UInt szB, HReg dst, HReg src ) { 1829436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ARM64Instr* i = LibVEX_Alloc(sizeof(ARM64Instr)); 1830436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->tag = ARM64in_VMov; 1831436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->ARM64in.VMov.szB = szB; 1832436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->ARM64in.VMov.dst = dst; 1833436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->ARM64in.VMov.src = src; 1834436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov switch (szB) { 1835436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case 16: 1836436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(hregClass(src) == HRcVec128); 1837436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(hregClass(dst) == HRcVec128); 1838436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov break; 1839436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case 8: 1840436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(hregClass(src) == HRcFlt64); 1841436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(hregClass(dst) == HRcFlt64); 1842436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov break; 1843436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov default: 1844436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vpanic("ARM64Instr_VMov"); 1845436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 1846436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return i; 1847436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov} 1848436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 1849436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ ARMInstr* ARMInstr_NCMovQ ( ARMCondCode cond, HReg dst, HReg src ) { 1850436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ ARMInstr* i = LibVEX_Alloc(sizeof(ARMInstr)); 1851436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ i->tag = ARMin_NCMovQ; 1852436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ i->ARMin.NCMovQ.cond = cond; 1853436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ i->ARMin.NCMovQ.dst = dst; 1854436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ i->ARMin.NCMovQ.src = src; 1855436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ vassert(cond != ARMcc_AL); 1856436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ return i; 1857436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ } 1858436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ 1859436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ ARMInstr* ARMInstr_NShift ( ARMNeonShiftOp op, 1860436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ HReg dst, HReg argL, HReg argR, 1861436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ UInt size, Bool Q ) { 1862436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ ARMInstr* i = LibVEX_Alloc(sizeof(ARMInstr)); 1863436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ i->tag = ARMin_NShift; 1864436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ i->ARMin.NShift.op = op; 1865436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ i->ARMin.NShift.argL = argL; 1866436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ i->ARMin.NShift.argR = argR; 1867436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ i->ARMin.NShift.dst = dst; 1868436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ i->ARMin.NShift.size = size; 1869436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ i->ARMin.NShift.Q = Q; 1870436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ return i; 1871436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ } 1872436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ 1873436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ ARMInstr* ARMInstr_NShl64 ( HReg dst, HReg src, UInt amt ) 1874436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ { 1875436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ ARMInstr* i = LibVEX_Alloc(sizeof(ARMInstr)); 1876436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ i->tag = ARMin_NShl64; 1877436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ i->ARMin.NShl64.dst = dst; 1878436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ i->ARMin.NShl64.src = src; 1879436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ i->ARMin.NShl64.amt = amt; 1880436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ vassert(amt >= 1 && amt <= 63); 1881436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ return i; 1882436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ } 1883436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ 1884436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ /* Helper copy-pasted from isel.c */ 1885436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ static Bool fitsIn8x4 ( UInt* u8, UInt* u4, UInt u ) 1886436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ { 1887436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ UInt i; 1888436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ for (i = 0; i < 16; i++) { 1889436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ if (0 == (u & 0xFFFFFF00)) { 1890436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ *u8 = u; 1891436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ *u4 = i; 1892436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ return True; 1893436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ } 1894436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ u = ROR32(u, 30); 1895436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ } 1896436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ vassert(i == 16); 1897436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ return False; 1898436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ } 1899436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ 1900436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ ARMInstr* ARMInstr_Add32 ( HReg rD, HReg rN, UInt imm32 ) { 1901436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ UInt u8, u4; 1902436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ ARMInstr *i = LibVEX_Alloc(sizeof(ARMInstr)); 1903436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ /* Try to generate single ADD if possible */ 1904436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ if (fitsIn8x4(&u8, &u4, imm32)) { 1905436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ i->tag = ARMin_Alu; 1906436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ i->ARMin.Alu.op = ARMalu_ADD; 1907436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ i->ARMin.Alu.dst = rD; 1908436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ i->ARMin.Alu.argL = rN; 1909436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ i->ARMin.Alu.argR = ARMRI84_I84(u8, u4); 1910436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ } else { 1911436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ i->tag = ARMin_Add32; 1912436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ i->ARMin.Add32.rD = rD; 1913436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ i->ARMin.Add32.rN = rN; 1914436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ i->ARMin.Add32.imm32 = imm32; 1915436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ } 1916436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ return i; 1917436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ } 1918436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 1919436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovARM64Instr* ARM64Instr_EvCheck ( ARM64AMode* amCounter, 1920436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ARM64AMode* amFailAddr ) { 1921436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ARM64Instr* i = LibVEX_Alloc(sizeof(ARM64Instr)); 1922436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->tag = ARM64in_EvCheck; 1923436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->ARM64in.EvCheck.amCounter = amCounter; 1924436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->ARM64in.EvCheck.amFailAddr = amFailAddr; 1925436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return i; 1926436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov} 1927436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 1928436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ ARMInstr* ARMInstr_ProfInc ( void ) { 1929436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ ARMInstr* i = LibVEX_Alloc(sizeof(ARMInstr)); 1930436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ i->tag = ARMin_ProfInc; 1931436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ return i; 1932436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ } 1933436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 1934436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov/* ... */ 1935436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 1936436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovvoid ppARM64Instr ( ARM64Instr* i ) { 1937436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov switch (i->tag) { 1938436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64in_Arith: 1939436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vex_printf("%s ", i->ARM64in.Arith.isAdd ? "add" : "sub"); 1940436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ppHRegARM64(i->ARM64in.Arith.dst); 1941436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vex_printf(", "); 1942436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ppHRegARM64(i->ARM64in.Arith.argL); 1943436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vex_printf(", "); 1944436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ppARM64RIA(i->ARM64in.Arith.argR); 1945436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return; 1946436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64in_Cmp: 1947436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vex_printf("cmp%s ", i->ARM64in.Cmp.is64 ? " " : "(w)" ); 1948436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ppHRegARM64(i->ARM64in.Cmp.argL); 1949436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vex_printf(", "); 1950436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ppARM64RIA(i->ARM64in.Cmp.argR); 1951436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return; 1952436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64in_Logic: 1953436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vex_printf("%s ", showARM64LogicOp(i->ARM64in.Logic.op)); 1954436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ppHRegARM64(i->ARM64in.Logic.dst); 1955436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vex_printf(", "); 1956436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ppHRegARM64(i->ARM64in.Logic.argL); 1957436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vex_printf(", "); 1958436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ppARM64RIL(i->ARM64in.Logic.argR); 1959436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return; 1960436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64in_Test: 1961436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vex_printf("tst "); 1962436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ppHRegARM64(i->ARM64in.Test.argL); 1963436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vex_printf(", "); 1964436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ppARM64RIL(i->ARM64in.Test.argR); 1965436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return; 1966436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64in_Shift: 1967436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vex_printf("%s ", showARM64ShiftOp(i->ARM64in.Shift.op)); 1968436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ppHRegARM64(i->ARM64in.Shift.dst); 1969436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vex_printf(", "); 1970436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ppHRegARM64(i->ARM64in.Shift.argL); 1971436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vex_printf(", "); 1972436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ppARM64RI6(i->ARM64in.Shift.argR); 1973436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return; 1974436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64in_Unary: 1975436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vex_printf("%s ", showARM64UnaryOp(i->ARM64in.Unary.op)); 1976436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ppHRegARM64(i->ARM64in.Unary.dst); 1977436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vex_printf(", "); 1978436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ppHRegARM64(i->ARM64in.Unary.src); 1979436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return; 1980436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64in_MovI: 1981436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vex_printf("mov "); 1982436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ppHRegARM64(i->ARM64in.MovI.dst); 1983436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vex_printf(", "); 1984436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ppHRegARM64(i->ARM64in.MovI.src); 1985436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return; 1986436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64in_Imm64: 1987436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vex_printf("imm64 "); 1988436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ppHRegARM64(i->ARM64in.Imm64.dst); 1989436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vex_printf(", 0x%llx", i->ARM64in.Imm64.imm64); 1990436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return; 1991436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64in_LdSt64: 1992436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if (i->ARM64in.LdSt64.isLoad) { 1993436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vex_printf("ldr "); 1994436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ppHRegARM64(i->ARM64in.LdSt64.rD); 1995436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vex_printf(", "); 1996436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ppARM64AMode(i->ARM64in.LdSt64.amode); 1997436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } else { 1998436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vex_printf("str "); 1999436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ppARM64AMode(i->ARM64in.LdSt64.amode); 2000436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vex_printf(", "); 2001436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ppHRegARM64(i->ARM64in.LdSt64.rD); 2002436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 2003436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return; 2004436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64in_LdSt32: 2005436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if (i->ARM64in.LdSt32.isLoad) { 2006436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vex_printf("ldruw "); 2007436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ppHRegARM64(i->ARM64in.LdSt32.rD); 2008436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vex_printf(", "); 2009436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ppARM64AMode(i->ARM64in.LdSt32.amode); 2010436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } else { 2011436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vex_printf("strw "); 2012436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ppARM64AMode(i->ARM64in.LdSt32.amode); 2013436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vex_printf(", "); 2014436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ppHRegARM64(i->ARM64in.LdSt32.rD); 2015436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 2016436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return; 2017436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64in_LdSt16: 2018436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if (i->ARM64in.LdSt16.isLoad) { 2019436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vex_printf("ldruh "); 2020436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ppHRegARM64(i->ARM64in.LdSt16.rD); 2021436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vex_printf(", "); 2022436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ppARM64AMode(i->ARM64in.LdSt16.amode); 2023436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } else { 2024436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vex_printf("strh "); 2025436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ppARM64AMode(i->ARM64in.LdSt16.amode); 2026436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vex_printf(", "); 2027436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ppHRegARM64(i->ARM64in.LdSt16.rD); 2028436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 2029436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return; 2030436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64in_LdSt8: 2031436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if (i->ARM64in.LdSt8.isLoad) { 2032436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vex_printf("ldrub "); 2033436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ppHRegARM64(i->ARM64in.LdSt8.rD); 2034436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vex_printf(", "); 2035436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ppARM64AMode(i->ARM64in.LdSt8.amode); 2036436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } else { 2037436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vex_printf("strb "); 2038436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ppARM64AMode(i->ARM64in.LdSt8.amode); 2039436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vex_printf(", "); 2040436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ppHRegARM64(i->ARM64in.LdSt8.rD); 2041436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 2042436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return; 2043436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64in_XDirect: 2044436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vex_printf("(xDirect) "); 2045436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vex_printf("if (%%pstate.%s) { ", 2046436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov showARM64CondCode(i->ARM64in.XDirect.cond)); 2047436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vex_printf("imm64 x9,0x%llx; ", i->ARM64in.XDirect.dstGA); 2048436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vex_printf("str x9,"); 2049436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ppARM64AMode(i->ARM64in.XDirect.amPC); 2050436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vex_printf("; imm64-exactly4 x9,$disp_cp_chain_me_to_%sEP; ", 2051436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->ARM64in.XDirect.toFastEP ? "fast" : "slow"); 2052436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vex_printf("blr x9 }"); 2053436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return; 2054436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64in_XIndir: 2055436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vex_printf("(xIndir) "); 2056436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vex_printf("if (%%pstate.%s) { ", 2057436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov showARM64CondCode(i->ARM64in.XIndir.cond)); 2058436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vex_printf("str "); 2059436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ppHRegARM64(i->ARM64in.XIndir.dstGA); 2060436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vex_printf(","); 2061436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ppARM64AMode(i->ARM64in.XIndir.amPC); 2062436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vex_printf("; imm64 x9,$disp_cp_xindir; "); 2063436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vex_printf("br x9 }"); 2064436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return; 2065436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64in_XAssisted: 2066436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vex_printf("(xAssisted) "); 2067436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vex_printf("if (%%pstate.%s) { ", 2068436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov showARM64CondCode(i->ARM64in.XAssisted.cond)); 2069436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vex_printf("str "); 2070436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ppHRegARM64(i->ARM64in.XAssisted.dstGA); 2071436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vex_printf(","); 2072436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ppARM64AMode(i->ARM64in.XAssisted.amPC); 2073436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vex_printf("; movw x21,$IRJumpKind_to_TRCVAL(%d); ", 2074436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov (Int)i->ARM64in.XAssisted.jk); 2075436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vex_printf("imm64 x9,$disp_cp_xassisted; "); 2076436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vex_printf("br x9 }"); 2077436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return; 2078436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64in_CSel: 2079436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vex_printf("csel "); 2080436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ppHRegARM64(i->ARM64in.CSel.dst); 2081436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vex_printf(", "); 2082436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ppHRegARM64(i->ARM64in.CSel.argL); 2083436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vex_printf(", "); 2084436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ppHRegARM64(i->ARM64in.CSel.argR); 2085436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vex_printf(", %s", showARM64CondCode(i->ARM64in.CSel.cond)); 2086436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return; 2087436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64in_Call: 2088436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vex_printf("call%s ", 2089436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->ARM64in.Call.cond==ARM64cc_AL 2090436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ? " " : showARM64CondCode(i->ARM64in.Call.cond)); 2091436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vex_printf("0x%lx [nArgRegs=%d, ", 2092436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->ARM64in.Call.target, i->ARM64in.Call.nArgRegs); 2093436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ppRetLoc(i->ARM64in.Call.rloc); 2094436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vex_printf("]"); 2095436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return; 2096436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64in_AddToSP: { 2097436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov Int simm = i->ARM64in.AddToSP.simm; 2098436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vex_printf("%s xsp, xsp, #%d", simm < 0 ? "sub" : "add", 2099436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov simm < 0 ? -simm : simm); 2100436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return; 2101436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 2102436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64in_FromSP: 2103436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vex_printf("mov "); 2104436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ppHRegARM64(i->ARM64in.FromSP.dst); 2105436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vex_printf(", xsp"); 2106436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return; 2107436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64in_Mul: 2108436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vex_printf("%s ", showARM64MulOp(i->ARM64in.Mul.op)); 2109436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ppHRegARM64(i->ARM64in.Mul.dst); 2110436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vex_printf(", "); 2111436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ppHRegARM64(i->ARM64in.Mul.argL); 2112436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vex_printf(", "); 2113436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ppHRegARM64(i->ARM64in.Mul.argR); 2114436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return; 2115436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 2116436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64in_LdrEX: { 2117436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov const HChar* sz = " "; 2118436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov switch (i->ARM64in.LdrEX.szB) { 2119436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case 1: sz = "b"; break; 2120436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case 2: sz = "h"; break; 2121436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case 4: case 8: break; 2122436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov default: vassert(0); 2123436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 2124436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vex_printf("ldxr%s %c2, [x4]", 2125436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov sz, i->ARM64in.LdrEX.szB == 8 ? 'x' : 'w'); 2126436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return; 2127436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 2128436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64in_StrEX: { 2129436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov const HChar* sz = " "; 2130436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov switch (i->ARM64in.StrEX.szB) { 2131436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case 1: sz = "b"; break; 2132436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case 2: sz = "h"; break; 2133436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case 4: case 8: break; 2134436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov default: vassert(0); 2135436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 2136436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vex_printf("stxr%s w0, %c2, [x4]", 2137436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov sz, i->ARM64in.StrEX.szB == 8 ? 'x' : 'w'); 2138436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return; 2139436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 2140436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64in_MFence: 2141436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vex_printf("(mfence) dsb sy; dmb sy; isb"); 2142436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return; 2143436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARM64in_CLREX: 2144436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ vex_printf("clrex"); 2145436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ return; 2146436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64in_VLdStS: 2147436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if (i->ARM64in.VLdStS.isLoad) { 2148436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vex_printf("ldr "); 2149436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ppHRegARM64asSreg(i->ARM64in.VLdStS.sD); 2150436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vex_printf(", %u(", i->ARM64in.VLdStS.uimm12); 2151436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ppHRegARM64(i->ARM64in.VLdStS.rN); 2152436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vex_printf(")"); 2153436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } else { 2154436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vex_printf("str "); 2155436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vex_printf("%u(", i->ARM64in.VLdStS.uimm12); 2156436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ppHRegARM64(i->ARM64in.VLdStS.rN); 2157436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vex_printf("), "); 2158436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ppHRegARM64asSreg(i->ARM64in.VLdStS.sD); 2159436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 2160436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return; 2161436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64in_VLdStD: 2162436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if (i->ARM64in.VLdStD.isLoad) { 2163436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vex_printf("ldr "); 2164436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ppHRegARM64(i->ARM64in.VLdStD.dD); 2165436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vex_printf(", %u(", i->ARM64in.VLdStD.uimm12); 2166436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ppHRegARM64(i->ARM64in.VLdStD.rN); 2167436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vex_printf(")"); 2168436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } else { 2169436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vex_printf("str "); 2170436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vex_printf("%u(", i->ARM64in.VLdStD.uimm12); 2171436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ppHRegARM64(i->ARM64in.VLdStD.rN); 2172436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vex_printf("), "); 2173436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ppHRegARM64(i->ARM64in.VLdStD.dD); 2174436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 2175436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return; 2176436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64in_VLdStQ: 2177436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if (i->ARM64in.VLdStQ.isLoad) 2178436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vex_printf("ld1.2d {"); 2179436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov else 2180436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vex_printf("st1.2d {"); 2181436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ppHRegARM64(i->ARM64in.VLdStQ.rQ); 2182436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vex_printf("}, ["); 2183436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ppHRegARM64(i->ARM64in.VLdStQ.rN); 2184436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vex_printf("]"); 2185436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return; 2186436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64in_VCvtI2F: { 2187436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov HChar syn = '?'; 2188436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov UInt fszB = 0; 2189436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov UInt iszB = 0; 2190436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov characteriseARM64CvtOp(&syn, &fszB, &iszB, i->ARM64in.VCvtI2F.how); 2191436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vex_printf("%ccvtf ", syn); 2192436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ppHRegARM64(i->ARM64in.VCvtI2F.rD); 2193436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vex_printf("(%c-reg), ", fszB == 4 ? 'S' : 'D'); 2194436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ppHRegARM64(i->ARM64in.VCvtI2F.rS); 2195436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vex_printf("(%c-reg)", iszB == 4 ? 'W' : 'X'); 2196436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return; 2197436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 2198436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64in_VCvtF2I: { 2199436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov HChar syn = '?'; 2200436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov UInt fszB = 0; 2201436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov UInt iszB = 0; 2202436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov HChar rmo = '?'; 2203436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov characteriseARM64CvtOp(&syn, &fszB, &iszB, i->ARM64in.VCvtF2I.how); 2204436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov UChar armRM = i->ARM64in.VCvtF2I.armRM; 2205436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if (armRM < 4) rmo = "npmz"[armRM]; 2206436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vex_printf("fcvt%c%c ", rmo, syn); 2207436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ppHRegARM64(i->ARM64in.VCvtF2I.rD); 2208436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vex_printf("(%c-reg), ", iszB == 4 ? 'W' : 'X'); 2209436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ppHRegARM64(i->ARM64in.VCvtF2I.rS); 2210436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vex_printf("(%c-reg)", fszB == 4 ? 'S' : 'D'); 2211436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return; 2212436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 2213436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64in_VCvtSD: 2214436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vex_printf("fcvt%s ", i->ARM64in.VCvtSD.sToD ? "s2d" : "d2s"); 2215436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if (i->ARM64in.VCvtSD.sToD) { 2216436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ppHRegARM64(i->ARM64in.VCvtSD.dst); 2217436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vex_printf(", "); 2218436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ppHRegARM64asSreg(i->ARM64in.VCvtSD.src); 2219436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } else { 2220436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ppHRegARM64asSreg(i->ARM64in.VCvtSD.dst); 2221436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vex_printf(", "); 2222436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ppHRegARM64(i->ARM64in.VCvtSD.src); 2223436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 2224436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return; 2225436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64in_VUnaryD: 2226436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vex_printf("f%s ", showARM64FpUnaryOp(i->ARM64in.VUnaryD.op)); 2227436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ppHRegARM64(i->ARM64in.VUnaryD.dst); 2228436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vex_printf(", "); 2229436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ppHRegARM64(i->ARM64in.VUnaryD.src); 2230436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return; 2231436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64in_VUnaryS: 2232436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vex_printf("f%s ", showARM64FpUnaryOp(i->ARM64in.VUnaryS.op)); 2233436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ppHRegARM64asSreg(i->ARM64in.VUnaryS.dst); 2234436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vex_printf(", "); 2235436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ppHRegARM64asSreg(i->ARM64in.VUnaryS.src); 2236436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return; 2237436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64in_VBinD: 2238436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vex_printf("f%s ", showARM64FpBinOp(i->ARM64in.VBinD.op)); 2239436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ppHRegARM64(i->ARM64in.VBinD.dst); 2240436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vex_printf(", "); 2241436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ppHRegARM64(i->ARM64in.VBinD.argL); 2242436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vex_printf(", "); 2243436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ppHRegARM64(i->ARM64in.VBinD.argR); 2244436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return; 2245436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64in_VBinS: 2246436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vex_printf("f%s ", showARM64FpBinOp(i->ARM64in.VBinS.op)); 2247436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ppHRegARM64asSreg(i->ARM64in.VBinS.dst); 2248436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vex_printf(", "); 2249436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ppHRegARM64asSreg(i->ARM64in.VBinS.argL); 2250436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vex_printf(", "); 2251436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ppHRegARM64asSreg(i->ARM64in.VBinS.argR); 2252436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return; 2253436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64in_VCmpD: 2254436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vex_printf("fcmp "); 2255436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ppHRegARM64(i->ARM64in.VCmpD.argL); 2256436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vex_printf(", "); 2257436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ppHRegARM64(i->ARM64in.VCmpD.argR); 2258436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return; 2259436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64in_VCmpS: 2260436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vex_printf("fcmp "); 2261436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ppHRegARM64asSreg(i->ARM64in.VCmpS.argL); 2262436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vex_printf(", "); 2263436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ppHRegARM64asSreg(i->ARM64in.VCmpS.argR); 2264436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return; 2265436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64in_FPCR: 2266436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if (i->ARM64in.FPCR.toFPCR) { 2267436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vex_printf("msr fpcr, "); 2268436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ppHRegARM64(i->ARM64in.FPCR.iReg); 2269436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } else { 2270436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vex_printf("mrs "); 2271436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ppHRegARM64(i->ARM64in.FPCR.iReg); 2272436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vex_printf(", fpcr"); 2273436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 2274436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return; 2275436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64in_VBinV: { 2276436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov const HChar* nm = "??"; 2277436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov const HChar* ar = "??"; 2278436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov showARM64VecBinOp(&nm, &ar, i->ARM64in.VBinV.op); 2279436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vex_printf("%s ", nm); 2280436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ppHRegARM64(i->ARM64in.VBinV.dst); 2281436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vex_printf(".%s, ", ar); 2282436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ppHRegARM64(i->ARM64in.VBinV.argL); 2283436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vex_printf(".%s, ", ar); 2284436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ppHRegARM64(i->ARM64in.VBinV.argR); 2285436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vex_printf(".%s", ar); 2286436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return; 2287436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 2288436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64in_VUnaryV: { 2289436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov const HChar* nm = "??"; 2290436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov const HChar* ar = "??"; 2291436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov showARM64VecUnaryOp(&nm, &ar, i->ARM64in.VUnaryV.op); 2292436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vex_printf("%s ", nm); 2293436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ppHRegARM64(i->ARM64in.VUnaryV.dst); 2294436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vex_printf(".%s, ", ar); 2295436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ppHRegARM64(i->ARM64in.VUnaryV.arg); 2296436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vex_printf(".%s", ar); 2297436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return; 2298436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 2299436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64in_VNarrowV: { 2300436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov UInt dszBlg2 = i->ARM64in.VNarrowV.dszBlg2; 2301436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov const HChar* darr[3] = { "8b", "4h", "2s" }; 2302436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov const HChar* sarr[3] = { "8h", "4s", "2d" }; 2303436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vex_printf("xtn "); 2304436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ppHRegARM64(i->ARM64in.VNarrowV.dst); 2305436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vex_printf(".%s, ", dszBlg2 < 3 ? darr[dszBlg2] : "??"); 2306436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ppHRegARM64(i->ARM64in.VNarrowV.src); 2307436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vex_printf(".%s", dszBlg2 < 3 ? sarr[dszBlg2] : "??"); 2308436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return; 2309436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 2310436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64in_VShiftImmV: { 2311436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov const HChar* nm = "??"; 2312436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov const HChar* ar = "??"; 2313436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov showARM64VecShiftOp(&nm, &ar, i->ARM64in.VShiftImmV.op); 2314436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vex_printf("%s ", nm); 2315436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ppHRegARM64(i->ARM64in.VShiftImmV.dst); 2316436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vex_printf(".%s, ", ar); 2317436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ppHRegARM64(i->ARM64in.VShiftImmV.src); 2318436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vex_printf(".%s, #%u", ar, i->ARM64in.VShiftImmV.amt); 2319436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return; 2320436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 2321436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMin_VAluS: 2322436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ vex_printf("f%-3ss ", showARMVfpOp(i->ARMin.VAluS.op)); 2323436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ ppHRegARM(i->ARMin.VAluS.dst); 2324436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ vex_printf(", "); 2325436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ ppHRegARM(i->ARMin.VAluS.argL); 2326436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ vex_printf(", "); 2327436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ ppHRegARM(i->ARMin.VAluS.argR); 2328436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ return; 2329436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMin_VCMovD: 2330436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ vex_printf("fcpyd%s ", showARMCondCode(i->ARMin.VCMovD.cond)); 2331436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ ppHRegARM(i->ARMin.VCMovD.dst); 2332436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ vex_printf(", "); 2333436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ ppHRegARM(i->ARMin.VCMovD.src); 2334436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ return; 2335436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMin_VCMovS: 2336436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ vex_printf("fcpys%s ", showARMCondCode(i->ARMin.VCMovS.cond)); 2337436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ ppHRegARM(i->ARMin.VCMovS.dst); 2338436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ vex_printf(", "); 2339436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ ppHRegARM(i->ARMin.VCMovS.src); 2340436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ return; 2341436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMin_VXferD: 2342436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ vex_printf("vmov "); 2343436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ if (i->ARMin.VXferD.toD) { 2344436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ ppHRegARM(i->ARMin.VXferD.dD); 2345436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ vex_printf(", "); 2346436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ ppHRegARM(i->ARMin.VXferD.rLo); 2347436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ vex_printf(", "); 2348436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ ppHRegARM(i->ARMin.VXferD.rHi); 2349436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ } else { 2350436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ ppHRegARM(i->ARMin.VXferD.rLo); 2351436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ vex_printf(", "); 2352436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ ppHRegARM(i->ARMin.VXferD.rHi); 2353436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ vex_printf(", "); 2354436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ ppHRegARM(i->ARMin.VXferD.dD); 2355436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ } 2356436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ return; 2357436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMin_VXferS: 2358436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ vex_printf("vmov "); 2359436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ if (i->ARMin.VXferS.toS) { 2360436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ ppHRegARM(i->ARMin.VXferS.fD); 2361436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ vex_printf(", "); 2362436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ ppHRegARM(i->ARMin.VXferS.rLo); 2363436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ } else { 2364436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ ppHRegARM(i->ARMin.VXferS.rLo); 2365436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ vex_printf(", "); 2366436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ ppHRegARM(i->ARMin.VXferS.fD); 2367436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ } 2368436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ return; 2369436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMin_VCvtID: { 2370436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ const HChar* nm = "?"; 2371436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ if (i->ARMin.VCvtID.iToD) { 2372436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ nm = i->ARMin.VCvtID.syned ? "fsitod" : "fuitod"; 2373436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ } else { 2374436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ nm = i->ARMin.VCvtID.syned ? "ftosid" : "ftouid"; 2375436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ } 2376436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ vex_printf("%s ", nm); 2377436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ ppHRegARM(i->ARMin.VCvtID.dst); 2378436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ vex_printf(", "); 2379436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ ppHRegARM(i->ARMin.VCvtID.src); 2380436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ return; 2381436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ } 2382436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMin_NLdStD: 2383436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ if (i->ARMin.NLdStD.isLoad) 2384436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ vex_printf("vld1.32 {"); 2385436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ else 2386436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ vex_printf("vst1.32 {"); 2387436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ ppHRegARM(i->ARMin.NLdStD.dD); 2388436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ vex_printf("} "); 2389436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ ppARMAModeN(i->ARMin.NLdStD.amode); 2390436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ return; 2391436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMin_NUnary: 2392436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ vex_printf("%s%s%s ", 2393436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ showARMNeonUnOp(i->ARMin.NUnary.op), 2394436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ showARMNeonUnOpDataType(i->ARMin.NUnary.op), 2395436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ showARMNeonDataSize(i)); 2396436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ ppHRegARM(i->ARMin.NUnary.dst); 2397436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ vex_printf(", "); 2398436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ ppHRegARM(i->ARMin.NUnary.src); 2399436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ if (i->ARMin.NUnary.op == ARMneon_EQZ) 2400436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ vex_printf(", #0"); 2401436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ if (i->ARMin.NUnary.op == ARMneon_VCVTFtoFixedS || 2402436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ i->ARMin.NUnary.op == ARMneon_VCVTFtoFixedU || 2403436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ i->ARMin.NUnary.op == ARMneon_VCVTFixedStoF || 2404436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ i->ARMin.NUnary.op == ARMneon_VCVTFixedUtoF) { 2405436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ vex_printf(", #%d", i->ARMin.NUnary.size); 2406436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ } 2407436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ if (i->ARMin.NUnary.op == ARMneon_VQSHLNSS || 2408436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ i->ARMin.NUnary.op == ARMneon_VQSHLNUU || 2409436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ i->ARMin.NUnary.op == ARMneon_VQSHLNUS) { 2410436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ UInt size; 2411436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ size = i->ARMin.NUnary.size; 2412436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ if (size & 0x40) { 2413436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ vex_printf(", #%d", size - 64); 2414436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ } else if (size & 0x20) { 2415436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ vex_printf(", #%d", size - 32); 2416436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ } else if (size & 0x10) { 2417436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ vex_printf(", #%d", size - 16); 2418436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ } else if (size & 0x08) { 2419436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ vex_printf(", #%d", size - 8); 2420436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ } 2421436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ } 2422436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ return; 2423436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMin_NUnaryS: 2424436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ vex_printf("%s%s%s ", 2425436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ showARMNeonUnOpS(i->ARMin.NUnaryS.op), 2426436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ showARMNeonUnOpSDataType(i->ARMin.NUnaryS.op), 2427436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ showARMNeonDataSize(i)); 2428436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ ppARMNRS(i->ARMin.NUnaryS.dst); 2429436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ vex_printf(", "); 2430436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ ppARMNRS(i->ARMin.NUnaryS.src); 2431436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ return; 2432436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMin_NShift: 2433436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ vex_printf("%s%s%s ", 2434436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ showARMNeonShiftOp(i->ARMin.NShift.op), 2435436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ showARMNeonShiftOpDataType(i->ARMin.NShift.op), 2436436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ showARMNeonDataSize(i)); 2437436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ ppHRegARM(i->ARMin.NShift.dst); 2438436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ vex_printf(", "); 2439436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ ppHRegARM(i->ARMin.NShift.argL); 2440436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ vex_printf(", "); 2441436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ ppHRegARM(i->ARMin.NShift.argR); 2442436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ return; 2443436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMin_NShl64: 2444436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ vex_printf("vshl.i64 "); 2445436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ ppHRegARM(i->ARMin.NShl64.dst); 2446436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ vex_printf(", "); 2447436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ ppHRegARM(i->ARMin.NShl64.src); 2448436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ vex_printf(", #%u", i->ARMin.NShl64.amt); 2449436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ return; 2450436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMin_NDual: 2451436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ vex_printf("%s%s%s ", 2452436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ showARMNeonDualOp(i->ARMin.NDual.op), 2453436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ showARMNeonDualOpDataType(i->ARMin.NDual.op), 2454436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ showARMNeonDataSize(i)); 2455436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ ppHRegARM(i->ARMin.NDual.arg1); 2456436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ vex_printf(", "); 2457436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ ppHRegARM(i->ARMin.NDual.arg2); 2458436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ return; 2459436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMin_NBinary: 2460436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ vex_printf("%s%s%s", 2461436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ showARMNeonBinOp(i->ARMin.NBinary.op), 2462436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ showARMNeonBinOpDataType(i->ARMin.NBinary.op), 2463436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ showARMNeonDataSize(i)); 2464436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ vex_printf(" "); 2465436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ ppHRegARM(i->ARMin.NBinary.dst); 2466436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ vex_printf(", "); 2467436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ ppHRegARM(i->ARMin.NBinary.argL); 2468436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ vex_printf(", "); 2469436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ ppHRegARM(i->ARMin.NBinary.argR); 2470436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ return; 2471436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64in_VImmQ: 2472436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vex_printf("qimm "); 2473436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ppHRegARM64(i->ARM64in.VImmQ.rQ); 2474436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vex_printf(", Bits16toBytes16(0x%x)", (UInt)i->ARM64in.VImmQ.imm); 2475436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return; 2476436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64in_VDfromX: 2477436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vex_printf("fmov "); 2478436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ppHRegARM64(i->ARM64in.VDfromX.rD); 2479436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vex_printf(", "); 2480436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ppHRegARM64(i->ARM64in.VDfromX.rX); 2481436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return; 2482436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64in_VQfromXX: 2483436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vex_printf("qFromXX "); 2484436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ppHRegARM64(i->ARM64in.VQfromXX.rQ); 2485436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vex_printf(", "); 2486436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ppHRegARM64(i->ARM64in.VQfromXX.rXhi); 2487436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vex_printf(", "); 2488436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ppHRegARM64(i->ARM64in.VQfromXX.rXlo); 2489436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return; 2490436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64in_VXfromQ: 2491436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vex_printf("mov "); 2492436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ppHRegARM64(i->ARM64in.VXfromQ.rX); 2493436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vex_printf(", "); 2494436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ppHRegARM64(i->ARM64in.VXfromQ.rQ); 2495436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vex_printf(".d[%u]", i->ARM64in.VXfromQ.laneNo); 2496436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return; 2497436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64in_VMov: { 2498436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov UChar aux = '?'; 2499436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov switch (i->ARM64in.VMov.szB) { 2500436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case 16: aux = 'q'; break; 2501436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case 8: aux = 'd'; break; 2502436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case 4: aux = 's'; break; 2503436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov default: break; 2504436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 2505436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vex_printf("mov(%c) ", aux); 2506436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ppHRegARM64(i->ARM64in.VMov.dst); 2507436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vex_printf(", "); 2508436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ppHRegARM64(i->ARM64in.VMov.src); 2509436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return; 2510436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 2511436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMin_NCMovQ: 2512436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ vex_printf("vmov%s ", showARMCondCode(i->ARMin.NCMovQ.cond)); 2513436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ ppHRegARM(i->ARMin.NCMovQ.dst); 2514436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ vex_printf(", "); 2515436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ ppHRegARM(i->ARMin.NCMovQ.src); 2516436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ return; 2517436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMin_Add32: 2518436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ vex_printf("add32 "); 2519436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ ppHRegARM(i->ARMin.Add32.rD); 2520436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ vex_printf(", "); 2521436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ ppHRegARM(i->ARMin.Add32.rN); 2522436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ vex_printf(", "); 2523436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ vex_printf("%d", i->ARMin.Add32.imm32); 2524436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ return; 2525436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64in_EvCheck: 2526436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vex_printf("(evCheck) ldr w9,"); 2527436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ppARM64AMode(i->ARM64in.EvCheck.amCounter); 2528436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vex_printf("; subs w9,w9,$1; str w9,"); 2529436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ppARM64AMode(i->ARM64in.EvCheck.amCounter); 2530436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vex_printf("; bpl nofail; ldr x9,"); 2531436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ppARM64AMode(i->ARM64in.EvCheck.amFailAddr); 2532436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vex_printf("; br x9; nofail:"); 2533436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return; 2534436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMin_ProfInc: 2535436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ vex_printf("(profInc) movw r12,LO16($NotKnownYet); " 2536436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ "movw r12,HI16($NotKnownYet); " 2537436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ "ldr r11,[r12]; " 2538436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ "adds r11,r11,$1; " 2539436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ "str r11,[r12]; " 2540436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ "ldr r11,[r12+4]; " 2541436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ "adc r11,r11,$0; " 2542436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ "str r11,[r12+4]"); 2543436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ return; 2544436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov default: 2545436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vex_printf("ppARM64Instr: unhandled case (tag %d)", (Int)i->tag); 2546436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vpanic("ppARM64Instr(1)"); 2547436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return; 2548436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 2549436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov} 2550436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 2551436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 2552436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov/* --------- Helpers for register allocation. --------- */ 2553436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 2554436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovvoid getRegUsage_ARM64Instr ( HRegUsage* u, ARM64Instr* i, Bool mode64 ) 2555436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{ 2556436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(mode64 == True); 2557436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov initHRegUsage(u); 2558436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov switch (i->tag) { 2559436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64in_Arith: 2560436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov addHRegUse(u, HRmWrite, i->ARM64in.Arith.dst); 2561436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov addHRegUse(u, HRmRead, i->ARM64in.Arith.argL); 2562436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov addRegUsage_ARM64RIA(u, i->ARM64in.Arith.argR); 2563436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return; 2564436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64in_Cmp: 2565436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov addHRegUse(u, HRmRead, i->ARM64in.Cmp.argL); 2566436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov addRegUsage_ARM64RIA(u, i->ARM64in.Cmp.argR); 2567436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return; 2568436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64in_Logic: 2569436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov addHRegUse(u, HRmWrite, i->ARM64in.Logic.dst); 2570436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov addHRegUse(u, HRmRead, i->ARM64in.Logic.argL); 2571436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov addRegUsage_ARM64RIL(u, i->ARM64in.Logic.argR); 2572436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return; 2573436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64in_Test: 2574436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov addHRegUse(u, HRmRead, i->ARM64in.Test.argL); 2575436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov addRegUsage_ARM64RIL(u, i->ARM64in.Test.argR); 2576436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return; 2577436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64in_Shift: 2578436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov addHRegUse(u, HRmWrite, i->ARM64in.Shift.dst); 2579436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov addHRegUse(u, HRmRead, i->ARM64in.Shift.argL); 2580436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov addRegUsage_ARM64RI6(u, i->ARM64in.Shift.argR); 2581436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return; 2582436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64in_Unary: 2583436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov addHRegUse(u, HRmWrite, i->ARM64in.Unary.dst); 2584436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov addHRegUse(u, HRmRead, i->ARM64in.Unary.src); 2585436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return; 2586436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64in_MovI: 2587436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov addHRegUse(u, HRmWrite, i->ARM64in.MovI.dst); 2588436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov addHRegUse(u, HRmRead, i->ARM64in.MovI.src); 2589436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return; 2590436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64in_Imm64: 2591436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov addHRegUse(u, HRmWrite, i->ARM64in.Imm64.dst); 2592436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return; 2593436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64in_LdSt64: 2594436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov addRegUsage_ARM64AMode(u, i->ARM64in.LdSt64.amode); 2595436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if (i->ARM64in.LdSt64.isLoad) { 2596436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov addHRegUse(u, HRmWrite, i->ARM64in.LdSt64.rD); 2597436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } else { 2598436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov addHRegUse(u, HRmRead, i->ARM64in.LdSt64.rD); 2599436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 2600436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return; 2601436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64in_LdSt32: 2602436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov addRegUsage_ARM64AMode(u, i->ARM64in.LdSt32.amode); 2603436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if (i->ARM64in.LdSt32.isLoad) { 2604436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov addHRegUse(u, HRmWrite, i->ARM64in.LdSt32.rD); 2605436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } else { 2606436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov addHRegUse(u, HRmRead, i->ARM64in.LdSt32.rD); 2607436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 2608436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return; 2609436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64in_LdSt16: 2610436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov addRegUsage_ARM64AMode(u, i->ARM64in.LdSt16.amode); 2611436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if (i->ARM64in.LdSt16.isLoad) { 2612436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov addHRegUse(u, HRmWrite, i->ARM64in.LdSt16.rD); 2613436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } else { 2614436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov addHRegUse(u, HRmRead, i->ARM64in.LdSt16.rD); 2615436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 2616436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return; 2617436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64in_LdSt8: 2618436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov addRegUsage_ARM64AMode(u, i->ARM64in.LdSt8.amode); 2619436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if (i->ARM64in.LdSt8.isLoad) { 2620436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov addHRegUse(u, HRmWrite, i->ARM64in.LdSt8.rD); 2621436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } else { 2622436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov addHRegUse(u, HRmRead, i->ARM64in.LdSt8.rD); 2623436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 2624436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return; 2625436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* XDirect/XIndir/XAssisted are also a bit subtle. They 2626436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov conditionally exit the block. Hence we only need to list (1) 2627436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov the registers that they read, and (2) the registers that they 2628436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov write in the case where the block is not exited. (2) is 2629436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov empty, hence only (1) is relevant here. */ 2630436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64in_XDirect: 2631436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov addRegUsage_ARM64AMode(u, i->ARM64in.XDirect.amPC); 2632436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return; 2633436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64in_XIndir: 2634436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov addHRegUse(u, HRmRead, i->ARM64in.XIndir.dstGA); 2635436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov addRegUsage_ARM64AMode(u, i->ARM64in.XIndir.amPC); 2636436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return; 2637436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64in_XAssisted: 2638436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov addHRegUse(u, HRmRead, i->ARM64in.XAssisted.dstGA); 2639436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov addRegUsage_ARM64AMode(u, i->ARM64in.XAssisted.amPC); 2640436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return; 2641436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64in_CSel: 2642436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov addHRegUse(u, HRmWrite, i->ARM64in.CSel.dst); 2643436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov addHRegUse(u, HRmRead, i->ARM64in.CSel.argL); 2644436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov addHRegUse(u, HRmRead, i->ARM64in.CSel.argR); 2645436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return; 2646436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64in_Call: 2647436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* logic and comments copied/modified from x86 back end */ 2648436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* This is a bit subtle. */ 2649436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* First off, claim it trashes all the caller-saved regs 2650436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov which fall within the register allocator's jurisdiction. 2651436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov These I believe to be x0 to x7. Also need to be 2652436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov careful about vector regs. */ 2653436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov addHRegUse(u, HRmWrite, hregARM64_X0()); 2654436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov addHRegUse(u, HRmWrite, hregARM64_X1()); 2655436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov addHRegUse(u, HRmWrite, hregARM64_X2()); 2656436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov addHRegUse(u, HRmWrite, hregARM64_X3()); 2657436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov addHRegUse(u, HRmWrite, hregARM64_X4()); 2658436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov addHRegUse(u, HRmWrite, hregARM64_X5()); 2659436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov addHRegUse(u, HRmWrite, hregARM64_X6()); 2660436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov addHRegUse(u, HRmWrite, hregARM64_X7()); 2661436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov addHRegUse(u, HRmWrite, hregARM64_Q16()); 2662436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov addHRegUse(u, HRmWrite, hregARM64_Q17()); 2663436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov addHRegUse(u, HRmWrite, hregARM64_Q18()); 2664436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* Now we have to state any parameter-carrying registers 2665436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov which might be read. This depends on nArgRegs. */ 2666436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov switch (i->ARM64in.Call.nArgRegs) { 2667436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case 8: addHRegUse(u, HRmRead, hregARM64_X7()); /*fallthru*/ 2668436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case 7: addHRegUse(u, HRmRead, hregARM64_X6()); /*fallthru*/ 2669436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case 6: addHRegUse(u, HRmRead, hregARM64_X5()); /*fallthru*/ 2670436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case 5: addHRegUse(u, HRmRead, hregARM64_X4()); /*fallthru*/ 2671436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case 4: addHRegUse(u, HRmRead, hregARM64_X3()); /*fallthru*/ 2672436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case 3: addHRegUse(u, HRmRead, hregARM64_X2()); /*fallthru*/ 2673436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case 2: addHRegUse(u, HRmRead, hregARM64_X1()); /*fallthru*/ 2674436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case 1: addHRegUse(u, HRmRead, hregARM64_X0()); break; 2675436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case 0: break; 2676436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov default: vpanic("getRegUsage_ARM64:Call:regparms"); 2677436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 2678436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* Finally, there is the issue that the insn trashes a 2679436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov register because the literal target address has to be 2680436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov loaded into a register. However, we reserve x9 for that 2681436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov purpose so there's no further complexity here. Stating x9 2682436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov as trashed is pointless since it's not under the control 2683436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov of the allocator, but what the hell. */ 2684436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov addHRegUse(u, HRmWrite, hregARM64_X9()); 2685436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return; 2686436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64in_AddToSP: 2687436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* Only changes SP, but regalloc doesn't control that, hence 2688436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov we don't care. */ 2689436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return; 2690436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64in_FromSP: 2691436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov addHRegUse(u, HRmWrite, i->ARM64in.FromSP.dst); 2692436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return; 2693436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64in_Mul: 2694436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov addHRegUse(u, HRmWrite, i->ARM64in.Mul.dst); 2695436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov addHRegUse(u, HRmRead, i->ARM64in.Mul.argL); 2696436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov addHRegUse(u, HRmRead, i->ARM64in.Mul.argR); 2697436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return; 2698436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64in_LdrEX: 2699436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov addHRegUse(u, HRmRead, hregARM64_X4()); 2700436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov addHRegUse(u, HRmWrite, hregARM64_X2()); 2701436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return; 2702436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64in_StrEX: 2703436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov addHRegUse(u, HRmRead, hregARM64_X4()); 2704436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov addHRegUse(u, HRmWrite, hregARM64_X0()); 2705436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov addHRegUse(u, HRmRead, hregARM64_X2()); 2706436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return; 2707436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64in_MFence: 2708436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return; 2709436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMin_CLREX: 2710436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ return; 2711436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64in_VLdStS: 2712436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov addHRegUse(u, HRmRead, i->ARM64in.VLdStS.rN); 2713436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if (i->ARM64in.VLdStS.isLoad) { 2714436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov addHRegUse(u, HRmWrite, i->ARM64in.VLdStS.sD); 2715436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } else { 2716436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov addHRegUse(u, HRmRead, i->ARM64in.VLdStS.sD); 2717436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 2718436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return; 2719436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64in_VLdStD: 2720436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov addHRegUse(u, HRmRead, i->ARM64in.VLdStD.rN); 2721436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if (i->ARM64in.VLdStD.isLoad) { 2722436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov addHRegUse(u, HRmWrite, i->ARM64in.VLdStD.dD); 2723436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } else { 2724436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov addHRegUse(u, HRmRead, i->ARM64in.VLdStD.dD); 2725436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 2726436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return; 2727436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64in_VLdStQ: 2728436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov addHRegUse(u, HRmRead, i->ARM64in.VLdStQ.rN); 2729436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if (i->ARM64in.VLdStQ.isLoad) 2730436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov addHRegUse(u, HRmWrite, i->ARM64in.VLdStQ.rQ); 2731436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov else 2732436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov addHRegUse(u, HRmRead, i->ARM64in.VLdStQ.rQ); 2733436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return; 2734436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64in_VCvtI2F: 2735436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov addHRegUse(u, HRmRead, i->ARM64in.VCvtI2F.rS); 2736436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov addHRegUse(u, HRmWrite, i->ARM64in.VCvtI2F.rD); 2737436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return; 2738436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64in_VCvtF2I: 2739436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov addHRegUse(u, HRmRead, i->ARM64in.VCvtF2I.rS); 2740436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov addHRegUse(u, HRmWrite, i->ARM64in.VCvtF2I.rD); 2741436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return; 2742436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64in_VCvtSD: 2743436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov addHRegUse(u, HRmWrite, i->ARM64in.VCvtSD.dst); 2744436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov addHRegUse(u, HRmRead, i->ARM64in.VCvtSD.src); 2745436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return; 2746436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64in_VUnaryD: 2747436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov addHRegUse(u, HRmWrite, i->ARM64in.VUnaryD.dst); 2748436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov addHRegUse(u, HRmRead, i->ARM64in.VUnaryD.src); 2749436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return; 2750436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64in_VUnaryS: 2751436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov addHRegUse(u, HRmWrite, i->ARM64in.VUnaryS.dst); 2752436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov addHRegUse(u, HRmRead, i->ARM64in.VUnaryS.src); 2753436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return; 2754436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64in_VBinD: 2755436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov addHRegUse(u, HRmWrite, i->ARM64in.VBinD.dst); 2756436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov addHRegUse(u, HRmRead, i->ARM64in.VBinD.argL); 2757436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov addHRegUse(u, HRmRead, i->ARM64in.VBinD.argR); 2758436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return; 2759436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64in_VBinS: 2760436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov addHRegUse(u, HRmWrite, i->ARM64in.VBinS.dst); 2761436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov addHRegUse(u, HRmRead, i->ARM64in.VBinS.argL); 2762436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov addHRegUse(u, HRmRead, i->ARM64in.VBinS.argR); 2763436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return; 2764436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64in_VCmpD: 2765436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov addHRegUse(u, HRmRead, i->ARM64in.VCmpD.argL); 2766436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov addHRegUse(u, HRmRead, i->ARM64in.VCmpD.argR); 2767436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return; 2768436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64in_VCmpS: 2769436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov addHRegUse(u, HRmRead, i->ARM64in.VCmpS.argL); 2770436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov addHRegUse(u, HRmRead, i->ARM64in.VCmpS.argR); 2771436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return; 2772436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64in_FPCR: 2773436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if (i->ARM64in.FPCR.toFPCR) 2774436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov addHRegUse(u, HRmRead, i->ARM64in.FPCR.iReg); 2775436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov else 2776436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov addHRegUse(u, HRmWrite, i->ARM64in.FPCR.iReg); 2777436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return; 2778436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64in_VBinV: 2779436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov addHRegUse(u, HRmWrite, i->ARM64in.VBinV.dst); 2780436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov addHRegUse(u, HRmRead, i->ARM64in.VBinV.argL); 2781436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov addHRegUse(u, HRmRead, i->ARM64in.VBinV.argR); 2782436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return; 2783436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64in_VUnaryV: 2784436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov addHRegUse(u, HRmWrite, i->ARM64in.VUnaryV.dst); 2785436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov addHRegUse(u, HRmRead, i->ARM64in.VUnaryV.arg); 2786436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return; 2787436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64in_VNarrowV: 2788436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov addHRegUse(u, HRmWrite, i->ARM64in.VNarrowV.dst); 2789436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov addHRegUse(u, HRmRead, i->ARM64in.VNarrowV.src); 2790436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return; 2791436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64in_VShiftImmV: 2792436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov addHRegUse(u, HRmWrite, i->ARM64in.VShiftImmV.dst); 2793436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov addHRegUse(u, HRmRead, i->ARM64in.VShiftImmV.src); 2794436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return; 2795436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMin_VAluS: 2796436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ addHRegUse(u, HRmWrite, i->ARMin.VAluS.dst); 2797436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ addHRegUse(u, HRmRead, i->ARMin.VAluS.argL); 2798436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ addHRegUse(u, HRmRead, i->ARMin.VAluS.argR); 2799436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ return; 2800436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMin_VUnaryS: 2801436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ addHRegUse(u, HRmWrite, i->ARMin.VUnaryS.dst); 2802436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ addHRegUse(u, HRmRead, i->ARMin.VUnaryS.src); 2803436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ return; 2804436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMin_VCMovD: 2805436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ addHRegUse(u, HRmWrite, i->ARMin.VCMovD.dst); 2806436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ addHRegUse(u, HRmRead, i->ARMin.VCMovD.dst); 2807436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ addHRegUse(u, HRmRead, i->ARMin.VCMovD.src); 2808436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ return; 2809436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMin_VCMovS: 2810436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ addHRegUse(u, HRmWrite, i->ARMin.VCMovS.dst); 2811436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ addHRegUse(u, HRmRead, i->ARMin.VCMovS.dst); 2812436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ addHRegUse(u, HRmRead, i->ARMin.VCMovS.src); 2813436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ return; 2814436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMin_VXferD: 2815436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ if (i->ARMin.VXferD.toD) { 2816436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ addHRegUse(u, HRmWrite, i->ARMin.VXferD.dD); 2817436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ addHRegUse(u, HRmRead, i->ARMin.VXferD.rHi); 2818436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ addHRegUse(u, HRmRead, i->ARMin.VXferD.rLo); 2819436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ } else { 2820436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ addHRegUse(u, HRmRead, i->ARMin.VXferD.dD); 2821436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ addHRegUse(u, HRmWrite, i->ARMin.VXferD.rHi); 2822436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ addHRegUse(u, HRmWrite, i->ARMin.VXferD.rLo); 2823436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ } 2824436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ return; 2825436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMin_VXferS: 2826436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ if (i->ARMin.VXferS.toS) { 2827436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ addHRegUse(u, HRmWrite, i->ARMin.VXferS.fD); 2828436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ addHRegUse(u, HRmRead, i->ARMin.VXferS.rLo); 2829436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ } else { 2830436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ addHRegUse(u, HRmRead, i->ARMin.VXferS.fD); 2831436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ addHRegUse(u, HRmWrite, i->ARMin.VXferS.rLo); 2832436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ } 2833436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ return; 2834436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMin_VCvtID: 2835436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ addHRegUse(u, HRmWrite, i->ARMin.VCvtID.dst); 2836436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ addHRegUse(u, HRmRead, i->ARMin.VCvtID.src); 2837436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ return; 2838436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMin_NLdStD: 2839436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ if (i->ARMin.NLdStD.isLoad) 2840436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ addHRegUse(u, HRmWrite, i->ARMin.NLdStD.dD); 2841436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ else 2842436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ addHRegUse(u, HRmRead, i->ARMin.NLdStD.dD); 2843436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ addRegUsage_ARMAModeN(u, i->ARMin.NLdStD.amode); 2844436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ return; 2845436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMin_NUnary: 2846436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ addHRegUse(u, HRmWrite, i->ARMin.NUnary.dst); 2847436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ addHRegUse(u, HRmRead, i->ARMin.NUnary.src); 2848436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ return; 2849436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMin_NUnaryS: 2850436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ addHRegUse(u, HRmWrite, i->ARMin.NUnaryS.dst->reg); 2851436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ addHRegUse(u, HRmRead, i->ARMin.NUnaryS.src->reg); 2852436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ return; 2853436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMin_NShift: 2854436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ addHRegUse(u, HRmWrite, i->ARMin.NShift.dst); 2855436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ addHRegUse(u, HRmRead, i->ARMin.NShift.argL); 2856436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ addHRegUse(u, HRmRead, i->ARMin.NShift.argR); 2857436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ return; 2858436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMin_NShl64: 2859436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ addHRegUse(u, HRmWrite, i->ARMin.NShl64.dst); 2860436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ addHRegUse(u, HRmRead, i->ARMin.NShl64.src); 2861436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ return; 2862436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMin_NDual: 2863436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ addHRegUse(u, HRmWrite, i->ARMin.NDual.arg1); 2864436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ addHRegUse(u, HRmWrite, i->ARMin.NDual.arg2); 2865436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ addHRegUse(u, HRmRead, i->ARMin.NDual.arg1); 2866436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ addHRegUse(u, HRmRead, i->ARMin.NDual.arg2); 2867436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ return; 2868436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64in_VImmQ: 2869436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov addHRegUse(u, HRmWrite, i->ARM64in.VImmQ.rQ); 2870436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return; 2871436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64in_VDfromX: 2872436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov addHRegUse(u, HRmWrite, i->ARM64in.VDfromX.rD); 2873436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov addHRegUse(u, HRmRead, i->ARM64in.VDfromX.rX); 2874436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return; 2875436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64in_VQfromXX: 2876436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov addHRegUse(u, HRmWrite, i->ARM64in.VQfromXX.rQ); 2877436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov addHRegUse(u, HRmRead, i->ARM64in.VQfromXX.rXhi); 2878436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov addHRegUse(u, HRmRead, i->ARM64in.VQfromXX.rXlo); 2879436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return; 2880436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64in_VXfromQ: 2881436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov addHRegUse(u, HRmWrite, i->ARM64in.VXfromQ.rX); 2882436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov addHRegUse(u, HRmRead, i->ARM64in.VXfromQ.rQ); 2883436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return; 2884436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64in_VMov: 2885436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov addHRegUse(u, HRmWrite, i->ARM64in.VMov.dst); 2886436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov addHRegUse(u, HRmRead, i->ARM64in.VMov.src); 2887436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return; 2888436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMin_NBinary: 2889436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ addHRegUse(u, HRmWrite, i->ARMin.NBinary.dst); 2890436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ /* TODO: sometimes dst is also being read! */ 2891436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ // XXX fix this 2892436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ addHRegUse(u, HRmRead, i->ARMin.NBinary.argL); 2893436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ addHRegUse(u, HRmRead, i->ARMin.NBinary.argR); 2894436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ return; 2895436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMin_NCMovQ: 2896436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ addHRegUse(u, HRmWrite, i->ARMin.NCMovQ.dst); 2897436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ addHRegUse(u, HRmRead, i->ARMin.NCMovQ.dst); 2898436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ addHRegUse(u, HRmRead, i->ARMin.NCMovQ.src); 2899436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ return; 2900436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMin_Add32: 2901436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ addHRegUse(u, HRmWrite, i->ARMin.Add32.rD); 2902436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ addHRegUse(u, HRmRead, i->ARMin.Add32.rN); 2903436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ return; 2904436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64in_EvCheck: 2905436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* We expect both amodes only to mention x21, so this is in 2906436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov fact pointless, since x21 isn't allocatable, but 2907436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov anyway.. */ 2908436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov addRegUsage_ARM64AMode(u, i->ARM64in.EvCheck.amCounter); 2909436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov addRegUsage_ARM64AMode(u, i->ARM64in.EvCheck.amFailAddr); 2910436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov addHRegUse(u, HRmWrite, hregARM64_X9()); /* also unavail to RA */ 2911436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return; 2912436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMin_ProfInc: 2913436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ addHRegUse(u, HRmWrite, hregARM_R12()); 2914436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ addHRegUse(u, HRmWrite, hregARM_R11()); 2915436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ return; 2916436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov default: 2917436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ppARM64Instr(i); 2918436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vpanic("getRegUsage_ARM64Instr"); 2919436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 2920436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov} 2921436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 2922436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 2923436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovvoid mapRegs_ARM64Instr ( HRegRemap* m, ARM64Instr* i, Bool mode64 ) 2924436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{ 2925436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(mode64 == True); 2926436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov switch (i->tag) { 2927436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64in_Arith: 2928436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->ARM64in.Arith.dst = lookupHRegRemap(m, i->ARM64in.Arith.dst); 2929436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->ARM64in.Arith.argL = lookupHRegRemap(m, i->ARM64in.Arith.argL); 2930436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov mapRegs_ARM64RIA(m, i->ARM64in.Arith.argR); 2931436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return; 2932436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64in_Cmp: 2933436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->ARM64in.Cmp.argL = lookupHRegRemap(m, i->ARM64in.Cmp.argL); 2934436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov mapRegs_ARM64RIA(m, i->ARM64in.Cmp.argR); 2935436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return; 2936436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64in_Logic: 2937436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->ARM64in.Logic.dst = lookupHRegRemap(m, i->ARM64in.Logic.dst); 2938436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->ARM64in.Logic.argL = lookupHRegRemap(m, i->ARM64in.Logic.argL); 2939436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov mapRegs_ARM64RIL(m, i->ARM64in.Logic.argR); 2940436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return; 2941436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64in_Test: 2942436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->ARM64in.Test.argL = lookupHRegRemap(m, i->ARM64in.Test.argL); 2943436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov mapRegs_ARM64RIL(m, i->ARM64in.Logic.argR); 2944436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return; 2945436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64in_Shift: 2946436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->ARM64in.Shift.dst = lookupHRegRemap(m, i->ARM64in.Shift.dst); 2947436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->ARM64in.Shift.argL = lookupHRegRemap(m, i->ARM64in.Shift.argL); 2948436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov mapRegs_ARM64RI6(m, i->ARM64in.Shift.argR); 2949436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return; 2950436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64in_Unary: 2951436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->ARM64in.Unary.dst = lookupHRegRemap(m, i->ARM64in.Unary.dst); 2952436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->ARM64in.Unary.src = lookupHRegRemap(m, i->ARM64in.Unary.src); 2953436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return; 2954436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64in_MovI: 2955436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->ARM64in.MovI.dst = lookupHRegRemap(m, i->ARM64in.MovI.dst); 2956436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->ARM64in.MovI.src = lookupHRegRemap(m, i->ARM64in.MovI.src); 2957436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return; 2958436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64in_Imm64: 2959436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->ARM64in.Imm64.dst = lookupHRegRemap(m, i->ARM64in.Imm64.dst); 2960436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return; 2961436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64in_LdSt64: 2962436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->ARM64in.LdSt64.rD = lookupHRegRemap(m, i->ARM64in.LdSt64.rD); 2963436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov mapRegs_ARM64AMode(m, i->ARM64in.LdSt64.amode); 2964436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return; 2965436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64in_LdSt32: 2966436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->ARM64in.LdSt32.rD = lookupHRegRemap(m, i->ARM64in.LdSt32.rD); 2967436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov mapRegs_ARM64AMode(m, i->ARM64in.LdSt32.amode); 2968436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return; 2969436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64in_LdSt16: 2970436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->ARM64in.LdSt16.rD = lookupHRegRemap(m, i->ARM64in.LdSt16.rD); 2971436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov mapRegs_ARM64AMode(m, i->ARM64in.LdSt16.amode); 2972436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return; 2973436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64in_LdSt8: 2974436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->ARM64in.LdSt8.rD = lookupHRegRemap(m, i->ARM64in.LdSt8.rD); 2975436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov mapRegs_ARM64AMode(m, i->ARM64in.LdSt8.amode); 2976436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return; 2977436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64in_XDirect: 2978436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov mapRegs_ARM64AMode(m, i->ARM64in.XDirect.amPC); 2979436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return; 2980436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64in_XIndir: 2981436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->ARM64in.XIndir.dstGA 2982436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov = lookupHRegRemap(m, i->ARM64in.XIndir.dstGA); 2983436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov mapRegs_ARM64AMode(m, i->ARM64in.XIndir.amPC); 2984436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return; 2985436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64in_XAssisted: 2986436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->ARM64in.XAssisted.dstGA 2987436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov = lookupHRegRemap(m, i->ARM64in.XAssisted.dstGA); 2988436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov mapRegs_ARM64AMode(m, i->ARM64in.XAssisted.amPC); 2989436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return; 2990436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64in_CSel: 2991436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->ARM64in.CSel.dst = lookupHRegRemap(m, i->ARM64in.CSel.dst); 2992436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->ARM64in.CSel.argL = lookupHRegRemap(m, i->ARM64in.CSel.argL); 2993436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->ARM64in.CSel.argR = lookupHRegRemap(m, i->ARM64in.CSel.argR); 2994436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return; 2995436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64in_Call: 2996436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return; 2997436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64in_AddToSP: 2998436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return; 2999436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64in_FromSP: 3000436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->ARM64in.FromSP.dst = lookupHRegRemap(m, i->ARM64in.FromSP.dst); 3001436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return; 3002436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64in_Mul: 3003436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->ARM64in.Mul.dst = lookupHRegRemap(m, i->ARM64in.Mul.dst); 3004436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->ARM64in.Mul.argL = lookupHRegRemap(m, i->ARM64in.Mul.argL); 3005436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->ARM64in.Mul.argR = lookupHRegRemap(m, i->ARM64in.Mul.argR); 3006436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov break; 3007436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64in_LdrEX: 3008436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return; 3009436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64in_StrEX: 3010436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return; 3011436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64in_MFence: 3012436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return; 3013436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMin_CLREX: 3014436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ return; 3015436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64in_VLdStS: 3016436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->ARM64in.VLdStS.sD = lookupHRegRemap(m, i->ARM64in.VLdStS.sD); 3017436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->ARM64in.VLdStS.rN = lookupHRegRemap(m, i->ARM64in.VLdStS.rN); 3018436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return; 3019436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64in_VLdStD: 3020436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->ARM64in.VLdStD.dD = lookupHRegRemap(m, i->ARM64in.VLdStD.dD); 3021436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->ARM64in.VLdStD.rN = lookupHRegRemap(m, i->ARM64in.VLdStD.rN); 3022436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return; 3023436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64in_VLdStQ: 3024436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->ARM64in.VLdStQ.rQ = lookupHRegRemap(m, i->ARM64in.VLdStQ.rQ); 3025436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->ARM64in.VLdStQ.rN = lookupHRegRemap(m, i->ARM64in.VLdStQ.rN); 3026436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return; 3027436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64in_VCvtI2F: 3028436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->ARM64in.VCvtI2F.rS = lookupHRegRemap(m, i->ARM64in.VCvtI2F.rS); 3029436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->ARM64in.VCvtI2F.rD = lookupHRegRemap(m, i->ARM64in.VCvtI2F.rD); 3030436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return; 3031436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64in_VCvtF2I: 3032436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->ARM64in.VCvtF2I.rS = lookupHRegRemap(m, i->ARM64in.VCvtF2I.rS); 3033436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->ARM64in.VCvtF2I.rD = lookupHRegRemap(m, i->ARM64in.VCvtF2I.rD); 3034436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return; 3035436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64in_VCvtSD: 3036436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->ARM64in.VCvtSD.dst = lookupHRegRemap(m, i->ARM64in.VCvtSD.dst); 3037436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->ARM64in.VCvtSD.src = lookupHRegRemap(m, i->ARM64in.VCvtSD.src); 3038436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return; 3039436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64in_VUnaryD: 3040436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->ARM64in.VUnaryD.dst = lookupHRegRemap(m, i->ARM64in.VUnaryD.dst); 3041436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->ARM64in.VUnaryD.src = lookupHRegRemap(m, i->ARM64in.VUnaryD.src); 3042436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return; 3043436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64in_VUnaryS: 3044436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->ARM64in.VUnaryS.dst = lookupHRegRemap(m, i->ARM64in.VUnaryS.dst); 3045436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->ARM64in.VUnaryS.src = lookupHRegRemap(m, i->ARM64in.VUnaryS.src); 3046436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return; 3047436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64in_VBinD: 3048436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->ARM64in.VBinD.dst = lookupHRegRemap(m, i->ARM64in.VBinD.dst); 3049436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->ARM64in.VBinD.argL = lookupHRegRemap(m, i->ARM64in.VBinD.argL); 3050436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->ARM64in.VBinD.argR = lookupHRegRemap(m, i->ARM64in.VBinD.argR); 3051436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return; 3052436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64in_VBinS: 3053436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->ARM64in.VBinS.dst = lookupHRegRemap(m, i->ARM64in.VBinS.dst); 3054436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->ARM64in.VBinS.argL = lookupHRegRemap(m, i->ARM64in.VBinS.argL); 3055436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->ARM64in.VBinS.argR = lookupHRegRemap(m, i->ARM64in.VBinS.argR); 3056436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return; 3057436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64in_VCmpD: 3058436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->ARM64in.VCmpD.argL = lookupHRegRemap(m, i->ARM64in.VCmpD.argL); 3059436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->ARM64in.VCmpD.argR = lookupHRegRemap(m, i->ARM64in.VCmpD.argR); 3060436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return; 3061436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64in_VCmpS: 3062436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->ARM64in.VCmpS.argL = lookupHRegRemap(m, i->ARM64in.VCmpS.argL); 3063436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->ARM64in.VCmpS.argR = lookupHRegRemap(m, i->ARM64in.VCmpS.argR); 3064436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return; 3065436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64in_FPCR: 3066436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->ARM64in.FPCR.iReg = lookupHRegRemap(m, i->ARM64in.FPCR.iReg); 3067436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return; 3068436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64in_VBinV: 3069436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->ARM64in.VBinV.dst = lookupHRegRemap(m, i->ARM64in.VBinV.dst); 3070436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->ARM64in.VBinV.argL = lookupHRegRemap(m, i->ARM64in.VBinV.argL); 3071436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->ARM64in.VBinV.argR = lookupHRegRemap(m, i->ARM64in.VBinV.argR); 3072436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return; 3073436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64in_VUnaryV: 3074436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->ARM64in.VUnaryV.dst = lookupHRegRemap(m, i->ARM64in.VUnaryV.dst); 3075436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->ARM64in.VUnaryV.arg = lookupHRegRemap(m, i->ARM64in.VUnaryV.arg); 3076436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return; 3077436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64in_VNarrowV: 3078436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->ARM64in.VNarrowV.dst = lookupHRegRemap(m, i->ARM64in.VNarrowV.dst); 3079436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->ARM64in.VNarrowV.src = lookupHRegRemap(m, i->ARM64in.VNarrowV.src); 3080436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return; 3081436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64in_VShiftImmV: 3082436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->ARM64in.VShiftImmV.dst 3083436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov = lookupHRegRemap(m, i->ARM64in.VShiftImmV.dst); 3084436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->ARM64in.VShiftImmV.src 3085436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov = lookupHRegRemap(m, i->ARM64in.VShiftImmV.src); 3086436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return; 3087436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMin_VAluS: 3088436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ i->ARMin.VAluS.dst = lookupHRegRemap(m, i->ARMin.VAluS.dst); 3089436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ i->ARMin.VAluS.argL = lookupHRegRemap(m, i->ARMin.VAluS.argL); 3090436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ i->ARMin.VAluS.argR = lookupHRegRemap(m, i->ARMin.VAluS.argR); 3091436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ return; 3092436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMin_VCMovD: 3093436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ i->ARMin.VCMovD.dst = lookupHRegRemap(m, i->ARMin.VCMovD.dst); 3094436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ i->ARMin.VCMovD.src = lookupHRegRemap(m, i->ARMin.VCMovD.src); 3095436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ return; 3096436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMin_VCMovS: 3097436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ i->ARMin.VCMovS.dst = lookupHRegRemap(m, i->ARMin.VCMovS.dst); 3098436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ i->ARMin.VCMovS.src = lookupHRegRemap(m, i->ARMin.VCMovS.src); 3099436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ return; 3100436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMin_VXferD: 3101436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ i->ARMin.VXferD.dD = lookupHRegRemap(m, i->ARMin.VXferD.dD); 3102436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ i->ARMin.VXferD.rHi = lookupHRegRemap(m, i->ARMin.VXferD.rHi); 3103436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ i->ARMin.VXferD.rLo = lookupHRegRemap(m, i->ARMin.VXferD.rLo); 3104436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ return; 3105436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMin_VXferS: 3106436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ i->ARMin.VXferS.fD = lookupHRegRemap(m, i->ARMin.VXferS.fD); 3107436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ i->ARMin.VXferS.rLo = lookupHRegRemap(m, i->ARMin.VXferS.rLo); 3108436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ return; 3109436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMin_VCvtID: 3110436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ i->ARMin.VCvtID.dst = lookupHRegRemap(m, i->ARMin.VCvtID.dst); 3111436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ i->ARMin.VCvtID.src = lookupHRegRemap(m, i->ARMin.VCvtID.src); 3112436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ return; 3113436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMin_NLdStD: 3114436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ i->ARMin.NLdStD.dD = lookupHRegRemap(m, i->ARMin.NLdStD.dD); 3115436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ mapRegs_ARMAModeN(m, i->ARMin.NLdStD.amode); 3116436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ return; 3117436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMin_NUnary: 3118436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ i->ARMin.NUnary.src = lookupHRegRemap(m, i->ARMin.NUnary.src); 3119436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ i->ARMin.NUnary.dst = lookupHRegRemap(m, i->ARMin.NUnary.dst); 3120436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ return; 3121436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMin_NUnaryS: 3122436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ i->ARMin.NUnaryS.src->reg 3123436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ = lookupHRegRemap(m, i->ARMin.NUnaryS.src->reg); 3124436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ i->ARMin.NUnaryS.dst->reg 3125436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ = lookupHRegRemap(m, i->ARMin.NUnaryS.dst->reg); 3126436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ return; 3127436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMin_NShift: 3128436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ i->ARMin.NShift.dst = lookupHRegRemap(m, i->ARMin.NShift.dst); 3129436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ i->ARMin.NShift.argL = lookupHRegRemap(m, i->ARMin.NShift.argL); 3130436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ i->ARMin.NShift.argR = lookupHRegRemap(m, i->ARMin.NShift.argR); 3131436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ return; 3132436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMin_NShl64: 3133436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ i->ARMin.NShl64.dst = lookupHRegRemap(m, i->ARMin.NShl64.dst); 3134436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ i->ARMin.NShl64.src = lookupHRegRemap(m, i->ARMin.NShl64.src); 3135436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ return; 3136436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMin_NDual: 3137436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ i->ARMin.NDual.arg1 = lookupHRegRemap(m, i->ARMin.NDual.arg1); 3138436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ i->ARMin.NDual.arg2 = lookupHRegRemap(m, i->ARMin.NDual.arg2); 3139436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ return; 3140436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64in_VImmQ: 3141436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->ARM64in.VImmQ.rQ = lookupHRegRemap(m, i->ARM64in.VImmQ.rQ); 3142436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return; 3143436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64in_VDfromX: 3144436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->ARM64in.VDfromX.rD 3145436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov = lookupHRegRemap(m, i->ARM64in.VDfromX.rD); 3146436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->ARM64in.VDfromX.rX 3147436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov = lookupHRegRemap(m, i->ARM64in.VDfromX.rX); 3148436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return; 3149436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64in_VQfromXX: 3150436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->ARM64in.VQfromXX.rQ 3151436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov = lookupHRegRemap(m, i->ARM64in.VQfromXX.rQ); 3152436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->ARM64in.VQfromXX.rXhi 3153436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov = lookupHRegRemap(m, i->ARM64in.VQfromXX.rXhi); 3154436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->ARM64in.VQfromXX.rXlo 3155436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov = lookupHRegRemap(m, i->ARM64in.VQfromXX.rXlo); 3156436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return; 3157436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64in_VXfromQ: 3158436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->ARM64in.VXfromQ.rX 3159436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov = lookupHRegRemap(m, i->ARM64in.VXfromQ.rX); 3160436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->ARM64in.VXfromQ.rQ 3161436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov = lookupHRegRemap(m, i->ARM64in.VXfromQ.rQ); 3162436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return; 3163436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64in_VMov: 3164436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->ARM64in.VMov.dst = lookupHRegRemap(m, i->ARM64in.VMov.dst); 3165436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->ARM64in.VMov.src = lookupHRegRemap(m, i->ARM64in.VMov.src); 3166436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return; 3167436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 3168436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMin_NBinary: 3169436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ i->ARMin.NBinary.argL = lookupHRegRemap(m, i->ARMin.NBinary.argL); 3170436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ i->ARMin.NBinary.argR = lookupHRegRemap(m, i->ARMin.NBinary.argR); 3171436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ i->ARMin.NBinary.dst = lookupHRegRemap(m, i->ARMin.NBinary.dst); 3172436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ return; 3173436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMin_NCMovQ: 3174436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ i->ARMin.NCMovQ.dst = lookupHRegRemap(m, i->ARMin.NCMovQ.dst); 3175436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ i->ARMin.NCMovQ.src = lookupHRegRemap(m, i->ARMin.NCMovQ.src); 3176436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ return; 3177436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMin_Add32: 3178436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ i->ARMin.Add32.rD = lookupHRegRemap(m, i->ARMin.Add32.rD); 3179436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ i->ARMin.Add32.rN = lookupHRegRemap(m, i->ARMin.Add32.rN); 3180436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ return; 3181436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64in_EvCheck: 3182436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* We expect both amodes only to mention x21, so this is in 3183436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov fact pointless, since x21 isn't allocatable, but 3184436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov anyway.. */ 3185436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov mapRegs_ARM64AMode(m, i->ARM64in.EvCheck.amCounter); 3186436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov mapRegs_ARM64AMode(m, i->ARM64in.EvCheck.amFailAddr); 3187436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return; 3188436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMin_ProfInc: 3189436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ /* hardwires r11 and r12 -- nothing to modify. */ 3190436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ return; 3191436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov default: 3192436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ppARM64Instr(i); 3193436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vpanic("mapRegs_ARM64Instr"); 3194436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 3195436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov} 3196436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 3197436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov/* Figure out if i represents a reg-reg move, and if so assign the 3198436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov source and destination to *src and *dst. If in doubt say No. Used 3199436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov by the register allocator to do move coalescing. 3200436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov*/ 3201436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovBool isMove_ARM64Instr ( ARM64Instr* i, HReg* src, HReg* dst ) 3202436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{ 3203436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov switch (i->tag) { 3204436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64in_MovI: 3205436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov *src = i->ARM64in.MovI.src; 3206436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov *dst = i->ARM64in.MovI.dst; 3207436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return True; 3208436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64in_VMov: 3209436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov *src = i->ARM64in.VMov.src; 3210436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov *dst = i->ARM64in.VMov.dst; 3211436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return True; 3212436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov default: 3213436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov break; 3214436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 3215436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 3216436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return False; 3217436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov} 3218436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 3219436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 3220436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov/* Generate arm spill/reload instructions under the direction of the 3221436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov register allocator. Note it's critical these don't write the 3222436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov condition codes. */ 3223436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 3224436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovvoid genSpill_ARM64 ( /*OUT*/HInstr** i1, /*OUT*/HInstr** i2, 3225436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov HReg rreg, Int offsetB, Bool mode64 ) 3226436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{ 3227436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov HRegClass rclass; 3228436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(offsetB >= 0); 3229436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(!hregIsVirtual(rreg)); 3230436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(mode64 == True); 3231436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov *i1 = *i2 = NULL; 3232436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov rclass = hregClass(rreg); 3233436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov switch (rclass) { 3234436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case HRcInt64: 3235436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(0 == (offsetB & 7)); 3236436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov offsetB >>= 3; 3237436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(offsetB < 4096); 3238436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov *i1 = ARM64Instr_LdSt64( 3239436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov False/*!isLoad*/, 3240436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov rreg, 3241436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ARM64AMode_RI12(hregARM64_X21(), offsetB, 8) 3242436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ); 3243436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return; 3244436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case HRcFlt64: 3245436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(0 == (offsetB & 7)); 3246436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(offsetB >= 0 && offsetB < 32768); 3247436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov *i1 = ARM64Instr_VLdStD(False/*!isLoad*/, 3248436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov rreg, hregARM64_X21(), offsetB); 3249436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return; 3250436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case HRcVec128: { 3251436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov HReg x21 = hregARM64_X21(); // baseblock 3252436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov HReg x9 = hregARM64_X9(); // spill temporary 3253436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(0 == (offsetB & 15)); // check sane alignment 3254436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(offsetB < 4096); 3255436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov *i1 = ARM64Instr_Arith(x9, x21, ARM64RIA_I12(offsetB, 0), True); 3256436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov *i2 = ARM64Instr_VLdStQ(False/*!isLoad*/, rreg, x9); 3257436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return; 3258436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 3259436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov default: 3260436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ppHRegClass(rclass); 3261436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vpanic("genSpill_ARM: unimplemented regclass"); 3262436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 3263436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov} 3264436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 3265436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovvoid genReload_ARM64 ( /*OUT*/HInstr** i1, /*OUT*/HInstr** i2, 3266436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov HReg rreg, Int offsetB, Bool mode64 ) 3267436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{ 3268436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov HRegClass rclass; 3269436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(offsetB >= 0); 3270436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(!hregIsVirtual(rreg)); 3271436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(mode64 == True); 3272436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov *i1 = *i2 = NULL; 3273436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov rclass = hregClass(rreg); 3274436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov switch (rclass) { 3275436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case HRcInt64: 3276436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(0 == (offsetB & 7)); 3277436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov offsetB >>= 3; 3278436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(offsetB < 4096); 3279436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov *i1 = ARM64Instr_LdSt64( 3280436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov True/*isLoad*/, 3281436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov rreg, 3282436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ARM64AMode_RI12(hregARM64_X21(), offsetB, 8) 3283436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ); 3284436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return; 3285436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case HRcFlt64: 3286436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(0 == (offsetB & 7)); 3287436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(offsetB >= 0 && offsetB < 32768); 3288436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov *i1 = ARM64Instr_VLdStD(True/*isLoad*/, 3289436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov rreg, hregARM64_X21(), offsetB); 3290436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return; 3291436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case HRcVec128: { 3292436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov HReg x21 = hregARM64_X21(); // baseblock 3293436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov HReg x9 = hregARM64_X9(); // spill temporary 3294436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(0 == (offsetB & 15)); // check sane alignment 3295436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(offsetB < 4096); 3296436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov *i1 = ARM64Instr_Arith(x9, x21, ARM64RIA_I12(offsetB, 0), True); 3297436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov *i2 = ARM64Instr_VLdStQ(True/*isLoad*/, rreg, x9); 3298436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return; 3299436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 3300436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov default: 3301436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ppHRegClass(rclass); 3302436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vpanic("genReload_ARM: unimplemented regclass"); 3303436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 3304436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov} 3305436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 3306436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 3307436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ /* Emit an instruction into buf and return the number of bytes used. 3308436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ Note that buf is not the insn's final place, and therefore it is 3309436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ imperative to emit position-independent code. */ 3310436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 3311436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic inline UChar iregNo ( HReg r ) 3312436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{ 3313436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov UInt n; 3314436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(hregClass(r) == HRcInt64); 3315436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(!hregIsVirtual(r)); 3316436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov n = hregNumber(r); 3317436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(n <= 30); 3318436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return toUChar(n); 3319436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov} 3320436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 3321436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic inline UChar dregNo ( HReg r ) 3322436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{ 3323436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov UInt n; 33240a8046eb0993fb7e155b03cc5ef3323fca3467c0Dmitriy Ivanov vassert(hregClass(r) == HRcFlt64 || hregClass(r) == HRcInt64); 3325436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(!hregIsVirtual(r)); 3326436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov n = hregNumber(r); 3327436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(n <= 31); 3328436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return toUChar(n); 3329436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov} 3330436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 3331436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic inline UChar qregNo ( HReg r ) 3332436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{ 3333436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov UInt n; 3334436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(hregClass(r) == HRcVec128); 3335436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(!hregIsVirtual(r)); 3336436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov n = hregNumber(r); 3337436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(n <= 31); 3338436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return toUChar(n); 3339436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov} 3340436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 3341436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define BITS4(zzb3,zzb2,zzb1,zzb0) \ 3342436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov (((zzb3) << 3) | ((zzb2) << 2) | ((zzb1) << 1) | (zzb0)) 3343436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 3344436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define X00 BITS4(0,0, 0,0) 3345436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define X01 BITS4(0,0, 0,1) 3346436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define X10 BITS4(0,0, 1,0) 3347436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define X11 BITS4(0,0, 1,1) 3348436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 3349436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define X000 BITS4(0, 0,0,0) 3350436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define X001 BITS4(0, 0,0,1) 3351436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define X010 BITS4(0, 0,1,0) 3352436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define X011 BITS4(0, 0,1,1) 3353436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define X100 BITS4(0, 1,0,0) 3354436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define X101 BITS4(0, 1,0,1) 3355436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define X110 BITS4(0, 1,1,0) 3356436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define X111 BITS4(0, 1,1,1) 3357436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 3358436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define X0000 BITS4(0,0,0,0) 3359436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define X0001 BITS4(0,0,0,1) 3360436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define X0010 BITS4(0,0,1,0) 3361436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define X0011 BITS4(0,0,1,1) 3362436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 3363436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define BITS8(zzb7,zzb6,zzb5,zzb4,zzb3,zzb2,zzb1,zzb0) \ 3364436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ((BITS4(zzb7,zzb6,zzb5,zzb4) << 4) | BITS4(zzb3,zzb2,zzb1,zzb0)) 3365436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 3366436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define X00000 BITS8(0,0,0, 0,0,0,0,0) 3367436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define X00001 BITS8(0,0,0, 0,0,0,0,1) 3368436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define X00111 BITS8(0,0,0, 0,0,1,1,1) 3369436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define X01000 BITS8(0,0,0, 0,1,0,0,0) 3370436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define X10000 BITS8(0,0,0, 1,0,0,0,0) 3371436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define X11000 BITS8(0,0,0, 1,1,0,0,0) 3372436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define X11110 BITS8(0,0,0, 1,1,1,1,0) 3373436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define X11111 BITS8(0,0,0, 1,1,1,1,1) 3374436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 3375436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define X000000 BITS8(0,0, 0,0,0,0,0,0) 3376436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define X000001 BITS8(0,0, 0,0,0,0,0,1) 3377436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define X000100 BITS8(0,0, 0,0,0,1,0,0) 3378436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define X000111 BITS8(0,0, 0,0,0,1,1,1) 3379436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define X001000 BITS8(0,0, 0,0,1,0,0,0) 3380436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define X001001 BITS8(0,0, 0,0,1,0,0,1) 3381436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define X001010 BITS8(0,0, 0,0,1,0,1,0) 3382eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov#define X001101 BITS8(0,0, 0,0,1,1,0,1) 3383051d3b5d6376aa10a65793c3c2267d6ab233b896Dmitriy Ivanov#define X001110 BITS8(0,0, 0,0,1,1,1,0) 3384436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define X001111 BITS8(0,0, 0,0,1,1,1,1) 3385436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define X010000 BITS8(0,0, 0,1,0,0,0,0) 3386436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define X010001 BITS8(0,0, 0,1,0,0,0,1) 3387436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define X010101 BITS8(0,0, 0,1,0,1,0,1) 3388436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define X010110 BITS8(0,0, 0,1,0,1,1,0) 3389436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define X011001 BITS8(0,0, 0,1,1,0,0,1) 3390436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define X011010 BITS8(0,0, 0,1,1,0,1,0) 3391436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define X011011 BITS8(0,0, 0,1,1,0,1,1) 3392436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define X011110 BITS8(0,0, 0,1,1,1,1,0) 3393436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define X011111 BITS8(0,0, 0,1,1,1,1,1) 33940a8046eb0993fb7e155b03cc5ef3323fca3467c0Dmitriy Ivanov#define X100000 BITS8(0,0, 1,0,0,0,0,0) 3395436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define X100001 BITS8(0,0, 1,0,0,0,0,1) 3396436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define X100011 BITS8(0,0, 1,0,0,0,1,1) 3397436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define X100100 BITS8(0,0, 1,0,0,1,0,0) 3398436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define X100101 BITS8(0,0, 1,0,0,1,0,1) 3399436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define X100110 BITS8(0,0, 1,0,0,1,1,0) 3400436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define X100111 BITS8(0,0, 1,0,0,1,1,1) 34010a8046eb0993fb7e155b03cc5ef3323fca3467c0Dmitriy Ivanov#define X101000 BITS8(0,0, 1,0,1,0,0,0) 3402436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define X110000 BITS8(0,0, 1,1,0,0,0,0) 3403436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define X110001 BITS8(0,0, 1,1,0,0,0,1) 3404436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define X110101 BITS8(0,0, 1,1,0,1,0,1) 3405436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define X110111 BITS8(0,0, 1,1,0,1,1,1) 3406436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define X111000 BITS8(0,0, 1,1,1,0,0,0) 3407436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define X111001 BITS8(0,0, 1,1,1,0,0,1) 3408436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define X111101 BITS8(0,0, 1,1,1,1,0,1) 3409436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define X111110 BITS8(0,0, 1,1,1,1,1,0) 3410436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define X111111 BITS8(0,0, 1,1,1,1,1,1) 3411436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 3412eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov#define X0001000 BITS8(0, 0,0,0,1,0,0,0) 34132ca80a6a6fc069acdb73186e8e578dbf8f46af80Dmitriy Ivanov#define X0010000 BITS8(0, 0,0,1,0,0,0,0) 3414436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define X0100000 BITS8(0, 0,1,0,0,0,0,0) 3415436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define X1000000 BITS8(0, 1,0,0,0,0,0,0) 3416436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 3417436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define X00100000 BITS8(0,0,1,0,0,0,0,0) 3418436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define X00100001 BITS8(0,0,1,0,0,0,0,1) 3419436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define X00100010 BITS8(0,0,1,0,0,0,1,0) 3420436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define X00100011 BITS8(0,0,1,0,0,0,1,1) 3421436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define X01010000 BITS8(0,1,0,1,0,0,0,0) 3422436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define X01010001 BITS8(0,1,0,1,0,0,0,1) 3423436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define X01010100 BITS8(0,1,0,1,0,1,0,0) 3424436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define X01011000 BITS8(0,1,0,1,1,0,0,0) 3425436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define X01100000 BITS8(0,1,1,0,0,0,0,0) 3426436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define X01100001 BITS8(0,1,1,0,0,0,0,1) 3427436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define X01100010 BITS8(0,1,1,0,0,0,1,0) 3428436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define X01100011 BITS8(0,1,1,0,0,0,1,1) 3429436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define X01110000 BITS8(0,1,1,1,0,0,0,0) 3430436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define X01110001 BITS8(0,1,1,1,0,0,0,1) 3431436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define X01110011 BITS8(0,1,1,1,0,0,1,1) 3432436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define X01110101 BITS8(0,1,1,1,0,1,0,1) 3433436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define X01110111 BITS8(0,1,1,1,0,1,1,1) 3434436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define X11000001 BITS8(1,1,0,0,0,0,0,1) 3435436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define X11000011 BITS8(1,1,0,0,0,0,1,1) 3436436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define X11010100 BITS8(1,1,0,1,0,1,0,0) 3437436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define X11010110 BITS8(1,1,0,1,0,1,1,0) 3438436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define X11011000 BITS8(1,1,0,1,1,0,0,0) 3439436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define X11011010 BITS8(1,1,0,1,1,0,1,0) 3440436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define X11011110 BITS8(1,1,0,1,1,1,1,0) 3441436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define X11110001 BITS8(1,1,1,1,0,0,0,1) 3442436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define X11110011 BITS8(1,1,1,1,0,0,1,1) 3443436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 34440a8046eb0993fb7e155b03cc5ef3323fca3467c0Dmitriy Ivanov#define BITS9(zzb8,zzb7,zzb6,zzb5,zzb4,zzb3,zzb2,zzb1,zzb0) \ 34450a8046eb0993fb7e155b03cc5ef3323fca3467c0Dmitriy Ivanov ((BITS8(zzb8,zzb7,zzb6,zzb5,zzb4,zzb3,zzb2,zzb1) << 1) | zzb0) 34460a8046eb0993fb7e155b03cc5ef3323fca3467c0Dmitriy Ivanov 34470a8046eb0993fb7e155b03cc5ef3323fca3467c0Dmitriy Ivanov#define X111100111 BITS9(1,1,1,1,0,0,1,1,1) 34480a8046eb0993fb7e155b03cc5ef3323fca3467c0Dmitriy Ivanov#define X111100101 BITS9(1,1,1,1,0,0,1,0,1) 34490a8046eb0993fb7e155b03cc5ef3323fca3467c0Dmitriy Ivanov 3450436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 3451436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov/* --- 4 fields --- */ 3452436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 3453436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic inline UInt X_8_19_1_4 ( UInt f1, UInt f2, UInt f3, UInt f4 ) { 3454436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(8+19+1+4 == 32); 3455436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(f1 < (1<<8)); 3456436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(f2 < (1<<19)); 3457436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(f3 < (1<<1)); 3458436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(f4 < (1<<4)); 3459436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov UInt w = 0; 3460436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov w = (w << 8) | f1; 3461436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov w = (w << 19) | f2; 3462436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov w = (w << 1) | f3; 3463436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov w = (w << 4) | f4; 3464436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return w; 3465436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov} 3466436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 3467436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov/* --- 5 fields --- */ 3468436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 3469436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic inline UInt X_3_6_2_16_5 ( UInt f1, UInt f2, 3470436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov UInt f3, UInt f4, UInt f5 ) { 3471436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(3+6+2+16+5 == 32); 3472436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(f1 < (1<<3)); 3473436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(f2 < (1<<6)); 3474436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(f3 < (1<<2)); 3475436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(f4 < (1<<16)); 3476436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(f5 < (1<<5)); 3477436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov UInt w = 0; 3478436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov w = (w << 3) | f1; 3479436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov w = (w << 6) | f2; 3480436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov w = (w << 2) | f3; 3481436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov w = (w << 16) | f4; 3482436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov w = (w << 5) | f5; 3483436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return w; 3484436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov} 3485436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 3486436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov/* --- 6 fields --- */ 3487436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 3488436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic inline UInt X_2_6_2_12_5_5 ( UInt f1, UInt f2, UInt f3, 3489436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov UInt f4, UInt f5, UInt f6 ) { 3490436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(2+6+2+12+5+5 == 32); 3491436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(f1 < (1<<2)); 3492436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(f2 < (1<<6)); 3493436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(f3 < (1<<2)); 3494436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(f4 < (1<<12)); 3495436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(f5 < (1<<5)); 3496436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(f6 < (1<<5)); 3497436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov UInt w = 0; 3498436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov w = (w << 2) | f1; 3499436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov w = (w << 6) | f2; 3500436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov w = (w << 2) | f3; 3501436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov w = (w << 12) | f4; 3502436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov w = (w << 5) | f5; 3503436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov w = (w << 5) | f6; 3504436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return w; 3505436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov} 3506436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 3507436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic inline UInt X_3_8_5_6_5_5 ( UInt f1, UInt f2, UInt f3, 3508436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov UInt f4, UInt f5, UInt f6 ) { 3509436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(3+8+5+6+5+5 == 32); 3510436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(f1 < (1<<3)); 3511436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(f2 < (1<<8)); 3512436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(f3 < (1<<5)); 3513436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(f4 < (1<<6)); 3514436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(f5 < (1<<5)); 3515436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(f6 < (1<<5)); 3516436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov UInt w = 0; 3517436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov w = (w << 3) | f1; 3518436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov w = (w << 8) | f2; 3519436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov w = (w << 5) | f3; 3520436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov w = (w << 6) | f4; 3521436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov w = (w << 5) | f5; 3522436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov w = (w << 5) | f6; 3523436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return w; 3524436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov} 3525436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 3526436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic inline UInt X_3_5_8_6_5_5 ( UInt f1, UInt f2, UInt f3, 3527436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov UInt f4, UInt f5, UInt f6 ) { 3528436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(3+8+5+6+5+5 == 32); 3529436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(f1 < (1<<3)); 3530436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(f2 < (1<<5)); 3531436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(f3 < (1<<8)); 3532436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(f4 < (1<<6)); 3533436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(f5 < (1<<5)); 3534436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(f6 < (1<<5)); 3535436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov UInt w = 0; 3536436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov w = (w << 3) | f1; 3537436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov w = (w << 5) | f2; 3538436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov w = (w << 8) | f3; 3539436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov w = (w << 6) | f4; 3540436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov w = (w << 5) | f5; 3541436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov w = (w << 5) | f6; 3542436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return w; 3543436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov} 3544436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 3545436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic inline UInt X_3_6_7_6_5_5 ( UInt f1, UInt f2, UInt f3, 3546436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov UInt f4, UInt f5, UInt f6 ) { 3547436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(3+6+7+6+5+5 == 32); 3548436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(f1 < (1<<3)); 3549436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(f2 < (1<<6)); 3550436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(f3 < (1<<7)); 3551436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(f4 < (1<<6)); 3552436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(f5 < (1<<5)); 3553436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(f6 < (1<<5)); 3554436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov UInt w = 0; 3555436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov w = (w << 3) | f1; 3556436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov w = (w << 6) | f2; 3557436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov w = (w << 7) | f3; 3558436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov w = (w << 6) | f4; 3559436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov w = (w << 5) | f5; 3560436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov w = (w << 5) | f6; 3561436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return w; 3562436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov} 3563436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 3564436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov/* --- 7 fields --- */ 3565436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 3566436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic inline UInt X_2_6_3_9_2_5_5 ( UInt f1, UInt f2, UInt f3, 3567436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov UInt f4, UInt f5, UInt f6, UInt f7 ) { 3568436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(2+6+3+9+2+5+5 == 32); 3569436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(f1 < (1<<2)); 3570436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(f2 < (1<<6)); 3571436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(f3 < (1<<3)); 3572436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(f4 < (1<<9)); 3573436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(f5 < (1<<2)); 3574436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(f6 < (1<<5)); 3575436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(f7 < (1<<5)); 3576436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov UInt w = 0; 3577436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov w = (w << 2) | f1; 3578436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov w = (w << 6) | f2; 3579436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov w = (w << 3) | f3; 3580436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov w = (w << 9) | f4; 3581436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov w = (w << 2) | f5; 3582436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov w = (w << 5) | f6; 3583436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov w = (w << 5) | f7; 3584436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return w; 3585436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov} 3586436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 3587436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic inline UInt X_3_6_1_6_6_5_5 ( UInt f1, UInt f2, UInt f3, 3588436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov UInt f4, UInt f5, UInt f6, UInt f7 ) { 3589436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(3+6+1+6+6+5+5 == 32); 3590436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(f1 < (1<<3)); 3591436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(f2 < (1<<6)); 3592436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(f3 < (1<<1)); 3593436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(f4 < (1<<6)); 3594436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(f5 < (1<<6)); 3595436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(f6 < (1<<5)); 3596436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(f7 < (1<<5)); 3597436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov UInt w = 0; 3598436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov w = (w << 3) | f1; 3599436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov w = (w << 6) | f2; 3600436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov w = (w << 1) | f3; 3601436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov w = (w << 6) | f4; 3602436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov w = (w << 6) | f5; 3603436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov w = (w << 5) | f6; 3604436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov w = (w << 5) | f7; 3605436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return w; 3606436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov} 3607436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 36080a8046eb0993fb7e155b03cc5ef3323fca3467c0Dmitriy Ivanovstatic inline UInt X_9_1_6_4_6_1_1_4( UInt f1, UInt f2, UInt f3, UInt f4, 36090a8046eb0993fb7e155b03cc5ef3323fca3467c0Dmitriy Ivanov UInt f5, UInt f6, UInt f7, UInt f8) { 36100a8046eb0993fb7e155b03cc5ef3323fca3467c0Dmitriy Ivanov vassert(9+1+6+4+6+1+1+4 == 32); 36110a8046eb0993fb7e155b03cc5ef3323fca3467c0Dmitriy Ivanov vassert(f1 < (1<<9)); 36120a8046eb0993fb7e155b03cc5ef3323fca3467c0Dmitriy Ivanov vassert(f2 < (1<<1)); 36130a8046eb0993fb7e155b03cc5ef3323fca3467c0Dmitriy Ivanov vassert(f3 < (1<<6)); 36140a8046eb0993fb7e155b03cc5ef3323fca3467c0Dmitriy Ivanov vassert(f4 < (1<<4)); 36150a8046eb0993fb7e155b03cc5ef3323fca3467c0Dmitriy Ivanov vassert(f5 < (1<<6)); 36160a8046eb0993fb7e155b03cc5ef3323fca3467c0Dmitriy Ivanov vassert(f6 < (1<<1)); 36170a8046eb0993fb7e155b03cc5ef3323fca3467c0Dmitriy Ivanov vassert(f7 < (1<<1)); 36180a8046eb0993fb7e155b03cc5ef3323fca3467c0Dmitriy Ivanov vassert(f8 < (1<<9)); 36190a8046eb0993fb7e155b03cc5ef3323fca3467c0Dmitriy Ivanov UInt w = 0; 36200a8046eb0993fb7e155b03cc5ef3323fca3467c0Dmitriy Ivanov w = (w << 9) | f1; 36210a8046eb0993fb7e155b03cc5ef3323fca3467c0Dmitriy Ivanov w = (w << 1) | f2; 36220a8046eb0993fb7e155b03cc5ef3323fca3467c0Dmitriy Ivanov w = (w << 6) | f3; 36230a8046eb0993fb7e155b03cc5ef3323fca3467c0Dmitriy Ivanov w = (w << 4) | f4; 36240a8046eb0993fb7e155b03cc5ef3323fca3467c0Dmitriy Ivanov w = (w << 6) | f5; 36250a8046eb0993fb7e155b03cc5ef3323fca3467c0Dmitriy Ivanov w = (w << 1) | f6; 36260a8046eb0993fb7e155b03cc5ef3323fca3467c0Dmitriy Ivanov w = (w << 1) | f7; 36270a8046eb0993fb7e155b03cc5ef3323fca3467c0Dmitriy Ivanov w = (w << 4) | f8; 36280a8046eb0993fb7e155b03cc5ef3323fca3467c0Dmitriy Ivanov return w; 36290a8046eb0993fb7e155b03cc5ef3323fca3467c0Dmitriy Ivanov} 36300a8046eb0993fb7e155b03cc5ef3323fca3467c0Dmitriy Ivanov 3631436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 3632436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ #define X0000 BITS4(0,0,0,0) 3633436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ #define X0001 BITS4(0,0,0,1) 3634436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ #define X0010 BITS4(0,0,1,0) 3635436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ #define X0011 BITS4(0,0,1,1) 3636436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ #define X0100 BITS4(0,1,0,0) 3637436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ #define X0101 BITS4(0,1,0,1) 3638436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ #define X0110 BITS4(0,1,1,0) 3639436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ #define X0111 BITS4(0,1,1,1) 3640436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ #define X1000 BITS4(1,0,0,0) 3641436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ #define X1001 BITS4(1,0,0,1) 3642436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ #define X1010 BITS4(1,0,1,0) 3643436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ #define X1011 BITS4(1,0,1,1) 3644436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ #define X1100 BITS4(1,1,0,0) 3645436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ #define X1101 BITS4(1,1,0,1) 3646436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ #define X1110 BITS4(1,1,1,0) 3647436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ #define X1111 BITS4(1,1,1,1) 3648436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov/* 3649436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define XXXXX___(zzx7,zzx6,zzx5,zzx4,zzx3) \ 3650436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ((((zzx7) & 0xF) << 28) | (((zzx6) & 0xF) << 24) | \ 3651436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov (((zzx5) & 0xF) << 20) | (((zzx4) & 0xF) << 16) | \ 3652436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov (((zzx3) & 0xF) << 12)) 3653436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 3654436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define XXXXXX__(zzx7,zzx6,zzx5,zzx4,zzx3,zzx2) \ 3655436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ((((zzx7) & 0xF) << 28) | (((zzx6) & 0xF) << 24) | \ 3656436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov (((zzx5) & 0xF) << 20) | (((zzx4) & 0xF) << 16) | \ 3657436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov (((zzx3) & 0xF) << 12) | (((zzx2) & 0xF) << 8)) 3658436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 3659436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define XXXXX__X(zzx7,zzx6,zzx5,zzx4,zzx3,zzx0) \ 3660436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ((((zzx7) & 0xF) << 28) | (((zzx6) & 0xF) << 24) | \ 3661436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov (((zzx5) & 0xF) << 20) | (((zzx4) & 0xF) << 16) | \ 3662436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov (((zzx3) & 0xF) << 12) | (((zzx0) & 0xF) << 0)) 3663436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 3664436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define XXX___XX(zzx7,zzx6,zzx5,zzx1,zzx0) \ 3665436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ((((zzx7) & 0xF) << 28) | (((zzx6) & 0xF) << 24) | \ 3666436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov (((zzx5) & 0xF) << 20) | (((zzx1) & 0xF) << 4) | \ 3667436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov (((zzx0) & 0xF) << 0)) 3668436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 3669436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define XXXXXXXX(zzx7,zzx6,zzx5,zzx4,zzx3,zzx2,zzx1,zzx0) \ 3670436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ((((zzx7) & 0xF) << 28) | (((zzx6) & 0xF) << 24) | \ 3671436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov (((zzx5) & 0xF) << 20) | (((zzx4) & 0xF) << 16) | \ 3672436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov (((zzx3) & 0xF) << 12) | (((zzx2) & 0xF) << 8) | \ 3673436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov (((zzx1) & 0xF) << 4) | (((zzx0) & 0xF) << 0)) 3674436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 3675436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define XX______(zzx7,zzx6) \ 3676436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ((((zzx7) & 0xF) << 28) | (((zzx6) & 0xF) << 24)) 3677436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov*/ 3678436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ /* Generate a skeletal insn that involves an a RI84 shifter operand. 3679436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ Returns a word which is all zeroes apart from bits 25 and 11..0, 3680436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ since it is those that encode the shifter operand (at least to the 3681436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ extent that we care about it.) */ 3682436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ static UInt skeletal_RI84 ( ARMRI84* ri ) 3683436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ { 3684436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ UInt instr; 3685436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ if (ri->tag == ARMri84_I84) { 3686436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ vassert(0 == (ri->ARMri84.I84.imm4 & ~0x0F)); 3687436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ vassert(0 == (ri->ARMri84.I84.imm8 & ~0xFF)); 3688436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ instr = 1 << 25; 3689436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ instr |= (ri->ARMri84.I84.imm4 << 8); 3690436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ instr |= ri->ARMri84.I84.imm8; 3691436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ } else { 3692436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ instr = 0 << 25; 3693436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ instr |= iregNo(ri->ARMri84.R.reg); 3694436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ } 3695436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ return instr; 3696436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ } 3697436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ 3698436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ /* Ditto for RI5. Resulting word is zeroes apart from bit 4 and bits 3699436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ 11..7. */ 3700436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ static UInt skeletal_RI5 ( ARMRI5* ri ) 3701436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ { 3702436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ UInt instr; 3703436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ if (ri->tag == ARMri5_I5) { 3704436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ UInt imm5 = ri->ARMri5.I5.imm5; 3705436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ vassert(imm5 >= 1 && imm5 <= 31); 3706436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ instr = 0 << 4; 3707436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ instr |= imm5 << 7; 3708436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ } else { 3709436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ instr = 1 << 4; 3710436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ instr |= iregNo(ri->ARMri5.R.reg) << 8; 3711436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ } 3712436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ return instr; 3713436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ } 3714436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 3715436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 3716436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov/* Get an immediate into a register, using only that register. */ 3717436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic UInt* imm64_to_iregNo ( UInt* p, Int xD, ULong imm64 ) 3718436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{ 3719436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if (imm64 == 0) { 3720436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov // This has to be special-cased, since the logic below 3721436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov // will leave the register unchanged in this case. 3722436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov // MOVZ xD, #0, LSL #0 3723436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov *p++ = X_3_6_2_16_5(X110, X100101, X00, 0/*imm16*/, xD); 3724436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return p; 3725436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 3726436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 3727436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov // There must be at least one non-zero halfword. Find the 3728436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov // lowest nonzero such, and use MOVZ to install it and zero 3729436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov // out the rest of the register. 3730436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov UShort h[4]; 3731436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov h[3] = (UShort)((imm64 >> 48) & 0xFFFF); 3732436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov h[2] = (UShort)((imm64 >> 32) & 0xFFFF); 3733436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov h[1] = (UShort)((imm64 >> 16) & 0xFFFF); 3734436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov h[0] = (UShort)((imm64 >> 0) & 0xFFFF); 3735436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 3736436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov UInt i; 3737436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov for (i = 0; i < 4; i++) { 3738436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if (h[i] != 0) 3739436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov break; 3740436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 3741436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(i < 4); 3742436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 3743436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov // MOVZ xD, h[i], LSL (16*i) 3744436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov *p++ = X_3_6_2_16_5(X110, X100101, i, h[i], xD); 3745436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 3746436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov // Work on upwards through h[i], using MOVK to stuff in any 3747436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov // remaining nonzero elements. 3748436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i++; 3749436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov for (; i < 4; i++) { 3750436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if (h[i] == 0) 3751436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov continue; 3752436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov // MOVK xD, h[i], LSL (16*i) 3753436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov *p++ = X_3_6_2_16_5(X111, X100101, i, h[i], xD); 3754436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 3755436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 3756436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return p; 3757436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov} 3758436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 3759436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov/* Get an immediate into a register, using only that register, and 3760436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov generating exactly 4 instructions, regardless of the value of the 3761436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov immediate. This is used when generating sections of code that need 3762436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov to be patched later, so as to guarantee a specific size. */ 3763436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic UInt* imm64_to_iregNo_EXACTLY4 ( UInt* p, Int xD, ULong imm64 ) 3764436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{ 3765436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov UShort h[4]; 3766436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov h[3] = (UShort)((imm64 >> 48) & 0xFFFF); 3767436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov h[2] = (UShort)((imm64 >> 32) & 0xFFFF); 3768436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov h[1] = (UShort)((imm64 >> 16) & 0xFFFF); 3769436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov h[0] = (UShort)((imm64 >> 0) & 0xFFFF); 3770436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov // Work on upwards through h[i], using MOVK to stuff in the 3771436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov // remaining elements. 3772436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov UInt i; 3773436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov for (i = 0; i < 4; i++) { 3774436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if (i == 0) { 3775436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov // MOVZ xD, h[0], LSL (16*0) 3776436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov *p++ = X_3_6_2_16_5(X110, X100101, i, h[i], xD); 3777436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } else { 3778436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov // MOVK xD, h[i], LSL (16*i) 3779436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov *p++ = X_3_6_2_16_5(X111, X100101, i, h[i], xD); 3780436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 3781436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 3782436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return p; 3783436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov} 3784436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 3785436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov/* Check whether p points at a 4-insn sequence cooked up by 3786436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov imm64_to_iregNo_EXACTLY4(). */ 3787436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic Bool is_imm64_to_iregNo_EXACTLY4 ( UInt* p, Int xD, ULong imm64 ) 3788436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{ 3789436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov UShort h[4]; 3790436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov h[3] = (UShort)((imm64 >> 48) & 0xFFFF); 3791436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov h[2] = (UShort)((imm64 >> 32) & 0xFFFF); 3792436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov h[1] = (UShort)((imm64 >> 16) & 0xFFFF); 3793436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov h[0] = (UShort)((imm64 >> 0) & 0xFFFF); 3794436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov // Work on upwards through h[i], using MOVK to stuff in the 3795436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov // remaining elements. 3796436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov UInt i; 3797436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov for (i = 0; i < 4; i++) { 3798436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov UInt expected; 3799436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if (i == 0) { 3800436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov // MOVZ xD, h[0], LSL (16*0) 3801436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov expected = X_3_6_2_16_5(X110, X100101, i, h[i], xD); 3802436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } else { 3803436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov // MOVK xD, h[i], LSL (16*i) 3804436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov expected = X_3_6_2_16_5(X111, X100101, i, h[i], xD); 3805436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 3806436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if (p[i] != expected) 3807436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return False; 3808436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 3809436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return True; 3810436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov} 3811436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 3812436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 3813436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov/* Generate a 8 bit store or 8-to-64 unsigned widening load from/to 3814436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov rD, using the given amode for the address. */ 3815436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic UInt* do_load_or_store8 ( UInt* p, 3816436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov Bool isLoad, UInt wD, ARM64AMode* am ) 3817436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{ 3818436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(wD <= 30); 3819436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if (am->tag == ARM64am_RI9) { 3820436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* STURB Wd, [Xn|SP + simm9]: 00 111000 000 simm9 00 n d 3821436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov LDURB Wd, [Xn|SP + simm9]: 00 111000 010 simm9 00 n d 3822436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov */ 3823436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov Int simm9 = am->ARM64am.RI9.simm9; 3824436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(-256 <= simm9 && simm9 <= 255); 3825436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov UInt instr = X_2_6_3_9_2_5_5(X00, X111000, isLoad ? X010 : X000, 3826436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov simm9 & 0x1FF, X00, 3827436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov iregNo(am->ARM64am.RI9.reg), wD); 3828436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov *p++ = instr; 3829436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return p; 3830436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 3831436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if (am->tag == ARM64am_RI12) { 3832436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* STRB Wd, [Xn|SP + uimm12 * 1]: 00 111 001 00 imm12 n d 3833436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov LDRB Wd, [Xn|SP + uimm12 * 1]: 00 111 001 01 imm12 n d 3834436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov */ 3835436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov UInt uimm12 = am->ARM64am.RI12.uimm12; 3836436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov UInt scale = am->ARM64am.RI12.szB; 3837436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(scale == 1); /* failure of this is serious. Do not ignore. */ 3838436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov UInt xN = iregNo(am->ARM64am.RI12.reg); 3839436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(xN <= 30); 3840436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov UInt instr = X_2_6_2_12_5_5(X00, X111001, isLoad ? X01 : X00, 3841436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov uimm12, xN, wD); 3842436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov *p++ = instr; 3843436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return p; 3844436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 3845436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if (am->tag == ARM64am_RR) { 3846436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* STRB Xd, [Xn|SP, Xm]: 00 111 000 001 m 011 0 10 n d 3847436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov LDRB Xd, [Xn|SP, Xm]: 00 111 000 011 m 011 0 10 n d 3848436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov */ 3849436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov UInt xN = iregNo(am->ARM64am.RR.base); 3850436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov UInt xM = iregNo(am->ARM64am.RR.index); 3851436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(xN <= 30); 3852436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov UInt instr = X_3_8_5_6_5_5(X001, isLoad ? X11000011 : X11000001, 3853436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov xM, X011010, xN, wD); 3854436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov *p++ = instr; 3855436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return p; 3856436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 3857436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vpanic("do_load_or_store8"); 3858436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(0); 3859436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov} 3860436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 3861436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 3862436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov/* Generate a 16 bit store or 16-to-64 unsigned widening load from/to 3863436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov rD, using the given amode for the address. */ 3864436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic UInt* do_load_or_store16 ( UInt* p, 3865436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov Bool isLoad, UInt wD, ARM64AMode* am ) 3866436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{ 3867436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(wD <= 30); 3868436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if (am->tag == ARM64am_RI9) { 3869436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* STURH Wd, [Xn|SP + simm9]: 01 111000 000 simm9 00 n d 3870436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov LDURH Wd, [Xn|SP + simm9]: 01 111000 010 simm9 00 n d 3871436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov */ 3872436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov Int simm9 = am->ARM64am.RI9.simm9; 3873436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(-256 <= simm9 && simm9 <= 255); 3874436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov UInt instr = X_2_6_3_9_2_5_5(X01, X111000, isLoad ? X010 : X000, 3875436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov simm9 & 0x1FF, X00, 3876436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov iregNo(am->ARM64am.RI9.reg), wD); 3877436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov *p++ = instr; 3878436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return p; 3879436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 3880436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if (am->tag == ARM64am_RI12) { 3881436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* STRH Wd, [Xn|SP + uimm12 * 2]: 01 111 001 00 imm12 n d 3882436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov LDRH Wd, [Xn|SP + uimm12 * 2]: 01 111 001 01 imm12 n d 3883436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov */ 3884436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov UInt uimm12 = am->ARM64am.RI12.uimm12; 3885436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov UInt scale = am->ARM64am.RI12.szB; 3886436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(scale == 2); /* failure of this is serious. Do not ignore. */ 3887436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov UInt xN = iregNo(am->ARM64am.RI12.reg); 3888436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(xN <= 30); 3889436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov UInt instr = X_2_6_2_12_5_5(X01, X111001, isLoad ? X01 : X00, 3890436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov uimm12, xN, wD); 3891436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov *p++ = instr; 3892436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return p; 3893436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 3894436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if (am->tag == ARM64am_RR) { 3895436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* STRH Xd, [Xn|SP, Xm]: 01 111 000 001 m 011 0 10 n d 3896436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov LDRH Xd, [Xn|SP, Xm]: 01 111 000 011 m 011 0 10 n d 3897436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov */ 3898436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov UInt xN = iregNo(am->ARM64am.RR.base); 3899436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov UInt xM = iregNo(am->ARM64am.RR.index); 3900436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(xN <= 30); 3901436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov UInt instr = X_3_8_5_6_5_5(X011, isLoad ? X11000011 : X11000001, 3902436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov xM, X011010, xN, wD); 3903436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov *p++ = instr; 3904436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return p; 3905436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 3906436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vpanic("do_load_or_store16"); 3907436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(0); 3908436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov} 3909436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 3910436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 3911436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov/* Generate a 32 bit store or 32-to-64 unsigned widening load from/to 3912436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov rD, using the given amode for the address. */ 3913436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic UInt* do_load_or_store32 ( UInt* p, 3914436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov Bool isLoad, UInt wD, ARM64AMode* am ) 3915436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{ 3916436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(wD <= 30); 3917436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if (am->tag == ARM64am_RI9) { 3918436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* STUR Wd, [Xn|SP + simm9]: 10 111000 000 simm9 00 n d 3919436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov LDUR Wd, [Xn|SP + simm9]: 10 111000 010 simm9 00 n d 3920436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov */ 3921436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov Int simm9 = am->ARM64am.RI9.simm9; 3922436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(-256 <= simm9 && simm9 <= 255); 3923436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov UInt instr = X_2_6_3_9_2_5_5(X10, X111000, isLoad ? X010 : X000, 3924436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov simm9 & 0x1FF, X00, 3925436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov iregNo(am->ARM64am.RI9.reg), wD); 3926436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov *p++ = instr; 3927436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return p; 3928436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 3929436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if (am->tag == ARM64am_RI12) { 3930436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* STR Wd, [Xn|SP + uimm12 * 4]: 10 111 001 00 imm12 n d 3931436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov LDR Wd, [Xn|SP + uimm12 * 4]: 10 111 001 01 imm12 n d 3932436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov */ 3933436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov UInt uimm12 = am->ARM64am.RI12.uimm12; 3934436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov UInt scale = am->ARM64am.RI12.szB; 3935436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(scale == 4); /* failure of this is serious. Do not ignore. */ 3936436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov UInt xN = iregNo(am->ARM64am.RI12.reg); 3937436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(xN <= 30); 3938436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov UInt instr = X_2_6_2_12_5_5(X10, X111001, isLoad ? X01 : X00, 3939436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov uimm12, xN, wD); 3940436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov *p++ = instr; 3941436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return p; 3942436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 3943436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if (am->tag == ARM64am_RR) { 3944436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* STR Wd, [Xn|SP, Xm]: 10 111 000 001 m 011 0 10 n d 3945436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov LDR Wd, [Xn|SP, Xm]: 10 111 000 011 m 011 0 10 n d 3946436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov */ 3947436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov UInt xN = iregNo(am->ARM64am.RR.base); 3948436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov UInt xM = iregNo(am->ARM64am.RR.index); 3949436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(xN <= 30); 3950436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov UInt instr = X_3_8_5_6_5_5(X101, isLoad ? X11000011 : X11000001, 3951436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov xM, X011010, xN, wD); 3952436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov *p++ = instr; 3953436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return p; 3954436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 3955436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vpanic("do_load_or_store32"); 3956436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(0); 3957436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov} 3958436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 3959436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 3960436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov/* Generate a 64 bit load or store to/from xD, using the given amode 3961436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov for the address. */ 3962436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic UInt* do_load_or_store64 ( UInt* p, 3963436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov Bool isLoad, UInt xD, ARM64AMode* am ) 3964436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{ 3965436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* In all these cases, Rn can't be 31 since that means SP. */ 3966436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(xD <= 30); 3967436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if (am->tag == ARM64am_RI9) { 3968436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* STUR Xd, [Xn|SP + simm9]: 11 111000 000 simm9 00 n d 3969436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov LDUR Xd, [Xn|SP + simm9]: 11 111000 010 simm9 00 n d 3970436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov */ 3971436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov Int simm9 = am->ARM64am.RI9.simm9; 3972436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(-256 <= simm9 && simm9 <= 255); 3973436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov UInt xN = iregNo(am->ARM64am.RI9.reg); 3974436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(xN <= 30); 3975436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov UInt instr = X_2_6_3_9_2_5_5(X11, X111000, isLoad ? X010 : X000, 3976436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov simm9 & 0x1FF, X00, xN, xD); 3977436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov *p++ = instr; 3978436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return p; 3979436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 3980436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if (am->tag == ARM64am_RI12) { 3981436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* STR Xd, [Xn|SP + uimm12 * 8]: 11 111 001 00 imm12 n d 3982436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov LDR Xd, [Xn|SP + uimm12 * 8]: 11 111 001 01 imm12 n d 3983436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov */ 3984436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov UInt uimm12 = am->ARM64am.RI12.uimm12; 3985436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov UInt scale = am->ARM64am.RI12.szB; 3986436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(scale == 8); /* failure of this is serious. Do not ignore. */ 3987436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov UInt xN = iregNo(am->ARM64am.RI12.reg); 3988436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(xN <= 30); 3989436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov UInt instr = X_2_6_2_12_5_5(X11, X111001, isLoad ? X01 : X00, 3990436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov uimm12, xN, xD); 3991436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov *p++ = instr; 3992436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return p; 3993436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 3994436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if (am->tag == ARM64am_RR) { 3995436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* STR Xd, [Xn|SP, Xm]: 11 111 000 001 m 011 0 10 n d 3996436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov LDR Xd, [Xn|SP, Xm]: 11 111 000 011 m 011 0 10 n d 3997436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov */ 3998436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov UInt xN = iregNo(am->ARM64am.RR.base); 3999436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov UInt xM = iregNo(am->ARM64am.RR.index); 4000436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(xN <= 30); 4001436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov UInt instr = X_3_8_5_6_5_5(X111, isLoad ? X11000011 : X11000001, 4002436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov xM, X011010, xN, xD); 4003436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov *p++ = instr; 4004436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return p; 4005436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 4006436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vpanic("do_load_or_store64"); 4007436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(0); 4008436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov} 4009436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 4010436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 4011436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov/* Emit an instruction into buf and return the number of bytes used. 4012436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov Note that buf is not the insn's final place, and therefore it is 4013436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov imperative to emit position-independent code. If the emitted 4014436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov instruction was a profiler inc, set *is_profInc to True, else 4015436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov leave it unchanged. */ 4016436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 4017436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovInt emit_ARM64Instr ( /*MB_MOD*/Bool* is_profInc, 4018436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov UChar* buf, Int nbuf, ARM64Instr* i, 4019436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov Bool mode64, 4020436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov void* disp_cp_chain_me_to_slowEP, 4021436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov void* disp_cp_chain_me_to_fastEP, 4022436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov void* disp_cp_xindir, 4023436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov void* disp_cp_xassisted ) 4024436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{ 4025436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov UInt* p = (UInt*)buf; 4026436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(nbuf >= 32); 4027436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(mode64 == True); 4028436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(0 == (((HWord)buf) & 3)); 4029436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 4030436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov switch (i->tag) { 4031436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64in_Arith: { 4032436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov UInt rD = iregNo(i->ARM64in.Arith.dst); 4033436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov UInt rN = iregNo(i->ARM64in.Arith.argL); 4034436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ARM64RIA* argR = i->ARM64in.Arith.argR; 4035436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov switch (argR->tag) { 4036436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64riA_I12: 4037436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov *p++ = X_2_6_2_12_5_5( 4038436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->ARM64in.Arith.isAdd ? X10 : X11, 4039436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov X010001, 4040436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov argR->ARM64riA.I12.shift == 12 ? X01 : X00, 4041436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov argR->ARM64riA.I12.imm12, rN, rD 4042436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ); 4043436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov break; 4044436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64riA_R: { 4045436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov UInt rM = iregNo(i->ARM64in.Arith.argR->ARM64riA.R.reg); 4046436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov *p++ = X_3_8_5_6_5_5( 4047436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->ARM64in.Arith.isAdd ? X100 : X110, 4048436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov X01011000, rM, X000000, rN, rD 4049436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ); 4050436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov break; 4051436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 4052436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov default: 4053436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov goto bad; 4054436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 4055436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov goto done; 4056436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 4057436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64in_Cmp: { 4058436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov UInt rD = 31; /* XZR, we are going to dump the result */ 4059436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov UInt rN = iregNo(i->ARM64in.Cmp.argL); 4060436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ARM64RIA* argR = i->ARM64in.Cmp.argR; 4061436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov Bool is64 = i->ARM64in.Cmp.is64; 4062436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov switch (argR->tag) { 4063436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64riA_I12: 4064436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* 1 11 10001 sh imm12 Rn Rd = SUBS Xd, Xn, #imm */ 4065436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* 0 11 10001 sh imm12 Rn Rd = SUBS Wd, Wn, #imm */ 4066436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov *p++ = X_2_6_2_12_5_5( 4067436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov is64 ? X11 : X01, X110001, 4068436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov argR->ARM64riA.I12.shift == 12 ? X01 : X00, 4069436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov argR->ARM64riA.I12.imm12, rN, rD); 4070436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov break; 4071436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64riA_R: { 4072436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* 1 11 01011 00 0 Rm 000000 Rn Rd = SUBS Xd, Xn, Xm */ 4073436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* 0 11 01011 00 0 Rm 000000 Rn Rd = SUBS Wd, Wn, Wm */ 4074436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov UInt rM = iregNo(i->ARM64in.Cmp.argR->ARM64riA.R.reg); 4075436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov *p++ = X_3_8_5_6_5_5(is64 ? X111 : X011, 4076436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov X01011000, rM, X000000, rN, rD); 4077436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov break; 4078436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 4079436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov default: 4080436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov goto bad; 4081436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 4082436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov goto done; 4083436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 4084436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64in_Logic: { 4085436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov UInt rD = iregNo(i->ARM64in.Logic.dst); 4086436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov UInt rN = iregNo(i->ARM64in.Logic.argL); 4087436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ARM64RIL* argR = i->ARM64in.Logic.argR; 4088436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov UInt opc = 0; /* invalid */ 4089436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(rD < 31); 4090436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(rN < 31); 4091436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov switch (i->ARM64in.Logic.op) { 4092436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64lo_OR: opc = X101; break; 4093436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64lo_AND: opc = X100; break; 4094436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64lo_XOR: opc = X110; break; 4095436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov default: break; 4096436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 4097436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(opc != 0); 4098436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov switch (argR->tag) { 4099436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64riL_I13: { 4100436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* 1 01 100100 N immR immS Rn Rd = ORR <Xd|Sp>, Xn, #imm */ 4101436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* 1 00 100100 N immR immS Rn Rd = AND <Xd|Sp>, Xn, #imm */ 4102436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* 1 10 100100 N immR immS Rn Rd = EOR <Xd|Sp>, Xn, #imm */ 4103436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov *p++ = X_3_6_1_6_6_5_5( 4104436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov opc, X100100, argR->ARM64riL.I13.bitN, 4105436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov argR->ARM64riL.I13.immR, argR->ARM64riL.I13.immS, 4106436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov rN, rD 4107436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ); 4108436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov break; 4109436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 4110436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64riL_R: { 4111436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* 1 01 01010 00 0 m 000000 n d = ORR Xd, Xn, Xm */ 4112436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* 1 00 01010 00 0 m 000000 n d = AND Xd, Xn, Xm */ 4113436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* 1 10 01010 00 0 m 000000 n d = EOR Xd, Xn, Xm */ 4114436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov UInt rM = iregNo(argR->ARM64riL.R.reg); 4115436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(rM < 31); 4116436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov *p++ = X_3_8_5_6_5_5(opc, X01010000, rM, X000000, rN, rD); 4117436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov break; 4118436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 4119436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov default: 4120436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov goto bad; 4121436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 4122436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov goto done; 4123436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 4124436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64in_Test: { 4125436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov UInt rD = 31; /* XZR, we are going to dump the result */ 4126436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov UInt rN = iregNo(i->ARM64in.Test.argL); 4127436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ARM64RIL* argR = i->ARM64in.Test.argR; 4128436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov switch (argR->tag) { 4129436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64riL_I13: { 4130436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* 1 11 100100 N immR immS Rn Rd = ANDS Xd, Xn, #imm */ 4131436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov *p++ = X_3_6_1_6_6_5_5( 4132436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov X111, X100100, argR->ARM64riL.I13.bitN, 4133436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov argR->ARM64riL.I13.immR, argR->ARM64riL.I13.immS, 4134436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov rN, rD 4135436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ); 4136436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov break; 4137436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 4138436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov default: 4139436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov goto bad; 4140436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 4141436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov goto done; 4142436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 4143436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64in_Shift: { 4144436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov UInt rD = iregNo(i->ARM64in.Shift.dst); 4145436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov UInt rN = iregNo(i->ARM64in.Shift.argL); 4146436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ARM64RI6* argR = i->ARM64in.Shift.argR; 4147436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(rD < 31); 4148436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(rN < 31); 4149436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov switch (argR->tag) { 4150436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64ri6_I6: { 4151436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* 110 1001101 (63-sh) (64-sh) nn dd LSL Xd, Xn, sh */ 4152436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* 110 1001101 sh 63 nn dd LSR Xd, Xn, sh */ 4153436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* 100 1001101 sh 63 nn dd ASR Xd, Xn, sh */ 4154436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov UInt sh = argR->ARM64ri6.I6.imm6; 4155436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(sh > 0 && sh < 64); 4156436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov switch (i->ARM64in.Shift.op) { 4157436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64sh_SHL: 4158436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov *p++ = X_3_6_1_6_6_5_5(X110, X100110, 4159436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 1, 64-sh, 63-sh, rN, rD); 4160436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov break; 4161436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64sh_SHR: 4162436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov *p++ = X_3_6_1_6_6_5_5(X110, X100110, 1, sh, 63, rN, rD); 4163436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov break; 4164436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64sh_SAR: 4165436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov *p++ = X_3_6_1_6_6_5_5(X100, X100110, 1, sh, 63, rN, rD); 4166436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov break; 4167436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov default: 4168436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(0); 4169436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 4170436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov break; 4171436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 4172436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64ri6_R: { 4173436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* 100 1101 0110 mm 001000 nn dd LSL Xd, Xn, Xm */ 4174436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* 100 1101 0110 mm 001001 nn dd LSR Xd, Xn, Xm */ 4175436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* 100 1101 0110 mm 001010 nn dd ASR Xd, Xn, Xm */ 4176436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov UInt rM = iregNo(argR->ARM64ri6.R.reg); 4177436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(rM < 31); 4178436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov UInt subOpc = 0; 4179436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov switch (i->ARM64in.Shift.op) { 4180436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64sh_SHL: subOpc = X001000; break; 4181436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64sh_SHR: subOpc = X001001; break; 4182436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64sh_SAR: subOpc = X001010; break; 4183436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov default: vassert(0); 4184436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 4185436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov *p++ = X_3_8_5_6_5_5(X100, X11010110, rM, subOpc, rN, rD); 4186436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov break; 4187436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 4188436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov default: 4189436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(0); 4190436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 4191436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov goto done; 4192436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 4193436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64in_Unary: { 4194436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov UInt rDst = iregNo(i->ARM64in.Unary.dst); 4195436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov UInt rSrc = iregNo(i->ARM64in.Unary.src); 4196436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov switch (i->ARM64in.Unary.op) { 4197436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64un_CLZ: 4198436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* 1 10 1101 0110 00000 00010 0 nn dd CLZ Xd, Xn */ 4199436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* 1 10 1101 0110 00000 00010 1 nn dd CLS Xd, Xn (unimp) */ 4200436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov *p++ = X_3_8_5_6_5_5(X110, 4201436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov X11010110, X00000, X000100, rSrc, rDst); 4202436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov goto done; 4203436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64un_NEG: 4204436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* 1 10 01011 000 m 000000 11111 d NEG Xd,Xm */ 4205436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* 0 10 01011 000 m 000000 11111 d NEG Wd,Wm (unimp) */ 4206436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov *p++ = X_3_8_5_6_5_5(X110, 4207436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov X01011000, rSrc, X000000, X11111, rDst); 4208436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov goto done; 4209436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64un_NOT: { 4210436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* 1 01 01010 00 1 m 000000 11111 d MVN Xd,Xm */ 4211436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov *p++ = X_3_8_5_6_5_5(X101, 4212436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov X01010001, rSrc, X000000, X11111, rDst); 4213436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov goto done; 4214436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 4215436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov default: 4216436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov break; 4217436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 4218436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov goto bad; 4219436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 4220436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64in_MovI: { 4221436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* We generate the "preferred form", ORR Xd, XZR, Xm 4222436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 101 01010 00 0 m 000000 11111 d 4223436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov */ 4224436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov UInt instr = 0xAA0003E0; 4225436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov UInt d = iregNo(i->ARM64in.MovI.dst); 4226436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov UInt m = iregNo(i->ARM64in.MovI.src); 4227436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov *p++ = instr | ((m & 31) << 16) | ((d & 31) << 0); 4228436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov goto done; 4229436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 4230436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64in_Imm64: { 4231436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov p = imm64_to_iregNo( p, iregNo(i->ARM64in.Imm64.dst), 4232436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->ARM64in.Imm64.imm64 ); 4233436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov goto done; 4234436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 4235436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64in_LdSt64: { 4236436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov p = do_load_or_store64( p, i->ARM64in.LdSt64.isLoad, 4237436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov iregNo(i->ARM64in.LdSt64.rD), 4238436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->ARM64in.LdSt64.amode ); 4239436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov goto done; 4240436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 4241436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64in_LdSt32: { 4242436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov p = do_load_or_store32( p, i->ARM64in.LdSt32.isLoad, 4243436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov iregNo(i->ARM64in.LdSt32.rD), 4244436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->ARM64in.LdSt32.amode ); 4245436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov goto done; 4246436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 4247436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64in_LdSt16: { 4248436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov p = do_load_or_store16( p, i->ARM64in.LdSt16.isLoad, 4249436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov iregNo(i->ARM64in.LdSt16.rD), 4250436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->ARM64in.LdSt16.amode ); 4251436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov goto done; 4252436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 4253436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64in_LdSt8: { 4254436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov p = do_load_or_store8( p, i->ARM64in.LdSt8.isLoad, 4255436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov iregNo(i->ARM64in.LdSt8.rD), 4256436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->ARM64in.LdSt8.amode ); 4257436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov goto done; 4258436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 4259436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMin_LdSt32: 4260436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMin_LdSt8U: { 4261436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ UInt bL, bB; 4262436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ HReg rD; 4263436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ ARMAMode1* am; 4264436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ ARMCondCode cc; 4265436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ if (i->tag == ARMin_LdSt32) { 4266436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ bB = 0; 4267436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ bL = i->ARMin.LdSt32.isLoad ? 1 : 0; 4268436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ am = i->ARMin.LdSt32.amode; 4269436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ rD = i->ARMin.LdSt32.rD; 4270436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ cc = i->ARMin.LdSt32.cc; 4271436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ } else { 4272436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ bB = 1; 4273436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ bL = i->ARMin.LdSt8U.isLoad ? 1 : 0; 4274436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ am = i->ARMin.LdSt8U.amode; 4275436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ rD = i->ARMin.LdSt8U.rD; 4276436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ cc = i->ARMin.LdSt8U.cc; 4277436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ } 4278436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ vassert(cc != ARMcc_NV); 4279436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ if (am->tag == ARMam1_RI) { 4280436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ Int simm12; 4281436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ UInt instr, bP; 4282436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ if (am->ARMam1.RI.simm13 < 0) { 4283436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ bP = 0; 4284436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ simm12 = -am->ARMam1.RI.simm13; 4285436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ } else { 4286436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ bP = 1; 4287436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ simm12 = am->ARMam1.RI.simm13; 4288436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ } 4289436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ vassert(simm12 >= 0 && simm12 <= 4095); 4290436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ instr = XXXXX___(cc,X0101,BITS4(bP,bB,0,bL), 4291436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ iregNo(am->ARMam1.RI.reg), 4292436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ iregNo(rD)); 4293436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ instr |= simm12; 4294436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ *p++ = instr; 4295436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ goto done; 4296436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ } else { 4297436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ // RR case 4298436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ goto bad; 4299436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ } 4300436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ } 4301436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMin_LdSt16: { 4302436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ HReg rD = i->ARMin.LdSt16.rD; 4303436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ UInt bS = i->ARMin.LdSt16.signedLoad ? 1 : 0; 4304436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ UInt bL = i->ARMin.LdSt16.isLoad ? 1 : 0; 4305436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ ARMAMode2* am = i->ARMin.LdSt16.amode; 4306436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ ARMCondCode cc = i->ARMin.LdSt16.cc; 4307436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ vassert(cc != ARMcc_NV); 4308436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ if (am->tag == ARMam2_RI) { 4309436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ HReg rN = am->ARMam2.RI.reg; 4310436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ Int simm8; 4311436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ UInt bP, imm8hi, imm8lo, instr; 4312436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ if (am->ARMam2.RI.simm9 < 0) { 4313436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ bP = 0; 4314436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ simm8 = -am->ARMam2.RI.simm9; 4315436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ } else { 4316436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ bP = 1; 4317436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ simm8 = am->ARMam2.RI.simm9; 4318436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ } 4319436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ vassert(simm8 >= 0 && simm8 <= 255); 4320436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ imm8hi = (simm8 >> 4) & 0xF; 4321436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ imm8lo = simm8 & 0xF; 4322436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ vassert(!(bL == 0 && bS == 1)); // "! signed store" 4323436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ /**/ if (bL == 0 && bS == 0) { 4324436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ // strh 4325436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ instr = XXXXXXXX(cc,X0001, BITS4(bP,1,0,0), iregNo(rN), 4326436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ iregNo(rD), imm8hi, X1011, imm8lo); 4327436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ *p++ = instr; 4328436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ goto done; 4329436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ } 4330436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ else if (bL == 1 && bS == 0) { 4331436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ // ldrh 4332436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ instr = XXXXXXXX(cc,X0001, BITS4(bP,1,0,1), iregNo(rN), 4333436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ iregNo(rD), imm8hi, X1011, imm8lo); 4334436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ *p++ = instr; 4335436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ goto done; 4336436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ } 4337436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ else if (bL == 1 && bS == 1) { 4338436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ // ldrsh 4339436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ instr = XXXXXXXX(cc,X0001, BITS4(bP,1,0,1), iregNo(rN), 4340436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ iregNo(rD), imm8hi, X1111, imm8lo); 4341436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ *p++ = instr; 4342436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ goto done; 4343436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ } 4344436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ else vassert(0); // ill-constructed insn 4345436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ } else { 4346436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ // RR case 4347436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ goto bad; 4348436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ } 4349436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ } 4350436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMin_Ld8S: { 4351436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ HReg rD = i->ARMin.Ld8S.rD; 4352436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ ARMAMode2* am = i->ARMin.Ld8S.amode; 4353436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ ARMCondCode cc = i->ARMin.Ld8S.cc; 4354436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ vassert(cc != ARMcc_NV); 4355436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ if (am->tag == ARMam2_RI) { 4356436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ HReg rN = am->ARMam2.RI.reg; 4357436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ Int simm8; 4358436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ UInt bP, imm8hi, imm8lo, instr; 4359436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ if (am->ARMam2.RI.simm9 < 0) { 4360436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ bP = 0; 4361436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ simm8 = -am->ARMam2.RI.simm9; 4362436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ } else { 4363436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ bP = 1; 4364436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ simm8 = am->ARMam2.RI.simm9; 4365436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ } 4366436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ vassert(simm8 >= 0 && simm8 <= 255); 4367436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ imm8hi = (simm8 >> 4) & 0xF; 4368436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ imm8lo = simm8 & 0xF; 4369436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ // ldrsb 4370436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ instr = XXXXXXXX(cc,X0001, BITS4(bP,1,0,1), iregNo(rN), 4371436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ iregNo(rD), imm8hi, X1101, imm8lo); 4372436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ *p++ = instr; 4373436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ goto done; 4374436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ } else { 4375436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ // RR case 4376436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ goto bad; 4377436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ } 4378436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ } 4379436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 4380436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64in_XDirect: { 4381436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* NB: what goes on here has to be very closely coordinated 4382436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov with chainXDirect_ARM64 and unchainXDirect_ARM64 below. */ 4383436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* We're generating chain-me requests here, so we need to be 4384436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov sure this is actually allowed -- no-redir translations 4385436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov can't use chain-me's. Hence: */ 4386436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(disp_cp_chain_me_to_slowEP != NULL); 4387436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(disp_cp_chain_me_to_fastEP != NULL); 4388436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 4389436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* Use ptmp for backpatching conditional jumps. */ 4390436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov UInt* ptmp = NULL; 4391436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 4392436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* First off, if this is conditional, create a conditional 4393436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov jump over the rest of it. Or at least, leave a space for 4394436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov it that we will shortly fill in. */ 4395436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if (i->ARM64in.XDirect.cond != ARM64cc_AL) { 4396436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(i->ARM64in.XDirect.cond != ARM64cc_NV); 4397436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ptmp = p; 4398436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov *p++ = 0; 4399436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 4400436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 4401436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* Update the guest PC. */ 4402436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* imm64 x9, dstGA */ 4403436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* str x9, amPC */ 4404436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov p = imm64_to_iregNo(p, /*x*/9, i->ARM64in.XDirect.dstGA); 4405436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov p = do_load_or_store64(p, False/*!isLoad*/, 4406436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /*x*/9, i->ARM64in.XDirect.amPC); 4407436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 4408436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* --- FIRST PATCHABLE BYTE follows --- */ 4409436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* VG_(disp_cp_chain_me_to_{slowEP,fastEP}) (where we're 4410436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov calling to) backs up the return address, so as to find the 4411436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov address of the first patchable byte. So: don't change the 4412436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov number of instructions (5) below. */ 4413436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* movw x9, VG_(disp_cp_chain_me_to_{slowEP,fastEP})[15:0] */ 4414436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* movk x9, VG_(disp_cp_chain_me_to_{slowEP,fastEP})[31:15], lsl 16 */ 4415436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* movk x9, VG_(disp_cp_chain_me_to_{slowEP,fastEP})[47:32], lsl 32 */ 4416436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* movk x9, VG_(disp_cp_chain_me_to_{slowEP,fastEP})[63:48], lsl 48 */ 4417436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* blr x9 */ 4418436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov void* disp_cp_chain_me 4419436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov = i->ARM64in.XDirect.toFastEP ? disp_cp_chain_me_to_fastEP 4420436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov : disp_cp_chain_me_to_slowEP; 4421436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov p = imm64_to_iregNo_EXACTLY4(p, /*x*/9, 4422436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov Ptr_to_ULong(disp_cp_chain_me)); 4423436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov *p++ = 0xD63F0120; 4424436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* --- END of PATCHABLE BYTES --- */ 4425436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 4426436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* Fix up the conditional jump, if there was one. */ 4427436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if (i->ARM64in.XDirect.cond != ARM64cc_AL) { 4428436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov Int delta = (UChar*)p - (UChar*)ptmp; /* must be signed */ 4429436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(delta > 0 && delta < 40); 4430436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert((delta & 3) == 0); 4431436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov UInt notCond = 1 ^ (UInt)i->ARM64in.XDirect.cond; 4432436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(notCond <= 13); /* Neither AL nor NV */ 4433436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(ptmp != NULL); 4434436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov delta = delta >> 2; 4435436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov *ptmp = X_8_19_1_4(X01010100, delta & ((1<<19)-1), 0, notCond); 4436436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 4437436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov goto done; 4438436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 4439436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 4440436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64in_XIndir: { 4441436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov // XIndir is more or less the same as XAssisted, except 4442436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov // we don't have a trc value to hand back, so there's no 4443436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov // write to r21 4444436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* Use ptmp for backpatching conditional jumps. */ 4445436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov //UInt* ptmp = NULL; 4446436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 4447436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* First off, if this is conditional, create a conditional 4448436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov jump over the rest of it. Or at least, leave a space for 4449436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov it that we will shortly fill in. */ 4450436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if (i->ARM64in.XIndir.cond != ARM64cc_AL) { 4451436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(0); //ATC 4452436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ vassert(i->ARMin.XIndir.cond != ARMcc_NV); 4453436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ ptmp = p; 4454436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ *p++ = 0; 4455436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 4456436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 4457436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* Update the guest PC. */ 4458436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* str r-dstGA, amPC */ 4459436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov p = do_load_or_store64(p, False/*!isLoad*/, 4460436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov iregNo(i->ARM64in.XIndir.dstGA), 4461436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->ARM64in.XIndir.amPC); 4462436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 4463436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* imm64 x9, VG_(disp_cp_xindir) */ 4464436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* br x9 */ 4465436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov p = imm64_to_iregNo(p, /*x*/9, Ptr_to_ULong(disp_cp_xindir)); 4466436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov *p++ = 0xD61F0120; /* br x9 */ 4467436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 4468436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* Fix up the conditional jump, if there was one. */ 4469436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if (i->ARM64in.XIndir.cond != ARM64cc_AL) { 4470436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(0); //ATC 4471436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ Int delta = (UChar*)p - (UChar*)ptmp; /* must be signed */ 4472436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ vassert(delta > 0 && delta < 40); 4473436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ vassert((delta & 3) == 0); 4474436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ UInt notCond = 1 ^ (UInt)i->ARMin.XIndir.cond; 4475436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ vassert(notCond <= 13); /* Neither AL nor NV */ 4476436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ delta = (delta >> 2) - 2; 4477436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ *ptmp = XX______(notCond, X1010) | (delta & 0xFFFFFF); 4478436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 4479436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov goto done; 4480436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 4481436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 4482436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64in_XAssisted: { 4483436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* Use ptmp for backpatching conditional jumps. */ 4484436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov UInt* ptmp = NULL; 4485436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 4486436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* First off, if this is conditional, create a conditional 4487436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov jump over the rest of it. Or at least, leave a space for 4488436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov it that we will shortly fill in. I think this can only 4489436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ever happen when VEX is driven by the switchbacker. */ 4490436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if (i->ARM64in.XAssisted.cond != ARM64cc_AL) { 4491436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(i->ARM64in.XDirect.cond != ARM64cc_NV); 4492436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ptmp = p; 4493436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov *p++ = 0; 4494436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 4495436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 4496436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* Update the guest PC. */ 4497436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* str r-dstGA, amPC */ 4498436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov p = do_load_or_store64(p, False/*!isLoad*/, 4499436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov iregNo(i->ARM64in.XAssisted.dstGA), 4500436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->ARM64in.XAssisted.amPC); 4501436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 4502436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* movw r21, $magic_number */ 4503436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov UInt trcval = 0; 4504436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov switch (i->ARM64in.XAssisted.jk) { 4505436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case Ijk_ClientReq: trcval = VEX_TRC_JMP_CLIENTREQ; break; 4506436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case Ijk_Sys_syscall: trcval = VEX_TRC_JMP_SYS_SYSCALL; break; 4507436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov //case Ijk_Sys_int128: trcval = VEX_TRC_JMP_SYS_INT128; break; 4508436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov //case Ijk_Yield: trcval = VEX_TRC_JMP_YIELD; break; 4509436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov //case Ijk_EmWarn: trcval = VEX_TRC_JMP_EMWARN; break; 4510436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov //case Ijk_MapFail: trcval = VEX_TRC_JMP_MAPFAIL; break; 4511436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case Ijk_NoDecode: trcval = VEX_TRC_JMP_NODECODE; break; 4512eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov case Ijk_InvalICache: trcval = VEX_TRC_JMP_INVALICACHE; break; 4513eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov case Ijk_FlushDCache: trcval = VEX_TRC_JMP_FLUSHDCACHE; break; 45142ca80a6a6fc069acdb73186e8e578dbf8f46af80Dmitriy Ivanov case Ijk_NoRedir: trcval = VEX_TRC_JMP_NOREDIR; break; 4515436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov //case Ijk_SigTRAP: trcval = VEX_TRC_JMP_SIGTRAP; break; 4516436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov //case Ijk_SigSEGV: trcval = VEX_TRC_JMP_SIGSEGV; break; 4517436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case Ijk_Boring: trcval = VEX_TRC_JMP_BORING; break; 4518436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* We don't expect to see the following being assisted. */ 4519436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov //case Ijk_Ret: 4520436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov //case Ijk_Call: 4521436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* fallthrough */ 4522436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov default: 4523436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ppIRJumpKind(i->ARM64in.XAssisted.jk); 4524436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vpanic("emit_ARM64Instr.ARM64in_XAssisted: " 4525436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "unexpected jump kind"); 4526436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 4527436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(trcval != 0); 4528436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov p = imm64_to_iregNo(p, /*x*/21, (ULong)trcval); 4529436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 4530436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* imm64 x9, VG_(disp_cp_xassisted) */ 4531436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* br x9 */ 4532436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov p = imm64_to_iregNo(p, /*x*/9, Ptr_to_ULong(disp_cp_xassisted)); 4533436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov *p++ = 0xD61F0120; /* br x9 */ 4534436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 4535436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* Fix up the conditional jump, if there was one. */ 4536436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if (i->ARM64in.XAssisted.cond != ARM64cc_AL) { 4537436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov Int delta = (UChar*)p - (UChar*)ptmp; /* must be signed */ 4538436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(delta > 0 && delta < 40); 4539436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert((delta & 3) == 0); 4540436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov UInt notCond = 1 ^ (UInt)i->ARM64in.XDirect.cond; 4541436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(notCond <= 13); /* Neither AL nor NV */ 4542436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(ptmp != NULL); 4543436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov delta = delta >> 2; 4544436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov *ptmp = X_8_19_1_4(X01010100, delta & ((1<<19)-1), 0, notCond); 4545436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 4546436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov goto done; 4547436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 4548436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 4549436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64in_CSel: { 4550436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* 100 1101 0100 mm cond 00 nn dd = CSEL Xd, Xn, Xm, cond */ 4551436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov UInt dd = iregNo(i->ARM64in.CSel.dst); 4552436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov UInt nn = iregNo(i->ARM64in.CSel.argL); 4553436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov UInt mm = iregNo(i->ARM64in.CSel.argR); 4554436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov UInt cond = (UInt)i->ARM64in.CSel.cond; 4555436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(dd < 31 && nn < 31 && mm < 31 && cond < 16); 4556436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov *p++ = X_3_8_5_6_5_5(X100, X11010100, mm, cond << 2, nn, dd); 4557436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov goto done; 4558436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 4559436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 4560436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64in_Call: { 4561436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* We'll use x9 as a scratch register to put the target 4562436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov address in. */ 4563436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if (i->ARM64in.Call.cond != ARM64cc_AL 4564436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov && i->ARM64in.Call.rloc.pri != RLPri_None) { 4565436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* The call might not happen (it isn't unconditional) and 4566436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov it returns a result. In this case we will need to 4567436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov generate a control flow diamond to put 0x555..555 in 4568436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov the return register(s) in the case where the call 4569436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov doesn't happen. If this ever becomes necessary, maybe 4570436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov copy code from the 32-bit ARM equivalent. Until that 4571436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov day, just give up. */ 4572436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov goto bad; 4573436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 4574436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 4575436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov UInt* ptmp = NULL; 4576436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if (i->ARM64in.Call.cond != ARM64cc_AL) { 4577436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* Create a hole to put a conditional branch in. We'll 4578436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov patch it once we know the branch length. */ 4579436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ptmp = p; 4580436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov *p++ = 0; 4581436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 4582436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 4583436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov // x9 = &target 4584436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov p = imm64_to_iregNo( (UInt*)p, 4585436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /*x*/9, (ULong)i->ARM64in.Call.target ); 4586436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov // blr x9 4587436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov *p++ = 0xD63F0120; 4588436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 4589436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov // Patch the hole if necessary 4590436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if (i->ARM64in.Call.cond != ARM64cc_AL) { 4591436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ULong dist = (ULong)(p - ptmp); 4592436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* imm64_to_iregNo produces between 1 and 4 insns, and 4593436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov then there's the BLR itself. Hence: */ 4594436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(dist >= 2 && dist <= 5); 4595436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(ptmp != NULL); 4596436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov // 01010100 simm19 0 cond = B.cond (here + simm19 << 2) 4597436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov *ptmp = X_8_19_1_4(X01010100, dist, 0, 4598436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 1 ^ (UInt)i->ARM64in.Call.cond); 4599436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } else { 4600436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(ptmp == NULL); 4601436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 4602436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 4603436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov goto done; 4604436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 4605436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 4606436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64in_AddToSP: { 4607436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* 10,0 10001 00 imm12 11111 11111 ADD xsp, xsp, #imm12 4608436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 11,0 10001 00 imm12 11111 11111 SUB xsp, xsp, #imm12 4609436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov */ 4610436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov Int simm12 = i->ARM64in.AddToSP.simm; 4611436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(-4096 < simm12 && simm12 < 4096); 4612436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(0 == (simm12 & 0xF)); 4613436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if (simm12 >= 0) { 4614436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov *p++ = X_2_6_2_12_5_5(X10, X010001, X00, simm12, X11111, X11111); 4615436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } else { 4616436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov *p++ = X_2_6_2_12_5_5(X11, X010001, X00, -simm12, X11111, X11111); 4617436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 4618436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov goto done; 4619436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 4620436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 4621436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64in_FromSP: { 4622436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* 10,0 10001 00 0..(12)..0 11111 dd MOV Xd, xsp */ 4623436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov UInt dd = iregNo(i->ARM64in.FromSP.dst); 4624436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(dd < 31); 4625436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov *p++ = X_2_6_2_12_5_5(X10, X010001, X00, 0, X11111, dd); 4626436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov goto done; 4627436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 4628436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 4629436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64in_Mul: { 4630436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* 100 11011 110 mm 011111 nn dd UMULH Xd, Xn,Xm 4631436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 100 11011 010 mm 011111 nn dd SMULH Xd, Xn,Xm 4632436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 100 11011 000 mm 011111 nn dd MUL Xd, Xn,Xm 4633436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov */ 4634436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov UInt dd = iregNo(i->ARM64in.Mul.dst); 4635436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov UInt nn = iregNo(i->ARM64in.Mul.argL); 4636436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov UInt mm = iregNo(i->ARM64in.Mul.argR); 4637436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(dd < 31 && nn < 31 && mm < 31); 4638436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov switch (i->ARM64in.Mul.op) { 4639436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64mul_ZX: 4640436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov *p++ = X_3_8_5_6_5_5(X100, X11011110, mm, X011111, nn, dd); 4641436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov goto done; 4642eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov case ARM64mul_SX: 4643eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov *p++ = X_3_8_5_6_5_5(X100, X11011010, mm, X011111, nn, dd); 4644eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov goto done; 4645436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64mul_PLAIN: 4646436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov *p++ = X_3_8_5_6_5_5(X100, X11011000, mm, X011111, nn, dd); 4647436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov goto done; 4648436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov default: 4649436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(0); 4650436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 4651436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov goto bad; 4652436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 4653436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64in_LdrEX: { 4654436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* 085F7C82 ldxrb w2, [x4] 4655436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 485F7C82 ldxrh w2, [x4] 4656436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 885F7C82 ldxr w2, [x4] 4657436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov C85F7C82 ldxr x2, [x4] 4658436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov */ 4659436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov switch (i->ARM64in.LdrEX.szB) { 4660436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case 1: *p++ = 0x085F7C82; goto done; 4661436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case 2: *p++ = 0x485F7C82; goto done; 4662436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case 4: *p++ = 0x885F7C82; goto done; 4663436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case 8: *p++ = 0xC85F7C82; goto done; 4664436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov default: break; 4665436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 4666436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov goto bad; 4667436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 4668436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64in_StrEX: { 4669436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* 08007C82 stxrb w0, w2, [x4] 4670436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 48007C82 stxrh w0, w2, [x4] 4671436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 88007C82 stxr w0, w2, [x4] 4672436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov C8007C82 stxr w0, x2, [x4] 4673436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov */ 4674436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov switch (i->ARM64in.StrEX.szB) { 4675436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case 1: *p++ = 0x08007C82; goto done; 4676436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case 2: *p++ = 0x48007C82; goto done; 4677436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case 4: *p++ = 0x88007C82; goto done; 4678436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case 8: *p++ = 0xC8007C82; goto done; 4679436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov default: break; 4680436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 4681436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov goto bad; 4682436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 4683436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64in_MFence: { 4684436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov *p++ = 0xD5033F9F; /* DSB sy */ 4685436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov *p++ = 0xD5033FBF; /* DMB sy */ 4686436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov *p++ = 0xD5033FDF; /* ISB */ 4687436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov goto done; 4688436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 4689436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov //case ARM64in_CLREX: { 4690436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov // //ATC, but believed to be correct 4691436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov // goto bad; 4692436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov // *p++ = 0xD5033F5F; /* clrex */ 4693436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov // goto done; 4694436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov //} 4695436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64in_VLdStS: { 4696436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* 10 111101 01 imm12 n t LDR St, [Xn|SP, #imm12 * 4] 4697436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 10 111101 00 imm12 n t STR St, [Xn|SP, #imm12 * 4] 4698436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov */ 4699436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov UInt sD = dregNo(i->ARM64in.VLdStS.sD); 4700436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov UInt rN = iregNo(i->ARM64in.VLdStS.rN); 4701436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov UInt uimm12 = i->ARM64in.VLdStS.uimm12; 4702436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov Bool isLD = i->ARM64in.VLdStS.isLoad; 4703436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(uimm12 < 16384 && 0 == (uimm12 & 3)); 4704436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov uimm12 >>= 2; 4705436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(uimm12 < (1<<12)); 4706436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(sD < 32); 4707436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(rN < 31); 4708436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov *p++ = X_2_6_2_12_5_5(X10, X111101, isLD ? X01 : X00, 4709436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov uimm12, rN, sD); 4710436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov goto done; 4711436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 4712436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64in_VLdStD: { 4713436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* 11 111101 01 imm12 n t LDR Dt, [Xn|SP, #imm12 * 8] 4714436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 11 111101 00 imm12 n t STR Dt, [Xn|SP, #imm12 * 8] 4715436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov */ 4716436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov UInt dD = dregNo(i->ARM64in.VLdStD.dD); 4717436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov UInt rN = iregNo(i->ARM64in.VLdStD.rN); 4718436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov UInt uimm12 = i->ARM64in.VLdStD.uimm12; 4719436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov Bool isLD = i->ARM64in.VLdStD.isLoad; 4720436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(uimm12 < 32768 && 0 == (uimm12 & 7)); 4721436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov uimm12 >>= 3; 4722436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(uimm12 < (1<<12)); 4723436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(dD < 32); 4724436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(rN < 31); 4725436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov *p++ = X_2_6_2_12_5_5(X11, X111101, isLD ? X01 : X00, 4726436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov uimm12, rN, dD); 4727436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov goto done; 4728436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 4729436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64in_VLdStQ: { 4730436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* 0100 1100 0000 0000 0111 11 rN rQ st1 {vQ.2d}, [<rN|SP>] 4731436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 0100 1100 0100 0000 0111 11 rN rQ ld1 {vQ.2d}, [<rN|SP>] 4732436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov */ 4733436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov UInt rQ = qregNo(i->ARM64in.VLdStQ.rQ); 4734436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov UInt rN = iregNo(i->ARM64in.VLdStQ.rN); 4735436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(rQ < 32); 4736436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(rN < 31); 4737436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if (i->ARM64in.VLdStQ.isLoad) { 4738436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov *p++ = 0x4C407C00 | (rN << 5) | rQ; 4739436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } else { 4740436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov *p++ = 0x4C007C00 | (rN << 5) | rQ; 4741436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 4742436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov goto done; 4743436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 4744436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64in_VCvtI2F: { 4745436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* 31 28 23 21 20 18 15 9 4 4746436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 000 11110 00 1 00 010 000000 n d SCVTF Sd, Wn 4747436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 000 11110 01 1 00 010 000000 n d SCVTF Dd, Wn 4748436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 100 11110 00 1 00 010 000000 n d SCVTF Sd, Xn 4749436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 100 11110 01 1 00 010 000000 n d SCVTF Dd, Xn 4750436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 000 11110 00 1 00 011 000000 n d UCVTF Sd, Wn 4751436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 000 11110 01 1 00 011 000000 n d UCVTF Dd, Wn 4752436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 100 11110 00 1 00 011 000000 n d UCVTF Sd, Xn 4753436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 100 11110 01 1 00 011 000000 n d UCVTF Dd, Xn 4754436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov */ 4755436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov UInt rN = iregNo(i->ARM64in.VCvtI2F.rS); 4756436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov UInt rD = dregNo(i->ARM64in.VCvtI2F.rD); 4757436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ARM64CvtOp how = i->ARM64in.VCvtI2F.how; 4758436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* Just handle cases as they show up. */ 4759436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov switch (how) { 4760436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64cvt_F32_I32S: /* SCVTF Sd, Wn */ 4761436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov *p++ = X_3_5_8_6_5_5(X000, X11110, X00100010, X000000, rN, rD); 4762436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov break; 4763436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64cvt_F64_I32S: /* SCVTF Dd, Wn */ 4764436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov *p++ = X_3_5_8_6_5_5(X000, X11110, X01100010, X000000, rN, rD); 4765436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov break; 4766436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64cvt_F32_I64S: /* SCVTF Sd, Xn */ 4767436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov *p++ = X_3_5_8_6_5_5(X100, X11110, X00100010, X000000, rN, rD); 4768436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov break; 4769436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64cvt_F64_I64S: /* SCVTF Dd, Xn */ 4770436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov *p++ = X_3_5_8_6_5_5(X100, X11110, X01100010, X000000, rN, rD); 4771436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov break; 47722ca80a6a6fc069acdb73186e8e578dbf8f46af80Dmitriy Ivanov case ARM64cvt_F32_I32U: /* UCVTF Sd, Wn */ 47732ca80a6a6fc069acdb73186e8e578dbf8f46af80Dmitriy Ivanov *p++ = X_3_5_8_6_5_5(X000, X11110, X00100011, X000000, rN, rD); 47742ca80a6a6fc069acdb73186e8e578dbf8f46af80Dmitriy Ivanov break; 4775436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64cvt_F64_I32U: /* UCVTF Dd, Wn */ 4776436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov *p++ = X_3_5_8_6_5_5(X000, X11110, X01100011, X000000, rN, rD); 4777436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov break; 4778436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64cvt_F32_I64U: /* UCVTF Sd, Xn */ 4779436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov *p++ = X_3_5_8_6_5_5(X100, X11110, X00100011, X000000, rN, rD); 4780436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov break; 4781436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64cvt_F64_I64U: /* UCVTF Dd, Xn */ 4782436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov *p++ = X_3_5_8_6_5_5(X100, X11110, X01100011, X000000, rN, rD); 4783436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov break; 4784436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov default: 4785436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov goto bad; //ATC 4786436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 4787436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov goto done; 4788436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 4789436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64in_VCvtF2I: { 4790436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* 30 23 20 18 15 9 4 4791436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov sf 00,11110,0x 1 00 000,000000 n d FCVTNS Rd, Fn (round to 4792436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov sf 00,11110,0x 1 00 001,000000 n d FCVTNU Rd, Fn nearest) 4793436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ---------------- 01 -------------- FCVTP-------- (round to +inf) 4794436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ---------------- 10 -------------- FCVTM-------- (round to -inf) 4795436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ---------------- 11 -------------- FCVTZ-------- (round to zero) 4796436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 4797436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov Rd is Xd when sf==1, Wd when sf==0 4798436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov Fn is Dn when x==1, Sn when x==0 4799436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 20:19 carry the rounding mode, using the same encoding as FPCR 4800436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov */ 4801436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov UInt rD = iregNo(i->ARM64in.VCvtF2I.rD); 4802436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov UInt rN = dregNo(i->ARM64in.VCvtF2I.rS); 4803436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ARM64CvtOp how = i->ARM64in.VCvtF2I.how; 4804436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov UChar armRM = i->ARM64in.VCvtF2I.armRM; 4805436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* Just handle cases as they show up. */ 4806436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov switch (how) { 4807436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64cvt_F64_I32S: /* FCVTxS Wd, Dn */ 4808436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov *p++ = X_3_5_8_6_5_5(X000, X11110, X01100000 | (armRM << 3), 4809436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov X000000, rN, rD); 4810436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov break; 4811436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64cvt_F64_I32U: /* FCVTxU Wd, Dn */ 4812436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov *p++ = X_3_5_8_6_5_5(X000, X11110, X01100001 | (armRM << 3), 4813436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov X000000, rN, rD); 4814436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov break; 4815436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64cvt_F64_I64S: /* FCVTxS Xd, Dn */ 4816436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov *p++ = X_3_5_8_6_5_5(X100, X11110, X01100000 | (armRM << 3), 4817436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov X000000, rN, rD); 4818436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov break; 4819436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64cvt_F64_I64U: /* FCVTxU Xd, Dn */ 4820436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov *p++ = X_3_5_8_6_5_5(X100, X11110, X01100001 | (armRM << 3), 4821436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov X000000, rN, rD); 4822436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov break; 4823436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64cvt_F32_I32S: /* FCVTxS Wd, Sn */ 4824436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov *p++ = X_3_5_8_6_5_5(X000, X11110, X00100000 | (armRM << 3), 4825436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov X000000, rN, rD); 4826436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov break; 48272ca80a6a6fc069acdb73186e8e578dbf8f46af80Dmitriy Ivanov case ARM64cvt_F32_I32U: /* FCVTxU Wd, Sn */ 48282ca80a6a6fc069acdb73186e8e578dbf8f46af80Dmitriy Ivanov *p++ = X_3_5_8_6_5_5(X000, X11110, X00100001 | (armRM << 3), 48292ca80a6a6fc069acdb73186e8e578dbf8f46af80Dmitriy Ivanov X000000, rN, rD); 48302ca80a6a6fc069acdb73186e8e578dbf8f46af80Dmitriy Ivanov break; 48312ca80a6a6fc069acdb73186e8e578dbf8f46af80Dmitriy Ivanov case ARM64cvt_F32_I64S: /* FCVTxS Xd, Sn */ 48322ca80a6a6fc069acdb73186e8e578dbf8f46af80Dmitriy Ivanov *p++ = X_3_5_8_6_5_5(X100, X11110, X00100000 | (armRM << 3), 48332ca80a6a6fc069acdb73186e8e578dbf8f46af80Dmitriy Ivanov X000000, rN, rD); 48342ca80a6a6fc069acdb73186e8e578dbf8f46af80Dmitriy Ivanov break; 4835436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64cvt_F32_I64U: /* FCVTxU Xd, Sn */ 4836436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov *p++ = X_3_5_8_6_5_5(X100, X11110, X00100001 | (armRM << 3), 4837436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov X000000, rN, rD); 4838436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov break; 4839436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov default: 4840436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov goto bad; //ATC 4841436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 4842436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov goto done; 4843436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 4844436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64in_VCvtSD: { 4845436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* 31 23 21 16 14 9 4 4846436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 000,11110, 00 10001 0,1 10000 n d FCVT Dd, Sn (S->D) 4847436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ---------- 01 ----- 0,0 --------- FCVT Sd, Dn (D->S) 4848436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov Rounding, when dst is smaller than src, is per the FPCR. 4849436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov */ 4850436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov UInt dd = dregNo(i->ARM64in.VCvtSD.dst); 4851436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov UInt nn = dregNo(i->ARM64in.VCvtSD.src); 4852436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if (i->ARM64in.VCvtSD.sToD) { 4853436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov *p++ = X_3_5_8_6_5_5(X000, X11110, X00100010, X110000, nn, dd); 4854436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } else { 4855436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov *p++ = X_3_5_8_6_5_5(X000, X11110, X01100010, X010000, nn, dd); 4856436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 4857436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov goto done; 4858436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 4859436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64in_VUnaryD: { 4860436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* 31 23 21 16 14 9 4 4861436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 000,11110 01 1,0000 0,0 10000 n d FMOV Dd, Dn (not handled) 4862436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ------------------- 0,1 --------- FABS ------ 4863436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ------------------- 1,0 --------- FNEG ------ 4864436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ------------------- 1,1 --------- FQSRT ----- 4865436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov */ 4866436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov UInt dD = dregNo(i->ARM64in.VUnaryD.dst); 4867436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov UInt dN = dregNo(i->ARM64in.VUnaryD.src); 4868436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov UInt b16 = 2; /* impossible */ 4869436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov UInt b15 = 2; /* impossible */ 4870436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov switch (i->ARM64in.VUnaryD.op) { 4871436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64fpu_NEG: b16 = 1; b15 = 0; break; 4872436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64fpu_SQRT: b16 = 1; b15 = 1; break; 4873436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64fpu_ABS: b16 = 0; b15 = 1; break; 4874436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov default: break; 4875436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 4876436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if (b16 < 2 && b15 < 2) { 4877436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov *p++ = X_3_8_5_6_5_5(X000, X11110011, (X0000 << 1) | b16, 4878436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov (b15 << 5) | X10000, dN, dD); 4879436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov goto done; 4880436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 4881436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* 4882436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 000, 11110 01 1,001 11,1 10000 n d FRINTI Dd, Dm (round per FPCR) 4883436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov */ 4884436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if (i->ARM64in.VUnaryD.op == ARM64fpu_RINT) { 4885436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov *p++ = X_3_8_5_6_5_5(X000, X11110011, X00111, X110000, dN, dD); 4886436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov goto done; 4887436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 4888436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov goto bad; 4889436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 4890436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64in_VUnaryS: { 4891436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* 31 23 21 16 14 9 4 4892436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 000,11110 00 1,0000 0,0 10000 n d FMOV Sd, Sn (not handled) 4893436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ------------------- 0,1 --------- FABS ------ 4894436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ------------------- 1,0 --------- FNEG ------ 4895436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ------------------- 1,1 --------- FQSRT ----- 4896436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov */ 4897436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov UInt sD = dregNo(i->ARM64in.VUnaryS.dst); 4898436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov UInt sN = dregNo(i->ARM64in.VUnaryS.src); 4899436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov UInt b16 = 2; /* impossible */ 4900436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov UInt b15 = 2; /* impossible */ 4901436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov switch (i->ARM64in.VUnaryS.op) { 4902436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64fpu_NEG: b16 = 1; b15 = 0; break; 4903436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64fpu_SQRT: b16 = 1; b15 = 1; break; 4904436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64fpu_ABS: b16 = 0; b15 = 1; break; 4905436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov default: break; 4906436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 4907436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if (b16 < 2 && b15 < 2) { 4908436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov *p++ = X_3_8_5_6_5_5(X000, X11110001, (X0000 << 1) | b16, 4909436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov (b15 << 5) | X10000, sN, sD); 4910436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov goto done; 4911436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 4912436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* 4913436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 000, 11110 00 1,001 11,1 10000 n d FRINTI Sd, Sm (round per FPCR) 4914436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov */ 4915436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if (i->ARM64in.VUnaryS.op == ARM64fpu_RINT) { 4916436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov *p++ = X_3_8_5_6_5_5(X000, X11110001, X00111, X110000, sN, sD); 4917436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov goto done; 4918436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 4919436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov goto bad; 4920436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 4921436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64in_VBinD: { 4922436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* 31 23 20 15 11 9 4 4923436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ---------------- 0000 ------ FMUL -------- 4924436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 000 11110 011 m 0001 10 n d FDIV Dd,Dn,Dm 4925436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ---------------- 0010 ------ FADD -------- 4926436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ---------------- 0011 ------ FSUB -------- 4927436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov */ 4928436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov UInt dD = dregNo(i->ARM64in.VBinD.dst); 4929436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov UInt dN = dregNo(i->ARM64in.VBinD.argL); 4930436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov UInt dM = dregNo(i->ARM64in.VBinD.argR); 4931436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov UInt b1512 = 16; /* impossible */ 4932436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov switch (i->ARM64in.VBinD.op) { 4933436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64fpb_DIV: b1512 = X0001; break; 4934436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64fpb_MUL: b1512 = X0000; break; 4935436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64fpb_SUB: b1512 = X0011; break; 4936436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64fpb_ADD: b1512 = X0010; break; 4937436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov default: goto bad; 4938436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 4939436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(b1512 < 16); 4940436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov *p++ 4941436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov = X_3_8_5_6_5_5(X000, X11110011, dM, (b1512 << 2) | X10, dN, dD); 4942436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov goto done; 4943436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 4944436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64in_VBinS: { 4945436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* 31 23 20 15 11 9 4 4946436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ---------------- 0000 ------ FMUL -------- 4947436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 000 11110 001 m 0001 10 n d FDIV Dd,Dn,Dm 4948436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ---------------- 0010 ------ FADD -------- 4949436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ---------------- 0011 ------ FSUB -------- 4950436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov */ 4951436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov UInt sD = dregNo(i->ARM64in.VBinS.dst); 4952436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov UInt sN = dregNo(i->ARM64in.VBinS.argL); 4953436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov UInt sM = dregNo(i->ARM64in.VBinS.argR); 4954436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov UInt b1512 = 16; /* impossible */ 4955436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov switch (i->ARM64in.VBinS.op) { 4956436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64fpb_DIV: b1512 = X0001; break; 4957436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64fpb_MUL: b1512 = X0000; break; 4958436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64fpb_SUB: b1512 = X0011; break; 4959436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64fpb_ADD: b1512 = X0010; break; 4960436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov default: goto bad; 4961436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 4962436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(b1512 < 16); 4963436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov *p++ 4964436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov = X_3_8_5_6_5_5(X000, X11110001, sM, (b1512 << 2) | X10, sN, sD); 4965436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov goto done; 4966436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 4967436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64in_VCmpD: { 4968436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* 000 11110 01 1 m 00 1000 n 00 000 FCMP Dn, Dm */ 4969436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov UInt dN = dregNo(i->ARM64in.VCmpD.argL); 4970436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov UInt dM = dregNo(i->ARM64in.VCmpD.argR); 4971436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov *p++ = X_3_8_5_6_5_5(X000, X11110011, dM, X001000, dN, X00000); 4972436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov goto done; 4973436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 4974436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64in_VCmpS: { 4975436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* 000 11110 00 1 m 00 1000 n 00 000 FCMP Sn, Sm */ 4976436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov UInt sN = dregNo(i->ARM64in.VCmpS.argL); 4977436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov UInt sM = dregNo(i->ARM64in.VCmpS.argR); 4978436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov *p++ = X_3_8_5_6_5_5(X000, X11110001, sM, X001000, sN, X00000); 4979436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov goto done; 4980436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 4981436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64in_FPCR: { 4982436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov Bool toFPCR = i->ARM64in.FPCR.toFPCR; 4983436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov UInt iReg = iregNo(i->ARM64in.FPCR.iReg); 4984436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if (toFPCR) { 4985436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* 0xD51B44 000 Rt MSR fpcr, rT */ 4986436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov *p++ = 0xD51B4400 | (iReg & 0x1F); 4987436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov goto done; 4988436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 4989436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov goto bad; // FPCR -> iReg case currently ATC 4990436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 4991436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64in_VBinV: { 4992436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* 31 23 20 15 9 4 4993eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov 010 01110 11 1 m 100001 n d ADD Vd.2d, Vn.2d, Vm.2d 4994eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov 010 01110 10 1 m 100001 n d ADD Vd.4s, Vn.4s, Vm.4s 4995eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov 010 01110 01 1 m 100001 n d ADD Vd.8h, Vn.8h, Vm.8h 4996eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov 010 01110 00 1 m 100001 n d ADD Vd.16b, Vn.16b, Vm.16b 4997436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 4998eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov 011 01110 11 1 m 100001 n d SUB Vd.2d, Vn.2d, Vm.2d 4999eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov 011 01110 10 1 m 100001 n d SUB Vd.4s, Vn.4s, Vm.4s 5000eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov 011 01110 01 1 m 100001 n d SUB Vd.8h, Vn.8h, Vm.8h 5001eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov 011 01110 00 1 m 100001 n d SUB Vd.16b, Vn.16b, Vm.16b 5002436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 5003eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov 010 01110 10 1 m 100111 n d MUL Vd.4s, Vn.4s, Vm.4s 5004eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov 010 01110 01 1 m 100111 n d MUL Vd.8h, Vn.8h, Vm.8h 5005eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov 010 01110 00 1 m 100111 n d MUL Vd.16b, Vn.16b, Vm.16b 5006436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 5007436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 010 01110 01 1 m 110101 n d FADD Vd.2d, Vn.2d, Vm.2d 5008436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 010 01110 00 1 m 110101 n d FADD Vd.4s, Vn.4s, Vm.4s 5009436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 010 01110 11 1 m 110101 n d FSUB Vd.2d, Vn.2d, Vm.2d 5010436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 010 01110 10 1 m 110101 n d FSUB Vd.4s, Vn.4s, Vm.4s 5011436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 5012436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 011 01110 01 1 m 110111 n d FMUL Vd.2d, Vn.2d, Vm.2d 5013436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 011 01110 00 1 m 110111 n d FMUL Vd.4s, Vn.4s, Vm.4s 5014436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 011 01110 01 1 m 111111 n d FDIV Vd.2d, Vn.2d, Vm.2d 5015436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 011 01110 00 1 m 111111 n d FDIV Vd.4s, Vn.4s, Vm.4s 5016436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 5017436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 011 01110 10 1 m 011001 n d UMAX Vd.4s, Vn.4s, Vm.4s 5018436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 011 01110 01 1 m 011001 n d UMAX Vd.8h, Vn.8h, Vm.8h 5019436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 011 01110 00 1 m 011001 n d UMAX Vd.16b, Vn.16b, Vm.16b 5020436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 5021436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 011 01110 10 1 m 011011 n d UMIN Vd.4s, Vn.4s, Vm.4s 5022436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 011 01110 01 1 m 011011 n d UMIN Vd.8h, Vn.8h, Vm.8h 5023436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 011 01110 00 1 m 011011 n d UMIN Vd.16b, Vn.16b, Vm.16b 5024436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 5025436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 010 01110 10 1 m 011001 n d SMAX Vd.4s, Vn.4s, Vm.4s 5026436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 010 01110 01 1 m 011001 n d SMAX Vd.8h, Vn.8h, Vm.8h 5027436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 010 01110 00 1 m 011001 n d SMAX Vd.16b, Vn.16b, Vm.16b 5028436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 5029436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 010 01110 10 1 m 011011 n d SMIN Vd.4s, Vn.4s, Vm.4s 5030436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 010 01110 01 1 m 011011 n d SMIN Vd.8h, Vn.8h, Vm.8h 5031436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 010 01110 00 1 m 011011 n d SMIN Vd.16b, Vn.16b, Vm.16b 5032436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 5033436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 010 01110 00 1 m 000111 n d AND Vd, Vn, Vm 5034436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 010 01110 10 1 m 000111 n d ORR Vd, Vn, Vm 5035436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 011 01110 00 1 m 000111 n d EOR Vd, Vn, Vm 5036436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 50372ca80a6a6fc069acdb73186e8e578dbf8f46af80Dmitriy Ivanov 011 01110 11 1 m 100011 n d CMEQ Vd.2d, Vn.2d, Vm.2d 50382ca80a6a6fc069acdb73186e8e578dbf8f46af80Dmitriy Ivanov 011 01110 10 1 m 100011 n d CMEQ Vd.4s, Vn.4s, Vm.4s 50392ca80a6a6fc069acdb73186e8e578dbf8f46af80Dmitriy Ivanov 011 01110 01 1 m 100011 n d CMEQ Vd.8h, Vn.8h, Vm.8h 50402ca80a6a6fc069acdb73186e8e578dbf8f46af80Dmitriy Ivanov 011 01110 00 1 m 100011 n d CMEQ Vd.16b, Vn.16b, Vm.16b 50412ca80a6a6fc069acdb73186e8e578dbf8f46af80Dmitriy Ivanov 5042eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov 011 01110 11 1 m 001101 n d CMHI Vd.2d, Vn.2d, Vm.2d 5043eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov 011 01110 10 1 m 001101 n d CMHI Vd.4s, Vn.4s, Vm.4s 5044eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov 011 01110 01 1 m 001101 n d CMHI Vd.8h, Vn.8h, Vm.8h 5045eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov 011 01110 00 1 m 001101 n d CMHI Vd.16b, Vn.16b, Vm.16b 5046eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov 5047eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov 010 01110 11 1 m 001101 n d CMGT Vd.2d, Vn.2d, Vm.2d 5048eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov 010 01110 10 1 m 001101 n d CMGT Vd.4s, Vn.4s, Vm.4s 5049eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov 010 01110 01 1 m 001101 n d CMGT Vd.8h, Vn.8h, Vm.8h 5050eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov 010 01110 00 1 m 001101 n d CMGT Vd.16b, Vn.16b, Vm.16b 5051eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov 5052eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov 010 01110 01 1 m 111001 n d FCMEQ Vd.2d, Vn.2d, Vm.2d 5053eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov 010 01110 00 1 m 111001 n d FCMEQ Vd.4s, Vn.4s, Vm.4s 5054eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov 5055eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov 011 01110 01 1 m 111001 n d FCMGE Vd.2d, Vn.2d, Vm.2d 5056eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov 011 01110 00 1 m 111001 n d FCMGE Vd.4s, Vn.4s, Vm.4s 5057eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov 5058eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov 011 01110 11 1 m 111001 n d FCMGT Vd.2d, Vn.2d, Vm.2d 5059eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov 011 01110 10 1 m 111001 n d FCMGT Vd.4s, Vn.4s, Vm.4s 5060eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov 5061eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov 010 01110 00 0 m 000000 n d TBL Vd.16b, {Vn.16b}, Vm.16b 5062eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov 5063436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov */ 5064436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov UInt vD = qregNo(i->ARM64in.VBinV.dst); 50650a8046eb0993fb7e155b03cc5ef3323fca3467c0Dmitriy Ivanov ARM64VecBinOp op = i->ARM64in.VBinV.op; 50660a8046eb0993fb7e155b03cc5ef3323fca3467c0Dmitriy Ivanov Bool isV128 = (op != ARM64vecb_UMULL8x8 50670a8046eb0993fb7e155b03cc5ef3323fca3467c0Dmitriy Ivanov && op != ARM64vecb_UMULL16x4 50680a8046eb0993fb7e155b03cc5ef3323fca3467c0Dmitriy Ivanov && op != ARM64vecb_UMULL32x2); 50690a8046eb0993fb7e155b03cc5ef3323fca3467c0Dmitriy Ivanov UInt vN = isV128 ? qregNo(i->ARM64in.VBinV.argL) 50700a8046eb0993fb7e155b03cc5ef3323fca3467c0Dmitriy Ivanov : dregNo(i->ARM64in.VBinV.argL); 50710a8046eb0993fb7e155b03cc5ef3323fca3467c0Dmitriy Ivanov UInt vM = isV128 ? qregNo(i->ARM64in.VBinV.argR) 50720a8046eb0993fb7e155b03cc5ef3323fca3467c0Dmitriy Ivanov : dregNo(i->ARM64in.VBinV.argR); 5073436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov switch (i->ARM64in.VBinV.op) { 5074436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64vecb_ADD64x2: 5075436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov *p++ = X_3_8_5_6_5_5(X010, X01110111, vM, X100001, vN, vD); 5076436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov break; 5077436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64vecb_ADD32x4: 5078436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov *p++ = X_3_8_5_6_5_5(X010, X01110101, vM, X100001, vN, vD); 5079436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov break; 5080436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64vecb_ADD16x8: 5081436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov *p++ = X_3_8_5_6_5_5(X010, X01110011, vM, X100001, vN, vD); 5082436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov break; 5083eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov case ARM64vecb_ADD8x16: 5084eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov *p++ = X_3_8_5_6_5_5(X010, X01110001, vM, X100001, vN, vD); 5085eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov break; 5086436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64vecb_SUB64x2: 5087436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov *p++ = X_3_8_5_6_5_5(X011, X01110111, vM, X100001, vN, vD); 5088436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov break; 5089436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64vecb_SUB32x4: 5090436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov *p++ = X_3_8_5_6_5_5(X011, X01110101, vM, X100001, vN, vD); 5091436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov break; 5092436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64vecb_SUB16x8: 5093436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov *p++ = X_3_8_5_6_5_5(X011, X01110011, vM, X100001, vN, vD); 5094436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov break; 5095eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov case ARM64vecb_SUB8x16: 5096eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov *p++ = X_3_8_5_6_5_5(X011, X01110001, vM, X100001, vN, vD); 5097eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov break; 5098436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64vecb_MUL32x4: 5099436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov *p++ = X_3_8_5_6_5_5(X010, X01110101, vM, X100111, vN, vD); 5100436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov break; 5101436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64vecb_MUL16x8: 5102436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov *p++ = X_3_8_5_6_5_5(X010, X01110011, vM, X100111, vN, vD); 5103436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov break; 5104eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov case ARM64vecb_MUL8x16: 5105eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov *p++ = X_3_8_5_6_5_5(X010, X01110001, vM, X100111, vN, vD); 5106eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov break; 5107436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64vecb_FADD64x2: 5108436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov *p++ = X_3_8_5_6_5_5(X010, X01110011, vM, X110101, vN, vD); 5109436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov break; 5110436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64vecb_FADD32x4: 5111436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov *p++ = X_3_8_5_6_5_5(X010, X01110001, vM, X110101, vN, vD); 5112436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov break; 5113436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64vecb_FSUB64x2: 5114436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov *p++ = X_3_8_5_6_5_5(X010, X01110111, vM, X110101, vN, vD); 5115436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov break; 5116436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64vecb_FSUB32x4: 5117436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov *p++ = X_3_8_5_6_5_5(X010, X01110101, vM, X110101, vN, vD); 5118436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov break; 5119436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64vecb_FMUL64x2: 5120436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov *p++ = X_3_8_5_6_5_5(X011, X01110011, vM, X110111, vN, vD); 5121436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov break; 5122436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64vecb_FMUL32x4: 5123436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov *p++ = X_3_8_5_6_5_5(X011, X01110001, vM, X110111, vN, vD); 5124436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov break; 5125436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64vecb_FDIV64x2: 5126436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov *p++ = X_3_8_5_6_5_5(X011, X01110011, vM, X111111, vN, vD); 5127436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov break; 5128436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64vecb_FDIV32x4: 5129436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov *p++ = X_3_8_5_6_5_5(X011, X01110001, vM, X111111, vN, vD); 5130436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov break; 5131436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 5132436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64vecb_UMAX32x4: 5133436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov *p++ = X_3_8_5_6_5_5(X011, X01110101, vM, X011001, vN, vD); 5134436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov break; 5135436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64vecb_UMAX16x8: 5136436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov *p++ = X_3_8_5_6_5_5(X011, X01110011, vM, X011001, vN, vD); 5137436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov break; 5138436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64vecb_UMAX8x16: 5139436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov *p++ = X_3_8_5_6_5_5(X011, X01110001, vM, X011001, vN, vD); 5140436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov break; 5141436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 5142436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64vecb_UMIN32x4: 5143436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov *p++ = X_3_8_5_6_5_5(X011, X01110101, vM, X011011, vN, vD); 5144436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov break; 5145436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64vecb_UMIN16x8: 5146436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov *p++ = X_3_8_5_6_5_5(X011, X01110011, vM, X011011, vN, vD); 5147436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov break; 5148436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64vecb_UMIN8x16: 5149436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov *p++ = X_3_8_5_6_5_5(X011, X01110001, vM, X011011, vN, vD); 5150436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov break; 5151436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 51520a8046eb0993fb7e155b03cc5ef3323fca3467c0Dmitriy Ivanov case ARM64vecb_UMULL32x2: 51530a8046eb0993fb7e155b03cc5ef3323fca3467c0Dmitriy Ivanov *p++ = X_3_8_5_6_5_5(X001, X01110101, vM, X110000, vN, vD); 51540a8046eb0993fb7e155b03cc5ef3323fca3467c0Dmitriy Ivanov break; 51550a8046eb0993fb7e155b03cc5ef3323fca3467c0Dmitriy Ivanov case ARM64vecb_UMULL16x4: 51560a8046eb0993fb7e155b03cc5ef3323fca3467c0Dmitriy Ivanov *p++ = X_3_8_5_6_5_5(X001, X01110011, vM, X110000, vN, vD); 51570a8046eb0993fb7e155b03cc5ef3323fca3467c0Dmitriy Ivanov break; 51580a8046eb0993fb7e155b03cc5ef3323fca3467c0Dmitriy Ivanov case ARM64vecb_UMULL8x8: 51590a8046eb0993fb7e155b03cc5ef3323fca3467c0Dmitriy Ivanov *p++ = X_3_8_5_6_5_5(X001, X01110001, vM, X110000, vN, vD); 51600a8046eb0993fb7e155b03cc5ef3323fca3467c0Dmitriy Ivanov break; 51610a8046eb0993fb7e155b03cc5ef3323fca3467c0Dmitriy Ivanov 5162436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64vecb_SMAX32x4: 5163436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov *p++ = X_3_8_5_6_5_5(X010, X01110101, vM, X011001, vN, vD); 5164436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov break; 5165436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64vecb_SMAX16x8: 5166436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov *p++ = X_3_8_5_6_5_5(X010, X01110011, vM, X011001, vN, vD); 5167436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov break; 5168436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64vecb_SMAX8x16: 5169436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov *p++ = X_3_8_5_6_5_5(X010, X01110001, vM, X011001, vN, vD); 5170436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov break; 5171436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 5172436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64vecb_SMIN32x4: 5173436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov *p++ = X_3_8_5_6_5_5(X010, X01110101, vM, X011011, vN, vD); 5174436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov break; 5175436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64vecb_SMIN16x8: 5176436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov *p++ = X_3_8_5_6_5_5(X010, X01110011, vM, X011011, vN, vD); 5177436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov break; 5178436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64vecb_SMIN8x16: 5179436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov *p++ = X_3_8_5_6_5_5(X010, X01110001, vM, X011011, vN, vD); 5180436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov break; 5181436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 5182436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64vecb_AND: 5183436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov *p++ = X_3_8_5_6_5_5(X010, X01110001, vM, X000111, vN, vD); 5184436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov break; 5185436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64vecb_ORR: 5186436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov *p++ = X_3_8_5_6_5_5(X010, X01110101, vM, X000111, vN, vD); 5187436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov break; 5188436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64vecb_XOR: 5189436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov *p++ = X_3_8_5_6_5_5(X011, X01110001, vM, X000111, vN, vD); 5190436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov break; 5191436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 5192436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64vecb_CMEQ64x2: 5193436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov *p++ = X_3_8_5_6_5_5(X011, X01110111, vM, X100011, vN, vD); 5194436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov break; 51952ca80a6a6fc069acdb73186e8e578dbf8f46af80Dmitriy Ivanov case ARM64vecb_CMEQ32x4: 51962ca80a6a6fc069acdb73186e8e578dbf8f46af80Dmitriy Ivanov *p++ = X_3_8_5_6_5_5(X011, X01110101, vM, X100011, vN, vD); 51972ca80a6a6fc069acdb73186e8e578dbf8f46af80Dmitriy Ivanov break; 51982ca80a6a6fc069acdb73186e8e578dbf8f46af80Dmitriy Ivanov case ARM64vecb_CMEQ16x8: 51992ca80a6a6fc069acdb73186e8e578dbf8f46af80Dmitriy Ivanov *p++ = X_3_8_5_6_5_5(X011, X01110011, vM, X100011, vN, vD); 52002ca80a6a6fc069acdb73186e8e578dbf8f46af80Dmitriy Ivanov break; 52012ca80a6a6fc069acdb73186e8e578dbf8f46af80Dmitriy Ivanov case ARM64vecb_CMEQ8x16: 52022ca80a6a6fc069acdb73186e8e578dbf8f46af80Dmitriy Ivanov *p++ = X_3_8_5_6_5_5(X011, X01110001, vM, X100011, vN, vD); 52032ca80a6a6fc069acdb73186e8e578dbf8f46af80Dmitriy Ivanov break; 5204436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 5205eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov case ARM64vecb_CMHI64x2: 5206eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov *p++ = X_3_8_5_6_5_5(X011, X01110111, vM, X001101, vN, vD); 5207eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov break; 5208eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov case ARM64vecb_CMHI32x4: 5209eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov *p++ = X_3_8_5_6_5_5(X011, X01110101, vM, X001101, vN, vD); 5210eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov break; 5211eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov case ARM64vecb_CMHI16x8: 5212eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov *p++ = X_3_8_5_6_5_5(X011, X01110011, vM, X001101, vN, vD); 5213eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov break; 5214eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov case ARM64vecb_CMHI8x16: 5215eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov *p++ = X_3_8_5_6_5_5(X011, X01110001, vM, X001101, vN, vD); 5216eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov break; 5217eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov 5218eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov case ARM64vecb_CMGT64x2: 5219eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov *p++ = X_3_8_5_6_5_5(X010, X01110111, vM, X001101, vN, vD); 5220eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov break; 5221eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov case ARM64vecb_CMGT32x4: 5222eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov *p++ = X_3_8_5_6_5_5(X010, X01110101, vM, X001101, vN, vD); 5223eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov break; 5224eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov case ARM64vecb_CMGT16x8: 5225eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov *p++ = X_3_8_5_6_5_5(X010, X01110011, vM, X001101, vN, vD); 5226eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov break; 5227eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov case ARM64vecb_CMGT8x16: 5228eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov *p++ = X_3_8_5_6_5_5(X010, X01110001, vM, X001101, vN, vD); 5229eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov break; 5230eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov 5231eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov case ARM64vecb_FCMEQ64x2: 5232eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov *p++ = X_3_8_5_6_5_5(X010, X01110011, vM, X111001, vN, vD); 5233eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov break; 5234eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov case ARM64vecb_FCMEQ32x4: 5235eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov *p++ = X_3_8_5_6_5_5(X010, X01110001, vM, X111001, vN, vD); 5236eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov break; 5237eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov 5238eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov case ARM64vecb_FCMGE64x2: 5239eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov *p++ = X_3_8_5_6_5_5(X011, X01110011, vM, X111001, vN, vD); 5240eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov break; 5241eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov case ARM64vecb_FCMGE32x4: 5242eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov *p++ = X_3_8_5_6_5_5(X011, X01110001, vM, X111001, vN, vD); 5243eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov break; 5244eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov 5245eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov case ARM64vecb_FCMGT64x2: 5246eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov *p++ = X_3_8_5_6_5_5(X011, X01110111, vM, X111001, vN, vD); 5247eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov break; 5248eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov case ARM64vecb_FCMGT32x4: 5249eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov *p++ = X_3_8_5_6_5_5(X011, X01110101, vM, X111001, vN, vD); 5250eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov break; 5251eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov 5252eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov case ARM64vecb_TBL1: 5253eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov *p++ = X_3_8_5_6_5_5(X010, X01110000, vM, X000000, vN, vD); 5254eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov break; 5255eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov 5256436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov default: 5257436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov goto bad; 5258436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 5259436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov goto done; 5260436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 5261436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64in_VUnaryV: { 5262436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* 31 23 20 15 9 4 5263436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 010 01110 11 1 00000 111110 n d FABS Vd.2d, Vn.2d 5264436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 010 01110 10 1 00000 111110 n d FABS Vd.4s, Vn.4s 5265436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 011 01110 11 1 00000 111110 n d FNEG Vd.2d, Vn.2d 5266436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 011 01110 10 1 00000 111110 n d FNEG Vd.4s, Vn.4s 52676d9b01c06e645ea0b0a3544e968961aaa7bc6a66Dmitriy Ivanov 010 01110 00 1 00000 010110 n d CNT Vd.16b, Vn.16b 5268436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 011 01110 00 1 00000 010110 n d NOT Vd.16b, Vn.16b 5269051d3b5d6376aa10a65793c3c2267d6ab233b896Dmitriy Ivanov 5270051d3b5d6376aa10a65793c3c2267d6ab233b896Dmitriy Ivanov 011 01110 00 1 10000 001110 n d UADDLV Hd, Vn.16b 5271051d3b5d6376aa10a65793c3c2267d6ab233b896Dmitriy Ivanov 011 01110 01 1 10000 001110 n d UADDLV Sd, Vn.8h 5272051d3b5d6376aa10a65793c3c2267d6ab233b896Dmitriy Ivanov 011 01110 10 1 10000 001110 n d UADDLV Dd, Vn.4s 5273051d3b5d6376aa10a65793c3c2267d6ab233b896Dmitriy Ivanov 5274051d3b5d6376aa10a65793c3c2267d6ab233b896Dmitriy Ivanov 010 01110 00 1 10000 001110 n d SADDLV Hd, Vn.16b 5275051d3b5d6376aa10a65793c3c2267d6ab233b896Dmitriy Ivanov 010 01110 01 1 10000 001110 n d SADDLV Sd, Vn.8h 5276051d3b5d6376aa10a65793c3c2267d6ab233b896Dmitriy Ivanov 010 01110 10 1 10000 001110 n d SADDLV Dd, Vn.4s 5277436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov */ 52780a8046eb0993fb7e155b03cc5ef3323fca3467c0Dmitriy Ivanov ARM64VecUnaryOp op = i->ARM64in.VUnaryV.op; 5279436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov UInt vD = qregNo(i->ARM64in.VUnaryV.dst); 52800a8046eb0993fb7e155b03cc5ef3323fca3467c0Dmitriy Ivanov Bool isV128 = !(op >= ARM64vecu_VMOVL8U && op <= ARM64vecu_VMOVL32S); 52810a8046eb0993fb7e155b03cc5ef3323fca3467c0Dmitriy Ivanov UInt vN = isV128 ? qregNo(i->ARM64in.VUnaryV.arg) 52820a8046eb0993fb7e155b03cc5ef3323fca3467c0Dmitriy Ivanov : dregNo(i->ARM64in.VUnaryV.arg); 5283436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov switch (i->ARM64in.VUnaryV.op) { 5284436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64vecu_FABS64x2: 5285436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov *p++ = X_3_8_5_6_5_5(X010, X01110111, X00000, X111110, vN, vD); 5286436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov break; 5287eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov case ARM64vecu_FABS32x4: 5288eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov *p++ = X_3_8_5_6_5_5(X010, X01110101, X00000, X111110, vN, vD); 5289eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov break; 5290436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64vecu_FNEG64x2: 5291436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov *p++ = X_3_8_5_6_5_5(X011, X01110111, X00000, X111110, vN, vD); 5292436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov break; 5293eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov case ARM64vecu_FNEG32x4: 5294eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov *p++ = X_3_8_5_6_5_5(X011, X01110101, X00000, X111110, vN, vD); 5295eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov break; 52960a8046eb0993fb7e155b03cc5ef3323fca3467c0Dmitriy Ivanov case ARM64vecu_VMOVL8U: 52970a8046eb0993fb7e155b03cc5ef3323fca3467c0Dmitriy Ivanov *p++ = X_9_1_6_4_6_1_1_4(X111100111, vD >> 4, X001000, vD & 0xFU, X101000, vN >> 4, 1, vN & 0xFU); 52980a8046eb0993fb7e155b03cc5ef3323fca3467c0Dmitriy Ivanov break; 52990a8046eb0993fb7e155b03cc5ef3323fca3467c0Dmitriy Ivanov case ARM64vecu_VMOVL16U: 53000a8046eb0993fb7e155b03cc5ef3323fca3467c0Dmitriy Ivanov *p++ = X_9_1_6_4_6_1_1_4(X111100111, vD >> 4, X010000, vD & 0xFU, X101000, vN >> 4, 1, vN & 0xFU); 53010a8046eb0993fb7e155b03cc5ef3323fca3467c0Dmitriy Ivanov break; 53020a8046eb0993fb7e155b03cc5ef3323fca3467c0Dmitriy Ivanov case ARM64vecu_VMOVL32U: 53030a8046eb0993fb7e155b03cc5ef3323fca3467c0Dmitriy Ivanov *p++ = X_9_1_6_4_6_1_1_4(X111100111, vD >> 4, X100000, vD & 0xFU, X101000, vN >> 4, 1, vN & 0xFU); 53040a8046eb0993fb7e155b03cc5ef3323fca3467c0Dmitriy Ivanov break; 53050a8046eb0993fb7e155b03cc5ef3323fca3467c0Dmitriy Ivanov case ARM64vecu_VMOVL8S: 53060a8046eb0993fb7e155b03cc5ef3323fca3467c0Dmitriy Ivanov *p++ = X_9_1_6_4_6_1_1_4(X111100101, vD >> 4, X001000, vD & 0xFU, X101000, vN >> 4, 1, vN & 0xFU); 53070a8046eb0993fb7e155b03cc5ef3323fca3467c0Dmitriy Ivanov break; 53080a8046eb0993fb7e155b03cc5ef3323fca3467c0Dmitriy Ivanov case ARM64vecu_VMOVL16S: 53090a8046eb0993fb7e155b03cc5ef3323fca3467c0Dmitriy Ivanov *p++ = X_9_1_6_4_6_1_1_4(X111100101, vD >> 4, X010000, vD & 0xFU, X101000, vN >> 4, 1, vN & 0xFU); 53100a8046eb0993fb7e155b03cc5ef3323fca3467c0Dmitriy Ivanov break; 53110a8046eb0993fb7e155b03cc5ef3323fca3467c0Dmitriy Ivanov case ARM64vecu_VMOVL32S: 53120a8046eb0993fb7e155b03cc5ef3323fca3467c0Dmitriy Ivanov *p++ = X_9_1_6_4_6_1_1_4(X111100101, vD >> 4, X100000, vD & 0xFU, X101000, vN >> 4, 1, vN & 0xFU); 53130a8046eb0993fb7e155b03cc5ef3323fca3467c0Dmitriy Ivanov break; 5314436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64vecu_NOT: 5315436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov *p++ = X_3_8_5_6_5_5(X011, X01110001, X00000, X010110, vN, vD); 5316436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov break; 53176d9b01c06e645ea0b0a3544e968961aaa7bc6a66Dmitriy Ivanov case ARM64vecu_CNT: 53186d9b01c06e645ea0b0a3544e968961aaa7bc6a66Dmitriy Ivanov *p++ = X_3_8_5_6_5_5(X010, X01110001, X00000, X010110, vN, vD); 53196d9b01c06e645ea0b0a3544e968961aaa7bc6a66Dmitriy Ivanov break; 5320051d3b5d6376aa10a65793c3c2267d6ab233b896Dmitriy Ivanov case ARM64vecu_UADDLV8x16: 5321051d3b5d6376aa10a65793c3c2267d6ab233b896Dmitriy Ivanov *p++ = X_3_8_5_6_5_5(X011, X01110001, X10000, X001110, vN, vD); 5322051d3b5d6376aa10a65793c3c2267d6ab233b896Dmitriy Ivanov break; 5323051d3b5d6376aa10a65793c3c2267d6ab233b896Dmitriy Ivanov case ARM64vecu_UADDLV16x8: 5324051d3b5d6376aa10a65793c3c2267d6ab233b896Dmitriy Ivanov *p++ = X_3_8_5_6_5_5(X011, X01110011, X10000, X001110, vN, vD); 5325051d3b5d6376aa10a65793c3c2267d6ab233b896Dmitriy Ivanov break; 5326051d3b5d6376aa10a65793c3c2267d6ab233b896Dmitriy Ivanov case ARM64vecu_UADDLV32x4: 5327051d3b5d6376aa10a65793c3c2267d6ab233b896Dmitriy Ivanov *p++ = X_3_8_5_6_5_5(X011, X01110101, X10000, X001110, vN, vD); 5328051d3b5d6376aa10a65793c3c2267d6ab233b896Dmitriy Ivanov break; 5329051d3b5d6376aa10a65793c3c2267d6ab233b896Dmitriy Ivanov case ARM64vecu_SADDLV8x16: 5330051d3b5d6376aa10a65793c3c2267d6ab233b896Dmitriy Ivanov *p++ = X_3_8_5_6_5_5(X010, X01110001, X10000, X001110, vN, vD); 5331051d3b5d6376aa10a65793c3c2267d6ab233b896Dmitriy Ivanov break; 5332051d3b5d6376aa10a65793c3c2267d6ab233b896Dmitriy Ivanov case ARM64vecu_SADDLV16x8: 5333051d3b5d6376aa10a65793c3c2267d6ab233b896Dmitriy Ivanov *p++ = X_3_8_5_6_5_5(X010, X01110011, X10000, X001110, vN, vD); 5334051d3b5d6376aa10a65793c3c2267d6ab233b896Dmitriy Ivanov break; 5335051d3b5d6376aa10a65793c3c2267d6ab233b896Dmitriy Ivanov case ARM64vecu_SADDLV32x4: 5336051d3b5d6376aa10a65793c3c2267d6ab233b896Dmitriy Ivanov *p++ = X_3_8_5_6_5_5(X010, X01110101, X10000, X001110, vN, vD); 5337051d3b5d6376aa10a65793c3c2267d6ab233b896Dmitriy Ivanov break; 5338436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov default: 5339436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov goto bad; 5340436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 5341436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov goto done; 5342436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 5343436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64in_VNarrowV: { 5344436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* 31 23 21 15 9 4 5345436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 000 01110 00 1,00001 001010 n d XTN Vd.8b, Vn.8h 5346436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 000 01110 01 1,00001 001010 n d XTN Vd.4h, Vn.4s 5347436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 000 01110 10 1,00001 001010 n d XTN Vd.2s, Vn.2d 5348436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov */ 5349436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov UInt vD = qregNo(i->ARM64in.VNarrowV.dst); 5350436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov UInt vN = qregNo(i->ARM64in.VNarrowV.src); 5351436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov UInt dszBlg2 = i->ARM64in.VNarrowV.dszBlg2; 5352436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(dszBlg2 >= 0 && dszBlg2 <= 2); 5353436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov *p++ = X_3_8_5_6_5_5(X000, X01110001 | (dszBlg2 << 1), 5354436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov X00001, X001010, vN, vD); 5355436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov goto done; 5356436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 5357436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64in_VShiftImmV: { 5358436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* 5359436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 0q1 011110 immh immb 000001 n d USHR Vd.T, Vn.T, #sh 5360436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 0q0 011110 immh immb 000001 n d SSHR Vd.T, Vn.T, #sh 5361436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov where immh:immb 5362436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov = case T of 5363436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 2d | sh in 1..63 -> let xxxxxx = 64-sh in 1xxx:xxx 5364436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 4s | sh in 1..31 -> let xxxxx = 32-sh in 01xx:xxx 5365436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 8h | sh in 1..15 -> let xxxx = 16-sh in 001x:xxx 5366436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 16b | sh in 1..7 -> let xxx = 8-sh in 0001:xxx 5367436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 5368436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 0q0 011110 immh immb 010101 n d SHL Vd.T, Vn.T, #sh 5369436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov where immh:immb 5370436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov = case T of 5371436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 2d | sh in 1..63 -> let xxxxxx = sh in 1xxx:xxx 5372436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 4s | sh in 1..31 -> let xxxxx = sh in 01xx:xxx 5373436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 8h | sh in 1..15 -> let xxxx = sh in 001x:xxx 5374436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 16b | sh in 1..7 -> let xxx = sh in 0001:xxx 5375436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov */ 5376436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov UInt vD = qregNo(i->ARM64in.VShiftImmV.dst); 5377436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov UInt vN = qregNo(i->ARM64in.VShiftImmV.src); 5378436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov UInt sh = i->ARM64in.VShiftImmV.amt; 5379436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ARM64VecShiftOp op = i->ARM64in.VShiftImmV.op; 5380436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov Bool syned = False; 5381436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov switch (op) { 5382eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov /* 64x2 cases */ 5383436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64vecsh_SSHR64x2: syned = True; 5384436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64vecsh_USHR64x2: /* fallthrough */ 5385436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if (sh >= 1 && sh <= 63) { 5386436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov UInt xxxxxx = 64-sh; 5387436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov *p++ = X_3_6_7_6_5_5(syned ? X010 : X011, X011110, 5388436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov X1000000 | xxxxxx, X000001, vN, vD); 5389436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov goto done; 5390436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 5391436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov break; 5392eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov case ARM64vecsh_SHL64x2: 5393eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov if (sh >= 1 && sh <= 63) { 5394eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov UInt xxxxxx = sh; 5395eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov *p++ = X_3_6_7_6_5_5(X010, X011110, 5396eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov X1000000 | xxxxxx, X010101, vN, vD); 5397eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov goto done; 5398eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov } 5399eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov break; 5400eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov /* 32x4 cases */ 5401eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov case ARM64vecsh_SSHR32x4: syned = True; 5402eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov case ARM64vecsh_USHR32x4: /* fallthrough */ 5403eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov if (sh >= 1 && sh <= 31) { 5404eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov UInt xxxxx = 32-sh; 5405eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov *p++ = X_3_6_7_6_5_5(syned ? X010 : X011, X011110, 5406eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov X0100000 | xxxxx, X000001, vN, vD); 5407eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov goto done; 5408eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov } 5409eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov break; 5410436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64vecsh_SHL32x4: 5411436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if (sh >= 1 && sh <= 31) { 5412436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov UInt xxxxx = sh; 5413436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov *p++ = X_3_6_7_6_5_5(X010, X011110, 5414436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov X0100000 | xxxxx, X010101, vN, vD); 5415436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov goto done; 5416436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 5417436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov break; 5418eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov /* 16x8 cases */ 5419eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov case ARM64vecsh_SSHR16x8: syned = True; 54202ca80a6a6fc069acdb73186e8e578dbf8f46af80Dmitriy Ivanov case ARM64vecsh_USHR16x8: /* fallthrough */ 54212ca80a6a6fc069acdb73186e8e578dbf8f46af80Dmitriy Ivanov if (sh >= 1 && sh <= 15) { 54222ca80a6a6fc069acdb73186e8e578dbf8f46af80Dmitriy Ivanov UInt xxxx = 16-sh; 54232ca80a6a6fc069acdb73186e8e578dbf8f46af80Dmitriy Ivanov *p++ = X_3_6_7_6_5_5(syned ? X010 : X011, X011110, 54242ca80a6a6fc069acdb73186e8e578dbf8f46af80Dmitriy Ivanov X0010000 | xxxx, X000001, vN, vD); 54252ca80a6a6fc069acdb73186e8e578dbf8f46af80Dmitriy Ivanov goto done; 54262ca80a6a6fc069acdb73186e8e578dbf8f46af80Dmitriy Ivanov } 54272ca80a6a6fc069acdb73186e8e578dbf8f46af80Dmitriy Ivanov break; 5428eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov case ARM64vecsh_SHL16x8: 5429eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov if (sh >= 1 && sh <= 15) { 5430eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov UInt xxxx = sh; 5431eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov *p++ = X_3_6_7_6_5_5(X010, X011110, 5432eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov X0010000 | xxxx, X010101, vN, vD); 5433eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov goto done; 5434eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov } 5435eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov break; 5436eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov 5437eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov 5438eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov /* 8x16 cases */ 5439eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov case ARM64vecsh_SSHR8x16: syned = True; 5440eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov case ARM64vecsh_USHR8x16: /* fallthrough */ 5441eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov if (sh >= 1 && sh <= 7) { 5442eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov UInt xxx = 8-sh; 5443eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov *p++ = X_3_6_7_6_5_5(syned ? X010 : X011, X011110, 5444eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov X0001000 | xxx, X000001, vN, vD); 5445eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov goto done; 5446eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov } 5447eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov break; 5448eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov case ARM64vecsh_SHL8x16: 5449eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov if (sh >= 1 && sh <= 7) { 5450eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov UInt xxx = sh; 5451eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov *p++ = X_3_6_7_6_5_5(X010, X011110, 5452eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov X0001000 | xxx, X010101, vN, vD); 5453eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov goto done; 5454eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov } 5455eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov break; 5456eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov 5457436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov default: 5458436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov break; 5459436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 5460436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov goto bad; 5461436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 5462436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMin_VAluS: { 5463436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ UInt dN = fregNo(i->ARMin.VAluS.argL); 5464436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ UInt dD = fregNo(i->ARMin.VAluS.dst); 5465436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ UInt dM = fregNo(i->ARMin.VAluS.argR); 5466436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ UInt bN = dN & 1; 5467436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ UInt bD = dD & 1; 5468436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ UInt bM = dM & 1; 5469436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ UInt pqrs = X1111; /* undefined */ 5470436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ switch (i->ARMin.VAluS.op) { 5471436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMvfp_ADD: pqrs = X0110; break; 5472436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMvfp_SUB: pqrs = X0111; break; 5473436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMvfp_MUL: pqrs = X0100; break; 5474436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMvfp_DIV: pqrs = X1000; break; 5475436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ default: goto bad; 5476436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ } 5477436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ vassert(pqrs != X1111); 5478436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ UInt bP = (pqrs >> 3) & 1; 5479436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ UInt bQ = (pqrs >> 2) & 1; 5480436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ UInt bR = (pqrs >> 1) & 1; 5481436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ UInt bS = (pqrs >> 0) & 1; 5482436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ UInt insn = XXXXXXXX(0xE, X1110, BITS4(bP,bD,bQ,bR), 5483436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ (dN >> 1), (dD >> 1), 5484436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ X1010, BITS4(bN,bS,bM,0), (dM >> 1)); 5485436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ *p++ = insn; 5486436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ goto done; 5487436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ } 5488436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMin_VUnaryS: { 5489436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ UInt fD = fregNo(i->ARMin.VUnaryS.dst); 5490436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ UInt fM = fregNo(i->ARMin.VUnaryS.src); 5491436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ UInt insn = 0; 5492436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ switch (i->ARMin.VUnaryS.op) { 5493436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMvfpu_COPY: 5494436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ insn = XXXXXXXX(0xE, X1110, BITS4(1,(fD & 1),1,1), X0000, 5495436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ (fD >> 1), X1010, BITS4(0,1,(fM & 1),0), 5496436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ (fM >> 1)); 5497436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ break; 5498436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMvfpu_ABS: 5499436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ insn = XXXXXXXX(0xE, X1110, BITS4(1,(fD & 1),1,1), X0000, 5500436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ (fD >> 1), X1010, BITS4(1,1,(fM & 1),0), 5501436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ (fM >> 1)); 5502436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ break; 5503436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMvfpu_NEG: 5504436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ insn = XXXXXXXX(0xE, X1110, BITS4(1,(fD & 1),1,1), X0001, 5505436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ (fD >> 1), X1010, BITS4(0,1,(fM & 1),0), 5506436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ (fM >> 1)); 5507436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ break; 5508436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMvfpu_SQRT: 5509436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ insn = XXXXXXXX(0xE, X1110, BITS4(1,(fD & 1),1,1), X0001, 5510436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ (fD >> 1), X1010, BITS4(1,1,(fM & 1),0), 5511436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ (fM >> 1)); 5512436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ break; 5513436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ default: 5514436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ goto bad; 5515436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ } 5516436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ *p++ = insn; 5517436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ goto done; 5518436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ } 5519436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMin_VCMovD: { 5520436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ UInt cc = (UInt)i->ARMin.VCMovD.cond; 5521436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ UInt dD = dregNo(i->ARMin.VCMovD.dst); 5522436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ UInt dM = dregNo(i->ARMin.VCMovD.src); 5523436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ vassert(cc < 16 && cc != ARMcc_AL); 5524436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ UInt insn = XXXXXXXX(cc, X1110,X1011,X0000,dD,X1011,X0100,dM); 5525436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ *p++ = insn; 5526436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ goto done; 5527436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ } 5528436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMin_VCMovS: { 5529436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ UInt cc = (UInt)i->ARMin.VCMovS.cond; 5530436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ UInt fD = fregNo(i->ARMin.VCMovS.dst); 5531436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ UInt fM = fregNo(i->ARMin.VCMovS.src); 5532436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ vassert(cc < 16 && cc != ARMcc_AL); 5533436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ UInt insn = XXXXXXXX(cc, X1110, BITS4(1,(fD & 1),1,1), 5534436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ X0000,(fD >> 1),X1010, 5535436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ BITS4(0,1,(fM & 1),0), (fM >> 1)); 5536436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ *p++ = insn; 5537436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ goto done; 5538436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ } 5539436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMin_VXferD: { 5540436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ UInt dD = dregNo(i->ARMin.VXferD.dD); 5541436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ UInt rHi = iregNo(i->ARMin.VXferD.rHi); 5542436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ UInt rLo = iregNo(i->ARMin.VXferD.rLo); 5543436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ /* vmov dD, rLo, rHi is 5544436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ E C 4 rHi rLo B (0,0,dD[4],1) dD[3:0] 5545436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ vmov rLo, rHi, dD is 5546436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ E C 5 rHi rLo B (0,0,dD[4],1) dD[3:0] 5547436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ */ 5548436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ UInt insn 5549436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ = XXXXXXXX(0xE, 0xC, i->ARMin.VXferD.toD ? 4 : 5, 5550436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ rHi, rLo, 0xB, 5551436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ BITS4(0,0, ((dD >> 4) & 1), 1), (dD & 0xF)); 5552436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ *p++ = insn; 5553436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ goto done; 5554436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ } 5555436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMin_VXferS: { 5556436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ UInt fD = fregNo(i->ARMin.VXferS.fD); 5557436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ UInt rLo = iregNo(i->ARMin.VXferS.rLo); 5558436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ /* vmov fD, rLo is 5559436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ E E 0 fD[4:1] rLo A (fD[0],0,0,1) 0 5560436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ vmov rLo, fD is 5561436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ E E 1 fD[4:1] rLo A (fD[0],0,0,1) 0 5562436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ */ 5563436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ UInt insn 5564436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ = XXXXXXXX(0xE, 0xE, i->ARMin.VXferS.toS ? 0 : 1, 5565436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ (fD >> 1) & 0xF, rLo, 0xA, 5566436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ BITS4((fD & 1),0,0,1), 0); 5567436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ *p++ = insn; 5568436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ goto done; 5569436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ } 5570436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMin_VCvtID: { 5571436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ Bool iToD = i->ARMin.VCvtID.iToD; 5572436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ Bool syned = i->ARMin.VCvtID.syned; 5573436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ if (iToD && syned) { 5574436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ // FSITOD: I32S-in-freg to F64-in-dreg 5575436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ UInt regF = fregNo(i->ARMin.VCvtID.src); 5576436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ UInt regD = dregNo(i->ARMin.VCvtID.dst); 5577436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ UInt insn = XXXXXXXX(0xE, X1110, X1011, X1000, regD, 5578436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ X1011, BITS4(1,1,(regF & 1),0), 5579436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ (regF >> 1) & 0xF); 5580436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ *p++ = insn; 5581436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ goto done; 5582436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ } 5583436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ if (iToD && (!syned)) { 5584436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ // FUITOD: I32U-in-freg to F64-in-dreg 5585436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ UInt regF = fregNo(i->ARMin.VCvtID.src); 5586436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ UInt regD = dregNo(i->ARMin.VCvtID.dst); 5587436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ UInt insn = XXXXXXXX(0xE, X1110, X1011, X1000, regD, 5588436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ X1011, BITS4(0,1,(regF & 1),0), 5589436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ (regF >> 1) & 0xF); 5590436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ *p++ = insn; 5591436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ goto done; 5592436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ } 5593436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ if ((!iToD) && syned) { 5594436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ // FTOSID: F64-in-dreg to I32S-in-freg 5595436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ UInt regD = dregNo(i->ARMin.VCvtID.src); 5596436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ UInt regF = fregNo(i->ARMin.VCvtID.dst); 5597436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ UInt insn = XXXXXXXX(0xE, X1110, BITS4(1,(regF & 1),1,1), 5598436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ X1101, (regF >> 1) & 0xF, 5599436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ X1011, X0100, regD); 5600436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ *p++ = insn; 5601436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ goto done; 5602436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ } 5603436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ if ((!iToD) && (!syned)) { 5604436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ // FTOUID: F64-in-dreg to I32U-in-freg 5605436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ UInt regD = dregNo(i->ARMin.VCvtID.src); 5606436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ UInt regF = fregNo(i->ARMin.VCvtID.dst); 5607436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ UInt insn = XXXXXXXX(0xE, X1110, BITS4(1,(regF & 1),1,1), 5608436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ X1100, (regF >> 1) & 0xF, 5609436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ X1011, X0100, regD); 5610436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ *p++ = insn; 5611436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ goto done; 5612436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ } 5613436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ /*UNREACHED*/ 5614436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ vassert(0); 5615436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ } 5616436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMin_NLdStD: { 5617436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ UInt regD = dregNo(i->ARMin.NLdStD.dD); 5618436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ UInt regN, regM; 5619436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ UInt D = regD >> 4; 5620436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ UInt bL = i->ARMin.NLdStD.isLoad ? 1 : 0; 5621436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ UInt insn; 5622436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ vassert(hregClass(i->ARMin.NLdStD.dD) == HRcFlt64); 5623436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ regD &= 0xF; 5624436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ if (i->ARMin.NLdStD.amode->tag == ARMamN_RR) { 5625436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ regN = iregNo(i->ARMin.NLdStD.amode->ARMamN.RR.rN); 5626436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ regM = iregNo(i->ARMin.NLdStD.amode->ARMamN.RR.rM); 5627436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ } else { 5628436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ regN = iregNo(i->ARMin.NLdStD.amode->ARMamN.R.rN); 5629436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ regM = 15; 5630436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ } 5631436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ insn = XXXXXXXX(0xF, X0100, BITS4(0, D, bL, 0), 5632436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ regN, regD, X0111, X1000, regM); 5633436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ *p++ = insn; 5634436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ goto done; 5635436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ } 5636436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMin_NUnaryS: { 5637436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ UInt Q = i->ARMin.NUnaryS.Q ? 1 : 0; 5638436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ UInt regD, D; 5639436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ UInt regM, M; 5640436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ UInt size = i->ARMin.NUnaryS.size; 5641436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ UInt insn; 5642436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ UInt opc, opc1, opc2; 5643436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ switch (i->ARMin.NUnaryS.op) { 5644436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_VDUP: 5645436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ if (i->ARMin.NUnaryS.size >= 16) 5646436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ goto bad; 5647436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ if (i->ARMin.NUnaryS.dst->tag != ARMNRS_Reg) 5648436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ goto bad; 5649436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ if (i->ARMin.NUnaryS.src->tag != ARMNRS_Scalar) 5650436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ goto bad; 5651436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ regD = (hregClass(i->ARMin.NUnaryS.dst->reg) == HRcVec128) 5652436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ ? (qregNo(i->ARMin.NUnaryS.dst->reg) << 1) 5653436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ : dregNo(i->ARMin.NUnaryS.dst->reg); 5654436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ regM = (hregClass(i->ARMin.NUnaryS.src->reg) == HRcVec128) 5655436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ ? (qregNo(i->ARMin.NUnaryS.src->reg) << 1) 5656436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ : dregNo(i->ARMin.NUnaryS.src->reg); 5657436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ D = regD >> 4; 5658436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ M = regM >> 4; 5659436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ regD &= 0xf; 5660436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ regM &= 0xf; 5661436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ insn = XXXXXXXX(0xF, X0011, BITS4(1,D,1,1), 5662436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ (i->ARMin.NUnaryS.size & 0xf), regD, 5663436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ X1100, BITS4(0,Q,M,0), regM); 5664436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ *p++ = insn; 5665436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ goto done; 5666436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_SETELEM: 5667436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ regD = Q ? (qregNo(i->ARMin.NUnaryS.dst->reg) << 1) : 5668436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ dregNo(i->ARMin.NUnaryS.dst->reg); 5669436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ regM = iregNo(i->ARMin.NUnaryS.src->reg); 5670436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ M = regM >> 4; 5671436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ D = regD >> 4; 5672436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ regM &= 0xF; 5673436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ regD &= 0xF; 5674436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ if (i->ARMin.NUnaryS.dst->tag != ARMNRS_Scalar) 5675436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ goto bad; 5676436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ switch (size) { 5677436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case 0: 5678436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ if (i->ARMin.NUnaryS.dst->index > 7) 5679436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ goto bad; 5680436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ opc = X1000 | i->ARMin.NUnaryS.dst->index; 5681436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ break; 5682436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case 1: 5683436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ if (i->ARMin.NUnaryS.dst->index > 3) 5684436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ goto bad; 5685436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ opc = X0001 | (i->ARMin.NUnaryS.dst->index << 1); 5686436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ break; 5687436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case 2: 5688436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ if (i->ARMin.NUnaryS.dst->index > 1) 5689436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ goto bad; 5690436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ opc = X0000 | (i->ARMin.NUnaryS.dst->index << 2); 5691436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ break; 5692436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ default: 5693436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ goto bad; 5694436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ } 5695436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ opc1 = (opc >> 2) & 3; 5696436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ opc2 = opc & 3; 5697436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ insn = XXXXXXXX(0xE, X1110, BITS4(0,(opc1 >> 1),(opc1 & 1),0), 5698436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ regD, regM, X1011, 5699436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ BITS4(D,(opc2 >> 1),(opc2 & 1),1), X0000); 5700436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ *p++ = insn; 5701436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ goto done; 5702436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_GETELEMU: 5703436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ regM = Q ? (qregNo(i->ARMin.NUnaryS.src->reg) << 1) : 5704436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ dregNo(i->ARMin.NUnaryS.src->reg); 5705436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ regD = iregNo(i->ARMin.NUnaryS.dst->reg); 5706436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ M = regM >> 4; 5707436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ D = regD >> 4; 5708436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ regM &= 0xF; 5709436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ regD &= 0xF; 5710436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ if (i->ARMin.NUnaryS.src->tag != ARMNRS_Scalar) 5711436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ goto bad; 5712436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ switch (size) { 5713436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case 0: 5714436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ if (Q && i->ARMin.NUnaryS.src->index > 7) { 5715436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ regM++; 5716436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ i->ARMin.NUnaryS.src->index -= 8; 5717436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ } 5718436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ if (i->ARMin.NUnaryS.src->index > 7) 5719436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ goto bad; 5720436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ opc = X1000 | i->ARMin.NUnaryS.src->index; 5721436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ break; 5722436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case 1: 5723436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ if (Q && i->ARMin.NUnaryS.src->index > 3) { 5724436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ regM++; 5725436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ i->ARMin.NUnaryS.src->index -= 4; 5726436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ } 5727436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ if (i->ARMin.NUnaryS.src->index > 3) 5728436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ goto bad; 5729436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ opc = X0001 | (i->ARMin.NUnaryS.src->index << 1); 5730436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ break; 5731436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case 2: 5732436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ goto bad; 5733436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ default: 5734436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ goto bad; 5735436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ } 5736436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ opc1 = (opc >> 2) & 3; 5737436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ opc2 = opc & 3; 5738436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ insn = XXXXXXXX(0xE, X1110, BITS4(1,(opc1 >> 1),(opc1 & 1),1), 5739436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ regM, regD, X1011, 5740436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ BITS4(M,(opc2 >> 1),(opc2 & 1),1), X0000); 5741436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ *p++ = insn; 5742436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ goto done; 5743436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_GETELEMS: 5744436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ regM = Q ? (qregNo(i->ARMin.NUnaryS.src->reg) << 1) : 5745436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ dregNo(i->ARMin.NUnaryS.src->reg); 5746436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ regD = iregNo(i->ARMin.NUnaryS.dst->reg); 5747436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ M = regM >> 4; 5748436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ D = regD >> 4; 5749436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ regM &= 0xF; 5750436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ regD &= 0xF; 5751436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ if (i->ARMin.NUnaryS.src->tag != ARMNRS_Scalar) 5752436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ goto bad; 5753436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ switch (size) { 5754436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case 0: 5755436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ if (Q && i->ARMin.NUnaryS.src->index > 7) { 5756436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ regM++; 5757436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ i->ARMin.NUnaryS.src->index -= 8; 5758436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ } 5759436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ if (i->ARMin.NUnaryS.src->index > 7) 5760436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ goto bad; 5761436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ opc = X1000 | i->ARMin.NUnaryS.src->index; 5762436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ break; 5763436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case 1: 5764436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ if (Q && i->ARMin.NUnaryS.src->index > 3) { 5765436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ regM++; 5766436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ i->ARMin.NUnaryS.src->index -= 4; 5767436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ } 5768436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ if (i->ARMin.NUnaryS.src->index > 3) 5769436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ goto bad; 5770436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ opc = X0001 | (i->ARMin.NUnaryS.src->index << 1); 5771436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ break; 5772436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case 2: 5773436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ if (Q && i->ARMin.NUnaryS.src->index > 1) { 5774436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ regM++; 5775436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ i->ARMin.NUnaryS.src->index -= 2; 5776436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ } 5777436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ if (i->ARMin.NUnaryS.src->index > 1) 5778436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ goto bad; 5779436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ opc = X0000 | (i->ARMin.NUnaryS.src->index << 2); 5780436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ break; 5781436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ default: 5782436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ goto bad; 5783436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ } 5784436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ opc1 = (opc >> 2) & 3; 5785436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ opc2 = opc & 3; 5786436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ insn = XXXXXXXX(0xE, X1110, BITS4(0,(opc1 >> 1),(opc1 & 1),1), 5787436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ regM, regD, X1011, 5788436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ BITS4(M,(opc2 >> 1),(opc2 & 1),1), X0000); 5789436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ *p++ = insn; 5790436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ goto done; 5791436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ default: 5792436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ goto bad; 5793436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ } 5794436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ } 5795436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMin_NUnary: { 5796436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ UInt Q = i->ARMin.NUnary.Q ? 1 : 0; 5797436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ UInt regD = (hregClass(i->ARMin.NUnary.dst) == HRcVec128) 5798436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ ? (qregNo(i->ARMin.NUnary.dst) << 1) 5799436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ : dregNo(i->ARMin.NUnary.dst); 5800436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ UInt regM, M; 5801436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ UInt D = regD >> 4; 5802436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ UInt sz1 = i->ARMin.NUnary.size >> 1; 5803436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ UInt sz2 = i->ARMin.NUnary.size & 1; 5804436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ UInt sz = i->ARMin.NUnary.size; 5805436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ UInt insn; 5806436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ UInt F = 0; /* TODO: floating point EQZ ??? */ 5807436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ if (i->ARMin.NUnary.op != ARMneon_DUP) { 5808436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ regM = (hregClass(i->ARMin.NUnary.src) == HRcVec128) 5809436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ ? (qregNo(i->ARMin.NUnary.src) << 1) 5810436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ : dregNo(i->ARMin.NUnary.src); 5811436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ M = regM >> 4; 5812436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ } else { 5813436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ regM = iregNo(i->ARMin.NUnary.src); 5814436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ M = regM >> 4; 5815436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ } 5816436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ regD &= 0xF; 5817436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ regM &= 0xF; 5818436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ switch (i->ARMin.NUnary.op) { 5819436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_COPY: /* VMOV reg, reg */ 5820436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ insn = XXXXXXXX(0xF, X0010, BITS4(0,D,1,0), regM, regD, X0001, 5821436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ BITS4(M,Q,M,1), regM); 5822436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ break; 5823436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_COPYN: /* VMOVN regD, regQ */ 5824436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ insn = XXXXXXXX(0xF, X0011, BITS4(1,D,1,1), BITS4(sz1,sz2,1,0), 5825436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ regD, X0010, BITS4(0,0,M,0), regM); 5826436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ break; 5827436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_COPYQNSS: /* VQMOVN regD, regQ */ 5828436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ insn = XXXXXXXX(0xF, X0011, BITS4(1,D,1,1), BITS4(sz1,sz2,1,0), 5829436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ regD, X0010, BITS4(1,0,M,0), regM); 5830436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ break; 5831436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_COPYQNUS: /* VQMOVUN regD, regQ */ 5832436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ insn = XXXXXXXX(0xF, X0011, BITS4(1,D,1,1), BITS4(sz1,sz2,1,0), 5833436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ regD, X0010, BITS4(0,1,M,0), regM); 5834436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ break; 5835436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_COPYQNUU: /* VQMOVN regD, regQ */ 5836436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ insn = XXXXXXXX(0xF, X0011, BITS4(1,D,1,1), BITS4(sz1,sz2,1,0), 5837436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ regD, X0010, BITS4(1,1,M,0), regM); 5838436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ break; 5839436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_COPYLS: /* VMOVL regQ, regD */ 5840436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ if (sz >= 3) 5841436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ goto bad; 5842436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ insn = XXXXXXXX(0xF, X0010, 5843436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ BITS4(1,D,(sz == 2) ? 1 : 0,(sz == 1) ? 1 : 0), 5844436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ BITS4((sz == 0) ? 1 : 0,0,0,0), 5845436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ regD, X1010, BITS4(0,0,M,1), regM); 5846436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ break; 5847436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_COPYLU: /* VMOVL regQ, regD */ 5848436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ if (sz >= 3) 5849436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ goto bad; 5850436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ insn = XXXXXXXX(0xF, X0011, 5851436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ BITS4(1,D,(sz == 2) ? 1 : 0,(sz == 1) ? 1 : 0), 5852436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ BITS4((sz == 0) ? 1 : 0,0,0,0), 5853436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ regD, X1010, BITS4(0,0,M,1), regM); 5854436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ break; 5855436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_NOT: /* VMVN reg, reg*/ 5856436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ insn = XXXXXXXX(0xF, X0011, BITS4(1,D,1,1), X0000, regD, X0101, 5857436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ BITS4(1,Q,M,0), regM); 5858436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ break; 5859436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_EQZ: 5860436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ insn = XXXXXXXX(0xF, X0011, BITS4(1,D,1,1), BITS4(sz1,sz2,0,1), 5861436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ regD, BITS4(0,F,0,1), BITS4(0,Q,M,0), regM); 5862436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ break; 5863436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_CNT: 5864436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ insn = XXXXXXXX(0xF, X0011, BITS4(1,D,1,1), X0000, regD, X0101, 5865436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ BITS4(0,Q,M,0), regM); 5866436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ break; 5867436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_CLZ: 5868436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ insn = XXXXXXXX(0xF, X0011, BITS4(1,D,1,1), BITS4(sz1,sz2,0,0), 5869436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ regD, X0100, BITS4(1,Q,M,0), regM); 5870436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ break; 5871436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_CLS: 5872436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ insn = XXXXXXXX(0xF, X0011, BITS4(1,D,1,1), BITS4(sz1,sz2,0,0), 5873436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ regD, X0100, BITS4(0,Q,M,0), regM); 5874436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ break; 5875436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_ABS: 5876436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ insn = XXXXXXXX(0xF, X0011, BITS4(1,D,1,1), BITS4(sz1,sz2,0,1), 5877436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ regD, X0011, BITS4(0,Q,M,0), regM); 5878436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ break; 5879436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_DUP: 5880436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ sz1 = i->ARMin.NUnary.size == 0 ? 1 : 0; 5881436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ sz2 = i->ARMin.NUnary.size == 1 ? 1 : 0; 5882436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ vassert(sz1 + sz2 < 2); 5883436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ insn = XXXXXXXX(0xE, X1110, BITS4(1, sz1, Q, 0), regD, regM, 5884436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ X1011, BITS4(D,0,sz2,1), X0000); 5885436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ break; 5886436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_REV16: 5887436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ insn = XXXXXXXX(0xF, X0011, BITS4(1,D,1,1), BITS4(sz1,sz2,0,0), 5888436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ regD, BITS4(0,0,0,1), BITS4(0,Q,M,0), regM); 5889436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ break; 5890436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_REV32: 5891436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ insn = XXXXXXXX(0xF, X0011, BITS4(1,D,1,1), BITS4(sz1,sz2,0,0), 5892436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ regD, BITS4(0,0,0,0), BITS4(1,Q,M,0), regM); 5893436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ break; 5894436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_REV64: 5895436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ insn = XXXXXXXX(0xF, X0011, BITS4(1,D,1,1), BITS4(sz1,sz2,0,0), 5896436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ regD, BITS4(0,0,0,0), BITS4(0,Q,M,0), regM); 5897436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ break; 5898436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_PADDLU: 5899436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ insn = XXXXXXXX(0xF, X0011, BITS4(1,D,1,1), BITS4(sz1,sz2,0,0), 5900436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ regD, X0010, BITS4(1,Q,M,0), regM); 5901436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ break; 5902436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_PADDLS: 5903436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ insn = XXXXXXXX(0xF, X0011, BITS4(1,D,1,1), BITS4(sz1,sz2,0,0), 5904436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ regD, X0010, BITS4(0,Q,M,0), regM); 5905436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ break; 5906436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_VQSHLNUU: 5907436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ insn = XXXXXXXX(0xF, X0011, 5908436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ (1 << 3) | (D << 2) | ((sz >> 4) & 3), 5909436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ sz & 0xf, regD, X0111, 5910436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ BITS4(sz >> 6,Q,M,1), regM); 5911436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ break; 5912436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_VQSHLNSS: 5913436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ insn = XXXXXXXX(0xF, X0010, 5914436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ (1 << 3) | (D << 2) | ((sz >> 4) & 3), 5915436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ sz & 0xf, regD, X0111, 5916436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ BITS4(sz >> 6,Q,M,1), regM); 5917436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ break; 5918436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_VQSHLNUS: 5919436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ insn = XXXXXXXX(0xF, X0011, 5920436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ (1 << 3) | (D << 2) | ((sz >> 4) & 3), 5921436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ sz & 0xf, regD, X0110, 5922436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ BITS4(sz >> 6,Q,M,1), regM); 5923436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ break; 5924436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_VCVTFtoS: 5925436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ insn = XXXXXXXX(0xF, X0011, BITS4(1,D,1,1), X1011, regD, X0111, 5926436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ BITS4(0,Q,M,0), regM); 5927436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ break; 5928436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_VCVTFtoU: 5929436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ insn = XXXXXXXX(0xF, X0011, BITS4(1,D,1,1), X1011, regD, X0111, 5930436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ BITS4(1,Q,M,0), regM); 5931436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ break; 5932436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_VCVTStoF: 5933436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ insn = XXXXXXXX(0xF, X0011, BITS4(1,D,1,1), X1011, regD, X0110, 5934436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ BITS4(0,Q,M,0), regM); 5935436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ break; 5936436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_VCVTUtoF: 5937436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ insn = XXXXXXXX(0xF, X0011, BITS4(1,D,1,1), X1011, regD, X0110, 5938436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ BITS4(1,Q,M,0), regM); 5939436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ break; 5940436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_VCVTFtoFixedU: 5941436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ sz1 = (sz >> 5) & 1; 5942436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ sz2 = (sz >> 4) & 1; 5943436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ sz &= 0xf; 5944436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ insn = XXXXXXXX(0xF, X0011, 5945436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ BITS4(1,D,sz1,sz2), sz, regD, X1111, 5946436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ BITS4(0,Q,M,1), regM); 5947436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ break; 5948436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_VCVTFtoFixedS: 5949436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ sz1 = (sz >> 5) & 1; 5950436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ sz2 = (sz >> 4) & 1; 5951436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ sz &= 0xf; 5952436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ insn = XXXXXXXX(0xF, X0010, 5953436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ BITS4(1,D,sz1,sz2), sz, regD, X1111, 5954436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ BITS4(0,Q,M,1), regM); 5955436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ break; 5956436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_VCVTFixedUtoF: 5957436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ sz1 = (sz >> 5) & 1; 5958436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ sz2 = (sz >> 4) & 1; 5959436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ sz &= 0xf; 5960436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ insn = XXXXXXXX(0xF, X0011, 5961436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ BITS4(1,D,sz1,sz2), sz, regD, X1110, 5962436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ BITS4(0,Q,M,1), regM); 5963436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ break; 5964436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_VCVTFixedStoF: 5965436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ sz1 = (sz >> 5) & 1; 5966436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ sz2 = (sz >> 4) & 1; 5967436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ sz &= 0xf; 5968436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ insn = XXXXXXXX(0xF, X0010, 5969436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ BITS4(1,D,sz1,sz2), sz, regD, X1110, 5970436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ BITS4(0,Q,M,1), regM); 5971436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ break; 5972436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_VCVTF32toF16: 5973436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ insn = XXXXXXXX(0xF, X0011, BITS4(1,D,1,1), X0110, regD, X0110, 5974436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ BITS4(0,0,M,0), regM); 5975436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ break; 5976436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_VCVTF16toF32: 5977436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ insn = XXXXXXXX(0xF, X0011, BITS4(1,D,1,1), X0110, regD, X0111, 5978436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ BITS4(0,0,M,0), regM); 5979436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ break; 5980436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_VRECIP: 5981436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ insn = XXXXXXXX(0xF, X0011, BITS4(1,D,1,1), X1011, regD, X0100, 5982436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ BITS4(0,Q,M,0), regM); 5983436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ break; 5984436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_VRECIPF: 5985436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ insn = XXXXXXXX(0xF, X0011, BITS4(1,D,1,1), X1011, regD, X0101, 5986436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ BITS4(0,Q,M,0), regM); 5987436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ break; 5988436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_VABSFP: 5989436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ insn = XXXXXXXX(0xF, X0011, BITS4(1,D,1,1), X1001, regD, X0111, 5990436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ BITS4(0,Q,M,0), regM); 5991436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ break; 5992436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_VRSQRTEFP: 5993436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ insn = XXXXXXXX(0xF, X0011, BITS4(1,D,1,1), X1011, regD, X0101, 5994436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ BITS4(1,Q,M,0), regM); 5995436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ break; 5996436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_VRSQRTE: 5997436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ insn = XXXXXXXX(0xF, X0011, BITS4(1,D,1,1), X1011, regD, X0100, 5998436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ BITS4(1,Q,M,0), regM); 5999436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ break; 6000436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_VNEGF: 6001436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ insn = XXXXXXXX(0xF, X0011, BITS4(1,D,1,1), X1001, regD, X0111, 6002436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ BITS4(1,Q,M,0), regM); 6003436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ break; 6004436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ 6005436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ default: 6006436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ goto bad; 6007436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ } 6008436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ *p++ = insn; 6009436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ goto done; 6010436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ } 6011436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMin_NDual: { 6012436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ UInt Q = i->ARMin.NDual.Q ? 1 : 0; 6013436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ UInt regD = (hregClass(i->ARMin.NDual.arg1) == HRcVec128) 6014436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ ? (qregNo(i->ARMin.NDual.arg1) << 1) 6015436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ : dregNo(i->ARMin.NDual.arg1); 6016436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ UInt regM = (hregClass(i->ARMin.NDual.arg2) == HRcVec128) 6017436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ ? (qregNo(i->ARMin.NDual.arg2) << 1) 6018436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ : dregNo(i->ARMin.NDual.arg2); 6019436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ UInt D = regD >> 4; 6020436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ UInt M = regM >> 4; 6021436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ UInt sz1 = i->ARMin.NDual.size >> 1; 6022436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ UInt sz2 = i->ARMin.NDual.size & 1; 6023436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ UInt insn; 6024436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ regD &= 0xF; 6025436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ regM &= 0xF; 6026436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ switch (i->ARMin.NDual.op) { 6027436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_TRN: /* VTRN reg, reg */ 6028436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ insn = XXXXXXXX(0xF, X0011, BITS4(1,D,1,1), BITS4(sz1,sz2,1,0), 6029436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ regD, X0000, BITS4(1,Q,M,0), regM); 6030436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ break; 6031436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_ZIP: /* VZIP reg, reg */ 6032436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ insn = XXXXXXXX(0xF, X0011, BITS4(1,D,1,1), BITS4(sz1,sz2,1,0), 6033436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ regD, X0001, BITS4(1,Q,M,0), regM); 6034436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ break; 6035436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_UZP: /* VUZP reg, reg */ 6036436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ insn = XXXXXXXX(0xF, X0011, BITS4(1,D,1,1), BITS4(sz1,sz2,1,0), 6037436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ regD, X0001, BITS4(0,Q,M,0), regM); 6038436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ break; 6039436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ default: 6040436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ goto bad; 6041436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ } 6042436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ *p++ = insn; 6043436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ goto done; 6044436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ } 6045436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMin_NBinary: { 6046436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ UInt Q = i->ARMin.NBinary.Q ? 1 : 0; 6047436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ UInt regD = (hregClass(i->ARMin.NBinary.dst) == HRcVec128) 6048436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ ? (qregNo(i->ARMin.NBinary.dst) << 1) 6049436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ : dregNo(i->ARMin.NBinary.dst); 6050436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ UInt regN = (hregClass(i->ARMin.NBinary.argL) == HRcVec128) 6051436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ ? (qregNo(i->ARMin.NBinary.argL) << 1) 6052436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ : dregNo(i->ARMin.NBinary.argL); 6053436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ UInt regM = (hregClass(i->ARMin.NBinary.argR) == HRcVec128) 6054436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ ? (qregNo(i->ARMin.NBinary.argR) << 1) 6055436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ : dregNo(i->ARMin.NBinary.argR); 6056436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ UInt sz1 = i->ARMin.NBinary.size >> 1; 6057436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ UInt sz2 = i->ARMin.NBinary.size & 1; 6058436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ UInt D = regD >> 4; 6059436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ UInt N = regN >> 4; 6060436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ UInt M = regM >> 4; 6061436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ UInt insn; 6062436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ regD &= 0xF; 6063436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ regM &= 0xF; 6064436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ regN &= 0xF; 6065436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ switch (i->ARMin.NBinary.op) { 6066436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_VAND: /* VAND reg, reg, reg */ 6067436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ insn = XXXXXXXX(0xF, X0010, BITS4(0,D,0,0), regN, regD, X0001, 6068436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ BITS4(N,Q,M,1), regM); 6069436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ break; 6070436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_VORR: /* VORR reg, reg, reg*/ 6071436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ insn = XXXXXXXX(0xF, X0010, BITS4(0,D,1,0), regN, regD, X0001, 6072436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ BITS4(N,Q,M,1), regM); 6073436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ break; 6074436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_VXOR: /* VEOR reg, reg, reg */ 6075436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ insn = XXXXXXXX(0xF, X0011, BITS4(0,D,0,0), regN, regD, X0001, 6076436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ BITS4(N,Q,M,1), regM); 6077436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ break; 6078436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_VADD: /* VADD reg, reg, reg */ 6079436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ insn = XXXXXXXX(0xF, X0010, BITS4(0,D,sz1,sz2), regN, regD, 6080436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ X1000, BITS4(N,Q,M,0), regM); 6081436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ break; 6082436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_VSUB: /* VSUB reg, reg, reg */ 6083436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ insn = XXXXXXXX(0xF, X0011, BITS4(0,D,sz1,sz2), regN, regD, 6084436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ X1000, BITS4(N,Q,M,0), regM); 6085436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ break; 6086436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_VMINU: /* VMIN.Uxx reg, reg, reg */ 6087436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ insn = XXXXXXXX(0xF, X0011, BITS4(0,D,sz1,sz2), regN, regD, 6088436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ X0110, BITS4(N,Q,M,1), regM); 6089436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ break; 6090436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_VMINS: /* VMIN.Sxx reg, reg, reg */ 6091436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ insn = XXXXXXXX(0xF, X0010, BITS4(0,D,sz1,sz2), regN, regD, 6092436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ X0110, BITS4(N,Q,M,1), regM); 6093436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ break; 6094436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_VMAXU: /* VMAX.Uxx reg, reg, reg */ 6095436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ insn = XXXXXXXX(0xF, X0011, BITS4(0,D,sz1,sz2), regN, regD, 6096436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ X0110, BITS4(N,Q,M,0), regM); 6097436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ break; 6098436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_VMAXS: /* VMAX.Sxx reg, reg, reg */ 6099436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ insn = XXXXXXXX(0xF, X0010, BITS4(0,D,sz1,sz2), regN, regD, 6100436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ X0110, BITS4(N,Q,M,0), regM); 6101436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ break; 6102436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_VRHADDS: /* VRHADD.Sxx reg, reg, reg */ 6103436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ insn = XXXXXXXX(0xF, X0010, BITS4(0,D,sz1,sz2), regN, regD, 6104436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ X0001, BITS4(N,Q,M,0), regM); 6105436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ break; 6106436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_VRHADDU: /* VRHADD.Uxx reg, reg, reg */ 6107436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ insn = XXXXXXXX(0xF, X0011, BITS4(0,D,sz1,sz2), regN, regD, 6108436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ X0001, BITS4(N,Q,M,0), regM); 6109436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ break; 6110436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_VQADDU: /* VQADD unsigned reg, reg, reg */ 6111436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ insn = XXXXXXXX(0xF, X0011, BITS4(0,D,sz1,sz2), regN, regD, 6112436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ X0000, BITS4(N,Q,M,1), regM); 6113436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ break; 6114436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_VQADDS: /* VQADD signed reg, reg, reg */ 6115436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ insn = XXXXXXXX(0xF, X0010, BITS4(0,D,sz1,sz2), regN, regD, 6116436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ X0000, BITS4(N,Q,M,1), regM); 6117436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ break; 6118436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_VQSUBU: /* VQSUB unsigned reg, reg, reg */ 6119436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ insn = XXXXXXXX(0xF, X0011, BITS4(0,D,sz1,sz2), regN, regD, 6120436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ X0010, BITS4(N,Q,M,1), regM); 6121436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ break; 6122436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_VQSUBS: /* VQSUB signed reg, reg, reg */ 6123436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ insn = XXXXXXXX(0xF, X0010, BITS4(0,D,sz1,sz2), regN, regD, 6124436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ X0010, BITS4(N,Q,M,1), regM); 6125436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ break; 6126436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_VCGTU: /* VCGT unsigned reg, reg, reg */ 6127436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ insn = XXXXXXXX(0xF, X0011, BITS4(0,D,sz1,sz2), regN, regD, 6128436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ X0011, BITS4(N,Q,M,0), regM); 6129436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ break; 6130436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_VCGTS: /* VCGT signed reg, reg, reg */ 6131436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ insn = XXXXXXXX(0xF, X0010, BITS4(0,D,sz1,sz2), regN, regD, 6132436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ X0011, BITS4(N,Q,M,0), regM); 6133436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ break; 6134436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_VCGEU: /* VCGE unsigned reg, reg, reg */ 6135436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ insn = XXXXXXXX(0xF, X0011, BITS4(0,D,sz1,sz2), regN, regD, 6136436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ X0011, BITS4(N,Q,M,1), regM); 6137436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ break; 6138436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_VCGES: /* VCGE signed reg, reg, reg */ 6139436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ insn = XXXXXXXX(0xF, X0010, BITS4(0,D,sz1,sz2), regN, regD, 6140436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ X0011, BITS4(N,Q,M,1), regM); 6141436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ break; 6142436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_VCEQ: /* VCEQ reg, reg, reg */ 6143436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ insn = XXXXXXXX(0xF, X0011, BITS4(0,D,sz1,sz2), regN, regD, 6144436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ X1000, BITS4(N,Q,M,1), regM); 6145436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ break; 6146436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_VEXT: /* VEXT.8 reg, reg, #imm4*/ 6147436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ if (i->ARMin.NBinary.size >= 16) 6148436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ goto bad; 6149436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ insn = XXXXXXXX(0xF, X0010, BITS4(1,D,1,1), regN, regD, 6150436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ i->ARMin.NBinary.size & 0xf, BITS4(N,Q,M,0), 6151436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ regM); 6152436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ break; 6153436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_VMUL: 6154436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ insn = XXXXXXXX(0xF, X0010, BITS4(0,D,sz1,sz2), regN, regD, 6155436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ X1001, BITS4(N,Q,M,1), regM); 6156436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ break; 6157436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_VMULLU: 6158436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ insn = XXXXXXXX(0xF, X0011, BITS4(1,D,sz1,sz2), regN, regD, 6159436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ X1100, BITS4(N,0,M,0), regM); 6160436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ break; 6161436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_VMULLS: 6162436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ insn = XXXXXXXX(0xF, X0010, BITS4(1,D,sz1,sz2), regN, regD, 6163436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ X1100, BITS4(N,0,M,0), regM); 6164436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ break; 6165436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_VMULP: 6166436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ insn = XXXXXXXX(0xF, X0011, BITS4(0,D,sz1,sz2), regN, regD, 6167436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ X1001, BITS4(N,Q,M,1), regM); 6168436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ break; 6169436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_VMULFP: 6170436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ insn = XXXXXXXX(0xF, X0011, BITS4(0,D,0,0), regN, regD, 6171436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ X1101, BITS4(N,Q,M,1), regM); 6172436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ break; 6173436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_VMULLP: 6174436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ insn = XXXXXXXX(0xF, X0010, BITS4(1,D,sz1,sz2), regN, regD, 6175436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ X1110, BITS4(N,0,M,0), regM); 6176436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ break; 6177436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_VQDMULH: 6178436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ insn = XXXXXXXX(0xF, X0010, BITS4(0,D,sz1,sz2), regN, regD, 6179436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ X1011, BITS4(N,Q,M,0), regM); 6180436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ break; 6181436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_VQRDMULH: 6182436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ insn = XXXXXXXX(0xF, X0011, BITS4(0,D,sz1,sz2), regN, regD, 6183436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ X1011, BITS4(N,Q,M,0), regM); 6184436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ break; 6185436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_VQDMULL: 6186436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ insn = XXXXXXXX(0xF, X0010, BITS4(1,D,sz1,sz2), regN, regD, 6187436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ X1101, BITS4(N,0,M,0), regM); 6188436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ break; 6189436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_VTBL: 6190436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ insn = XXXXXXXX(0xF, X0011, BITS4(1,D,1,1), regN, regD, 6191436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ X1000, BITS4(N,0,M,0), regM); 6192436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ break; 6193436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_VPADD: 6194436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ insn = XXXXXXXX(0xF, X0010, BITS4(0,D,sz1,sz2), regN, regD, 6195436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ X1011, BITS4(N,Q,M,1), regM); 6196436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ break; 6197436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_VPADDFP: 6198436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ insn = XXXXXXXX(0xF, X0011, BITS4(0,D,0,0), regN, regD, 6199436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ X1101, BITS4(N,Q,M,0), regM); 6200436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ break; 6201436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_VPMINU: 6202436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ insn = XXXXXXXX(0xF, X0011, BITS4(0,D,sz1,sz2), regN, regD, 6203436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ X1010, BITS4(N,Q,M,1), regM); 6204436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ break; 6205436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_VPMINS: 6206436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ insn = XXXXXXXX(0xF, X0010, BITS4(0,D,sz1,sz2), regN, regD, 6207436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ X1010, BITS4(N,Q,M,1), regM); 6208436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ break; 6209436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_VPMAXU: 6210436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ insn = XXXXXXXX(0xF, X0011, BITS4(0,D,sz1,sz2), regN, regD, 6211436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ X1010, BITS4(N,Q,M,0), regM); 6212436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ break; 6213436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_VPMAXS: 6214436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ insn = XXXXXXXX(0xF, X0010, BITS4(0,D,sz1,sz2), regN, regD, 6215436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ X1010, BITS4(N,Q,M,0), regM); 6216436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ break; 6217436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_VADDFP: /* VADD reg, reg, reg */ 6218436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ insn = XXXXXXXX(0xF, X0010, BITS4(0,D,0,0), regN, regD, 6219436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ X1101, BITS4(N,Q,M,0), regM); 6220436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ break; 6221436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_VSUBFP: /* VADD reg, reg, reg */ 6222436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ insn = XXXXXXXX(0xF, X0010, BITS4(0,D,1,0), regN, regD, 6223436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ X1101, BITS4(N,Q,M,0), regM); 6224436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ break; 6225436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_VABDFP: /* VABD reg, reg, reg */ 6226436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ insn = XXXXXXXX(0xF, X0011, BITS4(0,D,1,0), regN, regD, 6227436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ X1101, BITS4(N,Q,M,0), regM); 6228436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ break; 6229436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_VMINF: 6230436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ insn = XXXXXXXX(0xF, X0010, BITS4(0,D,1,0), regN, regD, 6231436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ X1111, BITS4(N,Q,M,0), regM); 6232436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ break; 6233436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_VMAXF: 6234436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ insn = XXXXXXXX(0xF, X0010, BITS4(0,D,0,0), regN, regD, 6235436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ X1111, BITS4(N,Q,M,0), regM); 6236436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ break; 6237436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_VPMINF: 6238436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ insn = XXXXXXXX(0xF, X0011, BITS4(0,D,1,0), regN, regD, 6239436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ X1111, BITS4(N,Q,M,0), regM); 6240436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ break; 6241436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_VPMAXF: 6242436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ insn = XXXXXXXX(0xF, X0011, BITS4(0,D,0,0), regN, regD, 6243436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ X1111, BITS4(N,Q,M,0), regM); 6244436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ break; 6245436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_VRECPS: 6246436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ insn = XXXXXXXX(0xF, X0010, BITS4(0,D,0,0), regN, regD, X1111, 6247436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ BITS4(N,Q,M,1), regM); 6248436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ break; 6249436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_VCGTF: 6250436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ insn = XXXXXXXX(0xF, X0011, BITS4(0,D,1,0), regN, regD, X1110, 6251436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ BITS4(N,Q,M,0), regM); 6252436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ break; 6253436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_VCGEF: 6254436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ insn = XXXXXXXX(0xF, X0011, BITS4(0,D,0,0), regN, regD, X1110, 6255436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ BITS4(N,Q,M,0), regM); 6256436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ break; 6257436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_VCEQF: 6258436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ insn = XXXXXXXX(0xF, X0010, BITS4(0,D,0,0), regN, regD, X1110, 6259436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ BITS4(N,Q,M,0), regM); 6260436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ break; 6261436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_VRSQRTS: 6262436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ insn = XXXXXXXX(0xF, X0010, BITS4(0,D,1,0), regN, regD, X1111, 6263436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ BITS4(N,Q,M,1), regM); 6264436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ break; 6265436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ default: 6266436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ goto bad; 6267436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ } 6268436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ *p++ = insn; 6269436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ goto done; 6270436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ } 6271436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMin_NShift: { 6272436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ UInt Q = i->ARMin.NShift.Q ? 1 : 0; 6273436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ UInt regD = (hregClass(i->ARMin.NShift.dst) == HRcVec128) 6274436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ ? (qregNo(i->ARMin.NShift.dst) << 1) 6275436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ : dregNo(i->ARMin.NShift.dst); 6276436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ UInt regM = (hregClass(i->ARMin.NShift.argL) == HRcVec128) 6277436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ ? (qregNo(i->ARMin.NShift.argL) << 1) 6278436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ : dregNo(i->ARMin.NShift.argL); 6279436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ UInt regN = (hregClass(i->ARMin.NShift.argR) == HRcVec128) 6280436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ ? (qregNo(i->ARMin.NShift.argR) << 1) 6281436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ : dregNo(i->ARMin.NShift.argR); 6282436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ UInt sz1 = i->ARMin.NShift.size >> 1; 6283436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ UInt sz2 = i->ARMin.NShift.size & 1; 6284436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ UInt D = regD >> 4; 6285436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ UInt N = regN >> 4; 6286436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ UInt M = regM >> 4; 6287436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ UInt insn; 6288436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ regD &= 0xF; 6289436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ regM &= 0xF; 6290436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ regN &= 0xF; 6291436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ switch (i->ARMin.NShift.op) { 6292436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_VSHL: 6293436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ insn = XXXXXXXX(0xF, X0011, BITS4(0,D,sz1,sz2), regN, regD, 6294436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ X0100, BITS4(N,Q,M,0), regM); 6295436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ break; 6296436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_VSAL: 6297436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ insn = XXXXXXXX(0xF, X0010, BITS4(0,D,sz1,sz2), regN, regD, 6298436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ X0100, BITS4(N,Q,M,0), regM); 6299436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ break; 6300436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_VQSHL: 6301436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ insn = XXXXXXXX(0xF, X0011, BITS4(0,D,sz1,sz2), regN, regD, 6302436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ X0100, BITS4(N,Q,M,1), regM); 6303436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ break; 6304436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMneon_VQSAL: 6305436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ insn = XXXXXXXX(0xF, X0010, BITS4(0,D,sz1,sz2), regN, regD, 6306436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ X0100, BITS4(N,Q,M,1), regM); 6307436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ break; 6308436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ default: 6309436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ goto bad; 6310436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ } 6311436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ *p++ = insn; 6312436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ goto done; 6313436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ } 6314436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMin_NShl64: { 6315436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ HReg regDreg = i->ARMin.NShl64.dst; 6316436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ HReg regMreg = i->ARMin.NShl64.src; 6317436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ UInt amt = i->ARMin.NShl64.amt; 6318436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ vassert(amt >= 1 && amt <= 63); 6319436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ vassert(hregClass(regDreg) == HRcFlt64); 6320436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ vassert(hregClass(regMreg) == HRcFlt64); 6321436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ UInt regD = dregNo(regDreg); 6322436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ UInt regM = dregNo(regMreg); 6323436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ UInt D = (regD >> 4) & 1; 6324436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ UInt Vd = regD & 0xF; 6325436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ UInt L = 1; 6326436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ UInt Q = 0; /* always 64-bit */ 6327436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ UInt M = (regM >> 4) & 1; 6328436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ UInt Vm = regM & 0xF; 6329436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ UInt insn = XXXXXXXX(X1111,X0010, BITS4(1,D,(amt>>5)&1,(amt>>4)&1), 6330436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ amt & 0xF, Vd, X0101, BITS4(L,Q,M,1), Vm); 6331436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ *p++ = insn; 6332436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ goto done; 6333436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ } 6334436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64in_VImmQ: { 6335436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov UInt rQ = qregNo(i->ARM64in.VImmQ.rQ); 6336436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov UShort imm = i->ARM64in.VImmQ.imm; 6337436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if (imm == 0x0000) { 6338436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* movi rQ.4s, #0x0 == 0x4F 0x00 0x04 000 rQ */ 6339436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(rQ < 32); 6340436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov *p++ = 0x4F000400 | rQ; 6341436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov goto done; 6342436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 6343436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if (imm == 0x0001) { 6344436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* movi rD, #0xFF == 0x2F 0x00 0xE4 001 rD */ 6345436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(rQ < 32); 6346436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov *p++ = 0x2F00E420 | rQ; 6347436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov goto done; 6348436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 6349436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if (imm == 0x0003) { 6350436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* movi rD, #0xFFFF == 0x2F 0x00 0xE4 011 rD */ 6351436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(rQ < 32); 6352436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov *p++ = 0x2F00E460 | rQ; 6353436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov goto done; 6354436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 6355436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if (imm == 0x000F) { 6356436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* movi rD, #0xFFFFFFFF == 0x2F 0x00 0xE5 111 rD */ 6357436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(rQ < 32); 6358436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov *p++ = 0x2F00E5E0 | rQ; 6359436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov goto done; 6360436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 6361436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if (imm == 0x00FF) { 6362436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* movi rD, #0xFFFFFFFFFFFFFFFF == 0x2F 0x07 0xE7 111 rD */ 6363436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(rQ < 32); 6364436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov *p++ = 0x2F07E7E0 | rQ; 6365436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov goto done; 6366436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 6367436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov goto bad; /* no other handled cases right now */ 6368436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 6369436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 6370436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64in_VDfromX: { 6371436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* INS Vd.D[0], rX 6372436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 0100 1110 0000 1000 0001 11 nn dd INS Vd.D[0], Xn 6373436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov This isn't wonderful, in the sense that the upper half of 6374436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov the vector register stays unchanged and thus the insn is 6375436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov data dependent on its output register. */ 6376436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov UInt dd = dregNo(i->ARM64in.VDfromX.rD); 6377436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov UInt xx = iregNo(i->ARM64in.VDfromX.rX); 6378436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(xx < 31); 6379436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov *p++ = 0x4E081C00 | X_2_6_2_12_5_5(0,0,0,0,xx,dd); 6380436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov goto done; 6381436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 6382436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 6383436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64in_VQfromXX: { 6384436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* What we really generate is a two insn sequence: 6385436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov INS Vd.D[0], Xlo; INS Vd.D[1], Xhi 6386436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 0100 1110 0000 1000 0001 11 nn dd INS Vd.D[0], Xn 6387436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 0100 1110 0001 1000 0001 11 nn dd INS Vd.D[1], Xn 6388436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov */ 6389436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov UInt qq = qregNo(i->ARM64in.VQfromXX.rQ); 6390436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov UInt xhi = iregNo(i->ARM64in.VQfromXX.rXhi); 6391436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov UInt xlo = iregNo(i->ARM64in.VQfromXX.rXlo); 6392436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(xhi < 31 && xlo < 31); 6393436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov *p++ = 0x4E081C00 | X_2_6_2_12_5_5(0,0,0,0,xlo,qq); 6394436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov *p++ = 0x4E181C00 | X_2_6_2_12_5_5(0,0,0,0,xhi,qq); 6395436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov goto done; 6396436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 6397436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 6398436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64in_VXfromQ: { 6399436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* 010 0111 0000 01000 001111 nn dd UMOV Xd, Vn.D[0] 6400436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 010 0111 0000 11000 001111 nn dd UMOV Xd, Vn.D[1] 6401436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov */ 6402436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov UInt dd = iregNo(i->ARM64in.VXfromQ.rX); 6403436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov UInt nn = qregNo(i->ARM64in.VXfromQ.rQ); 6404436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov UInt laneNo = i->ARM64in.VXfromQ.laneNo; 6405436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(dd < 31); 6406436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(laneNo < 2); 6407436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov *p++ = X_3_8_5_6_5_5(X010, X01110000, 6408436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov laneNo == 1 ? X11000 : X01000, X001111, nn, dd); 6409436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov goto done; 6410436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 6411436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 6412436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64in_VMov: { 6413436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* 000 11110 00 10000 00 10000 n d FMOV Sd, Sn 6414436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 000 11110 01 10000 00 10000 n d FMOV Dd, Dn 6415436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 010 01110 10 1 n 0 00111 n d MOV Vd.16b, Vn.16b 6416436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov */ 6417436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov HReg rD = i->ARM64in.VMov.dst; 6418436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov HReg rN = i->ARM64in.VMov.src; 6419436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov switch (i->ARM64in.VMov.szB) { 6420436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case 8: { 6421436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov UInt dd = dregNo(rD); 6422436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov UInt nn = dregNo(rN); 6423436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov *p++ = X_3_8_5_6_5_5(X000, X11110011, X00000, X010000, nn, dd); 6424436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov goto done; 6425436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 6426436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov default: 6427436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov break; 6428436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 6429436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov goto bad; 6430436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 6431436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMin_NeonImm: { 6432436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ UInt Q = (hregClass(i->ARMin.NeonImm.dst) == HRcVec128) ? 1 : 0; 6433436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ UInt regD = Q ? (qregNo(i->ARMin.NeonImm.dst) << 1) : 6434436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ dregNo(i->ARMin.NeonImm.dst); 6435436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ UInt D = regD >> 4; 6436436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ UInt imm = i->ARMin.NeonImm.imm->imm8; 6437436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ UInt tp = i->ARMin.NeonImm.imm->type; 6438436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ UInt j = imm >> 7; 6439436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ UInt imm3 = (imm >> 4) & 0x7; 6440436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ UInt imm4 = imm & 0xF; 6441436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ UInt cmode, op; 6442436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ UInt insn; 6443436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ regD &= 0xF; 6444436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ if (tp == 9) 6445436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ op = 1; 6446436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ else 6447436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ op = 0; 6448436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ switch (tp) { 6449436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case 0: 6450436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case 1: 6451436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case 2: 6452436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case 3: 6453436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case 4: 6454436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case 5: 6455436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ cmode = tp << 1; 6456436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ break; 6457436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case 9: 6458436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case 6: 6459436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ cmode = 14; 6460436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ break; 6461436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case 7: 6462436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ cmode = 12; 6463436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ break; 6464436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case 8: 6465436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ cmode = 13; 6466436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ break; 6467436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case 10: 6468436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ cmode = 15; 6469436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ break; 6470436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ default: 6471436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ vpanic("ARMin_NeonImm"); 6472436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ 6473436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ } 6474436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ insn = XXXXXXXX(0xF, BITS4(0,0,1,j), BITS4(1,D,0,0), imm3, regD, 6475436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ cmode, BITS4(0,Q,op,1), imm4); 6476436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ *p++ = insn; 6477436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ goto done; 6478436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ } 6479436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMin_NCMovQ: { 6480436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ UInt cc = (UInt)i->ARMin.NCMovQ.cond; 6481436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ UInt qM = qregNo(i->ARMin.NCMovQ.src) << 1; 6482436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ UInt qD = qregNo(i->ARMin.NCMovQ.dst) << 1; 6483436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ UInt vM = qM & 0xF; 6484436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ UInt vD = qD & 0xF; 6485436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ UInt M = (qM >> 4) & 1; 6486436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ UInt D = (qD >> 4) & 1; 6487436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ vassert(cc < 16 && cc != ARMcc_AL && cc != ARMcc_NV); 6488436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ /* b!cc here+8: !cc A00 0000 */ 6489436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ UInt insn = XXXXXXXX(cc ^ 1, 0xA, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0); 6490436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ *p++ = insn; 6491436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ /* vmov qD, qM */ 6492436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ insn = XXXXXXXX(0xF, 0x2, BITS4(0,D,1,0), 6493436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ vM, vD, BITS4(0,0,0,1), BITS4(M,1,M,1), vM); 6494436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ *p++ = insn; 6495436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ goto done; 6496436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ } 6497436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMin_Add32: { 6498436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ UInt regD = iregNo(i->ARMin.Add32.rD); 6499436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ UInt regN = iregNo(i->ARMin.Add32.rN); 6500436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ UInt imm32 = i->ARMin.Add32.imm32; 6501436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ vassert(regD != regN); 6502436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ /* MOV regD, imm32 */ 6503436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ p = imm32_to_iregNo((UInt *)p, regD, imm32); 6504436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ /* ADD regD, regN, regD */ 6505436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ UInt insn = XXXXXXXX(0xE, 0, X1000, regN, regD, 0, 0, regD); 6506436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ *p++ = insn; 6507436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ goto done; 6508436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ } 6509436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 6510436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case ARM64in_EvCheck: { 6511436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* The sequence is fixed (canned) except for the two amodes 6512436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov supplied by the insn. These don't change the length, though. 6513436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov We generate: 6514436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ldr w9, [x21 + #8] 8 == offsetof(host_EvC_COUNTER) 6515436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov subs w9, w9, #1 6516436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov str w9, [x21 + #8] 8 == offsetof(host_EvC_COUNTER) 6517436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov bpl nofail 6518436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ldr x9, [x21 + #0] 0 == offsetof(host_EvC_FAILADDR) 6519436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov br x9 6520436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov nofail: 6521436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov */ 6522436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov UInt* p0 = p; 6523436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov p = do_load_or_store32(p, True/*isLoad*/, /*w*/9, 6524436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->ARM64in.EvCheck.amCounter); 6525436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov *p++ = 0x71000529; /* subs w9, w9, #1 */ 6526436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov p = do_load_or_store32(p, False/*!isLoad*/, /*w*/9, 6527436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->ARM64in.EvCheck.amCounter); 6528436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov *p++ = 0x54000065; /* bpl nofail */ 6529436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov p = do_load_or_store64(p, True/*isLoad*/, /*x*/9, 6530436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->ARM64in.EvCheck.amFailAddr); 6531436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov *p++ = 0xD61F0120; /* br x9 */ 6532436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* nofail: */ 6533436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 6534436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* Crosscheck */ 6535436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(evCheckSzB_ARM64() == (UChar*)p - (UChar*)p0); 6536436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov goto done; 6537436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 6538436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 6539436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ case ARMin_ProfInc: { 6540436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ /* We generate: 6541436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ (ctrP is unknown now, so use 0x65556555 in the 6542436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ expectation that a later call to LibVEX_patchProfCtr 6543436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ will be used to fill in the immediate fields once the 6544436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ right value is known.) 6545436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ movw r12, lo16(0x65556555) 6546436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ movt r12, lo16(0x65556555) 6547436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ ldr r11, [r12] 6548436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ adds r11, r11, #1 6549436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ str r11, [r12] 6550436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ ldr r11, [r12+4] 6551436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ adc r11, r11, #0 6552436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ str r11, [r12+4] 6553436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ */ 6554436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ p = imm32_to_iregNo_EXACTLY2(p, /*r*/12, 0x65556555); 6555436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ *p++ = 0xE59CB000; 6556436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ *p++ = 0xE29BB001; 6557436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ *p++ = 0xE58CB000; 6558436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ *p++ = 0xE59CB004; 6559436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ *p++ = 0xE2ABB000; 6560436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ *p++ = 0xE58CB004; 6561436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ /* Tell the caller .. */ 6562436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ vassert(!(*is_profInc)); 6563436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ *is_profInc = True; 6564436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ goto done; 6565436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ } 6566436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 6567436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* ... */ 6568436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov default: 6569436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov goto bad; 6570436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 6571436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 6572436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov bad: 6573436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ppARM64Instr(i); 6574436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vpanic("emit_ARM64Instr"); 6575436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /*NOTREACHED*/ 6576436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 6577436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov done: 6578436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(((UChar*)p) - &buf[0] <= 36); 6579436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return ((UChar*)p) - &buf[0]; 6580436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov} 6581436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 6582436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 6583436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov/* How big is an event check? See case for ARM64in_EvCheck in 6584436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov emit_ARM64Instr just above. That crosschecks what this returns, so 6585436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov we can tell if we're inconsistent. */ 6586436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovInt evCheckSzB_ARM64 ( void ) 6587436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{ 6588436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return 24; 6589436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov} 6590436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 6591436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 6592436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov/* NB: what goes on here has to be very closely coordinated with the 6593436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov emitInstr case for XDirect, above. */ 6594436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovVexInvalRange chainXDirect_ARM64 ( void* place_to_chain, 6595436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov void* disp_cp_chain_me_EXPECTED, 6596436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov void* place_to_jump_to ) 6597436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{ 6598436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* What we're expecting to see is: 6599436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov movw x9, disp_cp_chain_me_to_EXPECTED[15:0] 6600436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov movk x9, disp_cp_chain_me_to_EXPECTED[31:15], lsl 16 6601436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov movk x9, disp_cp_chain_me_to_EXPECTED[47:32], lsl 32 6602436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov movk x9, disp_cp_chain_me_to_EXPECTED[63:48], lsl 48 6603436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov blr x9 6604436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov viz 6605436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov <16 bytes generated by imm64_to_iregNo_EXACTLY4> 6606436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov D6 3F 01 20 6607436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov */ 6608436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov UInt* p = (UInt*)place_to_chain; 6609436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(0 == (3 & (HWord)p)); 6610436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(is_imm64_to_iregNo_EXACTLY4( 6611436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov p, /*x*/9, Ptr_to_ULong(disp_cp_chain_me_EXPECTED))); 6612436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(p[4] == 0xD63F0120); 6613436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 6614436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* And what we want to change it to is: 6615436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov movw x9, place_to_jump_to[15:0] 6616436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov movk x9, place_to_jump_to[31:15], lsl 16 6617436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov movk x9, place_to_jump_to[47:32], lsl 32 6618436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov movk x9, place_to_jump_to[63:48], lsl 48 6619436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov br x9 6620436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov viz 6621436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov <16 bytes generated by imm64_to_iregNo_EXACTLY4> 6622436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov D6 1F 01 20 6623436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 6624436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov The replacement has the same length as the original. 6625436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov */ 6626436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov (void)imm64_to_iregNo_EXACTLY4( 6627436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov p, /*x*/9, Ptr_to_ULong(place_to_jump_to)); 6628436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov p[4] = 0xD61F0120; 6629436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 6630436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov VexInvalRange vir = {(HWord)p, 20}; 6631436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return vir; 6632436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov} 6633436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 6634436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 6635436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov/* NB: what goes on here has to be very closely coordinated with the 6636436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov emitInstr case for XDirect, above. */ 6637436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovVexInvalRange unchainXDirect_ARM64 ( void* place_to_unchain, 6638436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov void* place_to_jump_to_EXPECTED, 6639436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov void* disp_cp_chain_me ) 6640436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{ 6641436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* What we're expecting to see is: 6642436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov movw x9, place_to_jump_to_EXPECTED[15:0] 6643436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov movk x9, place_to_jump_to_EXPECTED[31:15], lsl 16 6644436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov movk x9, place_to_jump_to_EXPECTED[47:32], lsl 32 6645436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov movk x9, place_to_jump_to_EXPECTED[63:48], lsl 48 6646436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov br x9 6647436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov viz 6648436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov <16 bytes generated by imm64_to_iregNo_EXACTLY4> 6649436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov D6 1F 01 20 6650436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov */ 6651436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov UInt* p = (UInt*)place_to_unchain; 6652436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(0 == (3 & (HWord)p)); 6653436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(is_imm64_to_iregNo_EXACTLY4( 6654436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov p, /*x*/9, Ptr_to_ULong(place_to_jump_to_EXPECTED))); 6655436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(p[4] == 0xD61F0120); 6656436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 6657436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* And what we want to change it to is: 6658436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov movw x9, disp_cp_chain_me_to[15:0] 6659436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov movk x9, disp_cp_chain_me_to[31:15], lsl 16 6660436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov movk x9, disp_cp_chain_me_to[47:32], lsl 32 6661436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov movk x9, disp_cp_chain_me_to[63:48], lsl 48 6662436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov blr x9 6663436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov viz 6664436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov <16 bytes generated by imm64_to_iregNo_EXACTLY4> 6665436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov D6 3F 01 20 6666436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov */ 6667436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov (void)imm64_to_iregNo_EXACTLY4( 6668436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov p, /*x*/9, Ptr_to_ULong(disp_cp_chain_me)); 6669436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov p[4] = 0xD63F0120; 6670436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 6671436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov VexInvalRange vir = {(HWord)p, 20}; 6672436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return vir; 6673436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov} 6674436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 6675436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 6676436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ /* Patch the counter address into a profile inc point, as previously 6677436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ created by the ARMin_ProfInc case for emit_ARMInstr. */ 6678436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ VexInvalRange patchProfInc_ARM ( void* place_to_patch, 6679436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ ULong* location_of_counter ) 6680436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ { 6681436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ vassert(sizeof(ULong*) == 4); 6682436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ UInt* p = (UInt*)place_to_patch; 6683436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ vassert(0 == (3 & (HWord)p)); 6684436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ vassert(is_imm32_to_iregNo_EXACTLY2(p, /*r*/12, 0x65556555)); 6685436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ vassert(p[2] == 0xE59CB000); 6686436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ vassert(p[3] == 0xE29BB001); 6687436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ vassert(p[4] == 0xE58CB000); 6688436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ vassert(p[5] == 0xE59CB004); 6689436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ vassert(p[6] == 0xE2ABB000); 6690436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ vassert(p[7] == 0xE58CB004); 6691436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ imm32_to_iregNo_EXACTLY2(p, /*r*/12, 6692436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ (UInt)Ptr_to_ULong(location_of_counter)); 6693436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ VexInvalRange vir = {(HWord)p, 8}; 6694436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ return vir; 6695436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ } 6696436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ 6697436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ 6698436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ #undef BITS4 6699436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ #undef X0000 6700436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ #undef X0001 6701436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ #undef X0010 6702436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ #undef X0011 6703436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ #undef X0100 6704436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ #undef X0101 6705436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ #undef X0110 6706436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ #undef X0111 6707436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ #undef X1000 6708436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ #undef X1001 6709436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ #undef X1010 6710436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ #undef X1011 6711436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ #undef X1100 6712436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ #undef X1101 6713436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ #undef X1110 6714436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ #undef X1111 6715436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ #undef XXXXX___ 6716436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ #undef XXXXXX__ 6717436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ #undef XXX___XX 6718436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ #undef XXXXX__X 6719436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ #undef XXXXXXXX 6720436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ #undef XX______ 6721436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 6722436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov/*---------------------------------------------------------------*/ 6723436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov/*--- end host_arm64_defs.c ---*/ 6724436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov/*---------------------------------------------------------------*/ 6725