1436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 2436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov/*---------------------------------------------------------------*/ 3436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov/*--- begin guest_arm64_defs.h ---*/ 4436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov/*---------------------------------------------------------------*/ 5436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov/* 6436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov This file is part of Valgrind, a dynamic binary instrumentation 7436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov framework. 8436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 9436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov Copyright (C) 2013-2013 OpenWorks 10436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov info@open-works.net 11436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 12436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov This program is free software; you can redistribute it and/or 13436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov modify it under the terms of the GNU General Public License as 14436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov published by the Free Software Foundation; either version 2 of the 15436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov License, or (at your option) any later version. 16436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 17436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov This program is distributed in the hope that it will be useful, but 18436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov WITHOUT ANY WARRANTY; without even the implied warranty of 19436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 20436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov General Public License for more details. 21436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 22436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov You should have received a copy of the GNU General Public License 23436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov along with this program; if not, write to the Free Software 24436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 25436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 02110-1301, USA. 26436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 27436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov The GNU General Public License is contained in the file COPYING. 28436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov*/ 29436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 30436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#ifndef __VEX_GUEST_ARM64_DEFS_H 31436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define __VEX_GUEST_ARM64_DEFS_H 32436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 33436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#include "libvex_basictypes.h" 34436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#include "guest_generic_bb_to_IR.h" // DisResult 35436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 36436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov/*---------------------------------------------------------*/ 37436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov/*--- arm64 to IR conversion ---*/ 38436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov/*---------------------------------------------------------*/ 39436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 40436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov/* Convert one ARM64 insn to IR. See the type DisOneInstrFn in 41436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov bb_to_IR.h. */ 42436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovextern 43436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovDisResult disInstr_ARM64 ( IRSB* irbb, 44436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov Bool (*resteerOkFn) ( void*, Addr64 ), 45436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov Bool resteerCisOk, 46436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov void* callback_opaque, 47436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov UChar* guest_code, 48436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov Long delta, 49436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov Addr64 guest_IP, 50436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov VexArch guest_arch, 51436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov VexArchInfo* archinfo, 52436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov VexAbiInfo* abiinfo, 53436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov Bool host_bigendian, 54436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov Bool sigill_diag ); 55436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 56436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov/* Used by the optimiser to specialise calls to helpers. */ 57436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovextern 58436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovIRExpr* guest_arm64_spechelper ( const HChar* function_name, 59436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov IRExpr** args, 60436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov IRStmt** precedingStmts, 61436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov Int n_precedingStmts ); 62436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 63436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov/* Describes to the optimser which part of the guest state require 64436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov precise memory exceptions. This is logically part of the guest 65436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov state description. */ 66436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovextern 67436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovBool guest_arm64_state_requires_precise_mem_exns ( Int, Int ); 68436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 69436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovextern 70436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovVexGuestLayout arm64Guest_layout; 71436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 72436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 73436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov/*---------------------------------------------------------*/ 74436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov/*--- arm64 guest helpers ---*/ 75436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov/*---------------------------------------------------------*/ 76436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 77436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov/* --- CLEAN HELPERS --- */ 78436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 79436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov/* Calculate NZCV from the supplied thunk components, in the positions 80436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov they appear in the CPSR, viz bits 31:28 for N Z C V respectively. 81436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov Returned bits 63:32 and 27:0 are zero. */ 82436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovextern 83436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovULong arm64g_calculate_flags_nzcv ( ULong cc_op, ULong cc_dep1, 84436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ULong cc_dep2, ULong cc_dep3 ); 85436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 86b3f721d071c0089debafb21f2297cebc40ea6014Dmitriy Ivanov/* Calculate the C flag from the thunk components, in the lowest bit 87b3f721d071c0089debafb21f2297cebc40ea6014Dmitriy Ivanov of the word (bit 0). */ 88b3f721d071c0089debafb21f2297cebc40ea6014Dmitriy Ivanovextern 89b3f721d071c0089debafb21f2297cebc40ea6014Dmitriy IvanovULong arm64g_calculate_flag_c ( ULong cc_op, ULong cc_dep1, 90b3f721d071c0089debafb21f2297cebc40ea6014Dmitriy Ivanov ULong cc_dep2, ULong cc_dep3 ); 91b3f721d071c0089debafb21f2297cebc40ea6014Dmitriy Ivanov 92436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ /* Calculate the V flag from the thunk components, in the lowest bit 93436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ of the word (bit 0). */ 94436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ extern 95436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ UInt armg_calculate_flag_v ( UInt cc_op, UInt cc_dep1, 96436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ UInt cc_dep2, UInt cc_dep3 ); 97436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ 98436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov/* Calculate the specified condition from the thunk components, in the 99436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov lowest bit of the word (bit 0). */ 100436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovextern 101436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovULong arm64g_calculate_condition ( /* ARM64Condcode << 4 | cc_op */ 102436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ULong cond_n_op , 103436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ULong cc_dep1, 104436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ULong cc_dep2, ULong cc_dep3 ); 105436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 106436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ /* Calculate the QC flag from the thunk components, in the lowest bit 107436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ of the word (bit 0). */ 108436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ extern 109436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ UInt armg_calculate_flag_qc ( UInt resL1, UInt resL2, 110436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ UInt resR1, UInt resR2 ); 111436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 112436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 113436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov/*---------------------------------------------------------*/ 114436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov/*--- Condition code stuff ---*/ 115436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov/*---------------------------------------------------------*/ 116436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 117436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov/* Flag masks. Defines positions of flag bits in the NZCV 118436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov register. */ 119436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define ARM64G_CC_SHIFT_N 31 120436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define ARM64G_CC_SHIFT_Z 30 121436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define ARM64G_CC_SHIFT_C 29 122436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define ARM64G_CC_SHIFT_V 28 123436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ #define ARMG_CC_SHIFT_Q 27 124436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ 125436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ #define ARMG_CC_MASK_N (1 << ARMG_CC_SHIFT_N) 126436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ #define ARMG_CC_MASK_Z (1 << ARMG_CC_SHIFT_Z) 127436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ #define ARMG_CC_MASK_C (1 << ARMG_CC_SHIFT_C) 128436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ #define ARMG_CC_MASK_V (1 << ARMG_CC_SHIFT_V) 129436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ #define ARMG_CC_MASK_Q (1 << ARMG_CC_SHIFT_Q) 130436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 131436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov/* Flag thunk descriptors. A four-word thunk is used to record 132436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov details of the most recent flag-setting operation, so NZCV can 133436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov be computed later if needed. 134436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 135436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov The four words are: 136436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 137436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov CC_OP, which describes the operation. 138436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 139436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov CC_DEP1, CC_DEP2, CC_NDEP. These are arguments to the 140436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov operation. We want set up the mcx_masks in flag helper calls 141436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov involving these fields so that Memcheck "believes" that the 142436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov resulting flags are data-dependent on both CC_DEP1 and 143436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov CC_DEP2. Hence the name DEP. 144436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 145436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov When building the thunk, it is always necessary to write words into 146436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov CC_DEP1/2 and NDEP, even if those args are not used given the CC_OP 147436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov field. This is important because otherwise Memcheck could give 148436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov false positives as it does not understand the relationship between 149436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov the CC_OP field and CC_DEP1/2/NDEP, and so believes that the 150436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov definedness of the stored flags always depends on all 3 DEP values. 151436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 152436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov A summary of the field usages is: 153436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 154436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov OP DEP1 DEP2 DEP3 155436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 156436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 157436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov OP_COPY curr_NZCV:28x0 unused unused 158436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov OP_ADD32 argL argR unused 159436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov OP_ADD64 argL argR unused 160436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov OP_SUB32 argL argR unused 161436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov OP_SUB64 argL argR unused 162b3f721d071c0089debafb21f2297cebc40ea6014Dmitriy Ivanov OP_ADC32 argL argR 63x0:old_C 163b3f721d071c0089debafb21f2297cebc40ea6014Dmitriy Ivanov OP_ADC64 argL argR 63x0:old_C 164b3f721d071c0089debafb21f2297cebc40ea6014Dmitriy Ivanov OP_SBC32 argL argR 63x0:old_C 165b3f721d071c0089debafb21f2297cebc40ea6014Dmitriy Ivanov OP_SBC64 argL argR 63x0:old_C 166436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov OP_LOGIC32 result unused unused 167436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov OP_LOGIC64 result unused unused 168436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ OP_MUL result unused 30x0:old_C:old_V 169436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ OP_MULL resLO32 resHI32 30x0:old_C:old_V 170436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ */ 171436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 172436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovenum { 173436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ARM64G_CC_OP_COPY=0, /* DEP1 = NZCV in 31:28, DEP2 = 0, DEP3 = 0 174436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov just copy DEP1 to output */ 175436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 176436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ARM64G_CC_OP_ADD32, /* DEP1 = argL (Rn), DEP2 = argR (shifter_op), 177436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov DEP3 = 0 */ 178436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 179436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ARM64G_CC_OP_ADD64, /* DEP1 = argL (Rn), DEP2 = argR (shifter_op), 180436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov DEP3 = 0 */ 181436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 182436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ARM64G_CC_OP_SUB32, /* DEP1 = argL (Rn), DEP2 = argR (shifter_op), 183436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov DEP3 = 0 */ 184436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 185436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ARM64G_CC_OP_SUB64, /* DEP1 = argL (Rn), DEP2 = argR (shifter_op), 186436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov DEP3 = 0 */ 187436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 188b3f721d071c0089debafb21f2297cebc40ea6014Dmitriy Ivanov ARM64G_CC_OP_ADC32, /* DEP1 = argL (Rn), DEP2 = arg2 (shifter_op), 189b3f721d071c0089debafb21f2297cebc40ea6014Dmitriy Ivanov DEP3 = oldC (in LSB) */ 190b3f721d071c0089debafb21f2297cebc40ea6014Dmitriy Ivanov 191b3f721d071c0089debafb21f2297cebc40ea6014Dmitriy Ivanov ARM64G_CC_OP_ADC64, /* DEP1 = argL (Rn), DEP2 = arg2 (shifter_op), 192b3f721d071c0089debafb21f2297cebc40ea6014Dmitriy Ivanov DEP3 = oldC (in LSB) */ 193b3f721d071c0089debafb21f2297cebc40ea6014Dmitriy Ivanov 194b3f721d071c0089debafb21f2297cebc40ea6014Dmitriy Ivanov ARM64G_CC_OP_SBC32, /* DEP1 = argL (Rn), DEP2 = arg2 (shifter_op), 195b3f721d071c0089debafb21f2297cebc40ea6014Dmitriy Ivanov DEP3 = oldC (in LSB) */ 196b3f721d071c0089debafb21f2297cebc40ea6014Dmitriy Ivanov 197b3f721d071c0089debafb21f2297cebc40ea6014Dmitriy Ivanov ARM64G_CC_OP_SBC64, /* DEP1 = argL (Rn), DEP2 = arg2 (shifter_op), 198b3f721d071c0089debafb21f2297cebc40ea6014Dmitriy Ivanov DEP3 = oldC (in LSB) */ 199436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 200436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ARM64G_CC_OP_LOGIC32, /* DEP1 = result, DEP2 = 0, DEP3 = 0 */ 201436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ARM64G_CC_OP_LOGIC64, /* DEP1 = result, DEP2 = 0, DEP3 = 0 */ 202436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 203436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ ARMG_CC_OP_MUL, /* DEP1 = result, DEP2 = 0, DEP3 = oldC:old_V 204436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ (in bits 1:0) */ 205436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ 206436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ ARMG_CC_OP_MULL, /* DEP1 = resLO32, DEP2 = resHI32, DEP3 = oldC:old_V 207436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov//ZZ (in bits 1:0) */ 208436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 209436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ARM64G_CC_OP_NUMBER 210436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}; 211436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 212436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov/* XXXX because of the calling conventions for 213436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov arm64g_calculate_condition, all these OP values MUST be in the range 214436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 0 .. 15 only (viz, 4-bits). */ 215436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 216436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 217436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 218436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov/* Defines conditions which we can ask for */ 219436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 220436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovtypedef 221436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov enum { 222436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ARM64CondEQ = 0, /* equal : Z=1 */ 223436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ARM64CondNE = 1, /* not equal : Z=0 */ 224436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 225436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ARM64CondCS = 2, /* >=u (higher or same) (aka HS) : C=1 */ 226436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ARM64CondCC = 3, /* <u (lower) (aka LO) : C=0 */ 227436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 228436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ARM64CondMI = 4, /* minus (negative) : N=1 */ 229436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ARM64CondPL = 5, /* plus (zero or +ve) : N=0 */ 230436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 231436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ARM64CondVS = 6, /* overflow : V=1 */ 232436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ARM64CondVC = 7, /* no overflow : V=0 */ 233436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 234436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ARM64CondHI = 8, /* >u (higher) : C=1 && Z=0 */ 235436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ARM64CondLS = 9, /* <=u (lower or same) : C=0 || Z=1 */ 236436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 237436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ARM64CondGE = 10, /* >=s (signed greater or equal) : N=V */ 238436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ARM64CondLT = 11, /* <s (signed less than) : N!=V */ 239436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 240436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ARM64CondGT = 12, /* >s (signed greater) : Z=0 && N=V */ 241436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ARM64CondLE = 13, /* <=s (signed less or equal) : Z=1 || N!=V */ 242436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 243436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ARM64CondAL = 14, /* always (unconditional) : 1 */ 244436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ARM64CondNV = 15 /* always (unconditional) : 1 */ 245436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 246436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ARM64Condcode; 247436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 248436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#endif /* ndef __VEX_GUEST_ARM64_DEFS_H */ 249436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 250436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov/*---------------------------------------------------------------*/ 251436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov/*--- end guest_arm64_defs.h ---*/ 252436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov/*---------------------------------------------------------------*/ 253