1b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* -*- mode: C; c-basic-offset: 3; -*- */
2b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/*---------------------------------------------------------------*/
4b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/*--- begin                                  host_s390_defs.h ---*/
5b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/*---------------------------------------------------------------*/
6b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/*
8b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   This file is part of Valgrind, a dynamic binary instrumentation
9b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   framework.
10b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
11b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   Copyright IBM Corp. 2010-2011
12b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
13b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   This program is free software; you can redistribute it and/or
14b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   modify it under the terms of the GNU General Public License as
15b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   published by the Free Software Foundation; either version 2 of the
16b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   License, or (at your option) any later version.
17b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
18b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   This program is distributed in the hope that it will be useful, but
19b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   WITHOUT ANY WARRANTY; without even the implied warranty of
20b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
21b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   General Public License for more details.
22b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
23b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   You should have received a copy of the GNU General Public License
24b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   along with this program; if not, write to the Free Software
25b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
26b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   02110-1301, USA.
27b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
28b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   The GNU General Public License is contained in the file COPYING.
29b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov*/
30b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
31b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Contributed by Florian Krohm */
32b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
33b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#ifndef __VEX_HOST_S390_DEFS_H
34b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define __VEX_HOST_S390_DEFS_H
35b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
36b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#include "libvex_basictypes.h"            /* Bool */
37b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#include "libvex.h"                       /* VexArchInfo */
38b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#include "main_util.h"                    /* needed for host_generic_regs.h */
39b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#include "host_generic_regs.h"            /* HReg */
40b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
41b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* --------- Registers --------- */
42b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovconst HChar *s390_hreg_as_string(HReg);
43b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
44b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Dedicated registers */
45b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy StepanovHReg s390_hreg_guest_state_pointer(void);
46b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
47b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
48b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Given the index of a function argument, return the number of the
49b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   general purpose register in which it is being passed. Arguments are
50b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   counted 0, 1, 2, ... and they are being passed in r2, r3, r4, ... */
51b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic __inline__ unsigned
52b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_gprno_from_arg_index(unsigned ix)
53b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
54b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return ix + 2;
55b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
56b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
57b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* --------- Memory address expressions (amodes). --------- */
58b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
59b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* These are the address modes:
60b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   (1) b12:  base register + 12-bit unsigned offset   (e.g. RS)
61b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   (2) b20:  base register + 20-bit signed offset     (e.g. RSY)
62b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   (3) bx12: base register + index register + 12-bit unsigned offset (e.g. RX)
63b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   (4) bx20: base register + index register + 20-bit signed offset   (e.g. RXY)
64b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   fixs390: There is also pc-relative stuff.. e.g. LARL
65b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov*/
66b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
67b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovtypedef enum {
68b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   S390_AMODE_B12,
69b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   S390_AMODE_B20,
70b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   S390_AMODE_BX12,
71b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   S390_AMODE_BX20
72b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov} s390_amode_t;
73b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
74b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovtypedef struct {
75b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_amode_t tag;
76b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   HReg b;
77b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   HReg x;       /* hregNumber(x) == 0  for S390_AMODE_B12/B20 kinds */
78b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   Int  d;       /* 12 bit unsigned or 20 bit signed */
79b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov} s390_amode;
80b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
81b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
82b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_amode *s390_amode_b12(Int d, HReg b);
83b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_amode *s390_amode_b20(Int d, HReg b);
84b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_amode *s390_amode_bx12(Int d, HReg b, HReg x);
85b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_amode *s390_amode_bx20(Int d, HReg b, HReg x);
86b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_amode *s390_amode_for_guest_state(Int d);
87b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy StepanovBool        s390_amode_is_sane(const s390_amode *);
88b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
89b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovconst HChar *s390_amode_as_string(const s390_amode *);
90b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
91b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* ------------- 2nd (right) operand of binary operation ---------------- */
92b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
93b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovtypedef enum {
94b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   S390_OPND_REG,
95b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   S390_OPND_IMMEDIATE,
96b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   S390_OPND_AMODE
97b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov} s390_opnd_t;
98b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
99b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
100b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Naming convention for operand locations:
101b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   R    - GPR
102b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   I    - immediate value
103b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   M    - memory (any Amode may be used)
104b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov*/
105b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
106b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* An operand that is either in a GPR or is addressable via a BX20 amode */
107b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovtypedef struct {
108b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_opnd_t tag;
109b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   union {
110b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      HReg        reg;
111b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      s390_amode *am;
112b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      ULong       imm;
113b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   } variant;
114b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov} s390_opnd_RMI;
115b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
116b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
117b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* The kind of instructions */
118b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovtypedef enum {
119b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   S390_INSN_LOAD,   /* load register from memory */
120b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   S390_INSN_STORE,  /* store register to memory */
121b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   S390_INSN_MOVE,   /* from register to register */
122b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   S390_INSN_COND_MOVE, /* conditonal "move" to register */
123b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   S390_INSN_LOAD_IMMEDIATE,
124b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   S390_INSN_ALU,
125b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   S390_INSN_MUL,    /* n-bit operands; 2n-bit result */
126b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   S390_INSN_DIV,    /* 2n-bit dividend; n-bit divisor; n-bit quot/rem */
127b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   S390_INSN_DIVS,   /* n-bit dividend; n-bit divisor; n-bit quot/rem */
128b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   S390_INSN_CLZ,    /* count left-most zeroes */
129b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   S390_INSN_UNOP,
130b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   S390_INSN_TEST,   /* test operand and set cc */
131b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   S390_INSN_CC2BOOL,/* convert condition code to 0/1 */
132b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   S390_INSN_COMPARE,
133b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   S390_INSN_BRANCH, /* un/conditional goto */
134b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   S390_INSN_HELPER_CALL,
135b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   S390_INSN_CAS,    /* compare and swap */
136b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   S390_INSN_BFP_BINOP, /* Binary floating point 32-bit / 64-bit */
137b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   S390_INSN_BFP_UNOP,
138b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   S390_INSN_BFP_TRIOP,
139b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   S390_INSN_BFP_COMPARE,
140b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   S390_INSN_BFP128_BINOP, /* Binary floating point 128-bit */
141b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   S390_INSN_BFP128_UNOP,
142b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   S390_INSN_BFP128_COMPARE,
143b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   S390_INSN_BFP128_CONVERT_TO,
144b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   S390_INSN_BFP128_CONVERT_FROM,
145b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   S390_INSN_MFENCE
146b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov} s390_insn_tag;
147b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
148b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
149b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* The kind of ALU instructions */
150b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovtypedef enum {
151b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   S390_ALU_ADD,
152b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   S390_ALU_SUB,
153b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   S390_ALU_MUL,   /* n-bit operands; result is lower n-bit of product */
154b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   S390_ALU_AND,
155b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   S390_ALU_OR,
156b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   S390_ALU_XOR,
157b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   S390_ALU_LSH,
158b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   S390_ALU_RSH,
159b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   S390_ALU_RSHA   /* arithmetic */
160b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov} s390_alu_t;
161b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
162b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
163b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* The kind of unary integer operations */
164b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovtypedef enum {
165b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   S390_ZERO_EXTEND_8,
166b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   S390_ZERO_EXTEND_16,
167b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   S390_ZERO_EXTEND_32,
168b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   S390_SIGN_EXTEND_8,
169b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   S390_SIGN_EXTEND_16,
170b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   S390_SIGN_EXTEND_32,
171b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   S390_NEGATE
172b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov} s390_unop_t;
173b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
174b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* The kind of ternary BFP operations */
175b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovtypedef enum {
176b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   S390_BFP_MADD,
177b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   S390_BFP_MSUB,
178b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov} s390_bfp_triop_t;
179b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
180b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* The kind of binary BFP operations */
181b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovtypedef enum {
182b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   S390_BFP_ADD,
183b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   S390_BFP_SUB,
184b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   S390_BFP_MUL,
185b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   S390_BFP_DIV
186b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov} s390_bfp_binop_t;
187b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
188b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
189b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* The kind of unary BFP operations */
190b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovtypedef enum {
191b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   S390_BFP_ABS,
192b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   S390_BFP_NABS,
193b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   S390_BFP_NEG,
194b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   S390_BFP_SQRT,
195b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   S390_BFP_I32_TO_F32,
196b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   S390_BFP_I32_TO_F64,
197b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   S390_BFP_I32_TO_F128,
198b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   S390_BFP_I64_TO_F32,
199b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   S390_BFP_I64_TO_F64,
200b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   S390_BFP_I64_TO_F128,
201b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   S390_BFP_F32_TO_I32,
202b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   S390_BFP_F32_TO_I64,
203b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   S390_BFP_F32_TO_F64,
204b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   S390_BFP_F32_TO_F128,
205b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   S390_BFP_F64_TO_I32,
206b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   S390_BFP_F64_TO_I64,
207b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   S390_BFP_F64_TO_F32,
208b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   S390_BFP_F64_TO_F128,
209b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   S390_BFP_F128_TO_I32,
210b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   S390_BFP_F128_TO_I64,
211b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   S390_BFP_F128_TO_F32,
212b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   S390_BFP_F128_TO_F64
213b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov} s390_bfp_unop_t;
214b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
215b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
216b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Condition code. The encoding of the enumerators matches the value of
217b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   the mask field in the various branch opcodes. */
218b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovtypedef enum {
219b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   S390_CC_NEVER=  0,
220b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   S390_CC_OVFL =  1,   /* overflow */
221b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   S390_CC_H    =  2,   /* A > B ; high */
222b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   S390_CC_NLE  =  3,   /* not low or equal */
223b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   S390_CC_L    =  4,   /* A < B ; low */
224b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   S390_CC_NHE  =  5,   /* not high or equal */
225b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   S390_CC_LH   =  6,   /* low or high */
226b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   S390_CC_NE   =  7,   /* A != B ; not zero */
227b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   S390_CC_E    =  8,   /* A == B ; zero */
228b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   S390_CC_NLH  =  9,   /* not low or high */
229b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   S390_CC_HE   = 10,   /* A >= B ; high or equal*/
230b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   S390_CC_NL   = 11,   /* not low */
231b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   S390_CC_LE   = 12,   /* A <= B ; low or equal */
232b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   S390_CC_NH   = 13,   /* not high */
233b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   S390_CC_NO   = 14,   /* not overflow */
234b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   S390_CC_ALWAYS = 15
235b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov} s390_cc_t;
236b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
237b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
238b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Rounding mode as it is encoded in the m3/m4 fields of certain
239b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   instructions (e.g. CFEBR) */
240b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovtypedef enum {
241b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* S390_ROUND_NEAREST_AWAY = 1, not supported */
242b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   S390_ROUND_NEAREST_EVEN = 4,
243b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   S390_ROUND_ZERO         = 5,
244b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   S390_ROUND_POSINF       = 6,
245b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   S390_ROUND_NEGINF       = 7
246b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov} s390_round_t;
247b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
248b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
249b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Invert the condition code */
250b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic __inline__ s390_cc_t
251b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_cc_invert(s390_cc_t cond)
252b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
253b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return S390_CC_ALWAYS - cond;
254b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
255b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
256b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
257b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovtypedef struct {
258b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_insn_tag tag;
259b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   UChar size;            /* size of the result in bytes */
260b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   union {
261b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      struct {
262b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         HReg        dst;
263b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         s390_amode *src;
264b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      } load;
265b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      struct {
266b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         s390_amode *dst;
267b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         HReg        src;
268b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      } store;
269b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      struct {
270b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         HReg        dst;
271b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         HReg        src;
272b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      } move;
273b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      struct {
274b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         s390_cc_t     cond;
275b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         HReg          dst;
276b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         s390_opnd_RMI src;
277b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      } cond_move;
278b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      struct {
279b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         HReg        dst;
280b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         ULong       value;  /* not sign extended */
281b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      } load_immediate;
282b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      /* add, and, or, xor */
283b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      struct {
284b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         s390_alu_t    tag;
285b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         HReg          dst; /* op1 */
286b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         s390_opnd_RMI op2;
287b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      } alu;
288b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      struct {
289b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         Bool          signed_multiply;
290b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         HReg          dst_hi;  /*           r10 */
291b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         HReg          dst_lo;  /* also op1  r11 */
292b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         s390_opnd_RMI op2;
293b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      } mul;
294b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      struct {
295b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         Bool          signed_divide;
296b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         HReg          op1_hi;  /* also remainder   r10 */
297b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         HReg          op1_lo;  /* also quotient    r11 */
298b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         s390_opnd_RMI op2;
299b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      } div;
300b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      struct {
301b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         HReg          rem; /* remainder      r10 */
302b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         HReg          op1; /* also quotient  r11 */
303b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         s390_opnd_RMI op2;
304b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      } divs;
305b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      struct {
306b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         HReg          num_bits; /* number of leftmost '0' bits  r10 */
307b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         HReg          clobber;  /* unspecified                  r11 */
308b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         s390_opnd_RMI src;
309b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      } clz;
310b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      struct {
311b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         s390_unop_t   tag;
312b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         HReg          dst;
313b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         s390_opnd_RMI src;
314b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      } unop;
315b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      struct {
316b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         Bool          signed_comparison;
317b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         HReg          src1;
318b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         s390_opnd_RMI src2;
319b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      } compare;
320b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      struct {
321b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         HReg          dst;  /* condition code in s390 encoding */
322b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         HReg          op1;
323b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         HReg          op2;
324b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      } bfp_compare;
325b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      struct {
326b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         s390_opnd_RMI src;
327b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      } test;
328b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      /* Convert the condition code to a boolean value. */
329b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      struct {
330b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         s390_cc_t cond;
331b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         HReg      dst;
332b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      } cc2bool;
333b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      struct {
334b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         HReg        op1;
335b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         s390_amode *op2;
336b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         HReg        op3;
337b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         HReg        old_mem;
338b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      } cas;
339b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      struct {
340b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         IRJumpKind    kind;
341b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         s390_cc_t     cond;
342b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         s390_opnd_RMI dst;
343b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      } branch;
344b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      /* Pseudo-insn for representing a helper call.
345b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         TARGET is the absolute address of the helper function
346b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         NUM_ARGS says how many arguments are being passed.
347b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         All arguments have integer type and are being passed according to ABI,
348b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         i.e. in registers r2, r3, r4, r5, and r6, with argument #0 being
349b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         passed in r2 and so forth. */
350b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      struct {
351b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         s390_cc_t cond;
352b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         Addr64    target;
353b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         UInt      num_args;
354b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         HChar    *name;      /* callee's name (for debugging) */
355b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      } helper_call;
356b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      struct {
357b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         s390_bfp_triop_t tag;
358b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         s390_round_t     rounding_mode;
359b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         HReg             dst; /* first operand */
360b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         HReg             op2; /* second operand */
361b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         HReg             op3; /* third operand */
362b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      } bfp_triop;
363b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      struct {
364b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         s390_bfp_binop_t tag;
365b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         s390_round_t     rounding_mode;
366b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         HReg             dst; /* left operand */
367b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         HReg             op2; /* right operand */
368b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      } bfp_binop;
369b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      struct {
370b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         s390_bfp_unop_t tag;
371b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         s390_round_t    rounding_mode;
372b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         HReg            dst;  /* result */
373b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         HReg            op;   /* operand */
374b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      } bfp_unop;
375b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      struct {
376b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         s390_bfp_binop_t tag;
377b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         s390_round_t     rounding_mode;
378b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         HReg             dst_hi; /* left operand; high part */
379b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         HReg             dst_lo; /* left operand; low part */
380b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         HReg             op2_hi; /* right operand; high part */
381b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         HReg             op2_lo; /* right operand; low part */
382b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      } bfp128_binop;
383b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      /* This variant is also used by the BFP128_CONVERT_TO and
384b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         BFP128_CONVERT_FROM insns. */
385b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      struct {
386b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         s390_bfp_unop_t  tag;
387b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         s390_round_t     rounding_mode;
388b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         HReg             dst_hi; /* result; high part */
389b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         HReg             dst_lo; /* result; low part */
390b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         HReg             op_hi;  /* operand; high part */
391b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         HReg             op_lo;  /* operand; low part */
392b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      } bfp128_unop;
393b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      struct {
394b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         HReg             dst;    /* condition code in s390 encoding */
395b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         HReg             op1_hi; /* left operand; high part */
396b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         HReg             op1_lo; /* left operand; low part */
397b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         HReg             op2_hi; /* right operand; high part */
398b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         HReg             op2_lo; /* right operand; low part */
399b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      } bfp128_compare;
400b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   } variant;
401b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov} s390_insn;
402b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
403b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_insn *s390_insn_load(UChar size, HReg dst, s390_amode *src);
404b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_insn *s390_insn_store(UChar size, s390_amode *dst, HReg src);
405b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_insn *s390_insn_move(UChar size, HReg dst, HReg src);
406b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_insn *s390_insn_cond_move(UChar size, s390_cc_t cond, HReg dst,
407b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                               s390_opnd_RMI src);
408b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_insn *s390_insn_load_immediate(UChar size, HReg dst, ULong val);
409b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_insn *s390_insn_alu(UChar size, s390_alu_t, HReg dst,
410b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                         s390_opnd_RMI op2);
411b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_insn *s390_insn_mul(UChar size, HReg dst_hi, HReg dst_lo,
412b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                         s390_opnd_RMI op2, Bool signed_multiply);
413b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_insn *s390_insn_div(UChar size, HReg op1_hi, HReg op1_lo,
414b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                         s390_opnd_RMI op2, Bool signed_divide);
415b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_insn *s390_insn_divs(UChar size, HReg rem, HReg op1, s390_opnd_RMI op2);
416b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_insn *s390_insn_clz(UChar size, HReg num_bits, HReg clobber,
417b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                         s390_opnd_RMI op);
418b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_insn *s390_insn_cas(UChar size, HReg op1, s390_amode *op2, HReg op3,
419b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                         HReg old);
420b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_insn *s390_insn_unop(UChar size, s390_unop_t tag, HReg dst,
421b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                          s390_opnd_RMI opnd);
422b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_insn *s390_insn_cc2bool(HReg dst, s390_cc_t src);
423b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_insn *s390_insn_test(UChar size, s390_opnd_RMI src);
424b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_insn *s390_insn_compare(UChar size, HReg dst, s390_opnd_RMI opnd,
425b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                             Bool signed_comparison);
426b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_insn *s390_insn_branch(IRJumpKind jk, s390_cc_t cond, s390_opnd_RMI dst);
427b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_insn *s390_insn_helper_call(s390_cc_t cond, Addr64 target, UInt num_args,
428b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                 HChar *name);
429b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_insn *s390_insn_bfp_triop(UChar size, s390_bfp_triop_t, HReg dst, HReg op2,
430b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                               HReg op3, s390_round_t);
431b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_insn *s390_insn_bfp_binop(UChar size, s390_bfp_binop_t, HReg dst, HReg op2,
432b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                               s390_round_t);
433b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_insn *s390_insn_bfp_unop(UChar size, s390_bfp_unop_t tag, HReg dst,
434b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                              HReg op, s390_round_t);
435b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_insn *s390_insn_bfp_compare(UChar size, HReg dst, HReg op1, HReg op2);
436b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_insn *s390_insn_bfp128_binop(UChar size, s390_bfp_binop_t, HReg dst_hi,
437b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                  HReg dst_lo, HReg op2_hi, HReg op2_lo,
438b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                  s390_round_t);
439b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_insn *s390_insn_bfp128_unop(UChar size, s390_bfp_unop_t, HReg dst_hi,
440b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                 HReg dst_lo, HReg op_hi, HReg op_lo,
441b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                 s390_round_t);
442b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_insn *s390_insn_bfp128_compare(UChar size, HReg dst, HReg op1_hi,
443b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                    HReg op1_lo, HReg op2_hi, HReg op2_lo);
444b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_insn *s390_insn_bfp128_convert_to(UChar size, s390_bfp_unop_t,
445b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                       HReg dst_hi, HReg dst_lo, HReg op);
446b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_insn *s390_insn_bfp128_convert_from(UChar size, s390_bfp_unop_t,
447b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                         HReg dst, HReg op_hi, HReg op_lo,
448b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                         s390_round_t);
449b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_insn *s390_insn_mfence(void);
450b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy StepanovUInt       s390_insn_emit(UChar *buf, Int nbuf, const s390_insn *insn,
451b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                          void *dispatch);
452b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
453b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovconst HChar *s390_insn_as_string(const s390_insn *);
454b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
455b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/*--------------------------------------------------------*/
456b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* --- Interface exposed to VEX                       --- */
457b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/*--------------------------------------------------------*/
458b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
459b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovvoid ppS390AMode(s390_amode *);
460b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovvoid ppS390Instr(s390_insn *, Bool mode64);
461b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovvoid ppHRegS390(HReg);
462b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
463b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Some functions that insulate the register allocator from details
464b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   of the underlying instruction set. */
465b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovvoid  getRegUsage_S390Instr( HRegUsage *, s390_insn *, Bool );
466b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovvoid  mapRegs_S390Instr    ( HRegRemap *, s390_insn *, Bool );
467b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy StepanovBool  isMove_S390Instr     ( s390_insn *, HReg *, HReg * );
468b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy StepanovInt   emit_S390Instr       ( UChar *, Int, s390_insn *, Bool,
469b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                             void *, void * );
470b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovvoid  getAllocableRegs_S390( Int *, HReg **, Bool );
471b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovvoid  genSpill_S390        ( HInstr **, HInstr **, HReg , Int , Bool );
472b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovvoid  genReload_S390       ( HInstr **, HInstr **, HReg , Int , Bool );
473b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_insn *directReload_S390 ( s390_insn *, HReg, Short );
474b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy StepanovHInstrArray *iselSB_S390   ( IRSB *, VexArch, VexArchInfo *, VexAbiInfo * );
475b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
476b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* KLUDGE: See detailled comment in host_s390_defs.c. */
477b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovextern const VexArchInfo *s390_archinfo_host;
478b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
479b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Convenience macros to test installed facilities */
480b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define s390_host_has_ldisp \
481b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                      (s390_archinfo_host->hwcaps & (VEX_HWCAPS_S390X_LDISP))
482b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define s390_host_has_eimm \
483b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                      (s390_archinfo_host->hwcaps & (VEX_HWCAPS_S390X_EIMM))
484b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define s390_host_has_gie \
485b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                      (s390_archinfo_host->hwcaps & (VEX_HWCAPS_S390X_GIE))
486b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define s390_host_has_dfp \
487b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                      (s390_archinfo_host->hwcaps & (VEX_HWCAPS_S390X_DFP))
488b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define s390_host_has_fgx \
489b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                      (s390_archinfo_host->hwcaps & (VEX_HWCAPS_S390X_FGX))
490b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
491b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#endif /* ndef __VEX_HOST_S390_DEFS_H */
492b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
493b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/*---------------------------------------------------------------*/
494b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/*--- end                                    host_s390_defs.h ---*/
495b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/*---------------------------------------------------------------*/
496