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